Linjiajia
2023-04-04 a1d1fb7c44e33c4baeb52964a027932018bc1325
家大事记添加接口、家庭资产、家庭设备
30个文件已修改
47个文件已添加
1 文件已重命名
12194 ■■■■ 已修改文件
.idea/deploymentTargetDropDown.xml 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/AndroidManifest.xml 64 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/application/zhangshi_app_android/MyApplication.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/application/zhangshi_app_android/adapter/FamilyAssetsRvAdapter.java 147 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/application/zhangshi_app_android/adapter/FamilyMemorabiliaRvAdapter.java 30 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/application/zhangshi_app_android/adapter/HomeDevicesRvAdapter.java 134 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/application/zhangshi_app_android/adapter/ImageRvAdapter.java 69 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/application/zhangshi_app_android/bean/FamilyAssetsBean.java 47 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/application/zhangshi_app_android/bean/FamilyAssetsResponseBean.java 27 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/application/zhangshi_app_android/bean/FamilyMemorabiliaBean.java 68 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/application/zhangshi_app_android/bean/FamilyMemorabiliaRequestBean.java 33 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/application/zhangshi_app_android/bean/HomeDevicesBean.java 93 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/application/zhangshi_app_android/bean/HomeDevicesResponseBean.java 27 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/application/zhangshi_app_android/bean/UploadFileResponseBean.java 52 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/application/zhangshi_app_android/data/DataRepository.java 33 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/application/zhangshi_app_android/data/source/HttpDataSource.java 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/application/zhangshi_app_android/data/source/http/ApiService.java 27 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/application/zhangshi_app_android/data/source/http/HttpDataSourceImpl.java 33 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/application/zhangshi_app_android/other/MyTitleBarStyle.java 82 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/application/zhangshi_app_android/ui/DLBaseActivity.java 126 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/application/zhangshi_app_android/ui/function/CreateFamilyProjectActivity.java 132 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/application/zhangshi_app_android/ui/function/CreateFamilyProjectActivityViewModel.java 72 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/application/zhangshi_app_android/ui/function/FamilyAssetsActivity.java 105 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/application/zhangshi_app_android/ui/function/FamilyAssetsActivityViewModel.java 137 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/application/zhangshi_app_android/ui/function/FamilyAssetsDetailActivity.java 103 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/application/zhangshi_app_android/ui/function/FamilyAssetsDetailActivityViewModel.java 42 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/application/zhangshi_app_android/ui/function/FamilyMemorabiliaActivity.java 247 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/application/zhangshi_app_android/ui/function/FamilyMemorabiliaActivityViewModel.java 106 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/application/zhangshi_app_android/ui/function/FunctionFragment.java 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/application/zhangshi_app_android/ui/function/HomeDevicesActivity.java 99 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/application/zhangshi_app_android/ui/function/HomeDevicesActivityViewModel.java 138 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/application/zhangshi_app_android/ui/function/HomeDevicesDetailActivity.java 103 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/application/zhangshi_app_android/ui/function/HomeDevicesDetailActivityViewModel.java 41 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/application/zhangshi_app_android/ui/login/LoginActivity.java 4 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/res/drawable-xhdpi/function_home_devices.png 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/res/drawable-xhdpi/function_notes.png 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/res/drawable-xhdpi/ic_clear.png 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/res/drawable-xhdpi/ic_image_delete.png 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/res/drawable-xhdpi/img_data_null.png 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/res/drawable-xxhdpi/function_home_devices.png 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/res/drawable-xxhdpi/function_notes.png 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/res/drawable-xxhdpi/ic_clear.png 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/res/drawable-xxhdpi/ic_image_delete.png 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/res/drawable-xxhdpi/img_data_null.png 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/res/drawable/shape_73fab4cd_solid.xml 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/res/layout/activity_family_assets.xml 144 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/res/layout/activity_family_assets_detail.xml 192 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/res/layout/activity_family_memorabilia.xml 865 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/res/layout/activity_family_memorabilia_create.xml 51 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/res/layout/activity_home_devices.xml 144 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/res/layout/activity_home_devices_detail.xml 175 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/res/layout/fragment_function.xml 28 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/res/layout/item_family_assets.xml 226 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/res/layout/item_family_memorabilia.xml 89 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/res/layout/item_home_devices.xml 204 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/res/layout/item_image.xml 34 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/res/layout/item_image_footer.xml 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/res/layout/layout_drawer.xml 608 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/res/layout/pop_operate.xml 89 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/res/layout/pop_search.xml 256 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app_base/build.gradle 18 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app_base/src/main/java/com/android/app_base/base/adapter/BaseRVAdapter.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
app_base/src/main/java/com/android/app_base/base/adapter/ImageViewAdapter.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app_base/src/main/java/com/android/app_base/base/dialog/WaitDialog.java 40 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app_base/src/main/java/com/android/app_base/base/view/BaseActivity.java 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app_base/src/main/java/com/android/app_base/http/interceptor/LogInterceptor.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app_base/src/main/java/com/android/app_base/manager/OnPermissionsInterceptListenerImpl.java 51 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app_base/src/main/java/com/android/app_base/manager/UserManager.java 62 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app_base/src/main/java/com/android/app_base/utils/GlideEngine.java 106 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app_base/src/main/java/com/android/app_base/utils/GlideUtil.java 96 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app_base/src/main/java/com/android/app_base/widget/ExtendTitleBar.java 58 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app_base/src/main/java/com/android/app_base/widget/GridSpaceItemDecoration.java 48 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app_base/src/main/java/com/android/app_base/widget/WrapRecyclerView.java 485 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app_base/src/main/res/layout/wait_dialog.xml 43 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app_base/src/main/res/raw/loading.json 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app_base/src/main/res/raw/progress.json 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app_base/src/main/res/raw/province.json 5537 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app_base/src/main/res/raw/welcome.json 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
.idea/deploymentTargetDropDown.xml
@@ -12,17 +12,6 @@
        </deviceKey>
      </Target>
    </runningDeviceTargetSelectedWithDropDown>
    <targetSelectedWithDropDown>
      <Target>
        <type value="QUICK_BOOT_TARGET" />
        <deviceKey>
          <Key>
            <type value="VIRTUAL_DEVICE_PATH" />
            <value value="D:\software\Android\.android\avd\Pixel_API_30.avd" />
          </Key>
        </deviceKey>
      </Target>
    </targetSelectedWithDropDown>
    <timeTargetWasSelectedWithDropDown value="2023-03-28T11:22:31.926040400Z" />
    <timeTargetWasSelectedWithDropDown value="2023-04-03T09:11:44.626235900Z" />
  </component>
</project>
app/src/main/AndroidManifest.xml
@@ -2,11 +2,57 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools">
    <!-- 网络相关 -->
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.READ_CONTACTS"/>
    <!-- 外部存储 -->
    <!-- Android 13开始,如果你的应用targetSdk指定到了33或以上,READ_EXTERNAL_STORAGE权限就完全失去了作用,需要细化-->
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" android:maxSdkVersion="32" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
    <uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
    <uses-permission android:name="android.permission.RECORD_AUDIO" />
    <!--Android 13版本适配,细化存储权限,READ_EXTERNAL_STORAGE无法再使用-->
    <uses-permission android:name="android.permission.READ_MEDIA_IMAGES" />
    <uses-permission android:name="android.permission.READ_MEDIA_AUDIO" />
    <uses-permission android:name="android.permission.READ_MEDIA_VIDEO" />
    <!-- 震动权限 -->
    <uses-permission android:name="android.permission.VIBRATE" />
    <!-- 蓝牙权限 -->
    <uses-permission android:name="android.permission.BLUETOOTH" />
    <!-- 拍照权限 -->
    <uses-permission android:name="android.permission.CAMERA" />
    <!-- 安装权限 -->
    <uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" />
    <!-- 定位权限(用于 WebView 定位)-->
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
    <queries package="${applicationId}">
        <intent>
            <action android:name="android.media.action.IMAGE_CAPTURE">
            </action>
        </intent>
        <intent>
            <action android:name="android.media.action.ACTION_VIDEO_CAPTURE">
            </action>
        </intent>
    </queries>
    <application
        android:name=".MyApplication"
        android:allowBackup="true"
@@ -60,6 +106,18 @@
        <activity
            android:name=".ui.function.CreateFamilyProjectActivity"
            android:exported="false" />
        <activity
            android:name=".ui.function.FamilyAssetsActivity"
            android:exported="false" />
        <activity
            android:name=".ui.function.FamilyAssetsDetailActivity"
            android:exported="false" />
        <activity
            android:name=".ui.function.HomeDevicesActivity"
            android:exported="false" />
        <activity
            android:name=".ui.function.HomeDevicesDetailActivity"
            android:exported="false" />
    </application>
</manifest>
app/src/main/java/com/application/zhangshi_app_android/MyApplication.java
@@ -1,8 +1,8 @@
package com.application.zhangshi_app_android;
import com.android.app_base.base.BaseApplication;
import com.application.zhangshi_app_android.other.MyTitleBarStyle;
import com.hjq.bar.TitleBar;
import com.hjq.bar.style.TransparentBarStyle;
//import me.jessyan.autosize.AutoSizeConfig;
@@ -16,6 +16,6 @@
    public void onCreate() {
        super.onCreate();
        // 初始化 TitleBar 默认样式
//        TitleBar.setDefaultStyle(new TransparentBarStyle());
        TitleBar.setDefaultStyle(new MyTitleBarStyle());
    }
}
app/src/main/java/com/application/zhangshi_app_android/adapter/FamilyAssetsRvAdapter.java
New file
@@ -0,0 +1,147 @@
package com.application.zhangshi_app_android.adapter;
import android.content.Context;
import android.content.Intent;
import android.view.View;
import android.view.animation.Animation;
import android.view.animation.Transformation;
import android.widget.CompoundButton;
import android.widget.FrameLayout;
import androidx.recyclerview.widget.GridLayoutManager;
import com.android.app_base.base.BaseConfig;
import com.android.app_base.base.adapter.BaseRVAdapter;
import com.android.app_base.manager.AppManager;
import com.application.zhangshi_app_android.R;
import com.application.zhangshi_app_android.bean.FamilyAssetsBean;
import com.application.zhangshi_app_android.databinding.ItemFamilyAssetsBinding;
import com.application.zhangshi_app_android.ui.function.CreateFamilyProjectActivity;
import com.application.zhangshi_app_android.ui.function.FamilyAssetsActivity;
import com.application.zhangshi_app_android.ui.function.FamilyAssetsActivityViewModel;
import com.application.zhangshi_app_android.ui.function.FamilyAssetsDetailActivity;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Objects;
/**
 * @author Ljj
 * @date 2023.04.03. 19:52
 * @desc 家庭资产 recyclerView 的 adapter
 */
public class FamilyAssetsRvAdapter extends BaseRVAdapter<FamilyAssetsBean, ItemFamilyAssetsBinding, FamilyAssetsRvAdapter.ViewHolder> {
    private FamilyAssetsActivityViewModel viewModel;
    public FamilyAssetsRvAdapter(Context context) {
        super(context);
    }
    public FamilyAssetsRvAdapter(Context context, FamilyAssetsActivityViewModel viewModel) {
        super(context);
        this.viewModel = viewModel;
    }
    @Override
    protected int getLayoutId() {
        return R.layout.item_family_assets;
    }
    @Override
    protected ViewHolder getViewHolder(ItemFamilyAssetsBinding itemBind) {
        return new ViewHolder(itemBind);
    }
    @Override
    protected void onBind(ViewHolder holder, int position) {
        holder.getBinding().setBean(mDataList.get(position));
        if (position % 2 != 0){
            holder.getBinding().cardView.setCardBackgroundColor(mContext.getColor(R.color.color_card_blue));
        }else {
            holder.getBinding().cardView.setCardBackgroundColor(mContext.getColor(R.color.color_card_pink));
        }
        holder.getBinding().layoutTitle.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                if (holder.isExpended){
                    int initialHeight = holder.getBinding().cardView.getMeasuredHeight();
                    int collapsedHeight = holder.getBinding().layoutTitle.getMeasuredHeight();
                    int distanceToCollapse = (int) (initialHeight - collapsedHeight);
                    Animation a = new Animation() {
                        @Override
                        protected void applyTransformation(float interpolatedTime, Transformation t) {
                            if (interpolatedTime == 1){
                            }
                            holder.getBinding().cardView.getLayoutParams().height = (int) (initialHeight - (distanceToCollapse * interpolatedTime));
                            holder.getBinding().cardView.requestLayout();
                        }
                        @Override
                        public boolean willChangeBounds() {
                            return true;
                        }
                    };
                    a.setDuration(500);
                    holder.getBinding().cardView.startAnimation(a);
                    holder.isExpended = false;
                }else{
                    final int initialHeight = holder.getBinding().cardView.getMeasuredHeight();
                    holder.getBinding().cardView.measure(FrameLayout.LayoutParams.MATCH_PARENT, FrameLayout.LayoutParams.WRAP_CONTENT);
                    int targetHeight = holder.getBinding().cardView.getMeasuredHeight();
                    int distanceToExpand = targetHeight - initialHeight;
                    Animation a = new Animation() {
                        @Override
                        protected void applyTransformation(float interpolatedTime, Transformation t) {
                            if (interpolatedTime == 1){
                            }
                            holder.getBinding().cardView.getLayoutParams().height = (int) (initialHeight + (distanceToExpand * interpolatedTime));
                            holder.getBinding().cardView.requestLayout();
                        }
                        @Override
                        public boolean willChangeBounds() {
                            return true;
                        }
                    };
                    a.setDuration(500);
                    holder.getBinding().cardView.startAnimation(a);
                    holder.isExpended = true;
                }
            }
        });
        holder.getBinding().layoutContent.setOnClickListener(v -> {
            AppManager.getAppManager().startActivity(
                    new Intent(getRecyclerView().getContext(), FamilyAssetsDetailActivity.class)
                            .putExtra("bean",mDataList.get(position)));
        });
        ImageRvAdapter adapter = new ImageRvAdapter(mContext);
        holder.getBinding().rvImage.setLayoutManager(new GridLayoutManager(mContext,3));
        holder.getBinding().rvImage.setAdapter(adapter);
        String url = mDataList.get(position).getUrl();
        if (url == null||url.isEmpty()){
            return;
        }
        List<String> list;
        if (url.contains(",")){
            String[] split = url.split(",");
            list = new ArrayList<>(Arrays.asList(split));
        }else {
            list = new ArrayList<>();
            list.add(url);
        }
        adapter.setData(list);
    }
    public static class ViewHolder extends BaseViewHolder<ItemFamilyAssetsBinding>{
        private boolean isExpended;
        public ViewHolder(ItemFamilyAssetsBinding binding) {
            super(binding);
        }
    }
}
app/src/main/java/com/application/zhangshi_app_android/adapter/FamilyMemorabiliaRvAdapter.java
@@ -10,6 +10,7 @@
import androidx.lifecycle.LiveData;
import androidx.lifecycle.MutableLiveData;
import androidx.recyclerview.widget.GridLayoutManager;
import com.android.app_base.base.BaseConfig;
import com.android.app_base.base.adapter.BaseRVAdapter;
@@ -130,17 +131,28 @@
                    holder.getBinding().cardView.startAnimation(a);
                    holder.isExpended = true;
                }
                holder.getBinding().layoutModify.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        AppManager.getAppManager().startActivity(
                                new Intent(getRecyclerView().getContext(), CreateFamilyProjectActivity.class)
                                        .putExtra(BaseConfig.EXTRA_TYPE,0)
                                        .putExtra("bean",mDataList.get(position)));
                    }
                });
            }
        });
        holder.getBinding().layoutModify.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                AppManager.getAppManager().startActivity(
                        new Intent(getRecyclerView().getContext(), CreateFamilyProjectActivity.class)
                                .putExtra(BaseConfig.EXTRA_TYPE,0)
                                .putExtra("bean",mDataList.get(position)));
            }
        });
        holder.getBinding().layoutDelete.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
            }
        });
        ImageRvAdapter adapter = new ImageRvAdapter(mContext);
        mDataList.get(position).setUrl(mDataList.get(position).getUrl());
        adapter.setData(mDataList.get(position).getUrlList());
        holder.getBinding().rvImage.setLayoutManager(new GridLayoutManager(mContext,3));
        holder.getBinding().rvImage.setAdapter(adapter);
    }
    public void setCheckable(boolean b) {
app/src/main/java/com/application/zhangshi_app_android/adapter/HomeDevicesRvAdapter.java
New file
@@ -0,0 +1,134 @@
package com.application.zhangshi_app_android.adapter;
import android.content.Context;
import android.content.Intent;
import android.view.View;
import android.view.animation.Animation;
import android.view.animation.Transformation;
import android.widget.FrameLayout;
import androidx.recyclerview.widget.GridLayoutManager;
import com.android.app_base.base.adapter.BaseRVAdapter;
import com.android.app_base.manager.AppManager;
import com.application.zhangshi_app_android.R;
import com.application.zhangshi_app_android.bean.HomeDevicesBean;
import com.application.zhangshi_app_android.databinding.ItemFamilyAssetsBinding;
import com.application.zhangshi_app_android.databinding.ItemHomeDevicesBinding;
import com.application.zhangshi_app_android.ui.function.FamilyAssetsDetailActivity;
import com.application.zhangshi_app_android.ui.function.HomeDevicesDetailActivity;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
/**
 * @author Ljj
 * @date 2023.04.04. 0:20
 * @desc 家庭设备 recyclerView 的 adapter
 */
public class HomeDevicesRvAdapter extends BaseRVAdapter<HomeDevicesBean, ItemHomeDevicesBinding, HomeDevicesRvAdapter.ViewHolder>{
    public HomeDevicesRvAdapter(Context context) {
        super(context);
    }
    @Override
    protected int getLayoutId() {
        return R.layout.item_home_devices;
    }
    @Override
    protected void onBind(ViewHolder holder, int position) {
        holder.getBinding().setBean(mDataList.get(position));
        if (position % 2 != 0){
            holder.getBinding().cardView.setCardBackgroundColor(mContext.getColor(R.color.color_card_blue));
        }else {
            holder.getBinding().cardView.setCardBackgroundColor(mContext.getColor(R.color.color_card_pink));
        }
        holder.getBinding().layoutTitle.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                if (holder.isExpended){
                    int initialHeight = holder.getBinding().cardView.getMeasuredHeight();
                    int collapsedHeight = holder.getBinding().layoutTitle.getMeasuredHeight();
                    int distanceToCollapse = (int) (initialHeight - collapsedHeight);
                    Animation a = new Animation() {
                        @Override
                        protected void applyTransformation(float interpolatedTime, Transformation t) {
                            if (interpolatedTime == 1){
                            }
                            holder.getBinding().cardView.getLayoutParams().height = (int) (initialHeight - (distanceToCollapse * interpolatedTime));
                            holder.getBinding().cardView.requestLayout();
                        }
                        @Override
                        public boolean willChangeBounds() {
                            return true;
                        }
                    };
                    a.setDuration(500);
                    holder.getBinding().cardView.startAnimation(a);
                    holder.isExpended = false;
                }else{
                    final int initialHeight = holder.getBinding().cardView.getMeasuredHeight();
                    holder.getBinding().cardView.measure(FrameLayout.LayoutParams.MATCH_PARENT, FrameLayout.LayoutParams.WRAP_CONTENT);
                    int targetHeight = holder.getBinding().cardView.getMeasuredHeight();
                    int distanceToExpand = targetHeight - initialHeight;
                    Animation a = new Animation() {
                        @Override
                        protected void applyTransformation(float interpolatedTime, Transformation t) {
                            if (interpolatedTime == 1){
                            }
                            holder.getBinding().cardView.getLayoutParams().height = (int) (initialHeight + (distanceToExpand * interpolatedTime));
                            holder.getBinding().cardView.requestLayout();
                        }
                        @Override
                        public boolean willChangeBounds() {
                            return true;
                        }
                    };
                    a.setDuration(500);
                    holder.getBinding().cardView.startAnimation(a);
                    holder.isExpended = true;
                }
            }
        });
        holder.getBinding().layoutContent.setOnClickListener(v -> {
            AppManager.getAppManager().startActivity(
                    new Intent(getRecyclerView().getContext(), HomeDevicesDetailActivity.class)
                            .putExtra("bean",mDataList.get(position)));
        });
        ImageRvAdapter adapter = new ImageRvAdapter(mContext);
        holder.getBinding().rvImage.setLayoutManager(new GridLayoutManager(mContext,3));
        holder.getBinding().rvImage.setAdapter(adapter);
        String url = mDataList.get(position).getUrl();
        if (url == null||url.isEmpty()){
            return;
        }
        List<String> list;
        if (url.contains(",")){
            String[] split = url.split(",");
            list = new ArrayList<>(Arrays.asList(split));
        }else {
            list = new ArrayList<>();
            list.add(url);
        }
        adapter.setData(list);
    }
    @Override
    protected ViewHolder getViewHolder(ItemHomeDevicesBinding itemBind) {
        return new ViewHolder(itemBind);
    }
    public static class ViewHolder extends BaseViewHolder<ItemHomeDevicesBinding>{
        private boolean isExpended;
        public ViewHolder(ItemHomeDevicesBinding binding) {
            super(binding);
        }
    }
}
app/src/main/java/com/application/zhangshi_app_android/adapter/ImageRvAdapter.java
New file
@@ -0,0 +1,69 @@
package com.application.zhangshi_app_android.adapter;
import android.content.Context;
import android.media.Image;
import android.view.View;
import com.android.app_base.base.adapter.BaseRVAdapter;
import com.application.zhangshi_app_android.R;
import com.application.zhangshi_app_android.bean.FamilyMemorabiliaBean;
import com.application.zhangshi_app_android.databinding.ItemImageBinding;
import com.application.zhangshi_app_android.ui.function.CreateFamilyProjectActivityViewModel;
import java.util.List;
/**
 * @author Ljj
 * @date 2023.04.01. 22:42
 * @desc
 */
public class ImageRvAdapter extends BaseRVAdapter<String, ItemImageBinding, BaseRVAdapter.BaseViewHolder<ItemImageBinding>> {
    private boolean isEdited = false;
    private CreateFamilyProjectActivityViewModel viewModel;
    public ImageRvAdapter(Context context) {
        super(context);
    }
    public ImageRvAdapter(Context context, CreateFamilyProjectActivityViewModel viewModel) {
        super(context);
        this.viewModel = viewModel;
    }
    @Override
    protected int getLayoutId() {
        return R.layout.item_image;
    }
    @Override
    protected void onBind(BaseViewHolder<ItemImageBinding> holder, int position) {
        holder.getBinding().setUrl(mDataList.get(position));
        if (isEdited) {
            holder.getBinding().ivDelete.setVisibility(View.VISIBLE);
        } else {
            holder.getBinding().ivDelete.setVisibility(View.GONE);
        }
        holder.getBinding().ivDelete.setOnClickListener(v -> {
            FamilyMemorabiliaBean bean = viewModel.getBeanMutableLiveData().getValue();
            if (bean!=null){
                List<String> list = bean.getUrlList();
                list.remove(position);
                bean.setUrlList(list);
                viewModel.getBeanMutableLiveData().postValue(bean);
            }
        });
    }
    @Override
    protected BaseViewHolder<ItemImageBinding> getViewHolder(ItemImageBinding itemBind) {
        return new BaseViewHolder<>(itemBind);
    }
    public boolean isEdited() {
        return isEdited;
    }
    public void setIsEdited(boolean edited) {
        isEdited = edited;
        notifyItemRangeChanged(0,getItemCount());
    }
}
app/src/main/java/com/application/zhangshi_app_android/bean/FamilyAssetsBean.java
New file
@@ -0,0 +1,47 @@
package com.application.zhangshi_app_android.bean;
import java.io.Serializable;
/**
 * @author Ljj
 * @date 2023.04.03. 19:54
 * @desc 家族资产
 */
public class FamilyAssetsBean implements Serializable {
    private String address;
    private String createTime;
    private String holder;
    private long id;
    private String location;
    private String remark;
    private String title;
    private String type;
    private String url;
    public String getAddress() { return address; }
    public void setAddress(String value) { this.address = value; }
    public String getCreateTime() { return createTime; }
    public void setCreateTime(String value) { this.createTime = value; }
    public String getHolder() { return holder; }
    public void setHolder(String value) { this.holder = value; }
    public long getId() { return id; }
    public void setId(long value) { this.id = value; }
    public String getLocation() { return location; }
    public void setLocation(String value) { this.location = value; }
    public String getRemark() { return remark; }
    public void setRemark(String value) { this.remark = value; }
    public String getTitle() { return title; }
    public void setTitle(String value) { this.title = value; }
    public String getType() { return type; }
    public void setType(String value) { this.type = value; }
    public String getUrl() { return url; }
    public void setUrl(String value) { this.url = value; }
}
app/src/main/java/com/application/zhangshi_app_android/bean/FamilyAssetsResponseBean.java
New file
@@ -0,0 +1,27 @@
package com.application.zhangshi_app_android.bean;
import java.util.List;
/**
 * @author Ljj
 * @date 2023.04.03. 21:31
 * @desc
 */
public class FamilyAssetsResponseBean {
    private List<FamilyAssetsBean> data;
    private long pageNum;
    private long pageSize;
    private long total;
    public List<FamilyAssetsBean> getData() { return data; }
    public void setData(List<FamilyAssetsBean> value) { this.data = value; }
    public long getPageNum() { return pageNum; }
    public void setPageNum(long value) { this.pageNum = value; }
    public long getPageSize() { return pageSize; }
    public void setPageSize(long value) { this.pageSize = value; }
    public long getTotal() { return total; }
    public void setTotal(long value) { this.total = value; }
}
app/src/main/java/com/application/zhangshi_app_android/bean/FamilyMemorabiliaBean.java
@@ -1,6 +1,10 @@
package com.application.zhangshi_app_android.bean;
import android.net.Uri;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
/**
@@ -15,13 +19,58 @@
    private String people;
    private String remark;
    private String title;
    private List<String> url;
    private String url;
    private List<String> urlList;
    public String getAddress() { return address; }
    public void setAddress(String value) { this.address = value; }
    public String getCreateTime() { return createTime; }
    public void setCreateTime(String value) { this.createTime = value; }
    public void setUrl(String url) {
        this.url = url;
        if (url == null){
            return;
        }
        if (url.contains(",")){
            String[] split = url.split(",");
            if (urlList == null){
                urlList = new ArrayList<>(Arrays.asList(split));
            }else {
                urlList.clear();
                urlList.addAll(Arrays.asList(split));
            }
        }else {
            if (urlList == null){
                urlList = new ArrayList<>();
            }else {
                urlList.clear();
            }
            urlList.add(url);
        }
    }
    public List<String> getUrlList() {
        return urlList;
    }
    public void setUrlList(List<String> urlList) {
        this.urlList = urlList;
        StringBuilder sb = new StringBuilder();
        for (String s : urlList) {
            sb.append(s).append(",");
        }
        //去掉最后一个逗号
        if (sb.length() > 0) {
            sb.deleteCharAt(sb.length() - 1);
        }
        this.url = sb.toString();
    }
    public String getUrl() {
        return url;
    }
    public long getId() { return id; }
    public void setId(long value) {
@@ -37,8 +86,17 @@
    public String getTitle() { return title; }
    public void setTitle(String value) { this.title = value; }
    public List<String> getUrl() { return url; }
    public void setUrl(List<String> value) { this.url = value; }
    @Override
    public String toString() {
        return "FamilyMemorabiliaBean{" +
                "id=" + id +
                ", address='" + address + '\'' +
                ", createTime='" + createTime + '\'' +
                ", people='" + people + '\'' +
                ", remark='" + remark + '\'' +
                ", title='" + title + '\'' +
                ", url='" + url + '\'' +
                ", urlList=" + urlList +
                '}';
    }
}
app/src/main/java/com/application/zhangshi_app_android/bean/FamilyMemorabiliaRequestBean.java
@@ -1,5 +1,8 @@
package com.application.zhangshi_app_android.bean;
import java.util.HashMap;
import java.util.Map;
/**
 * @author Ljj
 * @date 2023.03.28. 15:57
@@ -12,8 +15,8 @@
    private String title;
    private String createTime;
    private int pageNum;
    private int pageSize;
    private int pageNum = 1;
    private int pageSize = 20;
    public String getPeople() {
        return people;
@@ -70,4 +73,30 @@
        this.createTime = createTime;
    }
    public Map<String, Object> getMap() {
        Map<String, Object> map = new HashMap<>();
        if (people == null) {
            people = "";
        }
        if (address == null) {
            address = "";
        }
        if (remark == null) {
            remark = "";
        }
        if (title == null) {
            title = "";
        }
        if (createTime == null) {
            createTime = "";
        }
        map.put("people", people);
        map.put("address", address);
        map.put("remark", remark);
        map.put("title", title);
        map.put("createTime", createTime);
        map.put("pageNum", pageNum);
        map.put("pageSize", pageSize);
        return map;
    }
}
app/src/main/java/com/application/zhangshi_app_android/bean/HomeDevicesBean.java
New file
@@ -0,0 +1,93 @@
package com.application.zhangshi_app_android.bean;
import java.io.Serializable;
/**
 * @author Ljj
 * @date 2023.04.04. 0:22
 * @desc 家庭设备 bean
 */
public class HomeDevicesBean implements Serializable {
    private long id;
    private String name;
    private String createTime;
    private String people;
    private String content;
    private String address;
    private String remark;
    private String url;
    public HomeDevicesBean(long id, String name, String createTime, String people, String content, String address, String remark, String url) {
        this.id = id;
        this.name = name;
        this.createTime = createTime;
        this.people = people;
        this.content = content;
        this.address = address;
        this.remark = remark;
        this.url = url;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getCreateTime() {
        return createTime;
    }
    public void setCreateTime(String createTime) {
        this.createTime = createTime;
    }
    public String getPeople() {
        return people;
    }
    public void setPeople(String people) {
        this.people = people;
    }
    public String getContent() {
        return content;
    }
    public void setContent(String content) {
        this.content = content;
    }
    public String getAddress() {
        return address;
    }
    public void setAddress(String address) {
        this.address = address;
    }
    public String getRemark() {
        return remark;
    }
    public void setRemark(String remark) {
        this.remark = remark;
    }
    public String getUrl() {
        return url;
    }
    public void setUrl(String url) {
        this.url = url;
    }
    public long getId() {
        return id;
    }
    public void setId(long id) {
        this.id = id;
    }
}
app/src/main/java/com/application/zhangshi_app_android/bean/HomeDevicesResponseBean.java
New file
@@ -0,0 +1,27 @@
package com.application.zhangshi_app_android.bean;
import java.util.List;
/**
 * @author Ljj
 * @date 2023.04.04. 15:03
 * @desc
 */
public class HomeDevicesResponseBean {
    private List<HomeDevicesBean> data;
    private long pageNum;
    private long pageSize;
    private long total;
    public List<HomeDevicesBean> getData() { return data; }
    public void setData(List<HomeDevicesBean> value) { this.data = value; }
    public long getPageNum() { return pageNum; }
    public void setPageNum(long value) { this.pageNum = value; }
    public long getPageSize() { return pageSize; }
    public void setPageSize(long value) { this.pageSize = value; }
    public long getTotal() { return total; }
    public void setTotal(long value) { this.total = value; }
}
app/src/main/java/com/application/zhangshi_app_android/bean/UploadFileResponseBean.java
New file
@@ -0,0 +1,52 @@
package com.application.zhangshi_app_android.bean;
/**
 * @author Ljj
 * @date 2023.04.02. 22:57
 * @desc 上传文件返回实体类
 */
public class UploadFileResponseBean {
    String fileName;
    String newFileName;
    String url;
    String originalFilename;
    public UploadFileResponseBean(String fileName, String newFileName, String url, String originalFilename) {
        this.fileName = fileName;
        this.newFileName = newFileName;
        this.url = url;
        this.originalFilename = originalFilename;
    }
    public String getFileName() {
        return fileName;
    }
    public void setFileName(String fileName) {
        this.fileName = fileName;
    }
    public String getNewFileName() {
        return newFileName;
    }
    public void setNewFileName(String newFileName) {
        this.newFileName = newFileName;
    }
    public String getUrl() {
        return url;
    }
    public void setUrl(String url) {
        this.url = url;
    }
    public String getOriginalFilename() {
        return originalFilename;
    }
    public void setOriginalFilename(String originalFilename) {
        this.originalFilename = originalFilename;
    }
}
app/src/main/java/com/application/zhangshi_app_android/data/DataRepository.java
@@ -5,21 +5,29 @@
import com.android.app_base.base.model.BaseModel;
import com.android.app_base.http.ResultData;
import com.application.zhangshi_app_android.bean.CaptchaImageBean;
import com.application.zhangshi_app_android.bean.FamilyAssetsResponseBean;
import com.application.zhangshi_app_android.bean.FamilyMemorabiliaBean;
import com.application.zhangshi_app_android.bean.FamilyMemorabiliaRequestBean;
import com.application.zhangshi_app_android.bean.FamilyMemorabiliaResponseBean;
import com.application.zhangshi_app_android.bean.HomeDevicesResponseBean;
import com.application.zhangshi_app_android.bean.LoginRequestBean;
import com.application.zhangshi_app_android.bean.LoginResponseBean;
import com.application.zhangshi_app_android.bean.UploadFileResponseBean;
import com.application.zhangshi_app_android.data.source.HttpDataSource;
import com.application.zhangshi_app_android.data.source.LocalDataSource;
import com.application.zhangshi_app_android.data.source.http.HttpDataSourceImpl;
import com.application.zhangshi_app_android.data.source.local.LocalDataSourceImpl;
import java.io.File;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.function.DoubleUnaryOperator;
import io.reactivex.Completable;
import io.reactivex.Observable;
import io.reactivex.Observer;
import okhttp3.MultipartBody;
/**
 * @author Ljj
@@ -83,8 +91,8 @@
     * 获取家大事记
     */
    @Override
    public Observable<ResultData<FamilyMemorabiliaResponseBean>> getFamilyMemorabilia(Map<String, Object> queryMap) {
        return mHttpDataSource.getFamilyMemorabilia(queryMap);
    public Observable<ResultData<FamilyMemorabiliaResponseBean>> getFamilyMemorabilia(Map<String,Object> paramsMap) {
        return mHttpDataSource.getFamilyMemorabilia(paramsMap);
    }
    /**
     * 增加家大事记
@@ -109,6 +117,27 @@
    }
    /**
     * 上传文件
     */
    public Observable<ResultData<UploadFileResponseBean>> uploadFile(MultipartBody.Part file) {
        return mHttpDataSource.uploadFile(file);
    }
    /**
     * 获取家庭资产
     */
    public Observable<ResultData<FamilyAssetsResponseBean>> getFamilyAssets(Map<String,Object> paramsMap) {
        return mHttpDataSource.getFamilyAssets(paramsMap);
    }
    /**
     * 获取家庭设备
     */
    public Observable<ResultData<HomeDevicesResponseBean>> getHomeDevices(Map<String, Object> paramsMap) {
        return mHttpDataSource.getHomeDevices(paramsMap);
    }
    /**
     * @see LocalDataSourceImpl
     */
}
app/src/main/java/com/application/zhangshi_app_android/data/source/HttpDataSource.java
@@ -2,17 +2,22 @@
import com.android.app_base.http.ResultData;
import com.application.zhangshi_app_android.bean.CaptchaImageBean;
import com.application.zhangshi_app_android.bean.FamilyAssetsResponseBean;
import com.application.zhangshi_app_android.bean.FamilyMemorabiliaBean;
import com.application.zhangshi_app_android.bean.FamilyMemorabiliaRequestBean;
import com.application.zhangshi_app_android.bean.FamilyMemorabiliaResponseBean;
import com.application.zhangshi_app_android.bean.HomeDevicesResponseBean;
import com.application.zhangshi_app_android.bean.LoginRequestBean;
import com.application.zhangshi_app_android.bean.LoginResponseBean;
import com.application.zhangshi_app_android.bean.UploadFileResponseBean;
import java.io.File;
import java.util.List;
import java.util.Map;
import io.reactivex.Observable;
import io.reactivex.Observer;
import okhttp3.MultipartBody;
/**
 * @author Ljj
@@ -37,7 +42,7 @@
    /**
     * 获取家大事记
     */
    Observable<ResultData<FamilyMemorabiliaResponseBean>> getFamilyMemorabilia(Map<String, Object> queryMap);
    Observable<ResultData<FamilyMemorabiliaResponseBean>> getFamilyMemorabilia(Map<String,Object> paramsMap);
    /**
     * 增加家大事记
@@ -52,4 +57,18 @@
     * 修改
     */
    Observable<ResultData<String>> updateFamilyMemorabilia(FamilyMemorabiliaBean familyMemorabiliaBean);
    /**
     * 上传文件
     */
    Observable<ResultData<UploadFileResponseBean>> uploadFile(MultipartBody.Part file);
    /**
     * 获取家庭资产
     */
    Observable<ResultData<FamilyAssetsResponseBean>> getFamilyAssets(Map<String, Object> paramsMap);
    /**
     * 获取家庭设备
     */
    Observable<ResultData<HomeDevicesResponseBean>> getHomeDevices(Map<String, Object> paramsMap);
}
app/src/main/java/com/application/zhangshi_app_android/data/source/http/ApiService.java
@@ -2,21 +2,28 @@
import com.android.app_base.http.ResultData;
import com.application.zhangshi_app_android.bean.CaptchaImageBean;
import com.application.zhangshi_app_android.bean.FamilyAssetsResponseBean;
import com.application.zhangshi_app_android.bean.FamilyMemorabiliaBean;
import com.application.zhangshi_app_android.bean.FamilyMemorabiliaRequestBean;
import com.application.zhangshi_app_android.bean.FamilyMemorabiliaResponseBean;
import com.application.zhangshi_app_android.bean.HomeDevicesResponseBean;
import com.application.zhangshi_app_android.bean.LoginRequestBean;
import com.application.zhangshi_app_android.bean.LoginResponseBean;
import com.application.zhangshi_app_android.bean.UploadFileResponseBean;
import java.io.File;
import java.util.List;
import java.util.Map;
import io.reactivex.Observable;
import okhttp3.MultipartBody;
import retrofit2.http.Body;
import retrofit2.http.DELETE;
import retrofit2.http.GET;
import retrofit2.http.Multipart;
import retrofit2.http.POST;
import retrofit2.http.PUT;
import retrofit2.http.Part;
import retrofit2.http.Path;
import retrofit2.http.Query;
import retrofit2.http.QueryMap;
@@ -48,7 +55,7 @@
     * 获取家大事件
     */
    @GET("family/zfEvent/all")
    Observable<ResultData<FamilyMemorabiliaResponseBean>> getFamilyMemorabilia(@QueryMap Map<String,Object> queryMap);
    Observable<ResultData<FamilyMemorabiliaResponseBean>> getFamilyMemorabilia(@QueryMap Map<String,Object> paramsMap);
    /**
     * 增加家大事记
     */
@@ -66,4 +73,22 @@
    Observable<ResultData<String>> updateFamilyMemorabilia(@Body FamilyMemorabiliaBean familyMemorabiliaBean);
    /**
     * 上传文件
     */
    @Multipart
    @POST("/common/upload")
    Observable<ResultData<UploadFileResponseBean>> uploadFile(@Part MultipartBody.Part file);
    /**
     * 获取家庭资产
     */
    @GET("/family/property/all")
    Observable<ResultData<FamilyAssetsResponseBean>> getFamilyAssets(@QueryMap Map<String, Object> paramsMap);
    /**
     * 获取家庭设备
     */
    @GET("")//TODO 获取家庭设备
    Observable<ResultData<HomeDevicesResponseBean>> getHomeDevices(@QueryMap Map<String, Object> paramsMap);
}
app/src/main/java/com/application/zhangshi_app_android/data/source/http/HttpDataSourceImpl.java
@@ -3,16 +3,21 @@
import com.android.app_base.http.ResultData;
import com.android.app_base.http.RetrofitManager;
import com.application.zhangshi_app_android.bean.CaptchaImageBean;
import com.application.zhangshi_app_android.bean.FamilyAssetsResponseBean;
import com.application.zhangshi_app_android.bean.FamilyMemorabiliaBean;
import com.application.zhangshi_app_android.bean.FamilyMemorabiliaRequestBean;
import com.application.zhangshi_app_android.bean.FamilyMemorabiliaResponseBean;
import com.application.zhangshi_app_android.bean.HomeDevicesResponseBean;
import com.application.zhangshi_app_android.bean.LoginRequestBean;
import com.application.zhangshi_app_android.bean.LoginResponseBean;
import com.android.app_base.base.BaseConfig;
import com.application.zhangshi_app_android.bean.UploadFileResponseBean;
import com.application.zhangshi_app_android.data.source.HttpDataSource;
import java.util.Map;
import io.reactivex.Observable;
import okhttp3.MultipartBody;
/**
 * @author Ljj
@@ -71,8 +76,8 @@
     * 获取家大事记
     */
    @Override
    public Observable<ResultData<FamilyMemorabiliaResponseBean>> getFamilyMemorabilia(Map<String, Object> queryMap) {
        return apiService.getFamilyMemorabilia(queryMap);
    public Observable<ResultData<FamilyMemorabiliaResponseBean>> getFamilyMemorabilia(Map<String,Object> paramsMap) {
        return apiService.getFamilyMemorabilia(paramsMap);
    }
    /**
     * 增加家大事记
@@ -96,4 +101,28 @@
    public Observable<ResultData<String>> updateFamilyMemorabilia(FamilyMemorabiliaBean familyMemorabiliaBean) {
        return apiService.updateFamilyMemorabilia(familyMemorabiliaBean);
    }
    /**
     * 上传文件
     */
    @Override
    public Observable<ResultData<UploadFileResponseBean>> uploadFile(MultipartBody.Part file) {
        return apiService.uploadFile(file);
    }
    /**
     * 获取家庭资产
     */
    @Override
    public Observable<ResultData<FamilyAssetsResponseBean>> getFamilyAssets(Map<String, Object> paramsMap) {
        return apiService.getFamilyAssets(paramsMap);
    }
    /**
     * 获取家庭设备
     */
    @Override
    public Observable<ResultData<HomeDevicesResponseBean>> getHomeDevices(Map<String, Object> paramsMap) {
        return apiService.getHomeDevices(paramsMap);
    }
}
app/src/main/java/com/application/zhangshi_app_android/other/MyTitleBarStyle.java
New file
@@ -0,0 +1,82 @@
package com.application.zhangshi_app_android.other;
import android.content.Context;
import android.content.res.ColorStateList;
import android.graphics.drawable.ColorDrawable;
import android.graphics.drawable.Drawable;
import android.util.TypedValue;
import android.widget.TextView;
import androidx.appcompat.content.res.AppCompatResources;
import com.android.app_base.utils.ScreenSizeUtils;
import com.application.zhangshi_app_android.R;
import com.hjq.bar.style.CommonBarStyle;
/**
 * @author Ljj
 * @date 2023.03.30. 20:11
 * @desc TitleBar统一样式
 */
public class MyTitleBarStyle extends CommonBarStyle {
    @Override
    public TextView createLeftView(Context context) {
        return super.createLeftView(context);
    }
    @Override
    public Drawable getTitleBarBackground(Context context) {
        return new ColorDrawable(context.getColor(R.color.color_title_bar_background));
    }
    @Override
    public Drawable getLeftTitleBackground(Context context) {
        return null;
    }
    @Override
    public Drawable getRightTitleBackground(Context context) {
        return null;
    }
    @Override
    public Drawable getBackButtonDrawable(Context context) {
        return AppCompatResources.getDrawable(context,R.drawable.ic_menu);
    }
    @Override
    public ColorStateList getTitleColor(Context context) {
        return ColorStateList.valueOf(0xFFFFFFFF);
    }
    @Override
    public ColorStateList getLeftTitleColor(Context context) {
        return null;
    }
    @Override
    public ColorStateList getRightTitleColor(Context context) {
        return null;
    }
    @Override
    public Drawable getLineDrawable(Context context) {
        return null;
    }
    @Override
    public int getLeftHorizontalPadding(Context context) {
        return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 16, context.getResources().getDisplayMetrics());
    }
    @Override
    public float getTitleSize(Context context) {
        return TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP, 20, context.getResources().getDisplayMetrics());
    }
    @Override
    public int getLeftIconPadding(Context context) {
        return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 16, context.getResources().getDisplayMetrics());
    }
}
app/src/main/java/com/application/zhangshi_app_android/ui/DLBaseActivity.java
New file
@@ -0,0 +1,126 @@
package com.application.zhangshi_app_android.ui;
import android.graphics.Color;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
import androidx.annotation.Nullable;
import androidx.databinding.DataBindingUtil;
import androidx.databinding.ViewDataBinding;
import androidx.drawerlayout.widget.DrawerLayout;
import com.android.app_base.base.view.BaseActivity;
import com.android.app_base.base.viewmodel.BaseViewModel;
import com.android.app_base.manager.AppManager;
import com.application.zhangshi_app_android.R;
import com.application.zhangshi_app_android.ui.function.FamilyAssetsActivity;
import com.application.zhangshi_app_android.ui.function.FamilyMemorabiliaActivity;
import com.application.zhangshi_app_android.ui.function.HomeDevicesActivity;
import com.hjq.bar.TitleBar;
import java.util.HashMap;
import java.util.Map;
/**
 * @author Ljj
 * @date 2023.04.01. 18:21
 * @desc 该APP里统一侧拉栏的Activity基类
 */
public abstract class DLBaseActivity<VDB extends ViewDataBinding,VM extends BaseViewModel> extends BaseActivity<VDB,VM> {
    /**
     * 侧拉栏
     */
    private DrawerLayout mDrawerLayout;
    private Map<Class,LinearLayout> classMap = new HashMap<>();
    @Override
    protected VDB initViewBinding() {
        if (isDrawerLayoutEnabled()){
            mDrawerLayout = new DrawerLayout(this);
            mDrawerLayout.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT));
            VDB mBinding = DataBindingUtil.inflate(getLayoutInflater(), getLayoutId(), mDrawerLayout, true);
            if (getDrawerLayoutId() > 0){
                getLayoutInflater().inflate(getDrawerLayoutId(), mDrawerLayout, true);
            }else {
                throw new IllegalArgumentException("没给侧拉栏布局就不要开启侧拉栏啦");
            }
            setContentView(mDrawerLayout);
            return mBinding;
        }
        return super.initViewBinding();
    }
    /**
     * 是否开启侧拉栏
     */
    protected boolean isDrawerLayoutEnabled() {
        return true;
    }
    /**
     * 获取侧拉栏的id
     * @return layout的id
     */
    protected int getDrawerLayoutId(){
        return R.layout.layout_drawer;
    };
    @Override
    protected void onResume() {
        super.onResume();
        if (mDrawerLayout != null) {
            classMap.put(null,(LinearLayout) findViewById(R.id.dl_home_root_net));
            classMap.put(FamilyMemorabiliaActivity.class,(LinearLayout) findViewById(R.id.dl_family_memorabilia));
            classMap.put(FamilyAssetsActivity.class,(LinearLayout) findViewById(R.id.dl_family_assets));
            classMap.put(HomeDevicesActivity.class,(LinearLayout) findViewById(R.id.dl_home_devices));
            classMap.put(null,(LinearLayout) findViewById(R.id.dl_honor_collection));
            classMap.put(null,(LinearLayout) findViewById(R.id.dl_little_doctor));
            classMap.put(null,(LinearLayout) findViewById(R.id.dl_clean_storage));
            classMap.put(null,(LinearLayout) findViewById(R.id.dl_contacts));
            classMap.put(null,(LinearLayout) findViewById(R.id.dl_pet));
            classMap.put(null,(LinearLayout) findViewById(R.id.dl_income_and_expenses));
            classMap.put(null,(LinearLayout) findViewById(R.id.dl_growing_up));
            classMap.put(null,(LinearLayout) findViewById(R.id.dl_marriage));
            classMap.put(null,(LinearLayout) findViewById(R.id.dl_property));
            classMap.put(null,(LinearLayout) findViewById(R.id.dl_hundred_wish));
            classMap.put(null,(LinearLayout) findViewById(R.id.dl_health_care));
            classMap.put(null,(LinearLayout) findViewById(R.id.dl_certificate_of_honor));
            classMap.put(null,(LinearLayout) findViewById(R.id.dl_privacy));
            setSelectItem(classMap.get(getClass()));
            for (Map.Entry<Class, LinearLayout> set : classMap.entrySet()) {
                set.getValue().setOnClickListener(v -> {
                    if (set.getKey() != null){
                        AppManager.getAppManager().startActivity(set.getKey());
                    }
                });
            }
            mDrawerLayout.setScrimColor(getResources().getColor(R.color.color_shadow));
        }
    }
    private void setSelectItem(LinearLayout linearLayout) {
        if (linearLayout == null){
            return;
        }
        TextView textView = (TextView) linearLayout.getChildAt(1);
        ImageView imageView = (ImageView) linearLayout.getChildAt(2);
        textView.setTextColor(Color.parseColor("#FFF6739F"));
        imageView.setBackgroundResource(R.drawable.ic_vector_pink);
    }
    /**
     * 获取DrawerLayout
     */
    @Nullable
    public DrawerLayout getDrawerLayout() {
        return mDrawerLayout;
    }
    @Override
    public void onLeftClick(TitleBar titleBar) {
        super.onRightClick(titleBar);
        mDrawerLayout.open();
    }
}
app/src/main/java/com/application/zhangshi_app_android/ui/function/CreateFamilyProjectActivity.java
@@ -1,39 +1,47 @@
package com.application.zhangshi_app_android.ui.function;
import android.graphics.drawable.ColorDrawable;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.EditText;
import android.widget.PopupWindow;
import androidx.annotation.Nullable;
import androidx.databinding.DataBindingUtil;
import androidx.recyclerview.widget.GridLayoutManager;
import com.android.app_base.base.BaseConfig;
import com.android.app_base.base.dialog.BaseDialog;
import com.android.app_base.base.dialog.UIDialog;
import com.android.app_base.base.view.BaseActivity;
import com.android.app_base.manager.UserManager;
import com.android.app_base.utils.ScreenSizeUtils;
import com.android.app_base.utils.ToastUtils;
import com.android.app_base.widget.LinearItemDecoration;
import com.application.zhangshi_app_android.BR;
import com.application.zhangshi_app_android.R;
import com.application.zhangshi_app_android.adapter.ImageRvAdapter;
import com.application.zhangshi_app_android.bean.FamilyMemorabiliaBean;
import com.application.zhangshi_app_android.databinding.ItemFamilyCreateBinding;
import com.application.zhangshi_app_android.databinding.ActivityFamilyMemorabiliaCreateBinding;
import com.luck.picture.lib.entity.LocalMedia;
import com.luck.picture.lib.interfaces.OnResultCallbackListener;
import java.io.File;
import java.util.ArrayList;
import java.util.function.Consumer;
/**
 * @author Gss
 * @date 2023.03.25. 16:00
 * @desc 家大事记 CreateFamilyProjectActivity
 */
public class CreateFamilyProjectActivity extends BaseActivity<ItemFamilyCreateBinding,CreateFamilyProjectActivityViewModel> {
public class CreateFamilyProjectActivity extends BaseActivity<ActivityFamilyMemorabiliaCreateBinding,CreateFamilyProjectActivityViewModel> {
    private int type;
    private int operateType;
    private PopupWindow popupWindow;
    private FamilyMemorabiliaBean bean;
    private ImageRvAdapter adapter;
    @Override
    public int getLayoutId() {
        return R.layout.item_family_create;
        return R.layout.activity_family_memorabilia_create;
    }
    @Override
@@ -45,7 +53,7 @@
    public void initParam() {
        type = getIntent().getIntExtra(BaseConfig.EXTRA_TYPE,0);
        if (type == 0){
            FamilyMemorabiliaBean bean = (FamilyMemorabiliaBean) getIntent().getSerializableExtra("bean");
            bean = (FamilyMemorabiliaBean) getIntent().getSerializableExtra("bean");
            if (bean!=null){
                viewModel.getBeanMutableLiveData().postValue(bean);
            }
@@ -54,13 +62,43 @@
    @Override
    public void initView() {
        adapter = new ImageRvAdapter(this);
        GridLayoutManager gridLayoutManager = new GridLayoutManager(this, 3);
        binding.rvImage.setLayoutManager(gridLayoutManager);
        binding.rvImage.setNestedScrollingEnabled(false);
        View footerView = View.inflate(this,R.layout.item_image_footer,null);
        binding.rvImage.addFooterView(footerView);
        footerView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                UserManager.getInstance().selectImage(getSelfActivity(), 9, new OnResultCallbackListener<LocalMedia>() {
                    @Override
                    public void onResult(ArrayList<LocalMedia> result) {
                        if (result.size() == 0) return;
                        for (LocalMedia media : result) {
                            String path = media.getRealPath();
                            File file = new File(path);
                            if (file.exists()) {
                                viewModel.uploadFile(file);
                            }
                        }
                    }
                    @Override
                    public void onCancel() {
                    }
                });
            }
        });
        binding.rvImage.setAdapter(adapter);
        if (type == 1){
            binding.ivOperate.setBackgroundResource(R.drawable.ic_operate_finish);
            viewModel.getTypeLiveData().postValue(true);
            binding.ivOperate.setOnClickListener(v -> {
                viewModel.add();
            });
        }else {
            binding.ivOperate.setBackgroundResource(R.drawable.ic_operate);
            popupWindow = new PopupWindow(this);
            // 设置布局文件
            popupWindow.setContentView(LayoutInflater.from(this).inflate(R.layout.pop_operate_delete, null));
@@ -78,18 +116,10 @@
            // 设置点击pop外侧消失,默认为false;在focusable为true时点击外侧始终消失
            popupWindow.setOutsideTouchable(true);
            binding.ivOperate.setOnClickListener(v -> {
                if (operateType == 0){
                    popupWindow.showAsDropDown(binding.ivOperate,-ScreenSizeUtils.dip2px(this,85) +binding.ivOperate.getWidth(),0);
                }else{
                    viewModel.update();
                }
            });
            popupWindow.getContentView().findViewById(R.id.tv_modify).setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    binding.ivOperate.setBackgroundResource(R.drawable.ic_operate_finish);
                    operateType = 1;
                    viewModel.getTypeLiveData().postValue(true);
                    popupWindow.dismiss();
                }
            });
@@ -111,7 +141,9 @@
                            .show();
                }
            });
            viewModel.getTypeLiveData().postValue(false);
        }
    }
    @Override
@@ -122,8 +154,62 @@
    @Override
    public void initLiveDataObserve() {
        viewModel.getBeanMutableLiveData().observe(this,bean -> {
            if (bean!=null){
                bean.setUrl(bean.getUrl());
                adapter.setData(bean.getUrlList());
            }
        });
        viewModel.getTypeLiveData().observe(this,operateType -> {
            if (operateType){
                if (type == 1) {
                    binding.ivOperate.setOnClickListener(v -> {
                        viewModel.add();
                    });
                }else {
                    binding.ivOperate.setOnClickListener(v -> {
                        viewModel.update();
                    });
                }
                binding.rvImage.getFooterViews().forEach(new Consumer<View>() {
                    @Override
                    public void accept(View view) {
                        view.setVisibility(View.VISIBLE);
                    }
                });
                setIsEdited(true);
            }else {
                binding.ivOperate.setOnClickListener(v -> {
                    popupWindow.showAsDropDown(binding.ivOperate,-ScreenSizeUtils.dip2px(this,85) +binding.ivOperate.getWidth(),0);
                });
                binding.rvImage.getFooterViews().forEach(new Consumer<View>() {
                    @Override
                    public void accept(View view) {
                        view.setVisibility(View.GONE);
                    }
                });
                setIsEdited(false);
            }
        });
    }
    public void setIsEdited(boolean isEdited){
        disableAllEditText(getContentView(),isEdited);
        adapter.setIsEdited(isEdited);
    }
    public void disableAllEditText(ViewGroup viewGroup,boolean isEdited) {
        for (int i = 0; i < viewGroup.getChildCount(); i++) {
            View child = viewGroup.getChildAt(i);
            if (child instanceof ViewGroup) {
                disableAllEditText((ViewGroup) child,isEdited);
            } else if (child instanceof EditText) {
                child.setEnabled(isEdited);
                child.setFocusable(isEdited);
                child.setFocusableInTouchMode(isEdited);
                if (!isEdited){
                    child.clearFocus();
                }
            }
        }
    }
}
app/src/main/java/com/application/zhangshi_app_android/ui/function/CreateFamilyProjectActivityViewModel.java
@@ -11,19 +11,22 @@
import com.android.app_base.http.ResultData;
import com.android.app_base.manager.AppManager;
import com.android.app_base.utils.RxUtils;
import com.android.app_base.utils.ToastUtils;
import com.application.zhangshi_app_android.bean.FamilyMemorabiliaBean;
import com.application.zhangshi_app_android.bean.UploadFileResponseBean;
import com.application.zhangshi_app_android.data.DataRepository;
import java.util.ArrayList;
import java.util.List;
import java.io.File;
import io.reactivex.Observer;
import io.reactivex.disposables.Disposable;
import okhttp3.MediaType;
import okhttp3.MultipartBody;
import okhttp3.RequestBody;
public class CreateFamilyProjectActivityViewModel extends BaseViewModel<DataRepository> {
    private MutableLiveData<FamilyMemorabiliaBean> beanMutableLiveData;
    private MutableLiveData<Boolean> typeLiveData;//true 编辑状态 false 展示状态
    public CreateFamilyProjectActivityViewModel(@NonNull Application application) {
        super(application);
    }
@@ -49,6 +52,7 @@
                    public void onNext(ResultData<String> stringResultData) {
                        if (stringResultData.getCode() == CODE_SUCCESS){
                            messageLiveData.postValue("添加成功");
                            AppManager.getAppManager().finishCurrentActivity();
                        }else {
                            messageLiveData.postValue(stringResultData.getMsg());
                        }
@@ -136,10 +140,72 @@
        if (beanMutableLiveData == null){
            beanMutableLiveData = new MutableLiveData<>();
        }
        if (beanMutableLiveData.getValue() == null){
            beanMutableLiveData.setValue(new FamilyMemorabiliaBean());
        }
        return beanMutableLiveData;
    }
    public void setBeanMutableLiveData(MutableLiveData<FamilyMemorabiliaBean> beanMutableLiveData) {
        this.beanMutableLiveData = beanMutableLiveData;
    }
    public MutableLiveData<Boolean> getTypeLiveData() {
        if (typeLiveData == null){
            typeLiveData = new MutableLiveData<>();
        }
        return typeLiveData;
    }
    public void setTypeLiveData(MutableLiveData<Boolean> typeLiveData) {
        this.typeLiveData = typeLiveData;
    }
    /**
     * 上传电子文件
     */
    public void uploadFile(File file) {
        RequestBody requestBody = RequestBody.create(MediaType.parse("multipart/form-data"), file);
        MultipartBody.Part body = MultipartBody.Part.createFormData("uploadFile", file.getName(), requestBody);
        model.uploadFile(body)
                .compose(RxUtils.schedulersTransformer())
                .subscribe(new Observer<ResultData<UploadFileResponseBean>>() {
                    @Override
                    public void onSubscribe(Disposable d) {
                        addSubscribe(d);
                    }
                    @Override
                    public void onNext(ResultData<UploadFileResponseBean> resultData) {
                        if (resultData.getCode() == CODE_SUCCESS){
                            FamilyMemorabiliaBean bean = getBeanMutableLiveData().getValue();
                            String url;
                            if (bean != null){
                                url = bean.getUrl();
                                if (url == null){
                                    url = resultData.getData().getUrl();
                                }else {
                                    url = url + "," + resultData.getData().getUrl();
                                }
                                bean.setUrl(url);
                                beanMutableLiveData.postValue(bean);
                            }
                        }else {
                            messageLiveData.postValue(resultData.getMsg());
                        }
                    }
                    @Override
                    public void onError(Throwable e) {
                        messageLiveData.postValue(e.getMessage());
                    }
                    @Override
                    public void onComplete() {
                    }
                });
    }
}
app/src/main/java/com/application/zhangshi_app_android/ui/function/FamilyAssetsActivity.java
New file
@@ -0,0 +1,105 @@
package com.application.zhangshi_app_android.ui.function;
import android.graphics.drawable.ColorDrawable;
import android.view.View;
import android.view.ViewGroup;
import android.widget.PopupWindow;
import androidx.databinding.library.baseAdapters.BR;
import androidx.lifecycle.Observer;
import com.android.app_base.utils.ScreenSizeUtils;
import com.android.app_base.widget.LinearItemDecoration;
import com.application.zhangshi_app_android.R;
import com.application.zhangshi_app_android.adapter.FamilyAssetsRvAdapter;
import com.application.zhangshi_app_android.adapter.FamilyMemorabiliaRvAdapter;
import com.application.zhangshi_app_android.bean.FamilyMemorabiliaBean;
import com.application.zhangshi_app_android.databinding.ActivityFamilyAssetsBinding;
import com.application.zhangshi_app_android.ui.DLBaseActivity;
import java.util.List;
/**
 * @author Ljj
 * @date 2023.04.03. 19:40
 * @desc
 */
public class FamilyAssetsActivity extends DLBaseActivity<ActivityFamilyAssetsBinding,FamilyAssetsActivityViewModel> {
    private FamilyAssetsRvAdapter adapter;
    private PopupWindow mOperatePopupWindow;
    @Override
    public int getLayoutId() {
        return R.layout.activity_family_assets;
    }
    @Override
    public int getVariableId() {
        return BR.viewModel;
    }
    @Override
    public void initParam() {
    }
    @Override
    public void initView() {
        adapter = new FamilyAssetsRvAdapter(this);
        LinearItemDecoration itemDecoration = new LinearItemDecoration();
        itemDecoration.setBottomSpace((int) getResources().getDimension(com.android.app_base.R.dimen.dp_12));
        itemDecoration.setHorizontalSpace((int) getResources().getDimension(com.android.app_base.R.dimen.dp_20));
        itemDecoration.setFirstTop((int) getResources().getDimension(com.android.app_base.R.dimen.dp_20));
        binding.recyclerView.addItemDecoration(itemDecoration);
        binding.recyclerView.setAdapter(adapter);
        mOperatePopupWindow = initPopUpWindow(View.inflate(this,R.layout.pop_operate,null));
        mOperatePopupWindow.getContentView().findViewById(R.id.layout_add).setVisibility(View.GONE);
        mOperatePopupWindow.getContentView().findViewById(R.id.layout_select).setVisibility(View.GONE);
        mOperatePopupWindow.getContentView().findViewById(R.id.tv_from_new_to_old).setOnClickListener(v -> {
            viewModel.sortDataList(0);
            mOperatePopupWindow.dismiss();
        });
        mOperatePopupWindow.getContentView().findViewById(R.id.tv_from_old_to_new).setOnClickListener(v -> {
            viewModel.sortDataList(1);
            mOperatePopupWindow.dismiss();
        });
        binding.ivOperate.setOnClickListener(v -> {
            mOperatePopupWindow.showAsDropDown(binding.ivOperate,-ScreenSizeUtils.dip2px(this,85) +binding.ivOperate.getWidth(),0);
        });
    }
    @Override
    public void initData() {
        viewModel.getFamilyAssets();
    }
    @Override
    public void initLiveDataObserve() {
        viewModel.getDataListLiveData().observe(this, familyAssetsBeans -> {
            adapter.setData(familyAssetsBeans);
        });
    }
    private PopupWindow initPopUpWindow(View view){
        PopupWindow popupWindow = new PopupWindow(this);
        // 设置布局文件
        popupWindow.setContentView(view);
        // 为了避免部分机型不显示,需要重新设置一下宽高
        popupWindow.setWidth(ViewGroup.LayoutParams.WRAP_CONTENT);
        popupWindow.setHeight(ViewGroup.LayoutParams.WRAP_CONTENT);
        // 设置pop透明效果
        popupWindow.setBackgroundDrawable(new ColorDrawable(0x0000));
        // 设置pop出入动画
        popupWindow.setAnimationStyle(com.android.app_base.R.style.pop_add);
        // 设置pop获取焦点,如果为false点击返回按钮会退出当前Activity,如果pop中有Editor的话,focusable必须要为true
        popupWindow.setFocusable(true);
        // 设置pop可点击,为false点击事件无效,默认为true
        popupWindow.setTouchable(true);
        // 设置点击pop外侧消失,默认为false;在focusable为true时点击外侧始终消失
        popupWindow.setOutsideTouchable(false);
        return popupWindow;
    }
}
app/src/main/java/com/application/zhangshi_app_android/ui/function/FamilyAssetsActivityViewModel.java
New file
@@ -0,0 +1,137 @@
package com.application.zhangshi_app_android.ui.function;
import static com.android.app_base.base.BaseConfig.CODE_SUCCESS;
import android.app.Application;
import androidx.annotation.NonNull;
import androidx.lifecycle.MutableLiveData;
import com.android.app_base.base.BaseConfig;
import com.android.app_base.base.StateViewEnum;
import com.android.app_base.base.viewmodel.BaseViewModel;
import com.android.app_base.http.ResultData;
import com.android.app_base.utils.RxUtils;
import com.application.zhangshi_app_android.bean.FamilyAssetsBean;
import com.application.zhangshi_app_android.bean.FamilyAssetsResponseBean;
import com.application.zhangshi_app_android.bean.FamilyMemorabiliaBean;
import com.application.zhangshi_app_android.bean.HomeDevicesBean;
import com.application.zhangshi_app_android.data.DataRepository;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Comparator;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import io.reactivex.Observer;
import io.reactivex.disposables.Disposable;
/**
 * @author Ljj
 * @date 2023.04.03. 19:41
 * @desc
 */
public class FamilyAssetsActivityViewModel extends BaseViewModel<DataRepository> {
    private MutableLiveData<List<FamilyAssetsBean>> checkListLiveData;//选中的数据
    private MutableLiveData<List<FamilyAssetsBean>> dataListLiveData;//所有数据
    public FamilyAssetsActivityViewModel(@NonNull Application application) {
        super(application);
    }
    @Override
    protected DataRepository initModel() {
        return DataRepository.getInstance();
    }
    public void getFamilyAssets(){
        model.getFamilyAssets(new HashMap<>())
                .compose(RxUtils.schedulersTransformer())
                .subscribe(new Observer<ResultData<FamilyAssetsResponseBean>>() {
                    @Override
                    public void onSubscribe(Disposable d) {
                        addSubscribe(d);
                    }
                    @Override
                    public void onNext(ResultData<FamilyAssetsResponseBean> data) {
                        if (data.getCode() == CODE_SUCCESS){
                            if (data.getData().getData().isEmpty()){
                                changeStateView(StateViewEnum.DATA_NULL);
                            }else {
                                changeStateView(StateViewEnum.HIDE);
                                dataListLiveData.postValue(data.getData().getData());
                            }
                        }else {
                            messageLiveData.postValue(data.getMsg());
                        }
                    }
                    @Override
                    public void onError(Throwable e) {
                        messageLiveData.postValue(e.getMessage());
                    }
                    @Override
                    public void onComplete() {
                    }
                });
    }
    public MutableLiveData<List<FamilyAssetsBean>> getCheckListLiveData() {
        return checkListLiveData;
    }
    public void setCheckListLiveData(MutableLiveData<List<FamilyAssetsBean>> checkListLiveData) {
        this.checkListLiveData = checkListLiveData;
    }
    public MutableLiveData<List<FamilyAssetsBean>> getDataListLiveData() {
        if (dataListLiveData == null){
            dataListLiveData = new MutableLiveData<>();
        }
        return dataListLiveData;
    }
    public void setDataListLiveData(MutableLiveData<List<FamilyAssetsBean>> dataListLiveData) {
        this.dataListLiveData = dataListLiveData;
    }
    public void sortDataList(int type){
        List<FamilyAssetsBean> list = dataListLiveData.getValue();
        if (list == null || list.isEmpty()){
            return;
        }
        list.sort(new Comparator<FamilyAssetsBean>() {
            @Override
            public int compare(FamilyAssetsBean o1, FamilyAssetsBean o2) {
                SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd", java.util.Locale.getDefault());
                Date date1 = null;
                Date date2 = null;
                try {
                    date1 = format.parse(o1.getCreateTime());
                    date2 = format.parse(o2.getCreateTime());
                } catch (ParseException e) {
                    throw new RuntimeException(e);
                }
                if (date1 != null && date2 != null) {
                    if (type == 0){
                        return date2.compareTo(date1);
                    }else {
                        return date1.compareTo(date2);
                    }
                }
                return 0;
            }
        });
        dataListLiveData.postValue(list);
    }
}
app/src/main/java/com/application/zhangshi_app_android/ui/function/FamilyAssetsDetailActivity.java
New file
@@ -0,0 +1,103 @@
package com.application.zhangshi_app_android.ui.function;
import android.view.View;
import android.view.ViewGroup;
import android.widget.EditText;
import androidx.recyclerview.widget.GridLayoutManager;
import com.application.zhangshi_app_android.BR;
import com.application.zhangshi_app_android.R;
import com.application.zhangshi_app_android.adapter.ImageRvAdapter;
import com.application.zhangshi_app_android.bean.FamilyAssetsBean;
import com.application.zhangshi_app_android.databinding.ActivityFamilyAssetsDetailBinding;
import com.application.zhangshi_app_android.ui.DLBaseActivity;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
/**
 * @author Ljj
 * @date 2023.04.03. 21:46
 * @desc
 */
public class FamilyAssetsDetailActivity extends DLBaseActivity<ActivityFamilyAssetsDetailBinding,FamilyAssetsDetailActivityViewModel> {
    private ImageRvAdapter adapter;
    @Override
    public int getLayoutId() {
        return R.layout.activity_family_assets_detail;
    }
    @Override
    public int getVariableId() {
        return BR.viewModel;
    }
    @Override
    public void initParam() {
        if (getIntent().hasExtra("bean")){
            viewModel.getBeanLiveData().setValue((FamilyAssetsBean) getIntent().getSerializableExtra("bean"));
        }
    }
    @Override
    public void initView() {
        adapter = new ImageRvAdapter(this);
        GridLayoutManager gridLayoutManager = new GridLayoutManager(this, 3);
        binding.rvImage.setLayoutManager(gridLayoutManager);
        binding.rvImage.setNestedScrollingEnabled(false);
        setIsEdited(false);
    }
    @Override
    public void initData() {
    }
    @Override
    public void initLiveDataObserve() {
        viewModel.getBeanLiveData().observe(this,bean -> {
            if (bean!=null){
                if (getTitleBar() != null){
                    getTitleBar().setTitle(bean.getHolder() + "的" + bean.getType());
                }
                String url = bean.getUrl();
                if (url == null||url.isEmpty()){
                    return;
                }
                List<String> list;
                if (url.contains(",")){
                    String[] split = url.split(",");
                    list = new ArrayList<>(Arrays.asList(split));
                }else {
                    list = new ArrayList<>();
                    list.add(url);
                }
                adapter.setData(list);
            }
        });
    }
    public void setIsEdited(boolean isEdited){
        disableAllEditText(getContentView(),isEdited);
        adapter.setIsEdited(isEdited);
    }
    public void disableAllEditText(ViewGroup viewGroup, boolean isEdited) {
        for (int i = 0; i < viewGroup.getChildCount(); i++) {
            View child = viewGroup.getChildAt(i);
            if (child instanceof ViewGroup) {
                disableAllEditText((ViewGroup) child,isEdited);
            } else if (child instanceof EditText) {
                child.setEnabled(isEdited);
                child.setFocusable(isEdited);
                child.setFocusableInTouchMode(isEdited);
                if (!isEdited){
                    child.clearFocus();
                }
            }
        }
    }
}
app/src/main/java/com/application/zhangshi_app_android/ui/function/FamilyAssetsDetailActivityViewModel.java
New file
@@ -0,0 +1,42 @@
package com.application.zhangshi_app_android.ui.function;
import android.app.Application;
import androidx.annotation.NonNull;
import androidx.lifecycle.MutableLiveData;
import com.android.app_base.base.viewmodel.BaseViewModel;
import com.application.zhangshi_app_android.bean.CaptchaImageBean;
import com.application.zhangshi_app_android.bean.FamilyAssetsBean;
import com.application.zhangshi_app_android.data.DataRepository;
/**
 * @author Ljj
 * @date 2023.04.03. 21:47
 * @desc
 */
public class FamilyAssetsDetailActivityViewModel extends BaseViewModel<DataRepository> {
    private MutableLiveData<FamilyAssetsBean> beanLiveData;
    public MutableLiveData<FamilyAssetsBean> getBeanLiveData() {
        if (beanLiveData == null){
            beanLiveData = new MutableLiveData<>();
        }
        return beanLiveData;
    }
    public void setBeanLiveData(MutableLiveData<FamilyAssetsBean> beanLiveData) {
        this.beanLiveData = beanLiveData;
    }
    public FamilyAssetsDetailActivityViewModel(@NonNull Application application) {
        super(application);
    }
    @Override
    protected DataRepository initModel() {
        return DataRepository.getInstance();
    }
}
app/src/main/java/com/application/zhangshi_app_android/ui/function/FamilyMemorabiliaActivity.java
@@ -15,6 +15,8 @@
import androidx.annotation.IdRes;
import androidx.annotation.LayoutRes;
import androidx.appcompat.app.AlertDialog;
import androidx.databinding.DataBindingUtil;
import androidx.databinding.ViewDataBinding;
import androidx.drawerlayout.widget.DrawerLayout;
import androidx.lifecycle.Observer;
@@ -30,6 +32,9 @@
import com.application.zhangshi_app_android.adapter.FamilyMemorabiliaRvAdapter;
import com.application.zhangshi_app_android.bean.FamilyMemorabiliaBean;
import com.application.zhangshi_app_android.databinding.ActivityFamilyMemorabiliaBinding;
import com.application.zhangshi_app_android.databinding.PopSearchBinding;
import com.application.zhangshi_app_android.ui.DLBaseActivity;
import com.hjq.bar.TitleBar;
import java.util.List;
@@ -38,13 +43,12 @@
 * @date 2023.03.18. 10:00
 * @desc 家大事记 Activity
 */
public class FamilyMemorabiliaActivity extends BaseActivity<ActivityFamilyMemorabiliaBinding,FamilyMemorabiliaActivityViewModel> {
public class FamilyMemorabiliaActivity extends DLBaseActivity<ActivityFamilyMemorabiliaBinding,FamilyMemorabiliaActivityViewModel> {
    FamilyMemorabiliaRvAdapter adapter;
    private PopupWindow mOperatePopupWindow;
    private PopupWindow mSearchPopupWindow;
    private int operateType = 0;
    private int searchType = 0;
    private PopSearchBinding mSearchPopBinding;
    @Override
    public int getLayoutId() {
@@ -71,33 +75,106 @@
        binding.recyclerView.addItemDecoration(itemDecoration);
        binding.recyclerView.setAdapter(adapter);
        mSearchPopBinding = DataBindingUtil.inflate(LayoutInflater.from(this), R.layout.pop_search, null, false);
        mSearchPopBinding.setViewModel(viewModel);
        mSearchPopupWindow = initPopUpWindow(mSearchPopBinding.getRoot());
        mOperatePopupWindow = initPopUpWindow(R.layout.pop_operate);
        mOperatePopupWindow.getContentView().findViewById(R.id.tv_add).setOnClickListener(v -> {
            AppManager.getAppManager().startActivity(new Intent(this,CreateFamilyProjectActivity.class).putExtra(BaseConfig.EXTRA_TYPE,1));
        mOperatePopupWindow = initPopUpWindow(View.inflate(this,R.layout.pop_operate,null));
        binding.ivSearchDefault.setOnClickListener(v -> {
            binding.layoutSearch.setVisibility(View.VISIBLE);
            binding.layoutDefault.setVisibility(View.GONE);
        });
        mOperatePopupWindow.getContentView().findViewById(R.id.tv_select).setOnClickListener(v -> {
            binding.ivOperate.setBackgroundResource(R.drawable.ic_operate_finish);
            operateType = 1;
            adapter.setCheckable(true);
            mOperatePopupWindow.dismiss();
        binding.ivSearchType.setOnClickListener(v -> {
            mSearchPopupWindow.setWidth(binding.layoutSearch.getMeasuredWidth());
            mSearchPopupWindow.showAsDropDown(binding.layoutSearch,0,0);
        });
        mOperatePopupWindow.getContentView().findViewById(R.id.tv_from_new_to_old).setOnClickListener(v -> {
            viewModel.changeOrder(true);
            mOperatePopupWindow.dismiss();
        binding.etSearch.setOnEditorActionListener(new TextView.OnEditorActionListener() {
            @Override
            public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
                if ((actionId == EditorInfo.IME_ACTION_UNSPECIFIED || actionId == EditorInfo.IME_ACTION_SEARCH)
                        && event != null) {
                    viewModel.getFamilyMemorabilia();
                    binding.layoutSearch.setVisibility(View.GONE);
                    binding.layoutDefault.setVisibility(View.VISIBLE);
                    binding.tvTitle.setText("搜索结果");
                    hideSoftKeyboard();
                    return true;
                }
                return false;
            }
        });
        mOperatePopupWindow.getContentView().findViewById(R.id.tv_from_old_to_new).setOnClickListener(v -> {
            viewModel.changeOrder(false);
            mOperatePopupWindow.dismiss();
        binding.ivSearch.setOnClickListener(v -> {
            viewModel.getFamilyMemorabilia();
            binding.layoutSearch.setVisibility(View.GONE);
            binding.layoutDefault.setVisibility(View.VISIBLE);
            binding.tvTitle.setText("搜索结果");
            mSearchPopupWindow.dismiss();
            hideSoftKeyboard();
        });
        binding.ivOperate.setOnClickListener(v -> {
            if (operateType == 0){
                mOperatePopupWindow.showAsDropDown(binding.ivOperate,-ScreenSizeUtils.dip2px(this,85) +binding.ivOperate.getWidth(),0);
            } else if (operateType == 1) {
        binding.fabAdd.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                AppManager.getAppManager().startActivity(new Intent(getSelfActivity(),CreateFamilyProjectActivity.class).putExtra(BaseConfig.EXTRA_TYPE,1));
            }
        });
        setOnClickListener(
                mSearchPopupWindow.getContentView().findViewById(R.id.iv_clear_person),
                mSearchPopupWindow.getContentView().findViewById(R.id.iv_clear_place),
                mSearchPopupWindow.getContentView().findViewById(R.id.iv_clear_time),
                mSearchPopupWindow.getContentView().findViewById(R.id.iv_clear_title),
                mOperatePopupWindow.getContentView().findViewById(R.id.tv_add),
                mOperatePopupWindow.getContentView().findViewById(R.id.tv_select),
                mOperatePopupWindow.getContentView().findViewById(R.id.tv_from_new_to_old),
                mOperatePopupWindow.getContentView().findViewById(R.id.tv_from_old_to_new)
                );
    }
    @Override
    public void initData() {
        viewModel.getFamilyMemorabilia();
    }
    @Override
    public void initLiveDataObserve() {
        viewModel.getCheckListLiveData().observe(this, new Observer<List<FamilyMemorabiliaBean>>() {
            @Override
            public void onChanged(List<FamilyMemorabiliaBean> familyMemorabiliaBeans) {
                if (viewModel.getOperateTypeLiveData().getValue() == 0){
                    return;
                }
                if (familyMemorabiliaBeans.isEmpty()){
                    viewModel.getOperateTypeLiveData().postValue(1);
                }else{
                    viewModel.getOperateTypeLiveData().postValue(2);
                }
            }
        });
        viewModel.getDataListLiveData().observe(this, new Observer<List<FamilyMemorabiliaBean>>() {
            @Override
            public void onChanged(List<FamilyMemorabiliaBean> familyMemorabiliaBeans) {
                adapter.setData(familyMemorabiliaBeans);
            }
        });
        viewModel.getOperateTypeLiveData().observe(this, integer -> {
            if (integer == 0){
                binding.ivOperate.setBackgroundResource(R.drawable.ic_operate);
                operateType = 0;
                binding.ivOperate.setOnClickListener(v -> {
                    mOperatePopupWindow.showAsDropDown(binding.ivOperate,-ScreenSizeUtils.dip2px(this,85) +binding.ivOperate.getWidth(),0);
                });
                adapter.setCheckable(false);
            } else {
            }else if (integer == 1){
                binding.ivOperate.setBackgroundResource(R.drawable.ic_operate_finish);
                binding.ivOperate.setOnClickListener(v -> {
                    viewModel.getOperateTypeLiveData().postValue(0);
                });
                adapter.setCheckable(true);
            }else if (integer == 2){
                binding.ivOperate.setBackgroundResource(R.drawable.ic_delete_white);
                new UIDialog.Builder(this)
                        .setTitle("您确定要删除项目吗")
                        .setContent("项目删除后将无法恢复")
@@ -110,90 +187,16 @@
                            }
                        })
                        .show();
            }
        });
        mSearchPopupWindow = initPopUpWindow(R.layout.pop_search);
        binding.ivSearchType.setOnClickListener(v -> {
            mSearchPopupWindow.showAsDropDown(binding.etSearch,0,0);
        });
        binding.ivSearchDefault.setOnClickListener(v -> {
            binding.layoutSearch.setVisibility(View.VISIBLE);
            binding.layoutDefault.setVisibility(View.GONE);
        });
        binding.fabAdd.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                AppManager.getAppManager().startActivity(new Intent(getSelfActivity(),CreateFamilyProjectActivity.class).putExtra(BaseConfig.EXTRA_TYPE,1));
            }
        });
        setOnClickListener(
                mSearchPopupWindow.getContentView().findViewById(R.id.tv_global_search),
                mSearchPopupWindow.getContentView().findViewById(R.id.tv_search_in_family_memorabilia),
                mSearchPopupWindow.getContentView().findViewById(R.id.tv_search_by_title),
                mSearchPopupWindow.getContentView().findViewById(R.id.tv_search_by_people),
                mSearchPopupWindow.getContentView().findViewById(R.id.tv_search_by_time),
                mSearchPopupWindow.getContentView().findViewById(R.id.tv_search_by_place));
        binding.etSearch.setOnEditorActionListener(new TextView.OnEditorActionListener() {
            @Override
            public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
                if ((actionId == EditorInfo.IME_ACTION_UNSPECIFIED || actionId == EditorInfo.IME_ACTION_SEARCH)
                        && event != null) {
                    viewModel.getFamilyMemorabilia(searchType);
                    hideSoftKeyboard();
                    return true;
                }
                return false;
            }
        });
        binding.ivMenu.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                binding.drawerLayout.open();
            }
        });
        binding.drawerLayout.setScrimColor(getResources().getColor(R.color.color_shadow));
    }
    @Override
    public void initData() {
        viewModel.getFamilyMemorabilia(searchType);
    }
    @Override
    public void initLiveDataObserve() {
        viewModel.getCheckListLiveData().observe(this, new Observer<List<FamilyMemorabiliaBean>>() {
            @Override
            public void onChanged(List<FamilyMemorabiliaBean> familyMemorabiliaBeans) {
                if (operateType == 0){
                    return;
                }
                if (familyMemorabiliaBeans.isEmpty()){
                    binding.ivOperate.setBackgroundResource(R.drawable.ic_operate_finish);
                    operateType = 1;
                }else{
                    binding.ivOperate.setBackgroundResource(R.drawable.ic_delete_white);
                    operateType = 2;
                }
            }
        });
        viewModel.getDataListLiveData().observe(this, new Observer<List<FamilyMemorabiliaBean>>() {
            @Override
            public void onChanged(List<FamilyMemorabiliaBean> familyMemorabiliaBeans) {
                adapter.setData(familyMemorabiliaBeans);
                adapter.setCheckable(true);
            }
        });
    }
    private PopupWindow initPopUpWindow(@LayoutRes int layoutId){
    private PopupWindow initPopUpWindow(View view){
        PopupWindow popupWindow = new PopupWindow(this);
        // 设置布局文件
        popupWindow.setContentView(LayoutInflater.from(this).inflate(layoutId, null));
        popupWindow.setContentView(view);
        // 为了避免部分机型不显示,需要重新设置一下宽高
        popupWindow.setWidth(ViewGroup.LayoutParams.WRAP_CONTENT);
        popupWindow.setHeight(ViewGroup.LayoutParams.WRAP_CONTENT);
@@ -206,7 +209,7 @@
        // 设置pop可点击,为false点击事件无效,默认为true
        popupWindow.setTouchable(true);
        // 设置点击pop外侧消失,默认为false;在focusable为true时点击外侧始终消失
        popupWindow.setOutsideTouchable(true);
        popupWindow.setOutsideTouchable(false);
        return popupWindow;
    }
@@ -218,32 +221,26 @@
    }
    @Override
    protected void hide() {
        super.hide();
        binding.layoutDataNull.setVisibility(View.GONE);
        binding.recyclerView.setVisibility(View.VISIBLE);
    }
    @Override
    public void onClick(View v) {
        int id = v.getId();
        if (id == R.id.tv_global_search){
            searchType = 0;
            binding.etSearch.setHint("全局搜索");
            mSearchPopupWindow.dismiss();
        }else if (id == R.id.tv_search_in_family_memorabilia) {
            searchType = 1;
            mSearchPopupWindow.dismiss();
            binding.etSearch.setHint("在“家大事记”内搜索");
        }else if (id == R.id.tv_search_by_title) {
            searchType = 2;
            mSearchPopupWindow.dismiss();
            binding.etSearch.setHint("按“大事记标题”搜索");
        }else if (id == R.id.tv_search_by_people) {
            searchType = 3;
            mSearchPopupWindow.dismiss();
            binding.etSearch.setHint("按“人物”搜索");
        }else if (id == R.id.tv_search_by_time) {
            searchType = 4;
            mSearchPopupWindow.dismiss();
            binding.etSearch.setHint("按“时间”搜索");
        }else if (id == R.id.tv_search_by_place) {
            searchType = 5;
            mSearchPopupWindow.dismiss();
            binding.etSearch.setHint("按“地点”搜索");
        if (id == R.id.tv_add){
            AppManager.getAppManager().startActivity(new Intent(this,CreateFamilyProjectActivity.class).putExtra(BaseConfig.EXTRA_TYPE,1));
        }else if (id == R.id.tv_select){
            viewModel.getOperateTypeLiveData().postValue(1);
            mOperatePopupWindow.dismiss();
        } else if (id == R.id.tv_from_new_to_old) {
            viewModel.changeOrder(true);
            mOperatePopupWindow.dismiss();
        } else if (id == R.id.tv_from_old_to_new) {
            viewModel.changeOrder(false);
            mOperatePopupWindow.dismiss();
        }
    }
}
app/src/main/java/com/application/zhangshi_app_android/ui/function/FamilyMemorabiliaActivityViewModel.java
@@ -11,13 +11,18 @@
import com.android.app_base.base.viewmodel.BaseViewModel;
import com.android.app_base.http.ResultData;
import com.android.app_base.utils.RxUtils;
import com.application.zhangshi_app_android.bean.FamilyAssetsBean;
import com.application.zhangshi_app_android.bean.FamilyMemorabiliaBean;
import com.application.zhangshi_app_android.bean.FamilyMemorabiliaRequestBean;
import com.application.zhangshi_app_android.bean.FamilyMemorabiliaResponseBean;
import com.application.zhangshi_app_android.data.DataRepository;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@@ -32,9 +37,11 @@
 */
public class FamilyMemorabiliaActivityViewModel extends BaseViewModel<DataRepository> {
    private MutableLiveData<List<FamilyMemorabiliaBean>> checkListLiveData;
    private MutableLiveData<List<FamilyMemorabiliaBean>> dataListLiveData;
    private MutableLiveData<String> stringMutableLiveData;
    private MutableLiveData<List<FamilyMemorabiliaBean>> checkListLiveData;//选中的数据
    private MutableLiveData<List<FamilyMemorabiliaBean>> dataListLiveData;//所有数据
    private MutableLiveData<Integer> operateTypeLiveData;//操作类型 0 选择操作 1.完成 2.删除
    private MutableLiveData<FamilyMemorabiliaRequestBean> requestBeanMutableLiveData;
    public FamilyMemorabiliaActivityViewModel(@NonNull Application application) {
        super(application);
    }
@@ -46,24 +53,11 @@
    /**
     * 获取家大事记
     */
    public void getFamilyMemorabilia(int searchType) {
        Map<String, Object> queryMap = new HashMap<>();
        queryMap.put("pageNum",1);
        queryMap.put("pageSize",20);
        if (searchType == 1){
            queryMap.put("remark",stringMutableLiveData.getValue());
        } else if (searchType == 2) {
            queryMap.put("title",stringMutableLiveData.getValue());
        }else if (searchType == 3) {
            queryMap.put("people",stringMutableLiveData.getValue());
    public void getFamilyMemorabilia() {
        if (getRequestBeanMutableLiveData().getValue() == null){
            getRequestBeanMutableLiveData().setValue(new FamilyMemorabiliaRequestBean());
        }
        else if (searchType == 4) {
            queryMap.put("createTime",stringMutableLiveData.getValue());
        }
        else if (searchType == 5) {
            queryMap.put("address",stringMutableLiveData.getValue());
        }
        model.getFamilyMemorabilia(queryMap)
        model.getFamilyMemorabilia(getRequestBeanMutableLiveData().getValue().getMap())
                .compose(RxUtils.schedulersTransformer())
                .subscribe(new Observer<ResultData<FamilyMemorabiliaResponseBean>>() {
                    @Override
@@ -77,6 +71,7 @@
                            if (data.getData().getData().isEmpty()){
                                changeStateView(StateViewEnum.DATA_NULL);
                            }else {
                                changeStateView(StateViewEnum.HIDE);
                                dataListLiveData.postValue(data.getData().getData());
                            }
                        }else {
@@ -168,35 +163,60 @@
        this.dataListLiveData = dataListLiveData;
    }
    public MutableLiveData<String> getStringMutableLiveData() {
        if (stringMutableLiveData == null){
            stringMutableLiveData = new MutableLiveData<>();
    @NonNull
    public MutableLiveData<FamilyMemorabiliaRequestBean> getRequestBeanMutableLiveData() {
        if (requestBeanMutableLiveData == null){
            requestBeanMutableLiveData = new MutableLiveData<>();
        }
        return stringMutableLiveData;
        if (requestBeanMutableLiveData.getValue()==null){
            requestBeanMutableLiveData.postValue(new FamilyMemorabiliaRequestBean());
        }
        return requestBeanMutableLiveData;
    }
    public void setStringMutableLiveData(MutableLiveData<String> stringMutableLiveData) {
        this.stringMutableLiveData = stringMutableLiveData;
    public void setRequestBeanMutableLiveData(MutableLiveData<FamilyMemorabiliaRequestBean> requestBeanMutableLiveData) {
        this.requestBeanMutableLiveData = requestBeanMutableLiveData;
    }
    public MutableLiveData<Integer> getOperateTypeLiveData() {
        if (operateTypeLiveData == null){
            operateTypeLiveData = new MutableLiveData<>();
            operateTypeLiveData.setValue(0);
        }
        return operateTypeLiveData;
    }
    public void setOperateTypeLiveData(MutableLiveData<Integer> operateTypeLiveData) {
        this.operateTypeLiveData = operateTypeLiveData;
    }
    public void changeOrder(boolean b) {
        List<FamilyMemorabiliaBean> dataList = getDataListLiveData().getValue();
        if (dataList == null) return;
        if (b){
            dataList.sort(new Comparator<FamilyMemorabiliaBean>() {
                @Override
                public int compare(FamilyMemorabiliaBean o1, FamilyMemorabiliaBean o2) {
                    return (int) (o1.getId() - o2.getId());
                }
            });
        }else {
            dataList.sort(new Comparator<FamilyMemorabiliaBean>() {
                @Override
                public int compare(FamilyMemorabiliaBean o1, FamilyMemorabiliaBean o2) {
                    return (int) (o2.getId() - o1.getId());
                }
            });
        List<FamilyMemorabiliaBean> list = getDataListLiveData().getValue();
        if (list == null || list.isEmpty()){
            return;
        }
        getDataListLiveData().postValue(dataList);
        list.sort(new Comparator<FamilyMemorabiliaBean>() {
            @Override
            public int compare(FamilyMemorabiliaBean o1, FamilyMemorabiliaBean o2) {
                SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd", java.util.Locale.getDefault());
                Date date1 = null;
                Date date2 = null;
                try {
                    date1 = format.parse(o1.getCreateTime());
                    date2 = format.parse(o2.getCreateTime());
                } catch (ParseException e) {
                    throw new RuntimeException(e);
                }
                if (date1 != null && date2 != null) {
                    if (b){
                        return date2.compareTo(date1);
                    }else {
                        return date1.compareTo(date2);
                    }
                }
                return 0;
            }
        });
        getDataListLiveData().postValue(list);
    }
}
app/src/main/java/com/application/zhangshi_app_android/ui/function/FunctionFragment.java
@@ -47,6 +47,24 @@
                AppManager.getAppManager().startActivity(FamilyMemorabiliaActivity.class);
            }
        });
        binding.layoutGrowingUp.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                AppManager.getAppManager().startActivity(GrowthExperienceActivity.class);
            }
        });
        binding.layoutFamilyAssets.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                AppManager.getAppManager().startActivity(FamilyAssetsActivity.class);
            }
        });
        binding.layoutHomeDevices.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                AppManager.getAppManager().startActivity(HomeDevicesActivity.class);
            }
        });
    }
    @Override
app/src/main/java/com/application/zhangshi_app_android/ui/function/HomeDevicesActivity.java
New file
@@ -0,0 +1,99 @@
package com.application.zhangshi_app_android.ui.function;
import android.graphics.drawable.ColorDrawable;
import android.view.View;
import android.view.ViewGroup;
import android.widget.PopupWindow;
import com.android.app_base.utils.ScreenSizeUtils;
import com.android.app_base.widget.LinearItemDecoration;
import com.application.zhangshi_app_android.BR;
import com.application.zhangshi_app_android.R;
import com.application.zhangshi_app_android.adapter.FamilyAssetsRvAdapter;
import com.application.zhangshi_app_android.adapter.HomeDevicesRvAdapter;
import com.application.zhangshi_app_android.databinding.ActivityHomeDevicesBinding;
import com.application.zhangshi_app_android.ui.DLBaseActivity;
/**
 * @author Ljj
 * @date 2023.04.04. 0:00
 * @desc 家庭设备
 */
public class HomeDevicesActivity extends DLBaseActivity<ActivityHomeDevicesBinding,HomeDevicesActivityViewModel> {
    private HomeDevicesRvAdapter adapter;
    private PopupWindow mOperatePopupWindow;
    @Override
    public int getLayoutId() {
        return R.layout.activity_home_devices;
    }
    @Override
    public int getVariableId() {
        return BR.viewModel;
    }
    @Override
    public void initParam() {
    }
    @Override
    public void initView() {
        adapter = new HomeDevicesRvAdapter(this);
        LinearItemDecoration itemDecoration = new LinearItemDecoration();
        itemDecoration.setBottomSpace((int) getResources().getDimension(com.android.app_base.R.dimen.dp_12));
        itemDecoration.setHorizontalSpace((int) getResources().getDimension(com.android.app_base.R.dimen.dp_20));
        itemDecoration.setFirstTop((int) getResources().getDimension(com.android.app_base.R.dimen.dp_20));
        binding.recyclerView.addItemDecoration(itemDecoration);
        binding.recyclerView.setAdapter(adapter);
        mOperatePopupWindow = initPopUpWindow(View.inflate(this,R.layout.pop_operate,null));
        mOperatePopupWindow.getContentView().findViewById(R.id.layout_add).setVisibility(View.GONE);
        mOperatePopupWindow.getContentView().findViewById(R.id.layout_select).setVisibility(View.GONE);
        mOperatePopupWindow.getContentView().findViewById(R.id.tv_from_new_to_old).setOnClickListener(v -> {
            viewModel.sortDataList(0);
            mOperatePopupWindow.dismiss();
        });
        mOperatePopupWindow.getContentView().findViewById(R.id.tv_from_old_to_new).setOnClickListener(v -> {
            viewModel.sortDataList(1);
            mOperatePopupWindow.dismiss();
        });
        binding.ivOperate.setOnClickListener(v -> {
            mOperatePopupWindow.showAsDropDown(binding.ivOperate,-ScreenSizeUtils.dip2px(this,85) +binding.ivOperate.getWidth(),0);
        });
    }
    @Override
    public void initData() {
        viewModel.getHomeDevices();
    }
    @Override
    public void initLiveDataObserve() {
        viewModel.getDataListLiveData().observe(this, homeDevices -> {
            adapter.setData(homeDevices);
        });
    }
    private PopupWindow initPopUpWindow(View view){
        PopupWindow popupWindow = new PopupWindow(this);
        // 设置布局文件
        popupWindow.setContentView(view);
        // 为了避免部分机型不显示,需要重新设置一下宽高
        popupWindow.setWidth(ViewGroup.LayoutParams.WRAP_CONTENT);
        popupWindow.setHeight(ViewGroup.LayoutParams.WRAP_CONTENT);
        // 设置pop透明效果
        popupWindow.setBackgroundDrawable(new ColorDrawable(0x0000));
        // 设置pop出入动画
        popupWindow.setAnimationStyle(com.android.app_base.R.style.pop_add);
        // 设置pop获取焦点,如果为false点击返回按钮会退出当前Activity,如果pop中有Editor的话,focusable必须要为true
        popupWindow.setFocusable(true);
        // 设置pop可点击,为false点击事件无效,默认为true
        popupWindow.setTouchable(true);
        // 设置点击pop外侧消失,默认为false;在focusable为true时点击外侧始终消失
        popupWindow.setOutsideTouchable(false);
        return popupWindow;
    }
}
app/src/main/java/com/application/zhangshi_app_android/ui/function/HomeDevicesActivityViewModel.java
New file
@@ -0,0 +1,138 @@
package com.application.zhangshi_app_android.ui.function;
import static com.android.app_base.base.BaseConfig.CODE_SUCCESS;
import android.app.Application;
import androidx.annotation.NonNull;
import androidx.lifecycle.LiveData;
import androidx.lifecycle.MutableLiveData;
import com.android.app_base.base.StateViewEnum;
import com.android.app_base.base.viewmodel.BaseViewModel;
import com.android.app_base.http.ResultData;
import com.android.app_base.utils.RxUtils;
import com.application.zhangshi_app_android.bean.FamilyAssetsBean;
import com.application.zhangshi_app_android.bean.FamilyAssetsResponseBean;
import com.application.zhangshi_app_android.bean.HomeDevicesBean;
import com.application.zhangshi_app_android.bean.HomeDevicesResponseBean;
import com.application.zhangshi_app_android.data.DataRepository;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import io.reactivex.Observer;
import io.reactivex.disposables.Disposable;
/**
 * @author Ljj
 * @date 2023.04.04. 0:01
 * @desc 家庭设备 ViewModel
 */
public class HomeDevicesActivityViewModel extends BaseViewModel<DataRepository> {
    private MutableLiveData<List<HomeDevicesBean>> dataListLiveData;//数据
    public HomeDevicesActivityViewModel(@NonNull Application application) {
        super(application);
    }
    @Override
    protected DataRepository initModel() {
        return DataRepository.getInstance();
    }
    public void getHomeDevices(){
        List<HomeDevicesBean> list = new ArrayList<>();
        list.add(new HomeDevicesBean(1,"电视","2023-04-03","张三","夏普液晶电视","客厅","4k超高清",""));
        list.add(new HomeDevicesBean(1,"电视","2023-04-02","张三","夏普液晶电视","客厅","4k超高清",""));
        list.add(new HomeDevicesBean(1,"电视","2023-04-01","张三","夏普液晶电视","客厅","4k超高清",""));
        if (list != null && !list.isEmpty()){
            dataListLiveData.postValue(list);
            return;
        }
        model.getHomeDevices(new HashMap<>())
                .compose(RxUtils.schedulersTransformer())
                .subscribe(new Observer<ResultData<HomeDevicesResponseBean>>() {
                    @Override
                    public void onSubscribe(Disposable d) {
                        addSubscribe(d);
                    }
                    @Override
                    public void onNext(ResultData<HomeDevicesResponseBean> data) {
                        if (data.getCode() == CODE_SUCCESS){
                            if (data.getData().getData().isEmpty()){
                                changeStateView(StateViewEnum.DATA_NULL);
                            }else {
                                changeStateView(StateViewEnum.HIDE);
                                dataListLiveData.postValue(data.getData().getData());
                            }
                        }else {
                            messageLiveData.postValue(data.getMsg());
                        }
                    }
                    @Override
                    public void onError(Throwable e) {
                        messageLiveData.postValue(e.getMessage());
                    }
                    @Override
                    public void onComplete() {
                    }
                });
    }
    public MutableLiveData<List<HomeDevicesBean>> getDataListLiveData() {
        if (dataListLiveData == null){
            dataListLiveData = new MutableLiveData<>();
        }
        return dataListLiveData;
    }
    public void setDataListLiveData(MutableLiveData<List<HomeDevicesBean>> dataListLiveData) {
        this.dataListLiveData = dataListLiveData;
    }
    /**
     * 按时间排序
     * @param type 0 从新到旧 1 从旧到新
     */
    public void sortDataList(int type){
        List<HomeDevicesBean> list = dataListLiveData.getValue();
        if (list == null || list.isEmpty()){
            return;
        }
        list.sort(new Comparator<HomeDevicesBean>() {
            @Override
            public int compare(HomeDevicesBean o1, HomeDevicesBean o2) {
                SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd", java.util.Locale.getDefault());
                Date date1 = null;
                Date date2 = null;
                try {
                    date1 = format.parse(o1.getCreateTime());
                    date2 = format.parse(o2.getCreateTime());
                } catch (ParseException e) {
                    throw new RuntimeException(e);
                }
                if (date1 != null && date2 != null) {
                    if (type == 0){
                        return date2.compareTo(date1);
                    }else {
                        return date1.compareTo(date2);
                    }
                }
                return 0;
            }
        });
        dataListLiveData.postValue(list);
    }
}
app/src/main/java/com/application/zhangshi_app_android/ui/function/HomeDevicesDetailActivity.java
New file
@@ -0,0 +1,103 @@
package com.application.zhangshi_app_android.ui.function;
import android.view.View;
import android.view.ViewGroup;
import android.widget.EditText;
import androidx.recyclerview.widget.GridLayoutManager;
import com.application.zhangshi_app_android.BR;
import com.application.zhangshi_app_android.R;
import com.application.zhangshi_app_android.adapter.ImageRvAdapter;
import com.application.zhangshi_app_android.bean.FamilyAssetsBean;
import com.application.zhangshi_app_android.bean.HomeDevicesBean;
import com.application.zhangshi_app_android.databinding.ActivityHomeDevicesDetailBinding;
import com.application.zhangshi_app_android.ui.DLBaseActivity;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
/**
 * @author Ljj
 * @date 2023.04.04. 15:19
 * @desc
 */
public class HomeDevicesDetailActivity extends DLBaseActivity<ActivityHomeDevicesDetailBinding,HomeDevicesDetailActivityViewModel> {
    private ImageRvAdapter adapter;
    @Override
    public int getLayoutId() {
        return R.layout.activity_home_devices_detail;
    }
    @Override
    public int getVariableId() {
        return BR.viewModel;
    }
    @Override
    public void initParam() {
        if (getIntent().hasExtra("bean")){
            viewModel.getBeanLiveData().setValue((HomeDevicesBean) getIntent().getSerializableExtra("bean"));
        }
    }
    @Override
    public void initView() {
        adapter = new ImageRvAdapter(this);
        GridLayoutManager gridLayoutManager = new GridLayoutManager(this, 3);
        binding.rvImage.setLayoutManager(gridLayoutManager);
        binding.rvImage.setNestedScrollingEnabled(false);
        setIsEdited(false);
    }
    @Override
    public void initData() {
    }
    @Override
    public void initLiveDataObserve() {
        viewModel.getBeanLiveData().observe(this,bean -> {
            if (bean!=null){
                if (getTitleBar() != null){
                    getTitleBar().setTitle(bean.getName());
                }
                String url = bean.getUrl();
                if (url == null||url.isEmpty()){
                    return;
                }
                List<String> list;
                if (url.contains(",")){
                    String[] split = url.split(",");
                    list = new ArrayList<>(Arrays.asList(split));
                }else {
                    list = new ArrayList<>();
                    list.add(url);
                }
                adapter.setData(list);
            }
        });
    }
    public void setIsEdited(boolean isEdited){
        disableAllEditText(getContentView(),isEdited);
        adapter.setIsEdited(isEdited);
    }
    public void disableAllEditText(ViewGroup viewGroup, boolean isEdited) {
        for (int i = 0; i < viewGroup.getChildCount(); i++) {
            View child = viewGroup.getChildAt(i);
            if (child instanceof ViewGroup) {
                disableAllEditText((ViewGroup) child,isEdited);
            } else if (child instanceof EditText) {
                child.setEnabled(isEdited);
                child.setFocusable(isEdited);
                child.setFocusableInTouchMode(isEdited);
                if (!isEdited){
                    child.clearFocus();
                }
            }
        }
    }
}
app/src/main/java/com/application/zhangshi_app_android/ui/function/HomeDevicesDetailActivityViewModel.java
New file
@@ -0,0 +1,41 @@
package com.application.zhangshi_app_android.ui.function;
import android.app.Application;
import androidx.annotation.NonNull;
import androidx.lifecycle.MutableLiveData;
import com.android.app_base.base.viewmodel.BaseViewModel;
import com.application.zhangshi_app_android.bean.FamilyAssetsBean;
import com.application.zhangshi_app_android.bean.HomeDevicesBean;
import com.application.zhangshi_app_android.data.DataRepository;
/**
 * @author Ljj
 * @date 2023.04.04. 15:35
 * @desc 家庭设备详情 ViewModel
 */
public class HomeDevicesDetailActivityViewModel extends BaseViewModel<DataRepository> {
    private MutableLiveData<HomeDevicesBean> beanLiveData;
    public HomeDevicesDetailActivityViewModel(@NonNull Application application) {
        super(application);
    }
    @Override
    protected DataRepository initModel() {
        return DataRepository.getInstance();
    }
    public MutableLiveData<HomeDevicesBean> getBeanLiveData() {
        if (beanLiveData == null){
            beanLiveData = new MutableLiveData<>();
        }
        return beanLiveData;
    }
    public void setBeanLiveData(MutableLiveData<HomeDevicesBean> beanLiveData) {
        this.beanLiveData = beanLiveData;
    }
}
app/src/main/java/com/application/zhangshi_app_android/ui/login/LoginActivity.java
@@ -2,6 +2,7 @@
import static com.android.app_base.base.BaseConfig.EXTRA_TYPE;
import android.Manifest;
import android.content.Intent;
import android.view.View;
@@ -10,10 +11,12 @@
import com.android.app_base.base.view.BaseActivity;
import com.android.app_base.manager.AppManager;
import com.android.app_base.manager.UserManager;
import com.android.app_base.utils.ToastUtils;
import com.application.zhangshi_app_android.BR;
import com.application.zhangshi_app_android.R;
import com.application.zhangshi_app_android.databinding.ActivityLoginBinding;
import com.application.zhangshi_app_android.ui.main.MainActivity;
import com.blankj.utilcode.util.PermissionUtils;
import com.gyf.immersionbar.ImmersionBar;
/**
@@ -35,7 +38,6 @@
    @Override
    public void initParam() {
        System.out.println("token"+UserManager.getInstance().getToken());
        if (!UserManager.getInstance().getToken().isEmpty()){
            AppManager.getAppManager().startActivity(MainActivity.class);
            finish();
app/src/main/res/drawable-xhdpi/function_home_devices.png
app/src/main/res/drawable-xhdpi/function_notes.png

app/src/main/res/drawable-xhdpi/ic_clear.png
app/src/main/res/drawable-xhdpi/ic_image_delete.png
app/src/main/res/drawable-xhdpi/img_data_null.png
app/src/main/res/drawable-xxhdpi/function_home_devices.png
app/src/main/res/drawable-xxhdpi/function_notes.png

app/src/main/res/drawable-xxhdpi/ic_clear.png
app/src/main/res/drawable-xxhdpi/ic_image_delete.png
app/src/main/res/drawable-xxhdpi/img_data_null.png
app/src/main/res/drawable/shape_73fab4cd_solid.xml
@@ -2,7 +2,7 @@
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:shape="rectangle">
    <solid android:color="#73fab4cd" />
    <corners android:topLeftRadius="10dp" android:topRightRadius="10dp" android:bottomLeftRadius="10dp" android:bottomRightRadius="10dp" />
    <solid android:color="#73FAB4CD" />
    <corners android:radius="10dp" />
</shape>
app/src/main/res/layout/activity_family_assets.xml
New file
@@ -0,0 +1,144 @@
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools">
    <data>
        <variable
            name="viewModel"
            type="com.application.zhangshi_app_android.ui.function.FamilyAssetsActivityViewModel" />
    </data>
    <androidx.constraintlayout.widget.ConstraintLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">
        <com.android.app_base.widget.ExtendTitleBar
            android:id="@+id/titleBar"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            app:layout_constraintTop_toTopOf="parent"
            >
            <FrameLayout
                android:layout_width="24dp"
                android:layout_height="24dp"
                android:layout_marginHorizontal="16dp"
                android:layout_gravity="center_vertical|end"
                >
                <ImageView
                    android:id="@+id/iv_operate"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_gravity="center"
                    android:background="@drawable/ic_operate"
                    />
            </FrameLayout>
            <LinearLayout
                android:id="@+id/layout_default"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:layout_marginHorizontal="56dp"
                android:gravity="center_vertical"
                >
                <TextView
                    android:id="@+id/tv_title"
                    android:layout_width="0dp"
                    android:layout_height="wrap_content"
                    android:layout_marginStart="16dp"
                    android:text="家庭资产"
                    android:layout_weight="1"
                    android:textColor="@color/white"
                    android:textSize="@dimen/sp_20"
                    />
                <ImageView
                    android:id="@+id/iv_search_default"
                    android:layout_width="@dimen/dp_24"
                    android:layout_height="@dimen/dp_24"
                    android:background="@drawable/ic_search"
                    />
            </LinearLayout>
            <LinearLayout
                android:id="@+id/layout_search"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:layout_marginVertical="4dp"
                android:layout_marginHorizontal="56dp"
                android:gravity="center_vertical"
                android:background="@color/white"
                android:paddingHorizontal="5dp"
                android:visibility="gone"
                >
                <ImageView
                    android:id="@+id/iv_search"
                    android:layout_width="24dp"
                    android:layout_height="24dp"
                    android:background="@drawable/ic_search_gray"
                    />
                <EditText
                    android:id="@+id/et_search"
                    android:layout_width="0dp"
                    android:layout_height="wrap_content"
                    android:layout_weight="1"
                    android:layout_marginStart="5dp"
                    android:textSize="14sp"
                    android:textColor="#61000000"
                    android:background="@null"
                    android:imeOptions="actionSearch"
                    android:text=""
                    android:singleLine="true"
                    android:hint="在“家大事记内搜索”"
                    />
                <ImageView
                    android:id="@+id/iv_search_type"
                    android:layout_width="24dp"
                    android:layout_height="24dp"
                    android:background="@drawable/ic_search_by"
                    />
            </LinearLayout>
        </com.android.app_base.widget.ExtendTitleBar>
        <LinearLayout
            android:id="@+id/layout_data_null"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:orientation="vertical"
            android:gravity="center"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toBottomOf="@+id/titleBar">
            <ImageView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:background="@drawable/img_data_null"
                />
            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginTop="18dp"
                android:text="暂时还没有数据哦~\n点击”+”立即创建"
                android:textSize="14sp"
                android:textColor="#73000000"
                />
        </LinearLayout>
        <androidx.recyclerview.widget.RecyclerView
            android:id="@+id/recyclerView"
            android:layout_width="match_parent"
            android:layout_height="0dp"
            android:background="@color/color_normal_background"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintTop_toBottomOf="@+id/titleBar"
            app:layout_constraintVertical_bias="1.0"
            tools:itemCount="20"
            tools:layout_editor_absoluteX="-81dp"
            tools:listitem="@layout/item_family_memorabilia" />
    </androidx.constraintlayout.widget.ConstraintLayout>
</layout>
app/src/main/res/layout/activity_family_assets_detail.xml
New file
@@ -0,0 +1,192 @@
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools">
    <data>
        <variable
            name="viewModel"
            type="com.application.zhangshi_app_android.ui.function.FamilyAssetsDetailActivityViewModel" />
    </data>
    <LinearLayout
        tools:context=".ui.function.CreateFamilyProjectActivity"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="@color/color_normal_background"
        android:orientation="vertical">
        <com.android.app_base.widget.ExtendTitleBar
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            app:title="哈哈哈"
            app:titleGravity="left"
            />
        <ScrollView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            app:layout_constraintTop_toBottomOf="@id/titleBar"
            >
            <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:orientation="vertical"
                android:paddingHorizontal="20dp"
                >
                <TextView
                    android:layout_width="wrap_content"
                    android:layout_marginTop="@dimen/dp_10"
                    android:layout_height="@dimen/dp_20"
                    android:text="类别"
                    android:textColor="#767375"
                    android:textSize="12sp"
                    />
                <EditText
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:inputType="text"
                    android:autofillHints="creditCardNumber"
                    android:textColorHint="#6b000000"
                    android:textColor="#DE000000"
                    android:textSize="16sp"
                    android:text="@={viewModel.beanLiveData.type}"
                    />
                <TextView
                    android:layout_width="wrap_content"
                    android:layout_marginTop="10dp"
                    android:layout_height="wrap_content"
                    android:text="时间"
                    android:textColor="#767375"
                    android:textSize="12sp"
                    />
                <EditText
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:layout_marginTop="2dp"
                    android:inputType="text"
                    android:textColor="#DE000000"
                    android:text="@={viewModel.beanLiveData.createTime}"
                    android:textSize="16sp" />
                <TextView
                    android:layout_width="wrap_content"
                    android:layout_marginTop="10dp"
                    android:layout_height="wrap_content"
                    android:text="证件卡号"
                    android:textColor="#767375"
                    android:textSize="12sp"
                    />
                <EditText
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:layout_marginTop="2dp"
                    android:inputType="text"
                    android:textColorHint="#6b000000"
                    android:text="@={viewModel.beanLiveData.title}"
                    android:textColor="#DE000000"
                    android:textSize="16sp" />
                <TextView
                    android:layout_width="wrap_content"
                    android:layout_marginTop="10dp"
                    android:layout_height="wrap_content"
                    android:text="开户行"
                    android:textColor="#767375"
                    android:textSize="12sp"
                    />
                <EditText
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:layout_marginTop="2dp"
                    android:inputType="text"
                    android:textColorHint="#6b000000"
                    android:textColor="#DE000000"
                    android:text="@={viewModel.beanLiveData.location}"
                    android:textSize="16sp" />
                <TextView
                    android:layout_width="wrap_content"
                    android:layout_marginTop="10dp"
                    android:layout_height="wrap_content"
                    android:text="持有人"
                    android:textColor="#767375"
                    android:textSize="12sp"
                    />
                <EditText
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:layout_marginTop="2dp"
                    android:inputType="text"
                    android:textColorHint="#6b000000"
                    android:textColor="#DE000000"
                    android:text="@={viewModel.beanLiveData.holder}"
                    android:textSize="16sp" />
                <TextView
                    android:layout_width="wrap_content"
                    android:layout_marginTop="10dp"
                    android:layout_height="wrap_content"
                    android:text="存放地点"
                    android:textColor="#767375"
                    android:textSize="12sp"
                    />
                <EditText
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:layout_marginTop="2dp"
                    android:inputType="text"
                    android:textColorHint="#6b000000"
                    android:textColor="#DE000000"
                    android:text="@={viewModel.beanLiveData.address}"
                    android:textSize="16sp" />
                <TextView
                    android:layout_width="wrap_content"
                    android:layout_marginTop="10dp"
                    android:layout_height="wrap_content"
                    android:text="备注"
                    android:textColor="#767375"
                    android:textSize="12sp"
                    />
                <EditText
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:layout_marginTop="2dp"
                    android:inputType="text"
                    android:textColorHint="#6b000000"
                    android:textColor="#DE000000"
                    android:text="@={viewModel.beanLiveData.remark}"
                    android:textSize="16sp" />
                <TextView
                    android:layout_width="wrap_content"
                    android:layout_marginTop="10dp"
                    android:layout_height="wrap_content"
                    android:text="电子文件"
                    android:textColor="#767375"
                    android:textSize="12sp"
                    />
                <RelativeLayout
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:background="@drawable/shape_6b0000_stroke"
                    >
                    <com.android.app_base.widget.WrapRecyclerView
                        android:id="@+id/rv_image"
                        android:orientation="vertical"
                        android:layout_width="match_parent"
                        android:layout_height="wrap_content"
                        android:layout_marginBottom="10dp"
                        android:layout_marginTop="2sp"
                        android:paddingStart="10dp"
                        android:paddingEnd="5dp"
                        android:paddingVertical="10dp"
                        />
                </RelativeLayout>
            </LinearLayout>
        </ScrollView>
    </LinearLayout>
</layout>
app/src/main/res/layout/activity_family_memorabilia.xml
@@ -1,759 +1,156 @@
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools">
    xmlns:tools="http://schemas.android.com/tools"
    >
    <data>
        <variable
            name="viewModel"
            type="com.application.zhangshi_app_android.ui.function.FamilyMemorabiliaActivityViewModel"/>
    </data>
    <androidx.drawerlayout.widget.DrawerLayout
        android:id="@+id/drawerLayout"
    <androidx.constraintlayout.widget.ConstraintLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:openDrawer="start"
        >
        <androidx.constraintlayout.widget.ConstraintLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            tools:context=".ui.function.FamilyMemorabiliaActivity"
            android:orientation="vertical">
        tools:context=".ui.function.FamilyMemorabiliaActivity"
        android:orientation="vertical">
            <com.hjq.bar.TitleBar
                android:id="@+id/titleBar"
                android:layout_width="match_parent"
                android:layout_height="?attr/actionBarSize"
                app:layout_constraintTop_toTopOf="parent"
                android:paddingHorizontal="0dp"
                android:background="@color/color_title_bar_background"
                app:leftIcon="@null"
                app:rightIcon="@null"
        <com.android.app_base.widget.ExtendTitleBar
            android:id="@+id/titleBar"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            app:layout_constraintTop_toTopOf="parent"
            >
            <FrameLayout
                android:layout_width="24dp"
                android:layout_height="24dp"
                android:layout_marginHorizontal="16dp"
                android:layout_gravity="center_vertical|end"
                >
                <ImageView
                    android:id="@+id/iv_menu"
                    android:layout_width="24dp"
                    android:layout_height="24dp"
                    android:layout_marginHorizontal="16dp"
                    android:background="@drawable/ic_menu"
                    android:layout_gravity="center_vertical"
                    />
                <FrameLayout
                    android:layout_width="24dp"
                    android:layout_height="24dp"
                    android:layout_marginHorizontal="16dp"
                    android:layout_gravity="center_vertical|end"
                    >
                    <ImageView
                        android:id="@+id/iv_operate"
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:layout_gravity="center"
                        android:background="@drawable/ic_operate"
                        />
                </FrameLayout>
                <LinearLayout
                    android:id="@+id/layout_default"
                    android:layout_width="match_parent"
                    android:layout_height="match_parent"
                    android:layout_marginHorizontal="56dp"
                    android:gravity="center_vertical"
                    >
                    <TextView
                        android:layout_width="0dp"
                        android:layout_height="wrap_content"
                        android:layout_marginStart="16dp"
                        android:text="家大事记"
                        android:layout_weight="1"
                        android:textColor="@color/white"
                        android:textSize="@dimen/sp_20"
                        />
                    <ImageView
                        android:id="@+id/iv_search_default"
                        android:layout_width="@dimen/dp_24"
                        android:layout_height="@dimen/dp_24"
                        android:background="@drawable/ic_search"
                        />
                </LinearLayout>
                <LinearLayout
                    android:id="@+id/layout_search"
                    android:layout_width="match_parent"
                    android:layout_height="match_parent"
                    android:layout_marginVertical="4dp"
                    android:layout_marginHorizontal="56dp"
                    android:gravity="center_vertical"
                    android:background="@color/white"
                    android:paddingHorizontal="5dp"
                    android:visibility="gone"
                    >
                    <ImageView
                        android:layout_width="24dp"
                        android:layout_height="24dp"
                        android:background="@drawable/ic_search_gray"
                        />
                    <EditText
                        android:id="@+id/et_search"
                        android:layout_width="0dp"
                        android:layout_height="wrap_content"
                        android:layout_weight="1"
                        android:layout_marginStart="5dp"
                        android:textSize="14sp"
                        android:textColor="#61000000"
                        android:background="@null"
                        android:imeOptions="actionSearch"
                        android:text="@={viewModel.stringMutableLiveData}"
                        android:singleLine="true"
                        android:hint="全局搜索"
                        />
                    <ImageView
                        android:id="@+id/iv_search_type"
                        android:layout_width="24dp"
                        android:layout_height="24dp"
                        android:background="@drawable/ic_search_by"
                        />
                </LinearLayout>
            </com.hjq.bar.TitleBar>
            <LinearLayout
                android:id="@+id/layout_data_null"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:orientation="vertical"
                android:gravity="center"
                app:layout_constraintBottom_toBottomOf="parent"
                app:layout_constraintEnd_toEndOf="parent"
                app:layout_constraintStart_toStartOf="parent"
                app:layout_constraintTop_toBottomOf="@+id/titleBar">
                <ImageView
                    android:id="@+id/iv_operate"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:background="@drawable/img_sakura"
                    android:layout_gravity="center"
                    android:background="@drawable/ic_operate"
                    />
                <TextView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_marginTop="18dp"
                    android:text="暂时还没有数据哦~\n点击”+”立即创建"
                    android:textSize="14sp"
                    android:textColor="#73000000"
                    />
            </LinearLayout>
            </FrameLayout>
            <androidx.recyclerview.widget.RecyclerView
                android:id="@+id/recyclerView"
                android:layout_width="match_parent"
                android:layout_height="0dp"
                android:background="@color/color_normal_background"
                app:layout_constraintBottom_toBottomOf="parent"
                app:layout_constraintTop_toBottomOf="@+id/titleBar"
                app:layout_constraintVertical_bias="1.0"
                tools:itemCount="20"
                tools:layout_editor_absoluteX="-81dp"
                tools:listitem="@layout/item_family_memorabilia" />
            <com.google.android.material.floatingactionbutton.FloatingActionButton
                android:id="@+id/fab_add"
                android:layout_width="@dimen/dp_56"
                android:layout_height="@dimen/dp_56"
                app:layout_constraintBottom_toBottomOf="parent"
                app:layout_constraintEnd_toEndOf="parent"
                android:layout_marginEnd="@dimen/dp_25"
                android:layout_marginBottom="@dimen/dp_44"
                android:src="@drawable/ic_add"
                app:fabCustomSize="@dimen/dp_56"
                />
        </androidx.constraintlayout.widget.ConstraintLayout>
        <androidx.core.widget.NestedScrollView
            android:layout_width="211dp"
            android:layout_height="match_parent"
            android:layout_gravity="start"
            android:background="@color/color_card_pink"
            android:paddingTop="25dp"
            >
            <LinearLayout
                android:id="@+id/layout_default"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:orientation="vertical"
                android:paddingHorizontal="12dp"
                android:layout_marginHorizontal="56dp"
                android:gravity="center_vertical"
                >
                <LinearLayout
                    android:layout_width="wrap_content"
                <TextView
                    android:id="@+id/tv_title"
                    android:layout_width="0dp"
                    android:layout_height="wrap_content"
                    android:layout_gravity="center_horizontal"
                    android:layout_marginTop="33dp"
                    android:layout_marginBottom="20dp"
                    android:gravity="center"
                    >
                    <androidx.constraintlayout.utils.widget.ImageFilterView
                        android:layout_width="50dp"
                        android:layout_height="50dp"
                        app:roundPercent="1"
                        android:background="@drawable/img_sakura"
                        />
                    <TextView
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:text="张喵"
                        android:textSize="18sp"
                        android:textColor="@color/black"
                        android:layout_marginStart="16dp"
                        />
                </LinearLayout>
                <androidx.cardview.widget.CardView
                    android:layout_width="match_parent"
                    android:layout_height="304dp"
                    app:cardBackgroundColor="@color/white"
                    app:cardCornerRadius="10dp"
                    app:cardElevation="0dp"
                    >
                    <LinearLayout
                        android:layout_width="match_parent"
                        android:layout_height="match_parent"
                        android:orientation="vertical"
                        android:paddingVertical="8dp"
                        >
                        <TextView
                            android:layout_width="wrap_content"
                            android:layout_height="wrap_content"
                            android:text="核心板块"
                            android:textColor="@color/black"
                            android:textSize="12sp"
                            android:layout_marginStart="14dp"
                            />
                        <View
                            android:layout_width="match_parent"
                            android:layout_height="1dp"
                            android:background="#FFF3F3F3"
                            />
                        <LinearLayout
                            android:layout_width="match_parent"
                            android:layout_height="0dp"
                            android:layout_weight="1"
                            android:paddingHorizontal="15dp"
                            android:gravity="center"
                            >
                            <ImageView
                                android:layout_width="wrap_content"
                                android:layout_height="wrap_content"
                                android:background="@drawable/ic_family_root_net"
                                />
                            <TextView
                                android:layout_width="0dp"
                                android:layout_height="wrap_content"
                                android:layout_weight="1"
                                android:text="家根网"
                                android:textColor="@color/black"
                                android:textSize="14sp"
                                android:layout_marginStart="15dp"
                                />
                            <ImageView
                                android:layout_width="wrap_content"
                                android:layout_height="wrap_content"
                                android:background="@drawable/ic_vector_gray"
                                />
                        </LinearLayout>
                        <LinearLayout
                            android:layout_width="match_parent"
                            android:layout_height="0dp"
                            android:layout_weight="1"
                            android:paddingHorizontal="15dp"
                            android:gravity="center"
                            >
                            <ImageView
                                android:layout_width="wrap_content"
                                android:layout_height="wrap_content"
                                android:background="@drawable/ic_notes"
                                />
                            <TextView
                                android:layout_width="0dp"
                                android:layout_height="wrap_content"
                                android:layout_weight="1"
                                android:text="家大事记"
                                android:textColor="#FFF6739F"
                                android:textSize="14sp"
                                android:layout_marginStart="15dp"
                                />
                            <ImageView
                                android:layout_width="wrap_content"
                                android:layout_height="wrap_content"
                                android:background="@drawable/ic_vector_pink"
                                />
                        </LinearLayout>
                        <LinearLayout
                            android:layout_width="match_parent"
                            android:layout_height="0dp"
                            android:layout_weight="1"
                            android:paddingHorizontal="15dp"
                            android:gravity="center"
                            >
                            <ImageView
                                android:layout_width="wrap_content"
                                android:layout_height="wrap_content"
                                android:background="@drawable/ic_asset"
                                />
                            <TextView
                                android:layout_width="0dp"
                                android:layout_height="wrap_content"
                                android:layout_weight="1"
                                android:text="家庭资产"
                                android:textColor="@color/black"
                                android:textSize="14sp"
                                android:layout_marginStart="15dp"
                                />
                            <ImageView
                                android:layout_width="wrap_content"
                                android:layout_height="wrap_content"
                                android:background="@drawable/ic_vector_gray"
                                />
                        </LinearLayout>
                        <LinearLayout
                            android:layout_width="match_parent"
                            android:layout_height="0dp"
                            android:layout_weight="1"
                            android:paddingHorizontal="15dp"
                            android:gravity="center"
                            >
                            <ImageView
                                android:layout_width="wrap_content"
                                android:layout_height="wrap_content"
                                android:background="@drawable/ic_home_devices"
                                />
                            <TextView
                                android:layout_width="0dp"
                                android:layout_height="wrap_content"
                                android:layout_weight="1"
                                android:text="家庭设备"
                                android:textColor="@color/black"
                                android:textSize="14sp"
                                android:layout_marginStart="15dp"
                                />
                            <ImageView
                                android:layout_width="wrap_content"
                                android:layout_height="wrap_content"
                                android:background="@drawable/ic_vector_gray"
                                />
                        </LinearLayout>
                        <LinearLayout
                            android:layout_width="match_parent"
                            android:layout_height="0dp"
                            android:layout_weight="1"
                            android:paddingHorizontal="15dp"
                            android:gravity="center"
                            >
                            <ImageView
                                android:layout_width="wrap_content"
                                android:layout_height="wrap_content"
                                android:background="@drawable/ic_honor"
                                />
                            <TextView
                                android:layout_width="0dp"
                                android:layout_height="wrap_content"
                                android:layout_weight="1"
                                android:text="收藏、荣誉"
                                android:textColor="@color/black"
                                android:textSize="14sp"
                                android:layout_marginStart="15dp"
                                />
                            <ImageView
                                android:layout_width="wrap_content"
                                android:layout_height="wrap_content"
                                android:background="@drawable/ic_vector_gray"
                                />
                        </LinearLayout>
                        <LinearLayout
                            android:layout_width="match_parent"
                            android:layout_height="0dp"
                            android:layout_weight="1"
                            android:paddingHorizontal="15dp"
                            android:gravity="center"
                            >
                            <ImageView
                                android:layout_width="wrap_content"
                                android:layout_height="wrap_content"
                                android:background="@drawable/ic_little_doctor"
                                />
                            <TextView
                                android:layout_width="0dp"
                                android:layout_height="wrap_content"
                                android:layout_weight="1"
                                android:text="小医生"
                                android:textColor="@color/black"
                                android:textSize="14sp"
                                android:layout_marginStart="15dp"
                                />
                            <ImageView
                                android:layout_width="wrap_content"
                                android:layout_height="wrap_content"
                                android:background="@drawable/ic_vector_gray"
                                />
                        </LinearLayout>
                        <LinearLayout
                            android:layout_width="match_parent"
                            android:layout_height="0dp"
                            android:layout_weight="1"
                            android:paddingHorizontal="15dp"
                            android:gravity="center"
                            >
                            <ImageView
                                android:layout_width="wrap_content"
                                android:layout_height="wrap_content"
                                android:background="@drawable/ic_cleaning"
                                />
                            <TextView
                                android:layout_width="0dp"
                                android:layout_height="wrap_content"
                                android:layout_weight="1"
                                android:text="保洁、收纳"
                                android:textColor="@color/black"
                                android:textSize="14sp"
                                android:layout_marginStart="15dp"
                                />
                            <ImageView
                                android:layout_width="wrap_content"
                                android:layout_height="wrap_content"
                                android:background="@drawable/ic_vector_gray"
                                />
                        </LinearLayout>
                        <LinearLayout
                            android:layout_width="match_parent"
                            android:layout_height="0dp"
                            android:layout_weight="1"
                            android:paddingHorizontal="15dp"
                            android:gravity="center"
                            >
                            <ImageView
                                android:layout_width="wrap_content"
                                android:layout_height="wrap_content"
                                android:background="@drawable/ic_mail_list"
                                />
                            <TextView
                                android:layout_width="0dp"
                                android:layout_height="wrap_content"
                                android:layout_weight="1"
                                android:text="通讯录"
                                android:textColor="@color/black"
                                android:textSize="14sp"
                                android:layout_marginStart="15dp"
                                />
                            <ImageView
                                android:layout_width="wrap_content"
                                android:layout_height="wrap_content"
                                android:background="@drawable/ic_vector_gray"
                                />
                        </LinearLayout>
                        <LinearLayout
                            android:layout_width="match_parent"
                            android:layout_height="0dp"
                            android:layout_weight="1"
                            android:paddingHorizontal="15dp"
                            android:gravity="center"
                            >
                            <ImageView
                                android:layout_width="wrap_content"
                                android:layout_height="wrap_content"
                                android:background="@drawable/ic_pet"
                                />
                            <TextView
                                android:layout_width="0dp"
                                android:layout_height="wrap_content"
                                android:layout_weight="1"
                                android:text="魅宠"
                                android:textColor="@color/black"
                                android:textSize="14sp"
                                android:layout_marginStart="15dp"
                                />
                            <ImageView
                                android:layout_width="wrap_content"
                                android:layout_height="wrap_content"
                                android:background="@drawable/ic_vector_gray"
                                />
                        </LinearLayout>
                        <LinearLayout
                            android:layout_width="match_parent"
                            android:layout_height="0dp"
                            android:layout_weight="1"
                            android:paddingHorizontal="15dp"
                            android:gravity="center"
                            >
                            <ImageView
                                android:layout_width="wrap_content"
                                android:layout_height="wrap_content"
                                android:background="@drawable/ic_income_expense"
                                />
                            <TextView
                                android:layout_width="0dp"
                                android:layout_height="wrap_content"
                                android:layout_weight="1"
                                android:text="家庭收支台账"
                                android:textColor="@color/black"
                                android:textSize="14sp"
                                android:layout_marginStart="15dp"
                                />
                            <ImageView
                                android:layout_width="wrap_content"
                                android:layout_height="wrap_content"
                                android:background="@drawable/ic_vector_gray"
                                />
                        </LinearLayout>
                    </LinearLayout>
                </androidx.cardview.widget.CardView>
                <androidx.cardview.widget.CardView
                    android:layout_width="match_parent"
                    android:layout_height="240dp"
                    app:cardBackgroundColor="@color/white"
                    app:cardCornerRadius="10dp"
                    app:cardElevation="0dp"
                    android:layout_marginTop="26dp"
                    android:layout_marginBottom="14dp"
                    >
                    <LinearLayout
                        android:layout_width="match_parent"
                        android:layout_height="match_parent"
                        android:orientation="vertical"
                        >
                        <TextView
                            android:layout_width="wrap_content"
                            android:layout_height="wrap_content"
                            android:text="个人板块"
                            android:textColor="@color/black"
                            android:textSize="12sp"
                            android:layout_marginVertical="8dp"
                            android:layout_marginStart="14dp"
                            />
                        <View
                            android:layout_width="match_parent"
                            android:layout_height="1dp"
                            android:background="#FFF3F3F3"
                            />
                        <LinearLayout
                            android:layout_width="match_parent"
                            android:layout_height="0dp"
                            android:layout_weight="1"
                            android:paddingHorizontal="15dp"
                            android:gravity="center"
                            >
                            <ImageView
                                android:layout_width="wrap_content"
                                android:layout_height="wrap_content"
                                android:background="@drawable/ic_growth"
                                />
                            <TextView
                                android:layout_width="0dp"
                                android:layout_height="wrap_content"
                                android:layout_weight="1"
                                android:text="成长经历阅历"
                                android:textColor="@color/black"
                                android:textSize="14sp"
                                android:layout_marginStart="15dp"
                                />
                            <ImageView
                                android:layout_width="wrap_content"
                                android:layout_height="wrap_content"
                                android:background="@drawable/ic_vector_gray"
                                />
                        </LinearLayout>
                        <LinearLayout
                            android:layout_width="match_parent"
                            android:layout_height="0dp"
                            android:layout_weight="1"
                            android:paddingHorizontal="15dp"
                            android:gravity="center"
                            >
                            <ImageView
                                android:layout_width="wrap_content"
                                android:layout_height="wrap_content"
                                android:background="@drawable/ic_marriage"
                                />
                            <TextView
                                android:layout_width="0dp"
                                android:layout_height="wrap_content"
                                android:layout_weight="1"
                                android:text="婚姻"
                                android:textColor="@color/black"
                                android:textSize="14sp"
                                android:layout_marginStart="15dp"
                                />
                            <ImageView
                                android:layout_width="wrap_content"
                                android:layout_height="wrap_content"
                                android:background="@drawable/ic_vector_gray"
                                />
                        </LinearLayout>
                        <LinearLayout
                            android:layout_width="match_parent"
                            android:layout_height="0dp"
                            android:layout_weight="1"
                            android:paddingHorizontal="15dp"
                            android:gravity="center"
                            >
                            <ImageView
                                android:layout_width="wrap_content"
                                android:layout_height="wrap_content"
                                android:background="@drawable/ic_property"
                                />
                            <TextView
                                android:layout_width="0dp"
                                android:layout_height="wrap_content"
                                android:layout_weight="1"
                                android:text="财产"
                                android:textColor="@color/black"
                                android:textSize="14sp"
                                android:layout_marginStart="15dp"
                                />
                            <ImageView
                                android:layout_width="wrap_content"
                                android:layout_height="wrap_content"
                                android:background="@drawable/ic_vector_gray"
                                />
                        </LinearLayout>
                        <LinearLayout
                            android:layout_width="match_parent"
                            android:layout_height="0dp"
                            android:layout_weight="1"
                            android:paddingHorizontal="15dp"
                            android:gravity="center"
                            >
                            <ImageView
                                android:layout_width="wrap_content"
                                android:layout_height="wrap_content"
                                android:background="@drawable/ic_wish"
                                />
                            <TextView
                                android:layout_width="0dp"
                                android:layout_height="wrap_content"
                                android:layout_weight="1"
                                android:text="百年心愿"
                                android:textColor="@color/black"
                                android:textSize="14sp"
                                android:layout_marginStart="15dp"
                                />
                            <ImageView
                                android:layout_width="wrap_content"
                                android:layout_height="wrap_content"
                                android:background="@drawable/ic_vector_gray"
                                />
                        </LinearLayout>
                        <LinearLayout
                            android:layout_width="match_parent"
                            android:layout_height="0dp"
                            android:layout_weight="1"
                            android:paddingHorizontal="15dp"
                            android:gravity="center"
                            >
                            <ImageView
                                android:layout_width="wrap_content"
                                android:layout_height="wrap_content"
                                android:background="@drawable/ic_tour"
                                />
                            <TextView
                                android:layout_width="0dp"
                                android:layout_height="wrap_content"
                                android:layout_weight="1"
                                android:text="旅游"
                                android:textColor="@color/black"
                                android:textSize="14sp"
                                android:layout_marginStart="15dp"
                                />
                            <ImageView
                                android:layout_width="wrap_content"
                                android:layout_height="wrap_content"
                                android:background="@drawable/ic_vector_gray"
                                />
                        </LinearLayout>
                        <LinearLayout
                            android:layout_width="match_parent"
                            android:layout_height="0dp"
                            android:layout_weight="1"
                            android:paddingHorizontal="15dp"
                            android:gravity="center"
                            >
                            <ImageView
                                android:layout_width="wrap_content"
                                android:layout_height="wrap_content"
                                android:background="@drawable/ic_health" />
                            <TextView
                                android:layout_width="0dp"
                                android:layout_height="wrap_content"
                                android:layout_weight="1"
                                android:text="健康保健"
                                android:textColor="@color/black"
                                android:textSize="14sp"
                                android:layout_marginStart="15dp"
                                />
                            <ImageView
                                android:layout_width="wrap_content"
                                android:layout_height="wrap_content"
                                android:background="@drawable/ic_vector_gray"
                                />
                        </LinearLayout>
                        <LinearLayout
                            android:layout_width="match_parent"
                            android:layout_height="0dp"
                            android:layout_weight="1"
                            android:paddingHorizontal="15dp"
                            android:gravity="center"
                            >
                            <ImageView
                                android:layout_width="wrap_content"
                                android:layout_height="wrap_content"
                                android:background="@drawable/ic_certificate"
                                />
                            <TextView
                                android:layout_width="0dp"
                                android:layout_height="wrap_content"
                                android:layout_weight="1"
                                android:text="荣誉、证书奖项"
                                android:textColor="@color/black"
                                android:textSize="14sp"
                                android:layout_marginStart="15dp"
                                />
                            <ImageView
                                android:layout_width="wrap_content"
                                android:layout_height="wrap_content"
                                android:background="@drawable/ic_vector_gray"
                                />
                        </LinearLayout>
                        <LinearLayout
                            android:layout_width="match_parent"
                            android:layout_height="0dp"
                            android:layout_weight="1"
                            android:paddingHorizontal="15dp"
                            android:gravity="center"
                            >
                            <ImageView
                                android:layout_width="wrap_content"
                                android:layout_height="wrap_content"
                                android:background="@drawable/ic_privacy"
                                />
                            <TextView
                                android:layout_width="0dp"
                                android:layout_height="wrap_content"
                                android:layout_weight="1"
                                android:text="隐私"
                                android:textColor="@color/black"
                                android:textSize="14sp"
                                android:layout_marginStart="15dp"
                                />
                            <ImageView
                                android:layout_width="wrap_content"
                                android:layout_height="wrap_content"
                                android:background="@drawable/ic_vector_gray"
                                />
                        </LinearLayout>
                    </LinearLayout>
                </androidx.cardview.widget.CardView>
                    android:layout_marginStart="16dp"
                    android:text="家大事记"
                    android:layout_weight="1"
                    android:textColor="@color/white"
                    android:textSize="@dimen/sp_20"
                    />
                <ImageView
                    android:id="@+id/iv_search_default"
                    android:layout_width="@dimen/dp_24"
                    android:layout_height="@dimen/dp_24"
                    android:background="@drawable/ic_search"
                    />
            </LinearLayout>
        </androidx.core.widget.NestedScrollView>
    </androidx.drawerlayout.widget.DrawerLayout>
            <LinearLayout
                android:id="@+id/layout_search"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:layout_marginVertical="4dp"
                android:layout_marginHorizontal="56dp"
                android:gravity="center_vertical"
                android:background="@color/white"
                android:paddingHorizontal="5dp"
                android:visibility="gone"
                >
                <ImageView
                    android:id="@+id/iv_search"
                    android:layout_width="24dp"
                    android:layout_height="24dp"
                    android:background="@drawable/ic_search_gray"
                    />
                <EditText
                    android:id="@+id/et_search"
                    android:layout_width="0dp"
                    android:layout_height="wrap_content"
                    android:layout_weight="1"
                    android:layout_marginStart="5dp"
                    android:textSize="14sp"
                    android:textColor="#61000000"
                    android:background="@null"
                    android:imeOptions="actionSearch"
                    android:text=""
                    android:singleLine="true"
                    android:hint="在“家大事记内搜索”"
                    />
                <ImageView
                    android:id="@+id/iv_search_type"
                    android:layout_width="24dp"
                    android:layout_height="24dp"
                    android:background="@drawable/ic_search_by"
                    />
            </LinearLayout>
        </com.android.app_base.widget.ExtendTitleBar>
        <LinearLayout
            android:id="@+id/layout_data_null"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:orientation="vertical"
            android:gravity="center"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toBottomOf="@+id/titleBar">
            <ImageView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:background="@drawable/img_data_null"
                />
            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginTop="18dp"
                android:text="暂时还没有数据哦~\n点击”+”立即创建"
                android:textSize="14sp"
                android:textColor="#73000000"
                />
        </LinearLayout>
        <androidx.recyclerview.widget.RecyclerView
            android:id="@+id/recyclerView"
            android:layout_width="match_parent"
            android:layout_height="0dp"
            android:background="@color/color_normal_background"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintTop_toBottomOf="@+id/titleBar"
            app:layout_constraintVertical_bias="1.0"
            tools:itemCount="20"
            tools:layout_editor_absoluteX="-81dp"
            tools:listitem="@layout/item_family_memorabilia" />
        <com.google.android.material.floatingactionbutton.FloatingActionButton
            android:id="@+id/fab_add"
            android:layout_width="@dimen/dp_56"
            android:layout_height="@dimen/dp_56"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            android:layout_marginEnd="@dimen/dp_25"
            android:layout_marginBottom="@dimen/dp_44"
            android:src="@drawable/ic_add"
            app:fabCustomSize="@dimen/dp_56"
            />
    </androidx.constraintlayout.widget.ConstraintLayout>
</layout>
app/src/main/res/layout/activity_family_memorabilia_create.xml
File was renamed from app/src/main/res/layout/item_family_create.xml
@@ -13,6 +13,7 @@
        tools:context=".ui.function.CreateFamilyProjectActivity"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="@color/color_normal_background"
        android:orientation="vertical">
        <com.hjq.bar.TitleBar
@@ -44,7 +45,7 @@
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_gravity="center"
                    android:background="@drawable/ic_operate"
                    android:background="@{viewModel.typeLiveData?@drawable/ic_operate_finish:@drawable/ic_operate}"
                    />
            </FrameLayout>
@@ -95,7 +96,7 @@
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:hint="请输入标题"
                    android:inputType="number"
                    android:inputType="text"
                    android:autofillHints="creditCardNumber"
                    android:textColorHint="#6b000000"
                    android:textColor="#DE000000"
@@ -119,7 +120,7 @@
                    android:layout_height="wrap_content"
                    android:layout_marginTop="@dimen/dp_2"
                    android:hint="请输入时间"
                    android:inputType="number"
                    android:inputType="text"
                    android:textColorHint="#6b000000"
                    android:textColor="#DE000000"
                    android:text="@={viewModel.beanMutableLiveData.createTime}"
@@ -141,7 +142,7 @@
                    android:layout_height="wrap_content"
                    android:layout_marginTop="@dimen/dp_2"
                    android:hint="请输入人物"
                    android:inputType="number"
                    android:inputType="text"
                    android:textColorHint="#6b000000"
                    android:text="@={viewModel.beanMutableLiveData.people}"
                    android:textColor="#DE000000"
@@ -163,7 +164,7 @@
                    android:layout_height="wrap_content"
                    android:layout_marginTop="@dimen/dp_2"
                    android:hint="请输入地点"
                    android:inputType="number"
                    android:inputType="text"
                    android:textColorHint="#6b000000"
                    android:textColor="#DE000000"
                    android:text="@={viewModel.beanMutableLiveData.address}"
@@ -185,7 +186,7 @@
                    android:layout_height="wrap_content"
                    android:layout_marginTop="@dimen/dp_2"
                    android:hint="请输入备注"
                    android:inputType="number"
                    android:inputType="text"
                    android:textColorHint="#6b000000"
                    android:textColor="#DE000000"
                    android:text="@={viewModel.beanMutableLiveData.remark}"
@@ -199,39 +200,19 @@
                    android:textColor="#ff000000"
                    android:textSize="@dimen/sp_12"
                    />
                <LinearLayout
                <com.android.app_base.widget.WrapRecyclerView
                    android:id="@+id/rv_image"
                    android:orientation="vertical"
                    android:layout_width="match_parent"
                    android:layout_height="@dimen/dp_180"
                    android:layout_marginTop="@dimen/dp_2"
                    android:layout_height="wrap_content"
                    android:background="@drawable/shape_6b0000_stroke"
                    android:layout_marginBottom="10dp"
                    >
                    android:layout_marginBottom="20dp"
                    android:layout_marginTop="@dimen/dp_2"
                    android:paddingStart="10dp"
                    android:paddingEnd="5dp"
                    android:paddingVertical="10dp"
                    />
                    <Button
                        android:id="@+id/button_add"
                        android:layout_width="@dimen/dp_85"
                        android:layout_height="@dimen/dp_85"
                        android:text="+"
                        android:textColor="@color/black"
                        android:textSize="@dimen/dp_35"
                        android:gravity="center"
                        android:layout_marginLeft="@dimen/dp_10"
                        android:layout_marginTop="@dimen/dp_10"
                        android:background="@drawable/shape_73fab4cd_solid"
                        />
                    <TextView
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:text="导入"
                        android:textColorHint="#6b000000"
                    android:textColor="#DE000000"
                        android:textSize="@dimen/sp_12"
                        android:layout_marginLeft="@dimen/dp_40"
                        />
                </LinearLayout>
            </LinearLayout>
        </ScrollView>
app/src/main/res/layout/activity_home_devices.xml
New file
@@ -0,0 +1,144 @@
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools">
    <data>
        <variable
            name="viewModel"
            type="com.application.zhangshi_app_android.ui.function.HomeDevicesActivityViewModel" />
    </data>
    <androidx.constraintlayout.widget.ConstraintLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">
        <com.android.app_base.widget.ExtendTitleBar
            android:id="@+id/titleBar"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            app:layout_constraintTop_toTopOf="parent"
            >
            <FrameLayout
                android:layout_width="24dp"
                android:layout_height="24dp"
                android:layout_marginHorizontal="16dp"
                android:layout_gravity="center_vertical|end"
                >
                <ImageView
                    android:id="@+id/iv_operate"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_gravity="center"
                    android:background="@drawable/ic_operate"
                    />
            </FrameLayout>
            <LinearLayout
                android:id="@+id/layout_default"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:layout_marginHorizontal="56dp"
                android:gravity="center_vertical"
                >
                <TextView
                    android:id="@+id/tv_title"
                    android:layout_width="0dp"
                    android:layout_height="wrap_content"
                    android:layout_marginStart="16dp"
                    android:text="家庭设备"
                    android:layout_weight="1"
                    android:textColor="@color/white"
                    android:textSize="@dimen/sp_20"
                    />
                <ImageView
                    android:id="@+id/iv_search_default"
                    android:layout_width="@dimen/dp_24"
                    android:layout_height="@dimen/dp_24"
                    android:background="@drawable/ic_search"
                    />
            </LinearLayout>
            <LinearLayout
                android:id="@+id/layout_search"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:layout_marginVertical="4dp"
                android:layout_marginHorizontal="56dp"
                android:gravity="center_vertical"
                android:background="@color/white"
                android:paddingHorizontal="5dp"
                android:visibility="gone"
                >
                <ImageView
                    android:id="@+id/iv_search"
                    android:layout_width="24dp"
                    android:layout_height="24dp"
                    android:background="@drawable/ic_search_gray"
                    />
                <EditText
                    android:id="@+id/et_search"
                    android:layout_width="0dp"
                    android:layout_height="wrap_content"
                    android:layout_weight="1"
                    android:layout_marginStart="5dp"
                    android:textSize="14sp"
                    android:textColor="#61000000"
                    android:background="@null"
                    android:imeOptions="actionSearch"
                    android:text=""
                    android:singleLine="true"
                    android:hint="在“家大事记内搜索”"
                    />
                <ImageView
                    android:id="@+id/iv_search_type"
                    android:layout_width="24dp"
                    android:layout_height="24dp"
                    android:background="@drawable/ic_search_by"
                    />
            </LinearLayout>
        </com.android.app_base.widget.ExtendTitleBar>
        <LinearLayout
            android:id="@+id/layout_data_null"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:orientation="vertical"
            android:gravity="center"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toBottomOf="@+id/titleBar">
            <ImageView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:background="@drawable/img_data_null"
                />
            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginTop="18dp"
                android:text="暂时还没有数据哦~\n点击”+”立即创建"
                android:textSize="14sp"
                android:textColor="#73000000"
                />
        </LinearLayout>
        <androidx.recyclerview.widget.RecyclerView
            android:id="@+id/recyclerView"
            android:layout_width="match_parent"
            android:layout_height="0dp"
            android:background="@color/color_normal_background"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintTop_toBottomOf="@+id/titleBar"
            app:layout_constraintVertical_bias="1.0"
            tools:itemCount="20"
            tools:layout_editor_absoluteX="-81dp"
            tools:listitem="@layout/item_family_memorabilia" />
    </androidx.constraintlayout.widget.ConstraintLayout>
</layout>
app/src/main/res/layout/activity_home_devices_detail.xml
New file
@@ -0,0 +1,175 @@
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    >
    <data>
        <variable
            name="viewModel"
            type="com.application.zhangshi_app_android.ui.function.HomeDevicesDetailActivityViewModel" />
    </data>
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="@color/color_normal_background"
        android:orientation="vertical">
        <com.android.app_base.widget.ExtendTitleBar
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            app:titleGravity="left"
            />
        <ScrollView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            app:layout_constraintTop_toBottomOf="@id/titleBar"
            >
            <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:orientation="vertical"
                android:paddingHorizontal="20dp"
                >
                <TextView
                    android:layout_width="wrap_content"
                    android:layout_marginTop="@dimen/dp_10"
                    android:layout_height="@dimen/dp_20"
                    android:text="设备名称"
                    android:textColor="#767375"
                    android:textSize="12sp"
                    />
                <EditText
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:inputType="text"
                    android:autofillHints="creditCardNumber"
                    android:textColorHint="#6b000000"
                    android:textColor="#DE000000"
                    android:textSize="16sp"
                    android:text="@={viewModel.beanLiveData.name}"
                    />
                <TextView
                    android:layout_width="wrap_content"
                    android:layout_marginTop="10dp"
                    android:layout_height="wrap_content"
                    android:text="时间"
                    android:textColor="#767375"
                    android:textSize="12sp"
                    />
                <EditText
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:layout_marginTop="2dp"
                    android:inputType="text"
                    android:textColor="#DE000000"
                    android:text="@={viewModel.beanLiveData.createTime}"
                    android:textSize="16sp" />
                <TextView
                    android:layout_width="wrap_content"
                    android:layout_marginTop="10dp"
                    android:layout_height="wrap_content"
                    android:text="购买人"
                    android:textColor="#767375"
                    android:textSize="12sp"
                    />
                <EditText
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:layout_marginTop="2dp"
                    android:inputType="text"
                    android:textColorHint="#6b000000"
                    android:text="@={viewModel.beanLiveData.people}"
                    android:textColor="#DE000000"
                    android:textSize="16sp" />
                <TextView
                    android:layout_width="wrap_content"
                    android:layout_marginTop="10dp"
                    android:layout_height="wrap_content"
                    android:text="事项内容"
                    android:textColor="#767375"
                    android:textSize="12sp"
                    />
                <EditText
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:layout_marginTop="2dp"
                    android:inputType="text"
                    android:textColorHint="#6b000000"
                    android:textColor="#DE000000"
                    android:text="@={viewModel.beanLiveData.content}"
                    android:textSize="16sp" />
                <TextView
                    android:layout_width="wrap_content"
                    android:layout_marginTop="10dp"
                    android:layout_height="wrap_content"
                    android:text="存放地点"
                    android:textColor="#767375"
                    android:textSize="12sp"
                    />
                <EditText
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:layout_marginTop="2dp"
                    android:inputType="text"
                    android:textColorHint="#6b000000"
                    android:textColor="#DE000000"
                    android:text="@={viewModel.beanLiveData.address}"
                    android:textSize="16sp" />
                <TextView
                    android:layout_width="wrap_content"
                    android:layout_marginTop="10dp"
                    android:layout_height="wrap_content"
                    android:text="备注"
                    android:textColor="#767375"
                    android:textSize="12sp"
                    />
                <EditText
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:layout_marginTop="2dp"
                    android:inputType="text"
                    android:textColorHint="#6b000000"
                    android:textColor="#DE000000"
                    android:text="@={viewModel.beanLiveData.remark}"
                    android:textSize="16sp" />
                <TextView
                    android:layout_width="wrap_content"
                    android:layout_marginTop="10dp"
                    android:layout_height="wrap_content"
                    android:text="电子文件"
                    android:textColor="#767375"
                    android:textSize="12sp"
                    />
                <RelativeLayout
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:background="@drawable/shape_6b0000_stroke"
                    >
                    <com.android.app_base.widget.WrapRecyclerView
                        android:id="@+id/rv_image"
                        android:orientation="vertical"
                        android:layout_width="match_parent"
                        android:layout_height="wrap_content"
                        android:layout_marginBottom="10dp"
                        android:layout_marginTop="2sp"
                        android:paddingStart="10dp"
                        android:paddingEnd="5dp"
                        android:paddingVertical="10dp"
                        />
                </RelativeLayout>
            </LinearLayout>
        </ScrollView>
    </LinearLayout>
</layout>
app/src/main/res/layout/fragment_function.xml
@@ -175,8 +175,8 @@
                        app:layout_constraintTop_toTopOf="@id/layout_home_root_net">
                        <ImageView
                            android:layout_width="@dimen/dp_24"
                            android:layout_height="@dimen/dp_24"
                            android:layout_width="wrap_content"
                            android:layout_height="wrap_content"
                            android:background="@drawable/function_notes" />
                        <TextView
@@ -357,6 +357,30 @@
                            android:textSize="@dimen/sp_14" />
                    </LinearLayout>
                    <LinearLayout
                        android:id="@+id/layout_home_devices"
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:gravity="center"
                        android:orientation="vertical"
                        app:layout_constraintEnd_toEndOf="@id/layout_family_memorabilia"
                        app:layout_constraintStart_toStartOf="@id/layout_family_memorabilia"
                        app:layout_constraintTop_toTopOf="@+id/layout_income_and_expenses">
                        <ImageView
                            android:layout_width="wrap_content"
                            android:layout_height="wrap_content"
                            android:background="@drawable/function_home_devices" />
                        <TextView
                            android:layout_width="wrap_content"
                            android:layout_height="wrap_content"
                            android:layout_marginTop="@dimen/dp_4"
                            android:text="家庭设备"
                            android:textColor="@color/black"
                            android:textSize="@dimen/sp_14" />
                    </LinearLayout>
                    <TextView
                        android:id="@+id/tv_personal_module"
                        android:layout_width="wrap_content"
app/src/main/res/layout/item_family_assets.xml
New file
@@ -0,0 +1,226 @@
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools">
    <data>
        <variable
            name="bean"
            type="com.application.zhangshi_app_android.bean.FamilyAssetsBean" />
    </data>
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        >
        <androidx.cardview.widget.CardView
            android:id="@+id/cardView"
            android:layout_width="match_parent"
            android:layout_height="40dp"
            android:layout_margin="@dimen/dp_2"
            app:cardCornerRadius="@dimen/dp_10"
            app:cardBackgroundColor="@color/color_card_pink"
            >
            <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:orientation="vertical"
                >
                <RelativeLayout
                    android:id="@+id/layout_title"
                    android:layout_width="match_parent"
                    android:layout_height="@dimen/dp_40"
                    android:gravity="center_vertical"
                    >
                    <TextView
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:layout_centerVertical="true"
                        android:layout_marginStart="24dp"
                        android:textSize="@dimen/sp_16"
                        android:textColor="@color/black"
                        android:text="@{bean.type}"
                        android:textStyle="bold"
                        tools:text="房产证"
                        />
                    <TextView
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:layout_centerInParent="true"
                        android:layout_centerHorizontal="true"
                        android:layout_marginStart="24dp"
                        android:text="@{bean.holder}"
                        android:textColor="@color/black"
                        android:textSize="@dimen/sp_16"
                        android:textStyle="bold"
                        tools:text="张三" />
                    <TextView
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:textSize="@dimen/sp_16"
                        android:textColor="@color/black"
                        android:text="@{bean.createTime}"
                        android:textStyle="bold"
                        android:layout_marginEnd="24dp"
                        android:layout_alignParentEnd="true"
                        android:layout_centerVertical="true"
                        tools:text="2019-01-12"
                        />
                </RelativeLayout>
                <LinearLayout
                    android:id="@+id/layout_content"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:orientation="vertical"
                    android:paddingHorizontal="@dimen/dp_24"
                    >
                    <LinearLayout
                        android:layout_width="match_parent"
                        android:layout_height="wrap_content"
                        android:orientation="horizontal"
                        android:layout_marginBottom="@dimen/dp_6"
                        >
                        <TextView
                            android:layout_width="wrap_content"
                            android:layout_height="wrap_content"
                            android:text="序号:"
                            android:textColor="@color/black"
                            android:textSize="@dimen/sp_12"
                            android:textStyle="bold"
                            />
                        <TextView
                            android:layout_width="wrap_content"
                            android:layout_height="wrap_content"
                            android:text="@{String.valueOf(bean.id)}"
                            android:textColor="@color/black"
                            android:textSize="@dimen/sp_12"
                            android:textStyle="bold"
                            />
                    </LinearLayout>
                    <LinearLayout
                        android:layout_width="match_parent"
                        android:layout_height="wrap_content"
                        android:orientation="horizontal"
                        android:layout_marginBottom="@dimen/dp_6"
                        >
                        <TextView
                            android:layout_width="wrap_content"
                            android:layout_height="wrap_content"
                            android:text="证件卡号:"
                            android:textColor="@color/black"
                            android:textSize="@dimen/sp_12"
                            android:textStyle="bold"
                            />
                        <TextView
                            android:layout_width="wrap_content"
                            android:layout_height="wrap_content"
                            android:text="@{bean.title}"
                            android:textColor="@color/black"
                            android:textSize="@dimen/sp_12"
                            android:textStyle="bold"
                            />
                    </LinearLayout>
                    <LinearLayout
                        android:layout_width="match_parent"
                        android:layout_height="wrap_content"
                        android:orientation="horizontal"
                        android:layout_marginBottom="@dimen/dp_6"
                        >
                        <TextView
                            android:layout_width="wrap_content"
                            android:layout_height="wrap_content"
                            android:text="开户行:"
                            android:textColor="@color/black"
                            android:textSize="@dimen/sp_12"
                            android:textStyle="bold"
                            />
                        <TextView
                            android:layout_width="wrap_content"
                            android:layout_height="wrap_content"
                            android:text="@{bean.location}"
                            android:textColor="@color/black"
                            android:textSize="@dimen/sp_12"
                            android:textStyle="bold"
                            />
                    </LinearLayout>
                    <LinearLayout
                        android:layout_width="match_parent"
                        android:layout_height="wrap_content"
                        android:orientation="horizontal"
                        android:layout_marginBottom="@dimen/dp_6"
                        >
                        <TextView
                            android:layout_width="wrap_content"
                            android:layout_height="wrap_content"
                            android:text="存放地点:"
                            android:textColor="@color/black"
                            android:textSize="@dimen/sp_12"
                            android:textStyle="bold"
                            />
                        <TextView
                            android:layout_width="wrap_content"
                            android:layout_height="wrap_content"
                            android:text="@{bean.address}"
                            android:textColor="@color/black"
                            android:textSize="@dimen/sp_12"
                            android:textStyle="bold"
                            />
                    </LinearLayout>
                    <LinearLayout
                        android:layout_width="match_parent"
                        android:layout_height="wrap_content"
                        android:orientation="horizontal"
                        android:layout_marginBottom="@dimen/dp_6"
                        >
                        <TextView
                            android:layout_width="wrap_content"
                            android:layout_height="wrap_content"
                            android:text="备注:"
                            android:textColor="@color/black"
                            android:textSize="@dimen/sp_12"
                            android:textStyle="bold"
                            />
                        <TextView
                            android:layout_width="wrap_content"
                            android:layout_height="wrap_content"
                            android:text="@{bean.remark}"
                            android:textColor="@color/black"
                            android:textSize="@dimen/sp_12"
                            android:textStyle="bold"
                            />
                    </LinearLayout>
                    <TextView
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:layout_marginBottom="@dimen/dp_6"
                        android:text="电子文件:"
                        android:textColor="@color/black"
                        android:textSize="@dimen/sp_12"
                        android:textStyle="bold"
                        />
                    <LinearLayout
                        android:layout_width="match_parent"
                        android:layout_height="wrap_content"
                        android:orientation="horizontal"
                        android:layout_marginBottom="@dimen/dp_15"
                        >
                        <androidx.recyclerview.widget.RecyclerView
                            android:id="@+id/rv_image"
                            android:layout_width="match_parent"
                            android:layout_height="wrap_content"
                            tools:listitem="@layout/item_image"
                            tools:itemCount="3"
                            />
                    </LinearLayout>
                </LinearLayout>
            </LinearLayout>
        </androidx.cardview.widget.CardView>
    </LinearLayout>
</layout>
app/src/main/res/layout/item_family_memorabilia.xml
@@ -1,6 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto">
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools">
    <data>
        <variable
@@ -154,86 +155,13 @@
                        android:orientation="horizontal"
                        android:layout_marginBottom="@dimen/dp_15"
                        >
                        <LinearLayout
                            android:layout_width="wrap_content"
                        <androidx.recyclerview.widget.RecyclerView
                            android:id="@+id/rv_image"
                            android:layout_width="match_parent"
                            android:layout_height="wrap_content"
                            android:orientation="vertical"
                            android:gravity="center"
                            >
                            <ImageView
                                android:layout_width="@dimen/dp_70"
                                android:layout_height="@dimen/dp_45"
                                android:background="@drawable/img_sakura"
                                android:layout_marginBottom="@dimen/dp_6"
                                />
                            <TextView
                                android:layout_width="wrap_content"
                                android:layout_height="wrap_content"
                                android:text="sakura.jpg"
                                android:textSize="@dimen/sp_10"
                                android:textColor="@color/black"
                                />
                        </LinearLayout>
                        <LinearLayout
                            android:layout_width="wrap_content"
                            android:layout_height="wrap_content"
                            android:orientation="vertical"
                            android:gravity="center"
                            android:layout_marginStart="@dimen/dp_10"
                            >
                            <ImageView
                                android:layout_width="@dimen/dp_70"
                                android:layout_height="@dimen/dp_45"
                                android:background="@drawable/img_lotus"
                                android:layout_marginBottom="@dimen/dp_6"
                                />
                            <TextView
                                android:layout_width="wrap_content"
                                android:layout_height="wrap_content"
                                android:text="lotus.jpg"
                                android:textSize="@dimen/sp_10"
                                android:textColor="@color/black"
                                />
                        </LinearLayout>
                        <LinearLayout
                            android:layout_width="wrap_content"
                            android:layout_height="wrap_content"
                            android:orientation="vertical"
                            android:gravity="center"
                            android:layout_marginStart="@dimen/dp_10"
                            >
                            <androidx.cardview.widget.CardView
                                android:layout_width="@dimen/dp_70"
                                android:layout_height="@dimen/dp_45"
                                android:layout_marginBottom="@dimen/dp_6"
                                app:cardCornerRadius="@dimen/dp_5"
                                >
                                <ImageView
                                    android:layout_width="@dimen/dp_70"
                                    android:layout_height="@dimen/dp_45"
                                    android:background="@drawable/img_sakura"
                                    />
                                <View
                                    android:layout_width="match_parent"
                                    android:layout_height="match_parent"
                                    android:background="#52000000"
                                    />
                                <ImageView
                                    android:layout_width="wrap_content"
                                    android:layout_height="wrap_content"
                                    android:background="@drawable/ic_play"
                                    android:layout_gravity="center"
                                    />
                            </androidx.cardview.widget.CardView>
                            <TextView
                                android:layout_width="wrap_content"
                                android:layout_height="wrap_content"
                                android:text="sakura.mp4"
                                android:textSize="@dimen/sp_10"
                                android:textColor="@color/black"
                                />
                        </LinearLayout>
                            tools:listitem="@layout/item_image"
                            tools:itemCount="3"
                            />
                    </LinearLayout>
                    <LinearLayout
@@ -264,6 +192,7 @@
                                />
                        </LinearLayout>
                        <LinearLayout
                            android:id="@+id/layout_delete"
                            android:layout_width="wrap_content"
                            android:layout_height="wrap_content"
                            android:layout_alignParentEnd="true"
app/src/main/res/layout/item_home_devices.xml
New file
@@ -0,0 +1,204 @@
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools">
    <data>
        <variable
            name="bean"
            type="com.application.zhangshi_app_android.bean.HomeDevicesBean" />
    </data>
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        >
        <androidx.cardview.widget.CardView
            android:id="@+id/cardView"
            android:layout_width="match_parent"
            android:layout_height="40dp"
            android:layout_margin="@dimen/dp_2"
            app:cardCornerRadius="@dimen/dp_10"
            app:cardBackgroundColor="@color/color_card_pink"
            >
            <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:orientation="vertical"
                >
                <LinearLayout
                    android:id="@+id/layout_title"
                    android:layout_width="match_parent"
                    android:layout_height="@dimen/dp_40"
                    android:gravity="center_vertical"
                    >
                    <TextView
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:layout_centerVertical="true"
                        android:layout_marginStart="24dp"
                        android:textSize="@dimen/sp_16"
                        android:textColor="@color/black"
                        android:text="@{bean.name}"
                        android:textStyle="bold"
                        tools:text="电视"
                        />
                    <TextView
                        android:layout_width="0dp"
                        android:layout_weight="1"
                        android:layout_height="wrap_content"
                        android:layout_centerInParent="true"
                        android:layout_marginStart="24dp"
                        android:text="@{bean.address}"
                        android:textColor="@color/black"
                        android:textSize="@dimen/sp_16"
                        android:textStyle="bold"
                        android:gravity="center"
                        tools:text="张三" />
                    <TextView
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:textSize="@dimen/sp_16"
                        android:textColor="@color/black"
                        android:text="@{bean.createTime}"
                        android:textStyle="bold"
                        android:layout_marginEnd="24dp"
                        android:layout_alignParentEnd="true"
                        android:layout_centerVertical="true"
                        tools:text="2019-01-12"
                        />
                </LinearLayout>
                <LinearLayout
                    android:id="@+id/layout_content"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:orientation="vertical"
                    android:paddingHorizontal="@dimen/dp_24"
                    >
                    <LinearLayout
                        android:layout_width="match_parent"
                        android:layout_height="wrap_content"
                        android:orientation="horizontal"
                        android:layout_marginBottom="@dimen/dp_6"
                        >
                        <TextView
                            android:layout_width="wrap_content"
                            android:layout_height="wrap_content"
                            android:text="序号:"
                            android:textColor="@color/black"
                            android:textSize="@dimen/sp_12"
                            android:textStyle="bold"
                            />
                        <TextView
                            android:layout_width="wrap_content"
                            android:layout_height="wrap_content"
                            android:text="@{String.valueOf(bean.id)}"
                            android:textColor="@color/black"
                            android:textSize="@dimen/sp_12"
                            android:textStyle="bold"
                            />
                    </LinearLayout>
                    <LinearLayout
                        android:layout_width="match_parent"
                        android:layout_height="wrap_content"
                        android:orientation="horizontal"
                        android:layout_marginBottom="@dimen/dp_6"
                        >
                        <TextView
                            android:layout_width="wrap_content"
                            android:layout_height="wrap_content"
                            android:text="购买人:"
                            android:textColor="@color/black"
                            android:textSize="@dimen/sp_12"
                            android:textStyle="bold"
                            />
                        <TextView
                            android:layout_width="wrap_content"
                            android:layout_height="wrap_content"
                            android:text="@{bean.people}"
                            android:textColor="@color/black"
                            android:textSize="@dimen/sp_12"
                            android:textStyle="bold"
                            />
                    </LinearLayout>
                    <LinearLayout
                        android:layout_width="match_parent"
                        android:layout_height="wrap_content"
                        android:orientation="horizontal"
                        android:layout_marginBottom="@dimen/dp_6"
                        >
                        <TextView
                            android:layout_width="wrap_content"
                            android:layout_height="wrap_content"
                            android:text="事项内容:"
                            android:textColor="@color/black"
                            android:textSize="@dimen/sp_12"
                            android:textStyle="bold"
                            />
                        <TextView
                            android:layout_width="wrap_content"
                            android:layout_height="wrap_content"
                            android:text="@{bean.content}"
                            android:textColor="@color/black"
                            android:textSize="@dimen/sp_12"
                            android:textStyle="bold"
                            />
                    </LinearLayout>
                    <LinearLayout
                        android:layout_width="match_parent"
                        android:layout_height="wrap_content"
                        android:orientation="horizontal"
                        android:layout_marginBottom="@dimen/dp_6"
                        >
                        <TextView
                            android:layout_width="wrap_content"
                            android:layout_height="wrap_content"
                            android:text="备注:"
                            android:textColor="@color/black"
                            android:textSize="@dimen/sp_12"
                            android:textStyle="bold"
                            />
                        <TextView
                            android:layout_width="wrap_content"
                            android:layout_height="wrap_content"
                            android:text="@{bean.remark}"
                            android:textColor="@color/black"
                            android:textSize="@dimen/sp_12"
                            android:textStyle="bold"
                            />
                    </LinearLayout>
                    <TextView
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:layout_marginBottom="@dimen/dp_6"
                        android:text="电子文件:"
                        android:textColor="@color/black"
                        android:textSize="@dimen/sp_12"
                        android:textStyle="bold"
                        />
                    <LinearLayout
                        android:layout_width="match_parent"
                        android:layout_height="wrap_content"
                        android:orientation="horizontal"
                        android:layout_marginBottom="@dimen/dp_15"
                        >
                        <androidx.recyclerview.widget.RecyclerView
                            android:id="@+id/rv_image"
                            android:layout_width="match_parent"
                            android:layout_height="wrap_content"
                            tools:listitem="@layout/item_image"
                            tools:itemCount="3"
                            />
                    </LinearLayout>
                </LinearLayout>
            </LinearLayout>
        </androidx.cardview.widget.CardView>
    </LinearLayout>
</layout>
app/src/main/res/layout/item_image.xml
New file
@@ -0,0 +1,34 @@
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto">
    <data>
        <variable
            name="url"
            type="String" />
    </data>
    <androidx.constraintlayout.widget.ConstraintLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content">
        <ImageView
            android:id="@+id/iv_image"
            android:layout_width="87dp"
            android:layout_height="87dp"
            android:layout_marginTop="7.5dp"
            app:layout_constraintTop_toTopOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:imageUrl="@{url}"
            />
        <ImageView
            android:id="@+id/iv_delete"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:background="@drawable/ic_image_delete"
            app:layout_constraintTop_toTopOf="parent"
            app:layout_constraintStart_toEndOf="@id/iv_image"
            android:layout_marginStart="-7.5dp"
            />
    </androidx.constraintlayout.widget.ConstraintLayout>
</layout>
app/src/main/res/layout/item_image_footer.xml
New file
@@ -0,0 +1,22 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:layout_gravity="center"
    >
    <TextView
        android:id="@+id/button_add"
        android:layout_width="@dimen/dp_85"
        android:layout_height="@dimen/dp_85"
        android:text="+"
        android:textColor="@color/black"
        android:textSize="60sp"
        android:gravity="center"
        android:background="@drawable/shape_73fab4cd_solid"
        android:layout_marginTop="8dp"
        android:layout_marginStart="2dp"
        />
</LinearLayout>
app/src/main/res/layout/layout_drawer.xml
New file
@@ -0,0 +1,608 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.core.widget.NestedScrollView
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="211dp"
    android:layout_height="match_parent"
    android:layout_gravity="start"
    android:background="@color/color_card_pink"
    android:paddingTop="25dp"
    >
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical"
        android:paddingHorizontal="12dp"
        >
        <LinearLayout
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center_horizontal"
            android:layout_marginTop="33dp"
            android:layout_marginBottom="20dp"
            android:gravity="center"
            >
            <androidx.constraintlayout.utils.widget.ImageFilterView
                android:layout_width="50dp"
                android:layout_height="50dp"
                app:roundPercent="1"
                android:background="@drawable/img_sakura"
                />
            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="张喵"
                android:textSize="18sp"
                android:textColor="@color/black"
                android:layout_marginStart="16dp"
                />
        </LinearLayout>
        <androidx.cardview.widget.CardView
            android:layout_width="match_parent"
            android:layout_height="304dp"
            app:cardBackgroundColor="@color/white"
            app:cardCornerRadius="10dp"
            app:cardElevation="0dp"
            >
            <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:orientation="vertical"
                android:paddingVertical="8dp"
                >
                <TextView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:text="核心板块"
                    android:textColor="@color/black"
                    android:textSize="12sp"
                    android:layout_marginStart="14dp"
                    />
                <View
                    android:layout_width="match_parent"
                    android:layout_height="1dp"
                    android:background="#FFF3F3F3"
                    />
                <LinearLayout
                    android:id="@+id/dl_home_root_net"
                    android:layout_width="match_parent"
                    android:layout_height="0dp"
                    android:layout_weight="1"
                    android:paddingHorizontal="15dp"
                    android:gravity="center"
                    >
                    <ImageView
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:background="@drawable/ic_family_root_net"
                        />
                    <TextView
                        android:layout_width="0dp"
                        android:layout_height="wrap_content"
                        android:layout_weight="1"
                        android:text="家根网"
                        android:textColor="@color/black"
                        android:textSize="14sp"
                        android:layout_marginStart="15dp"
                        />
                    <ImageView
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:background="@drawable/ic_vector_gray"
                        />
                </LinearLayout>
                <LinearLayout
                    android:id="@+id/dl_family_memorabilia"
                    android:layout_width="match_parent"
                    android:layout_height="0dp"
                    android:layout_weight="1"
                    android:paddingHorizontal="15dp"
                    android:gravity="center"
                    >
                    <ImageView
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:background="@drawable/ic_notes"
                        />
                    <TextView
                        android:layout_width="0dp"
                        android:layout_height="wrap_content"
                        android:layout_weight="1"
                        android:text="家大事记"
                        android:textColor="@color/black"
                        android:textSize="14sp"
                        android:layout_marginStart="15dp"
                        />
                    <ImageView
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:background="@drawable/ic_vector_gray"
                        />
                </LinearLayout>
                <LinearLayout
                    android:id="@+id/dl_family_assets"
                    android:layout_width="match_parent"
                    android:layout_height="0dp"
                    android:layout_weight="1"
                    android:paddingHorizontal="15dp"
                    android:gravity="center"
                    >
                    <ImageView
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:background="@drawable/ic_asset"
                        />
                    <TextView
                        android:layout_width="0dp"
                        android:layout_height="wrap_content"
                        android:layout_weight="1"
                        android:text="家庭资产"
                        android:textColor="@color/black"
                        android:textSize="14sp"
                        android:layout_marginStart="15dp"
                        />
                    <ImageView
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:background="@drawable/ic_vector_gray"
                        />
                </LinearLayout>
                <LinearLayout
                    android:id="@+id/dl_home_devices"
                    android:layout_width="match_parent"
                    android:layout_height="0dp"
                    android:layout_weight="1"
                    android:paddingHorizontal="15dp"
                    android:gravity="center"
                    >
                    <ImageView
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:background="@drawable/ic_home_devices"
                        />
                    <TextView
                        android:layout_width="0dp"
                        android:layout_height="wrap_content"
                        android:layout_weight="1"
                        android:text="家庭设备"
                        android:textColor="@color/black"
                        android:textSize="14sp"
                        android:layout_marginStart="15dp"
                        />
                    <ImageView
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:background="@drawable/ic_vector_gray"
                        />
                </LinearLayout>
                <LinearLayout
                    android:id="@+id/dl_honor_collection"
                    android:layout_width="match_parent"
                    android:layout_height="0dp"
                    android:layout_weight="1"
                    android:paddingHorizontal="15dp"
                    android:gravity="center"
                    >
                    <ImageView
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:background="@drawable/ic_honor"
                        />
                    <TextView
                        android:layout_width="0dp"
                        android:layout_height="wrap_content"
                        android:layout_weight="1"
                        android:text="收藏、荣誉"
                        android:textColor="@color/black"
                        android:textSize="14sp"
                        android:layout_marginStart="15dp"
                        />
                    <ImageView
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:background="@drawable/ic_vector_gray"
                        />
                </LinearLayout>
                <LinearLayout
                    android:id="@+id/dl_little_doctor"
                    android:layout_width="match_parent"
                    android:layout_height="0dp"
                    android:layout_weight="1"
                    android:paddingHorizontal="15dp"
                    android:gravity="center"
                    >
                    <ImageView
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:background="@drawable/ic_little_doctor"
                        />
                    <TextView
                        android:layout_width="0dp"
                        android:layout_height="wrap_content"
                        android:layout_weight="1"
                        android:text="小医生"
                        android:textColor="@color/black"
                        android:textSize="14sp"
                        android:layout_marginStart="15dp"
                        />
                    <ImageView
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:background="@drawable/ic_vector_gray"
                        />
                </LinearLayout>
                <LinearLayout
                    android:id="@+id/dl_clean_storage"
                    android:layout_width="match_parent"
                    android:layout_height="0dp"
                    android:layout_weight="1"
                    android:paddingHorizontal="15dp"
                    android:gravity="center"
                    >
                    <ImageView
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:background="@drawable/ic_cleaning"
                        />
                    <TextView
                        android:layout_width="0dp"
                        android:layout_height="wrap_content"
                        android:layout_weight="1"
                        android:text="保洁、收纳"
                        android:textColor="@color/black"
                        android:textSize="14sp"
                        android:layout_marginStart="15dp"
                        />
                    <ImageView
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:background="@drawable/ic_vector_gray"
                        />
                </LinearLayout>
                <LinearLayout
                    android:id="@+id/dl_contacts"
                    android:layout_width="match_parent"
                    android:layout_height="0dp"
                    android:layout_weight="1"
                    android:paddingHorizontal="15dp"
                    android:gravity="center"
                    >
                    <ImageView
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:background="@drawable/ic_mail_list"
                        />
                    <TextView
                        android:layout_width="0dp"
                        android:layout_height="wrap_content"
                        android:layout_weight="1"
                        android:text="通讯录"
                        android:textColor="@color/black"
                        android:textSize="14sp"
                        android:layout_marginStart="15dp"
                        />
                    <ImageView
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:background="@drawable/ic_vector_gray"
                        />
                </LinearLayout>
                <LinearLayout
                    android:id="@+id/dl_pet"
                    android:layout_width="match_parent"
                    android:layout_height="0dp"
                    android:layout_weight="1"
                    android:paddingHorizontal="15dp"
                    android:gravity="center"
                    >
                    <ImageView
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:background="@drawable/ic_pet"
                        />
                    <TextView
                        android:layout_width="0dp"
                        android:layout_height="wrap_content"
                        android:layout_weight="1"
                        android:text="魅宠"
                        android:textColor="@color/black"
                        android:textSize="14sp"
                        android:layout_marginStart="15dp"
                        />
                    <ImageView
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:background="@drawable/ic_vector_gray"
                        />
                </LinearLayout>
                <LinearLayout
                    android:id="@+id/dl_income_and_expenses"
                    android:layout_width="match_parent"
                    android:layout_height="0dp"
                    android:layout_weight="1"
                    android:paddingHorizontal="15dp"
                    android:gravity="center"
                    >
                    <ImageView
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:background="@drawable/ic_income_expense"
                        />
                    <TextView
                        android:layout_width="0dp"
                        android:layout_height="wrap_content"
                        android:layout_weight="1"
                        android:text="家庭收支台账"
                        android:textColor="@color/black"
                        android:textSize="14sp"
                        android:layout_marginStart="15dp"
                        />
                    <ImageView
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:background="@drawable/ic_vector_gray"
                        />
                </LinearLayout>
            </LinearLayout>
        </androidx.cardview.widget.CardView>
        <androidx.cardview.widget.CardView
            android:layout_width="match_parent"
            android:layout_height="240dp"
            app:cardBackgroundColor="@color/white"
            app:cardCornerRadius="10dp"
            app:cardElevation="0dp"
            android:layout_marginTop="26dp"
            android:layout_marginBottom="14dp"
            >
            <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:orientation="vertical"
                >
                <TextView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:text="个人板块"
                    android:textColor="@color/black"
                    android:textSize="12sp"
                    android:layout_marginVertical="8dp"
                    android:layout_marginStart="14dp"
                    />
                <View
                    android:layout_width="match_parent"
                    android:layout_height="1dp"
                    android:background="#FFF3F3F3"
                    />
                <LinearLayout
                    android:id="@+id/dl_growing_up"
                    android:layout_width="match_parent"
                    android:layout_height="0dp"
                    android:layout_weight="1"
                    android:paddingHorizontal="15dp"
                    android:gravity="center"
                    >
                    <ImageView
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:background="@drawable/ic_growth"
                        />
                    <TextView
                        android:layout_width="0dp"
                        android:layout_height="wrap_content"
                        android:layout_weight="1"
                        android:text="成长经历阅历"
                        android:textColor="@color/black"
                        android:textSize="14sp"
                        android:layout_marginStart="15dp"
                        />
                    <ImageView
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:background="@drawable/ic_vector_gray"
                        />
                </LinearLayout>
                <LinearLayout
                    android:id="@+id/dl_marriage"
                    android:layout_width="match_parent"
                    android:layout_height="0dp"
                    android:layout_weight="1"
                    android:paddingHorizontal="15dp"
                    android:gravity="center"
                    >
                    <ImageView
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:background="@drawable/ic_marriage"
                        />
                    <TextView
                        android:layout_width="0dp"
                        android:layout_height="wrap_content"
                        android:layout_weight="1"
                        android:text="婚姻"
                        android:textColor="@color/black"
                        android:textSize="14sp"
                        android:layout_marginStart="15dp"
                        />
                    <ImageView
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:background="@drawable/ic_vector_gray"
                        />
                </LinearLayout>
                <LinearLayout
                    android:id="@+id/dl_property"
                    android:layout_width="match_parent"
                    android:layout_height="0dp"
                    android:layout_weight="1"
                    android:paddingHorizontal="15dp"
                    android:gravity="center"
                    >
                    <ImageView
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:background="@drawable/ic_property"
                        />
                    <TextView
                        android:layout_width="0dp"
                        android:layout_height="wrap_content"
                        android:layout_weight="1"
                        android:text="财产"
                        android:textColor="@color/black"
                        android:textSize="14sp"
                        android:layout_marginStart="15dp"
                        />
                    <ImageView
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:background="@drawable/ic_vector_gray"
                        />
                </LinearLayout>
                <LinearLayout
                    android:layout_width="match_parent"
                    android:layout_height="0dp"
                    android:layout_weight="1"
                    android:paddingHorizontal="15dp"
                    android:gravity="center"
                    >
                    <ImageView
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:background="@drawable/ic_wish"
                        />
                    <TextView
                        android:layout_width="0dp"
                        android:layout_height="wrap_content"
                        android:layout_weight="1"
                        android:text="百年心愿"
                        android:textColor="@color/black"
                        android:textSize="14sp"
                        android:layout_marginStart="15dp"
                        />
                    <ImageView
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:background="@drawable/ic_vector_gray"
                        />
                </LinearLayout>
                <LinearLayout
                    android:id="@+id/dl_hundred_wish"
                    android:layout_width="match_parent"
                    android:layout_height="0dp"
                    android:layout_weight="1"
                    android:paddingHorizontal="15dp"
                    android:gravity="center"
                    >
                    <ImageView
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:background="@drawable/ic_tour"
                        />
                    <TextView
                        android:layout_width="0dp"
                        android:layout_height="wrap_content"
                        android:layout_weight="1"
                        android:text="旅游"
                        android:textColor="@color/black"
                        android:textSize="14sp"
                        android:layout_marginStart="15dp"
                        />
                    <ImageView
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:background="@drawable/ic_vector_gray"
                        />
                </LinearLayout>
                <LinearLayout
                    android:id="@+id/dl_health_care"
                    android:layout_width="match_parent"
                    android:layout_height="0dp"
                    android:layout_weight="1"
                    android:paddingHorizontal="15dp"
                    android:gravity="center"
                    >
                    <ImageView
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:background="@drawable/ic_health" />
                    <TextView
                        android:layout_width="0dp"
                        android:layout_height="wrap_content"
                        android:layout_weight="1"
                        android:text="健康保健"
                        android:textColor="@color/black"
                        android:textSize="14sp"
                        android:layout_marginStart="15dp"
                        />
                    <ImageView
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:background="@drawable/ic_vector_gray"
                        />
                </LinearLayout>
                <LinearLayout
                    android:id="@+id/dl_certificate_of_honor"
                    android:layout_width="match_parent"
                    android:layout_height="0dp"
                    android:layout_weight="1"
                    android:paddingHorizontal="15dp"
                    android:gravity="center"
                    >
                    <ImageView
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:background="@drawable/ic_certificate"
                        />
                    <TextView
                        android:layout_width="0dp"
                        android:layout_height="wrap_content"
                        android:layout_weight="1"
                        android:text="荣誉、证书奖项"
                        android:textColor="@color/black"
                        android:textSize="14sp"
                        android:layout_marginStart="15dp"
                        />
                    <ImageView
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:background="@drawable/ic_vector_gray"
                        />
                </LinearLayout>
                <LinearLayout
                    android:id="@+id/dl_privacy"
                    android:layout_width="match_parent"
                    android:layout_height="0dp"
                    android:layout_weight="1"
                    android:paddingHorizontal="15dp"
                    android:gravity="center"
                    >
                    <ImageView
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:background="@drawable/ic_privacy"
                        />
                    <TextView
                        android:layout_width="0dp"
                        android:layout_height="wrap_content"
                        android:layout_weight="1"
                        android:text="隐私"
                        android:textColor="@color/black"
                        android:textSize="14sp"
                        android:layout_marginStart="15dp"
                        />
                    <ImageView
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:background="@drawable/ic_vector_gray"
                        />
                </LinearLayout>
            </LinearLayout>
        </androidx.cardview.widget.CardView>
    </LinearLayout>
</androidx.core.widget.NestedScrollView>
app/src/main/res/layout/pop_operate.xml
@@ -10,55 +10,69 @@
    >
    <LinearLayout
        android:layout_width="85dp"
        android:layout_height="122dp"
        android:layout_height="wrap_content"
        android:orientation="vertical"
        android:gravity="center_horizontal"
        >
        <TextView
            android:id="@+id/tv_add"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:gravity="center"
            android:text="新建"
            android:textColor="#FF333333"
            android:textSize="12sp"
            app:drawableStartCompat="@drawable/ic_operate_add"
            android:drawablePadding="5dp"
            android:layout_weight="1"
            />
        <View
        <LinearLayout
            android:id="@+id/layout_add"
            android:layout_width="match_parent"
            android:layout_height="0.3dp"
            android:background="#FF939393"
            />
        <TextView
            android:id="@+id/tv_select"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="选择"
            android:gravity="center"
            android:textColor="#FF333333"
            android:textSize="12sp"
            app:drawableStartCompat="@drawable/ic_operate_select"
            android:drawablePadding="5dp"
            android:layout_weight="1"
            />
        <View
            android:orientation="vertical"
            android:gravity="center_horizontal"
            >
            <TextView
                android:id="@+id/tv_add"
                android:layout_width="wrap_content"
                android:layout_height="32dp"
                android:gravity="center"
                android:text="新建"
                android:textColor="#FF333333"
                android:textSize="12sp"
                app:drawableStartCompat="@drawable/ic_operate_add"
                android:drawablePadding="5dp"
                />
            <View
                android:layout_width="match_parent"
                android:layout_height="0.3dp"
                android:background="#FF939393"
                />
        </LinearLayout>
        <LinearLayout
            android:id="@+id/layout_select"
            android:layout_width="match_parent"
            android:layout_height="0.3dp"
            android:background="#FF939393"
            />
            android:layout_height="wrap_content"
            android:orientation="vertical"
            android:gravity="center_horizontal"
            >
            <TextView
                android:id="@+id/tv_select"
                android:layout_width="wrap_content"
                android:layout_height="32dp"
                android:text="选择"
                android:gravity="center"
                android:textColor="#FF333333"
                android:textSize="12sp"
                app:drawableStartCompat="@drawable/ic_operate_select"
                android:drawablePadding="5dp"
                />
            <View
                android:layout_width="match_parent"
                android:layout_height="0.3dp"
                android:background="#FF939393"
                />
        </LinearLayout>
        <TextView
            android:id="@+id/tv_from_new_to_old"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_height="32dp"
            android:text="由新到旧"
            android:gravity="center"
            android:textColor="#FF333333"
            android:textSize="12sp"
            app:drawableStartCompat="@drawable/ic_operate_order"
            android:drawablePadding="5dp"
            android:layout_weight="1"
            android:drawablePadding="3dp"
            />
        <View
            android:layout_width="match_parent"
@@ -68,14 +82,13 @@
        <TextView
            android:id="@+id/tv_from_old_to_new"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_height="32dp"
            android:text="由旧到新"
            android:gravity="center"
            android:textColor="#FF333333"
            android:textSize="12sp"
            app:drawableStartCompat="@drawable/ic_operate_order"
            android:drawablePadding="5dp"
            android:layout_weight="1"
            android:drawablePadding="3dp"
            />
    </LinearLayout>
app/src/main/res/layout/pop_search.xml
@@ -1,106 +1,184 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.cardview.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:orientation="vertical"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    app:cardBackgroundColor="#FFFAD1E0"
    app:cardCornerRadius="10dp"
    app:cardElevation="0dp"
    >
<layout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto">
    <data>
        <import type="android.text.TextUtils" />
        <import type="android.view.View" />
        <variable
            name="viewModel"
            type="com.application.zhangshi_app_android.ui.function.FamilyMemorabiliaActivityViewModel" />
    </data>
    <LinearLayout
        android:layout_width="200dp"
        android:layout_height="180dp"
        android:orientation="vertical"
        android:gravity="center_horizontal"
        >
        <TextView
            android:id="@+id/tv_global_search"
            android:layout_width="match_parent"
            android:layout_height="0dp"
            android:gravity="center"
            android:text="全局搜索"
            android:textColor="#FF333333"
            android:textSize="12sp"
            android:layout_weight="1"
            />
        <View
            android:layout_width="match_parent"
            android:layout_height="0.3dp"
            android:background="#FF939393"
            />
        <TextView
            android:id="@+id/tv_search_in_family_memorabilia"
            android:layout_width="match_parent"
            android:layout_height="0dp"
            android:gravity="center"
            android:text="在“家大事记”内搜索"
            android:textColor="#FF333333"
            android:textSize="12sp"
            android:layout_weight="1"
            />
        <View
            android:layout_width="match_parent"
            android:layout_height="0.3dp"
            android:background="#FF939393"
            />
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:background="@color/white">
        <TextView
            android:id="@+id/tv_search_by_title"
        <View
            android:layout_width="match_parent"
            android:layout_height="0dp"
            android:layout_weight="1"
            android:gravity="center"
            android:text="按“大事记标题”搜索"
            android:textColor="#FF333333"
            android:textSize="12sp" />
            android:layout_height="0.5dp"
            android:background="#FF939393" />
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="40dp"
            android:layout_marginHorizontal="12dp"
            android:gravity="center">
            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="标题"
                android:textColor="#FF333333"
                android:textSize="14sp" />
            <EditText
                android:id="@+id/et_title"
                android:layout_width="0dp"
                android:layout_weight="1"
                android:layout_height="wrap_content"
                android:background="@null"
                android:inputType="text"
                android:layout_marginStart="6dp"
                android:text="@={viewModel.requestBeanMutableLiveData.title}"
                android:hint="请输入标题"
                android:textColorHint="#61000000"
                android:textColor="#FF333333"
                android:textSize="14sp" />
            <ImageView
                android:id="@+id/iv_clear_title"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:visibility="@{viewModel.requestBeanMutableLiveData.title != null  &amp;&amp; viewModel.requestBeanMutableLiveData.title.length() > 0 ? View.VISIBLE : View.GONE}"
                android:background="@drawable/ic_clear" />
        </LinearLayout>
        <View
            android:layout_width="match_parent"
            android:layout_height="0.3dp"
            android:background="#FF939393"
            />
        <TextView
            android:id="@+id/tv_search_by_people"
            android:layout_width="match_parent"
            android:layout_height="0dp"
            android:gravity="center"
            android:text="按“人物”搜索"
            android:textColor="#FF333333"
            android:textSize="12sp"
            android:layout_weight="1"
            />
        <View
            android:layout_width="match_parent"
            android:layout_height="0.3dp"
            android:background="#FF939393"
            />
            android:background="#FF939393" />
        <TextView
            android:id="@+id/tv_search_by_time"
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="0dp"
            android:layout_weight="1"
            android:gravity="center"
            android:text="按“时间”搜索"
            android:textColor="#FF333333"
            android:textSize="12sp" />
            android:layout_height="40dp"
            android:layout_marginHorizontal="12dp"
            android:gravity="center">
            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="人物"
                android:textColor="#FF333333"
                android:textSize="14sp" />
            <EditText
                android:id="@+id/et_person"
                android:layout_width="0dp"
                android:layout_weight="1"
                android:inputType="text"
                android:layout_height="wrap_content"
                android:background="@null"
                android:layout_marginStart="6dp"
                android:text="@={viewModel.requestBeanMutableLiveData.people}"
                android:hint="请输入人物"
                android:textColorHint="#61000000"
                android:textColor="#FF333333"
                android:textSize="14sp" />
            <ImageView
                android:id="@+id/iv_clear_person"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:background="@drawable/ic_clear"
                android:visibility="@{TextUtils.isEmpty(viewModel.requestBeanMutableLiveData.people)?View.GONE:View.VISIBLE}"
                />
        </LinearLayout>
        <View
            android:layout_width="match_parent"
            android:layout_height="0.3dp"
            android:background="#FF939393"
            />
        <TextView
            android:id="@+id/tv_search_by_place"
            android:background="#FF939393" />
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="0dp"
            android:gravity="center"
            android:text="按“地点”搜索"
            android:textColor="#FF333333"
            android:textSize="12sp"
            android:layout_weight="1"
            />
            android:layout_height="40dp"
            android:layout_marginHorizontal="12dp"
            android:gravity="center">
            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="时间"
                android:textColor="#FF333333"
                android:textSize="14sp" />
            <EditText
                android:id="@+id/et_time"
                android:layout_width="0dp"
                android:layout_weight="1"
                android:layout_height="wrap_content"
                android:background="@null"
                android:inputType="text"
                android:layout_marginStart="6dp"
                android:text="@={viewModel.requestBeanMutableLiveData.createTime}"
                android:hint="请输入时间"
                android:textColorHint="#61000000"
                android:textColor="#FF333333"
                android:textSize="14sp" />
            <ImageView
                android:id="@+id/iv_clear_time"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:background="@drawable/ic_clear"
                android:visibility="@{TextUtils.isEmpty(viewModel.requestBeanMutableLiveData.createTime)?View.GONE:View.VISIBLE}"
                />
        </LinearLayout>
        <View
            android:layout_width="match_parent"
            android:layout_height="0.3dp"
            android:background="#FF939393" />
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="40dp"
            android:layout_marginHorizontal="12dp"
            android:gravity="center">
            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="地点"
                android:textColor="#FF333333"
                android:textSize="14sp" />
            <EditText
                android:id="@+id/et_place"
                android:layout_width="0dp"
                android:layout_weight="1"
                android:layout_height="wrap_content"
                android:background="@null"
                android:layout_marginStart="6dp"
                android:text="@={viewModel.requestBeanMutableLiveData.address}"
                android:inputType="text"
                android:hint="请输入地点"
                android:textColorHint="#61000000"
                android:textColor="#FF333333"
                android:textSize="14sp" />
            <ImageView
                android:id="@+id/iv_clear_place"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:background="@drawable/ic_clear"
                android:visibility="@{TextUtils.isEmpty(viewModel.requestBeanMutableLiveData.address)?View.GONE:View.VISIBLE}"
                />
        </LinearLayout>
    </LinearLayout>
</androidx.cardview.widget.CardView>
</layout>
app_base/build.gradle
@@ -66,9 +66,23 @@
    // kotlin扩展(可选)
//    implementation 'com.geyifeng.immersionbar:immersionbar-ktx:3.2.2'
    //图片相关
    api 'com.github.bumptech.glide:glide:4.11.0'
    annotationProcessor 'com.github.bumptech.glide:compiler:4.11.0'
    api 'com.github.bumptech.glide:glide:4.12.0'
    annotationProcessor 'com.github.bumptech.glide:compiler:4.12.0'
    //内存泄露工具
    debugImplementation 'com.squareup.leakcanary:leakcanary-android:2.9.1'
    //图片选择器
    // PictureSelector 基础 (必须)
    api 'io.github.lucksiege:pictureselector:v3.10.8'
    // 图片压缩 (按需引入)
    api 'io.github.lucksiege:compress:v3.10.8'
    // 图片裁剪 (按需引入)
    api 'io.github.lucksiege:ucrop:v3.10.8'
    // 自定义相机 (按需引入)
    api 'io.github.lucksiege:camerax:v3.10.8'
    // 动画解析库:https://github.com/airbnb/lottie-android
    // 动画资源:https://lottiefiles.com、https://icons8.com/animated-icons
    api 'com.airbnb.android:lottie:4.1.0'
}
app_base/src/main/java/com/android/app_base/base/adapter/BaseRVAdapter.java
@@ -21,7 +21,7 @@
/**
 * @author Ljj
 * @date 2023.03.02. 17:09
 * @desc
 * @desc RecyclerView 适配器基类
 */
public abstract class BaseRVAdapter<T,VDB extends ViewDataBinding,VH extends BaseRVAdapter.BaseViewHolder<VDB>> extends RecyclerView.Adapter<VH> {
app_base/src/main/java/com/android/app_base/base/adapter/ImageViewAdapter.java
@@ -2,10 +2,13 @@
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.net.Uri;
import android.util.Base64;
import android.widget.ImageView;
import androidx.databinding.BindingAdapter;
import com.android.app_base.utils.GlideUtil;
/**
 * @author Ljj
@@ -14,7 +17,12 @@
 */
public class ImageViewAdapter {
    @BindingAdapter({"imageUrl"})
    public static void loadImage(ImageView imageView, String url) {
    public static void loadUrlImage(ImageView imageView, String url) {
        GlideUtil.loadImage(url, imageView);
    }
    @BindingAdapter({"imageUri"})
    public static void loadUriImage(ImageView imageView, String uri) {
        imageView.setImageURI(Uri.parse(uri));
    }
    @BindingAdapter({"imageBase64"})
app_base/src/main/java/com/android/app_base/base/dialog/WaitDialog.java
New file
@@ -0,0 +1,40 @@
package com.android.app_base.base.dialog;
import static com.blankj.utilcode.util.StringUtils.getString;
import android.content.Context;
import android.view.View;
import android.widget.TextView;
import androidx.annotation.StringRes;
import com.android.app_base.R;
public final class WaitDialog {
    public static final class Builder
            extends BaseDialog.Builder<Builder> {
        private final TextView mMessageView;
        public Builder(Context context) {
            super(context);
            setContentView(R.layout.wait_dialog);
            setAnimStyle(BaseDialog.ANIM_TOAST);
            setBackgroundDimEnabled(false);
            setCancelable(false);
            mMessageView = findViewById(R.id.tv_wait_message);
        }
        public Builder setMessage(@StringRes int id) {
            return setMessage(getString(id));
        }
        public Builder setMessage(CharSequence text) {
            mMessageView.setText(text);
            mMessageView.setVisibility(text == null ? View.GONE : View.VISIBLE);
            return this;
        }
    }
}
app_base/src/main/java/com/android/app_base/base/view/BaseActivity.java
@@ -15,15 +15,14 @@
import androidx.appcompat.app.AppCompatActivity;
import androidx.databinding.DataBindingUtil;
import androidx.databinding.ViewDataBinding;
import androidx.drawerlayout.widget.DrawerLayout;
import androidx.lifecycle.Observer;
import androidx.lifecycle.ViewModelProvider;
import com.android.app_base.action.TitleBarAction;
import com.android.app_base.base.BaseApplication;
import com.android.app_base.base.action.ClickAction;
import com.android.app_base.base.viewmodel.BaseViewModel;
import com.android.app_base.base.StateViewEnum;
import com.android.app_base.utils.ScreenSizeUtils;
import com.blankj.utilcode.util.ToastUtils;
import com.gyf.immersionbar.ImmersionBar;
import com.hjq.bar.TitleBar;
@@ -34,11 +33,10 @@
/**
 *  Activity基类,所有的 Activity 都要继承此类
 */
public abstract class BaseActivity<V extends ViewDataBinding,VM extends BaseViewModel> extends AppCompatActivity implements TitleBarAction, ClickAction {
    protected V binding;
public abstract class BaseActivity<VDB extends ViewDataBinding,VM extends BaseViewModel> extends AppCompatActivity implements TitleBarAction, ClickAction {
    protected VDB binding;
    protected VM viewModel;
    private int viewModelId;
    /**
     * 标题栏对象
     */
@@ -47,8 +45,6 @@
     * 状态栏沉浸
     */
    private ImmersionBar mImmersionBar;
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
@@ -61,6 +57,7 @@
        initView();
        //页面事件监听的方法,用于ViewModel层转到View层的事件注册
        initLiveDataObserve();
    }
    @Override
    protected void onResume() {
@@ -91,6 +88,7 @@
        initStateView();
        //初始化沉浸式状态栏和 titleBar
        initStatusBar();
        initSoftKeyboard();
    }
    /**
@@ -98,8 +96,7 @@
     */
    protected void initViewDataBindingAndViewModel() {
        if (getLayoutId() > 0) {
            binding = DataBindingUtil.setContentView(this, getLayoutId());
            initSoftKeyboard();
            binding = initViewBinding();
        }
        viewModelId = getVariableId();
        viewModel = initViewModel();
@@ -113,6 +110,13 @@
            //让ViewModel拥有View的生命周期感应
            getLifecycle().addObserver(viewModel);
        }
    }
    /**
     * 初始化ViewBinding
     */
    protected VDB initViewBinding() {
        return DataBindingUtil.setContentView(this, getLayoutId());
    }
    /**
     * 初始化ViewModel
@@ -130,6 +134,7 @@
        return new ViewModelProvider(this, (ViewModelProvider.Factory) ViewModelProvider.AndroidViewModelFactory.getInstance(getApplication())).get(vmClass);
    }
    /**
     * 对状态视图liveData进行观察监听
     */
app_base/src/main/java/com/android/app_base/http/interceptor/LogInterceptor.java
@@ -39,7 +39,7 @@
        //重定向URL
        @SuppressLint("MissingPermission") HttpUrl modifiedUrl = request.url().newBuilder()
                //添加的公共参数
                .addQueryParameter("deviceId", PhoneUtils.getDeviceId())
//                .addQueryParameter("deviceId", PhoneUtils.getDeviceId())
                .addQueryParameter("udid", "")
                .addQueryParameter("channel", "")
                .addQueryParameter("version", "")
@@ -51,7 +51,7 @@
                .addQueryParameter("os", "android")
                .addQueryParameter("osVersion", DeviceUtils.getSDKVersionName())
                .addQueryParameter("isSimulator", DeviceUtils.isEmulator() ? "1" : "0")
                .addQueryParameter("imei", PhoneUtils.getIMEI())
//                .addQueryParameter("imei", PhoneUtils.getIMEI())
                .addQueryParameter("oaid", "android")
                .addQueryParameter("androidId", DeviceUtils.getAndroidID())
//                .addQueryParameter("networkType", NetworkUtils.getNetworkType().name())
app_base/src/main/java/com/android/app_base/manager/OnPermissionsInterceptListenerImpl.java
New file
@@ -0,0 +1,51 @@
package com.android.app_base.manager;
import android.Manifest;
import android.os.Build;
import androidx.fragment.app.Fragment;
import com.blankj.utilcode.util.PermissionUtils;
import com.luck.picture.lib.interfaces.OnRequestPermissionListener;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
/**
 * @author Ljj
 * @date 2023.04.02. 18:45
 * @desc 解决Android 13 以上版本使用PictureSelector 选择图片时报错的问题
 *       'io.github.lucksiege:pictureselector:v3.10.9'则不需要
 *       //TODO 待删
 */
public class OnPermissionsInterceptListenerImpl implements com.luck.picture.lib.interfaces.OnPermissionsInterceptListener {
    @Override
    public void requestPermission(Fragment fragment, String[] permissionArray, OnRequestPermissionListener call) {
        if (permissionArray == null || fragment == null || fragment.getContext() == null) return;
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
            //把权限数组转换成List
            List<String> result = new ArrayList<>(Arrays.asList(permissionArray));
            result.remove(Manifest.permission.READ_EXTERNAL_STORAGE);
            //把result转换成数组
            permissionArray = result.toArray(new String[result.size()]);
            call.onCall(permissionArray, true);
        } else {
            call.onCall(permissionArray, true);
        }
    }
    @Override
    public boolean hasPermissions(Fragment fragment, String[] permissionArray) {
        if (permissionArray == null || fragment == null) return false;
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
            List<String> result = Arrays.asList(permissionArray);
            if (result.contains(Manifest.permission.READ_EXTERNAL_STORAGE)) {
                result.remove(Manifest.permission.READ_EXTERNAL_STORAGE);
            }
        } else {
            return PermissionUtils.isGranted(permissionArray);
        }
        return false;
    }
}
app_base/src/main/java/com/android/app_base/manager/UserManager.java
@@ -1,6 +1,22 @@
package com.android.app_base.manager;
import android.Manifest;
import android.app.Activity;
import android.os.Build;
import androidx.annotation.NonNull;
import com.android.app_base.utils.GlideEngine;
import com.android.app_base.utils.SPUtils;
import com.android.app_base.utils.ToastUtils;
import com.blankj.utilcode.util.PermissionUtils;
import com.luck.picture.lib.basic.PictureSelector;
import com.luck.picture.lib.config.SelectMimeType;
import com.luck.picture.lib.entity.LocalMedia;
import com.luck.picture.lib.interfaces.OnResultCallbackListener;
import java.io.File;
import java.util.ArrayList;
/**
 * @author Ljj
@@ -20,6 +36,52 @@
        }
        return instance;
    }
    /**
     * 是否有权限
     */
    public boolean isGranted(@NonNull String... permissions) {
        return PermissionUtils.isGranted(permissions);
    }
    /**
     * 获取权限
     */
    public void getPermissions(PermissionUtils.SimpleCallback simpleCallback, @NonNull String... permissions) {
        if (isGranted(permissions)){
            simpleCallback.onGranted();
            return;
        }
        PermissionUtils.permission(permissions).callback(simpleCallback).request();
    }
    /**
     * 选择图片
     */
    public void selectImage(Activity activity,int maxSelectNum,OnResultCallbackListener<LocalMedia> onResultCallbackListener){
        String[] permissions;
        if (Build.VERSION.SDK_INT >= 33) {
            permissions = new String[]{Manifest.permission.READ_MEDIA_IMAGES, Manifest.permission.READ_MEDIA_VIDEO, Manifest.permission.READ_MEDIA_AUDIO, Manifest.permission.CAMERA};
        }else {
            permissions = new String[]{Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE,Manifest.permission.CAMERA};
        }
        getPermissions(new PermissionUtils.SimpleCallback() {
            @Override
            public void onGranted() {
                PictureSelector.create(activity)
                        .openGallery(SelectMimeType.ofImage())
                        .setImageEngine(GlideEngine.createGlideEngine())
                        .setPermissionsInterceptListener(new OnPermissionsInterceptListenerImpl())
                        .isMaxSelectEnabledMask(true)// 达到最大选择数是否开启禁选蒙层
                        .setMaxSelectNum(maxSelectNum)
                        .forResult(onResultCallbackListener);
            }
            //
            @Override
            public void onDenied() {
                ToastUtils.showShort("请开启相关权限");
            }
        }, permissions);
    }
    public void setToken(String token){
        SPUtils.getInstance("tokenInfo").put("token",token);
app_base/src/main/java/com/android/app_base/utils/GlideEngine.java
New file
@@ -0,0 +1,106 @@
package com.android.app_base.utils;
import android.content.Context;
import android.widget.ImageView;
import com.android.app_base.R;
import com.bumptech.glide.Glide;
import com.bumptech.glide.load.resource.bitmap.CenterCrop;
import com.bumptech.glide.load.resource.bitmap.RoundedCorners;
import com.luck.picture.lib.engine.ImageEngine;
import com.luck.picture.lib.utils.ActivityCompatHelper;
public class GlideEngine implements ImageEngine {
    /**
     * 加载图片
     *
     * @param context   上下文
     * @param url       资源url
     * @param imageView 图片承载控件
     */
    @Override
    public void loadImage(Context context, String url, ImageView imageView) {
        if (!ActivityCompatHelper.assertValidRequest(context)) {
            return;
        }
        Glide.with(context)
                .load(url)
                .into(imageView);
    }
    @Override
    public void loadImage(Context context, ImageView imageView, String url, int maxWidth, int maxHeight) {
        if (!ActivityCompatHelper.assertValidRequest(context)) {
            return;
        }
        Glide.with(context)
                .load(url)
                .override(maxWidth, maxHeight)
                .into(imageView);
    }
    /**
     * 加载相册目录封面
     *
     * @param context   上下文
     * @param url       图片路径
     * @param imageView 承载图片ImageView
     */
    @Override
    public void loadAlbumCover(Context context, String url, ImageView imageView) {
        if (!ActivityCompatHelper.assertValidRequest(context)) {
            return;
        }
        Glide.with(context)
                .asBitmap()
                .load(url)
                .override(180, 180)
                .sizeMultiplier(0.5f)
                .transform(new CenterCrop(), new RoundedCorners(8))
                .placeholder(com.luck.picture.lib.R.drawable.ps_image_placeholder)
                .into(imageView);
    }
    /**
     * 加载图片列表图片
     *
     * @param context   上下文
     * @param url       图片路径
     * @param imageView 承载图片ImageView
     */
    @Override
    public void loadGridImage(Context context, String url, ImageView imageView) {
        if (!ActivityCompatHelper.assertValidRequest(context)) {
            return;
        }
        Glide.with(context)
                .load(url)
                .override(200, 200)
                .centerCrop()
                .placeholder(com.luck.picture.lib.R.drawable.ps_image_placeholder)
                .into(imageView);
    }
    @Override
    public void pauseRequests(Context context) {
        Glide.with(context).pauseRequests();
    }
    @Override
    public void resumeRequests(Context context) {
        Glide.with(context).resumeRequests();
    }
    private GlideEngine() {
    }
    private static final class InstanceHolder {
        static final GlideEngine instance = new GlideEngine();
    }
    public static GlideEngine createGlideEngine() {
        return InstanceHolder.instance;
    }
}
app_base/src/main/java/com/android/app_base/utils/GlideUtil.java
New file
@@ -0,0 +1,96 @@
package com.android.app_base.utils;
import android.content.Context;
import android.widget.ImageView;
import com.android.app_base.R;
import com.android.app_base.base.BaseApplication;
import com.bumptech.glide.Glide;
import com.bumptech.glide.load.engine.DiskCacheStrategy;
import com.bumptech.glide.load.resource.bitmap.CenterCrop;
import com.bumptech.glide.load.resource.bitmap.RoundedCorners;
import com.bumptech.glide.request.RequestOptions;
/**
 * @author Ljj
 * @date 2023.04.02. 23:16
 * @desc Glide工具类
 */
public class GlideUtil {
    /**
     * 加载图片到 ImageView 中
     *
     * @param imageUrl  图片 URL
     * @param imageView ImageView 对象
     */
    public static void loadImage(String imageUrl, ImageView imageView) {
        Glide.with(BaseApplication.getInstance())
                .load(imageUrl)
                .into(imageView);
    }
    //圆形
    public static <T> void loadCircleImage(T t, ImageView img) {
        RequestOptions options = new RequestOptions()
                .circleCrop()
                .placeholder(com.luck.picture.lib.R.drawable.ps_image_placeholder)
                .error(com.luck.picture.lib.R.drawable.ps_image_placeholder)
                .diskCacheStrategy(DiskCacheStrategy.ALL).dontAnimate();
        Glide.with(BaseApplication.getInstance())
                .load(t)
                .apply(options)
                .into(img);
    }
    //圆角
    public static <T> void loadCornersImage(T t, ImageView img,int radius) {
        Glide.with(BaseApplication.getInstance())
                .load(t)
                .diskCacheStrategy(DiskCacheStrategy.ALL)
                .dontAnimate()
                .transform(new CenterCrop(),new RoundedCorners(radius))
                .into (img);
    }
    //透明度
    public static <T> void loadAlphaImage(T t, ImageView img,float alpha) {
        img.setAlpha(alpha);
        RequestOptions options = new RequestOptions().centerCrop().placeholder(com.luck.picture.lib.R.drawable.ps_image_placeholder)
                .diskCacheStrategy(DiskCacheStrategy.ALL).dontAnimate();
        Glide.with(BaseApplication.getInstance())
                .load(t)
                .apply(options)
                .into (img);
    }
    /**
     * 加载视频某时间的帧图片
     * @param t 视频地址
     * @param img 加载的控件
     * @param radius 圆角,不需要传负数
     * @param frame 需要加载的帧时间,单位微秒
     * @param <T>
     */
    public static <T> void loadVideoCover(T t, ImageView img,int radius,int frame) {
        RequestOptions options = new RequestOptions().centerCrop()
                .frame(frame)
                .diskCacheStrategy(DiskCacheStrategy.ALL).dontAnimate();
        if (radius > 0){
            RoundedCorners roundedCorners = new RoundedCorners(radius);
            options.bitmapTransform(roundedCorners);
        }
        Glide.with(BaseApplication.getInstance())
                .load(t)
                .apply(options)
                .into (img);
    }
    /**
     * 清除 Glide 缓存
     *
     * @param context Context 对象
     */
    public static void clearCache(Context context) {
        Glide.get(context).clearMemory();
        new Thread(() -> Glide.get(context).clearDiskCache()).start();
    }
}
app_base/src/main/java/com/android/app_base/widget/ExtendTitleBar.java
New file
@@ -0,0 +1,58 @@
package com.android.app_base.widget;
import android.content.Context;
import android.util.AttributeSet;
import android.view.Gravity;
import androidx.databinding.BindingAdapter;
import androidx.databinding.BindingMethod;
import com.hjq.bar.TitleBar;
import com.hjq.bar.TitleBarSupport;
/**
 * @author Ljj
 * @date 2023.03.30. 20:47
 * @desc 扩展标题栏,在原有标题栏增加标题靠左或靠右的功能
 */
public class ExtendTitleBar extends TitleBar {
    private int titleGravity;
    public ExtendTitleBar(Context context) {
        super(context);
    }
    public ExtendTitleBar(Context context, AttributeSet attrs) {
        super(context, attrs);
    }
    public ExtendTitleBar(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }
    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
        setTitleGravity(titleGravity);
    }
    @Override
    public TitleBar setTitleGravity(int gravity) {
        titleGravity = gravity;
        gravity = TitleBarSupport.getAbsoluteGravity(this, gravity);
        LayoutParams params = (LayoutParams) getTitleView().getLayoutParams();
        params.gravity = gravity;
        // 如果标题的重心为左,那么左边就不能有内容
        if (gravity == Gravity.LEFT || gravity == Gravity.START){
            params.setMargins(getLeftView().getMeasuredWidth(),0,0,0);
        }
        // 如果标题的重心为右,那么右边就不能有内容
        if (gravity == Gravity.RIGHT && gravity == Gravity.END){
            params.setMargins(0,0,0, getRightView().getMeasuredWidth());
        }
        getTitleView().setLayoutParams(params);
        return this;
    }
}
app_base/src/main/java/com/android/app_base/widget/GridSpaceItemDecoration.java
New file
@@ -0,0 +1,48 @@
package com.android.app_base.widget;
import android.graphics.Rect;
import android.view.View;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
/**
 * RecyclerView 网格item等分间距
 */
public class GridSpaceItemDecoration extends RecyclerView.ItemDecoration {
    private int mSpanCount;//横条目数量
    private int mRowSpacing;//行间距
    private int mColumnSpacing;// 列间距
    /**
     * @param spanCount     列数
     * @param rowSpacing    行间距
     * @param columnSpacing 列间距
     */
    public GridSpaceItemDecoration(int spanCount, int rowSpacing, int columnSpacing) {
        this.mSpanCount = spanCount;
        this.mRowSpacing = rowSpacing;
        this.mColumnSpacing = columnSpacing;
    }
    @Override
    public void getItemOffsets(@NonNull Rect outRect, @NonNull View view, @NonNull RecyclerView parent, @NonNull RecyclerView.State state) {
        int position = parent.getChildAdapterPosition(view); // 获取view 在adapter中的位置。
        int column = position % mSpanCount; // view 所在的列
        //列间等间距(列数从0开始)
        //列左边 = 所在列 * 列间距 / 总列数
        //列右边 = 列间距 - 下一列的列左边
        outRect.left = column * mColumnSpacing / mSpanCount;
        outRect.right = mColumnSpacing - (column + 1) * mColumnSpacing / mSpanCount;
        if (mRowSpacing == -1) {
            return;
        }
        // 如果position > 行数,说明不是在第一行,则不指定行高,其他行的上间距为 top=mRowSpacing
        if (position >= mSpanCount) {
            outRect.top = mRowSpacing; // item top
        }
    }
}
app_base/src/main/java/com/android/app_base/widget/WrapRecyclerView.java
New file
@@ -0,0 +1,485 @@
package com.android.app_base.widget;
import android.content.Context;
import android.util.AttributeSet;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.ViewParent;
import androidx.annotation.LayoutRes;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.recyclerview.widget.GridLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import java.util.ArrayList;
import java.util.List;
/**
 * 支持添加底部和头部的 RecyclerView
 */
public final class WrapRecyclerView extends RecyclerView {
    /**
     * 原有的适配器
     */
    private Adapter mRealAdapter;
    /**
     * 支持添加头部和底部的适配器
     */
    private final WrapRecyclerAdapter mWrapAdapter = new WrapRecyclerAdapter();
    public WrapRecyclerView(Context context) {
        super(context);
    }
    public WrapRecyclerView(Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
    }
    public WrapRecyclerView(Context context, @Nullable AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
    }
    @Override
    public void setAdapter(Adapter adapter) {
        mRealAdapter = adapter;
        // 偷梁换柱
        mWrapAdapter.setRealAdapter(mRealAdapter);
        // 禁用条目动画
        setItemAnimator(null);
        super.setAdapter(mWrapAdapter);
    }
    @Override
    public Adapter getAdapter() {
        return mRealAdapter;
    }
    /**
     * 添加头部View
     */
    public void addHeaderView(View view) {
        mWrapAdapter.addHeaderView(view);
    }
    @SuppressWarnings("unchecked")
    public <V extends View> V addHeaderView(@LayoutRes int id) {
        View headerView = LayoutInflater.from(getContext()).inflate(id, this, false);
        addHeaderView(headerView);
        return (V) headerView;
    }
    /**
     * 移除头部View
     */
    public void removeHeaderView(View view) {
        mWrapAdapter.removeHeaderView(view);
    }
    /**
     * 添加底部View
     */
    public void addFooterView(View view) {
        mWrapAdapter.addFooterView(view);
    }
    @SuppressWarnings("unchecked")
    public <V extends View> V addFooterView(@LayoutRes int id) {
        View footerView = LayoutInflater.from(getContext()).inflate(id, this, false);
        addFooterView(footerView);
        return (V) footerView;
    }
    /**
     * 移除底部View
     */
    public void removeFooterView(View view) {
        mWrapAdapter.removeFooterView(view);
    }
    /**
     * 获取头部View总数
     */
    public int getHeaderViewsCount() {
        return mWrapAdapter.getHeaderViewsCount();
    }
    /**
     * 获取底部View总数
     */
    public int getFooterViewsCount() {
        return mWrapAdapter.getFooterViewsCount();
    }
    /**
     * 获取头部View集合
     */
    public List<View> getHeaderViews() {
        return mWrapAdapter.getHeaderViews();
    }
    /**
     * 获取底部View集合
     */
    public List<View> getFooterViews() {
        return mWrapAdapter.getFooterViews();
    }
    /**
     * 刷新头部和底部布局所有的 View 的状态
     */
    public void refreshHeaderFooterViews() {
        mWrapAdapter.notifyDataSetChanged();
    }
    /**
     * 设置在 GridLayoutManager 模式下头部和尾部都是独占一行的效果
     */
    public void adjustSpanSize() {
        final LayoutManager layoutManager = getLayoutManager();
        if (layoutManager instanceof GridLayoutManager) {
            ((GridLayoutManager) layoutManager).setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() {
                @Override
                public int getSpanSize(int position) {
                    return (position < mWrapAdapter.getHeaderViewsCount()
                            || position >= mWrapAdapter.getHeaderViewsCount() + (mRealAdapter == null ? 0 : mRealAdapter.getItemCount()))
                            ? ((GridLayoutManager) layoutManager).getSpanCount() : 1;
                }
            });
        }
    }
    /**
     * 采用装饰设计模式,将原有的适配器包装起来
     */
    private static final class WrapRecyclerAdapter extends Adapter<ViewHolder> {
        /**
         * 头部条目类型
         */
        private static final int HEADER_VIEW_TYPE = Integer.MIN_VALUE >> 1;
        /**
         * 底部条目类型
         */
        private static final int FOOTER_VIEW_TYPE = Integer.MAX_VALUE >> 1;
        /**
         * 原有的适配器
         */
        private Adapter mRealAdapter;
        /**
         * 头部View集合
         */
        private final List<View> mHeaderViews = new ArrayList<>();
        /**
         * 底部View集合
         */
        private final List<View> mFooterViews = new ArrayList<>();
        /**
         * 当前调用的位置
         */
        private int mCurrentPosition;
        /**
         * RecyclerView对象
         */
        private RecyclerView mRecyclerView;
        /**
         * 数据观察者对象
         */
        private WrapAdapterDataObserver mObserver;
        private void setRealAdapter(Adapter adapter) {
            if (mRealAdapter != adapter) {
                if (mRealAdapter != null) {
                    if (mObserver != null) {
                        // 为原有的RecyclerAdapter移除数据监听对象
                        mRealAdapter.unregisterAdapterDataObserver(mObserver);
                    }
                }
                mRealAdapter = adapter;
                if (mRealAdapter != null) {
                    if (mObserver == null) {
                        mObserver = new WrapAdapterDataObserver(this);
                    }
                    // 为原有的RecyclerAdapter添加数据监听对象
                    mRealAdapter.registerAdapterDataObserver(mObserver);
                    // 适配器不是第一次被绑定到RecyclerView上需要发送通知,因为第一次绑定会自动通知
                    if (mRecyclerView != null) {
                        notifyDataSetChanged();
                    }
                }
            }
        }
        @Override
        public int getItemCount() {
            if (mRealAdapter != null) {
                return getHeaderViewsCount() + mRealAdapter.getItemCount() + getFooterViewsCount();
            } else {
                return getHeaderViewsCount() + getFooterViewsCount();
            }
        }
        @SuppressWarnings("all")
        @Override
        public int getItemViewType(int position) {
            mCurrentPosition = position;
            // 获取头部布局的总数
            int headerCount = getHeaderViewsCount();
            // 获取原有适配器的总数
            int adapterCount = mRealAdapter != null ? mRealAdapter.getItemCount() : 0;
            // 获取在原有适配器上的位置
            int adjPosition = position - headerCount;
            if (position < headerCount) {
                return HEADER_VIEW_TYPE;
            } else if (adjPosition < adapterCount) {
                return mRealAdapter.getItemViewType(adjPosition);
            } else {
                return FOOTER_VIEW_TYPE;
            }
        }
        public int getPosition() {
            return mCurrentPosition;
        }
        @SuppressWarnings("all")
        @Override
        public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
            switch (viewType) {
                case HEADER_VIEW_TYPE:
                    return newWrapViewHolder(mHeaderViews.get(getPosition()));
                case FOOTER_VIEW_TYPE:
                    return newWrapViewHolder(mFooterViews.get(getPosition() - getHeaderViewsCount() - (mRealAdapter != null ? mRealAdapter.getItemCount() : 0)));
                default:
                    int itemViewType = mRealAdapter.getItemViewType(getPosition() - getHeaderViewsCount());
                    if (itemViewType == HEADER_VIEW_TYPE || itemViewType == FOOTER_VIEW_TYPE) {
                        throw new IllegalStateException("Please do not use this type as itemType");
                    }
                    if (mRealAdapter != null) {
                        return mRealAdapter.onCreateViewHolder(parent, itemViewType);
                    } else {
                        return null;
                    }
            }
        }
        @SuppressWarnings("unchecked")
        @Override
        public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
            int viewType = getItemViewType(position);
            switch (viewType) {
                case HEADER_VIEW_TYPE:
                case FOOTER_VIEW_TYPE:
                    break;
                default:
                    if (mRealAdapter != null) {
                        mRealAdapter.onBindViewHolder(holder, getPosition() - getHeaderViewsCount());
                    }
                    break;
            }
        }
        private WrapViewHolder newWrapViewHolder(View view) {
            ViewParent parent = view.getParent();
            if (parent instanceof ViewGroup) {
                // IllegalStateException: ViewHolder views must not be attached when created.
                // Ensure that you are not passing 'true' to the attachToRoot parameter of LayoutInflater.inflate(..., boolean attachToRoot)
                ((ViewGroup) parent).removeView(view);
            }
            return new WrapViewHolder(view);
        }
        @Override
        public long getItemId(int position) {
            if (mRealAdapter != null && position > getHeaderViewsCount() - 1 && position < getHeaderViewsCount() + mRealAdapter.getItemCount()) {
                return mRealAdapter.getItemId(position - getHeaderViewsCount());
            } else {
                return super.getItemId(position);
            }
        }
        @Override
        public void onAttachedToRecyclerView(@NonNull RecyclerView recyclerView) {
            mRecyclerView = recyclerView;
            if (mRealAdapter != null) {
                mRealAdapter.onAttachedToRecyclerView(recyclerView);
            }
        }
        @Override
        public void onDetachedFromRecyclerView(@NonNull RecyclerView recyclerView) {
            mRecyclerView = null;
            if (mRealAdapter != null) {
                mRealAdapter.onDetachedFromRecyclerView(recyclerView);
            }
        }
        @SuppressWarnings("unchecked")
        @Override
        public void onViewRecycled(@NonNull ViewHolder holder) {
            if (holder instanceof WrapViewHolder) {
                // 防止这个 ViewHolder 被 RecyclerView 拿去复用
                holder.setIsRecyclable(false);
                return;
            }
            if (mRealAdapter != null) {
                mRealAdapter.onViewRecycled(holder);
            }
        }
        @SuppressWarnings("unchecked")
        @Override
        public boolean onFailedToRecycleView(@NonNull ViewHolder holder) {
            if (mRealAdapter != null) {
                return mRealAdapter.onFailedToRecycleView(holder);
            }
            return super.onFailedToRecycleView(holder);
        }
        @SuppressWarnings("unchecked")
        @Override
        public void onViewAttachedToWindow(@NonNull ViewHolder holder) {
            if (mRealAdapter != null) {
                mRealAdapter.onViewAttachedToWindow(holder);
            }
        }
        @SuppressWarnings("unchecked")
        @Override
        public void onViewDetachedFromWindow(@NonNull ViewHolder holder) {
            if (mRealAdapter != null) {
                mRealAdapter.onViewDetachedFromWindow(holder);
            }
        }
        /**
         * 添加头部View
         */
        private void addHeaderView(View view) {
            // 不能添加同一个View对象,否则会导致RecyclerView复用异常
            if (!mHeaderViews.contains(view) && !mFooterViews.contains(view)) {
                mHeaderViews.add(view);
                notifyDataSetChanged();
            }
        }
        /**
         * 移除头部View
         */
        private void removeHeaderView(View view) {
            if (mHeaderViews.remove(view)) {
                notifyDataSetChanged();
            }
        }
        /**
         * 添加底部View
         */
        private void addFooterView(View view) {
            // 不能添加同一个View对象,否则会导致RecyclerView复用异常
            if (!mFooterViews.contains(view) && !mHeaderViews.contains(view)) {
                mFooterViews.add(view);
                notifyDataSetChanged();
            }
        }
        /**
         * 移除底部View
         */
        private void removeFooterView(View view) {
            if (mFooterViews.remove(view)) {
                notifyDataSetChanged();
            }
        }
        /**
         * 获取头部View总数
         */
        private int getHeaderViewsCount() {
            return mHeaderViews.size();
        }
        /**
         * 获取底部View总数
         */
        private int getFooterViewsCount() {
            return mFooterViews.size();
        }
        /**
         * 获取头部View集合
         */
        private List<View> getHeaderViews() {
            return mHeaderViews;
        }
        /**
         * 获取底部View集合
         */
        private List<View> getFooterViews() {
            return mFooterViews;
        }
    }
    /**
     * 头部和底部通用的ViewHolder对象
     */
    private static final class WrapViewHolder extends ViewHolder {
        private WrapViewHolder(View itemView) {
            super(itemView);
        }
    }
    /**
     * 数据改变监听器
     */
    private static final class WrapAdapterDataObserver extends AdapterDataObserver {
        private final WrapRecyclerAdapter mWrapAdapter;
        private WrapAdapterDataObserver(WrapRecyclerAdapter adapter) {
            mWrapAdapter = adapter;
        }
        @Override
        public void onChanged() {
            mWrapAdapter.notifyDataSetChanged();
        }
        @Override
        public void onItemRangeChanged(int positionStart, int itemCount, Object payload) {
            onItemRangeChanged(mWrapAdapter.getHeaderViewsCount() + positionStart, itemCount);
        }
        @Override
        public void onItemRangeChanged(int positionStart, int itemCount) {
            mWrapAdapter.notifyItemRangeChanged(mWrapAdapter.getHeaderViewsCount() + positionStart, itemCount);
        }
        @Override
        public void onItemRangeInserted(int positionStart, int itemCount) {
            mWrapAdapter.notifyItemRangeInserted(mWrapAdapter.getHeaderViewsCount() + positionStart, itemCount);
        }
        @Override
        public void onItemRangeRemoved(int positionStart, int itemCount) {
            mWrapAdapter.notifyItemRangeRemoved(mWrapAdapter.getHeaderViewsCount() + positionStart, itemCount);
        }
        @Override
        public void onItemRangeMoved(int fromPosition, int toPosition, int itemCount) {
            mWrapAdapter.notifyItemMoved(mWrapAdapter.getHeaderViewsCount() + fromPosition, toPosition);
        }
    }
}
app_base/src/main/res/layout/wait_dialog.xml
New file
@@ -0,0 +1,43 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.cardview.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_gravity="center"
    android:gravity="center"
    android:orientation="vertical"
    app:cardBackgroundColor="#D9000000"
    app:cardCornerRadius="@dimen/dp_15"
    app:cardElevation="0px"
    >
    <LinearLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:gravity="center"
        android:minWidth="@dimen/dp_110"
        android:minHeight="@dimen/dp_110"
        android:orientation="vertical"
        android:padding="@dimen/dp_10">
        <com.airbnb.lottie.LottieAnimationView
            android:layout_width="@dimen/dp_70"
            android:layout_height="@dimen/dp_70"
            app:lottie_autoPlay="true"
            app:lottie_loop="true"
            app:lottie_rawRes="@raw/progress" />
        <TextView
            android:id="@+id/tv_wait_message"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginHorizontal="@dimen/dp_15"
            android:layout_marginTop="@dimen/dp_5"
            android:maxLines="3"
            android:text="加载中.."
            android:textColor="#FFFFFF"
            android:textSize="@dimen/sp_14" />
    </LinearLayout>
</androidx.cardview.widget.CardView>
app_base/src/main/res/raw/loading.json
New file
@@ -0,0 +1 @@
{"v":"5.5.8","fr":50,"ip":0,"op":147,"w":800,"h":600,"nm":"Paperplane","ddd":0,"assets":[{"id":"comp_0","layers":[{"ddd":0,"ind":1,"ty":4,"nm":"planete Outlines - Group 4","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":38,"s":[50]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":88,"s":[50]},{"t":120,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[468.336,323.378,0],"to":[-29,0,0],"ti":[29,0,0]},{"t":102,"s":[294.336,323.378,0]}],"ix":2},"a":{"a":0,"k":[453.672,304.756,0],"ix":1},"s":{"a":0,"k":[50,50,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[6.742,0],[0.741,-0.14],[0,0.074],[13.484,0],[1.669,-0.361],[19.79,0],[3.317,-19.082],[2.691,0],[0,-13.484],[-0.048,-0.629],[2.405,0],[0,-6.742],[-6.742,0],[0,0],[0,6.743]],"o":[[-0.781,0],[0.001,-0.074],[0,-13.484],[-1.778,0],[-3.594,-18.742],[-20.03,0],[-2.421,-0.804],[-13.485,0],[0,0.642],[-1.89,-1.199],[-6.742,0],[0,6.743],[0,0],[6.742,0],[0,-6.742]],"v":[[75.134,16.175],[72.85,16.396],[72.856,16.175],[48.44,-8.241],[43.262,-7.685],[3.406,-40.591],[-36.571,-6.995],[-44.269,-8.241],[-68.685,16.175],[-68.604,18.079],[-75.133,16.175],[-87.341,28.383],[-75.133,40.592],[75.134,40.592],[87.342,28.383]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.815686334348,0.823529471603,0.827451040231,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[453.672,304.756],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 4","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":151,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"Merged Shape Layer","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.547],"y":[0]},"t":0,"s":[0]},{"i":{"x":[0.845],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":77,"s":[35]},{"t":150,"s":[0]}],"ix":10},"p":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":0,"s":[390.319,298.2,0],"to":[0,-2.583,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":44,"s":[390.319,282.7,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":110,"s":[390.319,319.25,0],"to":[0,0,0],"ti":[0,0,0]},{"t":150,"s":[390.319,298.2,0]}],"ix":2},"a":{"a":0,"k":[664.319,256.2,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0]],"v":[[18.967,-3.189],[-18.967,19.935],[-0.949,-19.935]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.223528981209,0.192156970501,0.674510002136,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[236.879,292.737],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[633.939,275.369],"ix":2},"a":{"a":0,"k":[236.879,292.737],"ix":1},"s":{"a":0,"k":[50,50],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"planete Outlines - Group 1","np":1,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-98.335,64.79],[-105.619,4.984],[105.619,-64.79],[-80.316,24.919]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.278430998325,0.294117987156,0.847059011459,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[316.247,247.882],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 2","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[673.623,252.941],"ix":2},"a":{"a":0,"k":[316.247,247.882],"ix":1},"s":{"a":0,"k":[50,50],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"planete Outlines - Group 2","np":1,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-133.812,-42.171],[133.812,-75.141],[5.765,75.141],[-61.708,18.402],[124.227,-71.307],[-87.011,-1.534]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.365000009537,0.407999992371,0.976000010967,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[297.638,254.4],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 3","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[664.319,256.2],"ix":2},"a":{"a":0,"k":[297.638,254.4],"ix":1},"s":{"a":0,"k":[50,50],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"planete Outlines - Group 3","np":1,"cix":2,"bm":0,"ix":3,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":151,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"planete Outlines - Group 5","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":0,"s":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":45,"s":[100]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":102,"s":[100]},{"t":150,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[327.38,267.583,0],"to":[25.833,0,0],"ti":[-25.833,0,0]},{"t":150,"s":[482.38,267.583,0]}],"ix":2},"a":{"a":0,"k":[171.76,193.166,0],"ix":1},"s":{"a":0,"k":[50,50,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[13.485,0],[4.38,-4.171],[21.913,0],[3.575,-18.765],[1.851,0],[0,-13.484],[-0.011,-0.291],[1.599,0],[0,-6.743],[-6.742,0],[0,0],[0,13.485]],"o":[[-6.526,0],[-0.793,-21.719],[-19.806,0],[-1.734,-0.391],[-13.485,0],[0,0.293],[-1.4,-0.559],[-6.742,0],[0,6.742],[0,0],[13.485,0],[0,-13.484]],"v":[[59.669,-8.242],[42.84,-1.506],[2.287,-40.592],[-37.576,-7.638],[-42.962,-8.242],[-67.378,16.174],[-67.356,17.049],[-71.878,16.174],[-84.086,28.383],[-71.878,40.591],[59.669,40.591],[84.086,16.174]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.816000007181,0.823999980852,0.827000038297,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[171.76,193.166],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 5","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":151,"st":0,"bm":0}]}],"layers":[{"ddd":0,"ind":1,"ty":0,"nm":"Pre-comp 1","refId":"comp_0","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[406,306,0],"ix":2},"a":{"a":0,"k":[400,300,0],"ix":1},"s":{"a":0,"k":[179,179,100],"ix":6}},"ao":0,"w":800,"h":600,"ip":0,"op":147,"st":0,"bm":0}],"markers":[]}
app_base/src/main/res/raw/progress.json
New file
@@ -0,0 +1 @@
{"v":"4.6.9","fr":30,"ip":0,"op":45,"w":200,"h":200,"nm":"Composition 1","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":0,"ty":4,"nm":"LFCalque de forme 2","ks":{"o":{"a":0,"k":100},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[1],"y":[0]},"n":["0p833_0p833_1_0"],"t":0,"s":[0],"e":[360]},{"i":{"x":[0],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"n":["0_1_0p167_0p167"],"t":15,"s":[360],"e":[510]},{"t":34}]},"p":{"a":0,"k":[100,100,0]},"a":{"a":0,"k":[-93.098,-93.098,0]},"s":{"a":0,"k":[80,80,100]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[55.228,0],[0,-55.228],[-55.228,0],[0,55.228]],"o":[[-55.228,0],[0,55.228],[55.228,0],[0,-55.228]],"v":[[0,-100],[-100,0],[0,100],[100,0]],"c":true}},"nm":"Tracé 1","mn":"ADBE Vector Shape - Group"},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"n":["0_1_0p167_0p167"],"t":23,"s":[100],"e":[42]},{"t":45}],"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":0,"s":[98],"e":[98]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":6,"s":[98],"e":[60]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":13,"s":[60],"e":[40]},{"t":23}],"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Raccorder les tracés 1","mn":"ADBE Vector Filter - Trim"},{"ty":"st","c":{"a":0,"k":[1,1,1,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":5},"lc":2,"lj":2,"nm":"Contour 1","mn":"ADBE Vector Graphic - Stroke"},{"ty":"tr","p":{"a":0,"k":[-93.098,-93.098],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transformer "}],"nm":"Ellipse 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group"}],"ip":0,"op":45,"st":0,"bm":0,"sr":1}],"chars":[],"markers":[]}
app_base/src/main/res/raw/province.json
New file
Diff too large
app_base/src/main/res/raw/welcome.json
New file
@@ -0,0 +1 @@
{"v":"5.5.2","fr":30,"ip":0,"op":136,"w":976,"h":671,"nm":"Hi Animation","ddd":0,"assets":[{"id":"comp_0","layers":[{"ddd":0,"ind":1,"ty":4,"nm":"h path 2 Outlines 2","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[987.04,469.648,0],"ix":2},"a":{"a":0,"k":[154.5,299.5,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,54.658]],"v":[[-99.143,-243.983],[-99.574,119.373],[-98.794,145.015]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.207843137255,0.517647058824,0.964705882353,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":22,"ix":5},"lc":2,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[154.325,299.75],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.24],"y":[1]},"o":{"x":[0.76],"y":[0]},"t":0,"s":[96]},{"i":{"x":[0.36],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":41,"s":[0]},{"i":{"x":[0.627],"y":[-2.176]},"o":{"x":[0.289],"y":[0]},"t":60,"s":[32]},{"i":{"x":[0.693],"y":[0.768]},"o":{"x":[0.281],"y":[-0.012]},"t":97,"s":[32.748]},{"t":105,"s":[0]}],"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.24],"y":[1]},"o":{"x":[0.76],"y":[0]},"t":0,"s":[98]},{"i":{"x":[0.36],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":41,"s":[55.4]},{"i":{"x":[0.627],"y":[-2.176]},"o":{"x":[0.289],"y":[0]},"t":60,"s":[94.4]},{"i":{"x":[0.693],"y":[0.768]},"o":{"x":[0.281],"y":[-0.012]},"t":97,"s":[96.608]},{"t":105,"s":[0]}],"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false}],"ip":0,"op":1950,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"h path 2 Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[749.5,449.5,0],"ix":2},"a":{"a":0,"k":[154.5,299.5,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[-54.658,0],[0,54.658]],"o":[[0,0],[0,0],[0,54.658],[54.66,0],[0,0]],"v":[[-99.143,-243.983],[-99.143,142.703],[-98.794,145.015],[0.174,243.983],[99.143,145.015]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.996078431373,0.733333333333,0,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":22,"ix":5},"lc":2,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[154.325,299.75],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.24],"y":[1]},"o":{"x":[0.76],"y":[0]},"t":0,"s":[96]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.64],"y":[0]},"t":60,"s":[0]},{"t":97,"s":[0]}],"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.24],"y":[1]},"o":{"x":[0.76],"y":[0]},"t":0,"s":[98]},{"i":{"x":[0.675],"y":[-2.679]},"o":{"x":[0.342],"y":[0]},"t":60,"s":[55.4]},{"i":{"x":[0.675],"y":[0.696]},"o":{"x":[0.37],"y":[-0.022]},"t":97,"s":[56.806]},{"t":105,"s":[0]}],"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false}],"ip":0,"op":1950,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"h path 1 Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[749.5,447.5,0],"ix":2},"a":{"a":0,"k":[154.5,202.5,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[54.659,0],[0,-54.658],[0,0]],"o":[[0,0],[0,0],[0,-54.658],[-54.658,0],[0,0],[0,0]],"v":[[98.969,147.132],[98.969,51.627],[98.969,51.868],[-0.001,-47.101],[-98.969,51.868],[-98.969,-147.132]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.996078431373,0.733333333333,0,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":22,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[154.5,202.632],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.74],"y":[1]},"o":{"x":[0.4],"y":[0.8]},"t":0,"s":[68]},{"i":{"x":[0.48],"y":[1]},"o":{"x":[0.114],"y":[0.292]},"t":15,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.26],"y":[0]},"t":64,"s":[0]},{"t":97,"s":[0]}],"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.74],"y":[1]},"o":{"x":[0.4],"y":[0.8]},"t":0,"s":[65]},{"i":{"x":[0.48],"y":[1]},"o":{"x":[0.114],"y":[0.399]},"t":15,"s":[100]},{"i":{"x":[0.657],"y":[-9.391]},"o":{"x":[0.323],"y":[0]},"t":64,"s":[67.4]},{"i":{"x":[0.683],"y":[0.716]},"o":{"x":[0.281],"y":[-0.009]},"t":97,"s":[67.703]},{"t":105,"s":[0]}],"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false}],"ip":0,"op":1950,"st":0,"bm":0}]}],"layers":[{"ddd":0,"ind":1,"ty":0,"nm":"Hi files","refId":"comp_0","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[473.436,364,0],"ix":2},"a":{"a":0,"k":[750,500,0],"ix":1},"s":{"a":0,"k":[108,108,100],"ix":6}},"ao":0,"w":1500,"h":1000,"ip":29,"op":136,"st":29,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"Shape Layer 4","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.46,"y":1},"o":{"x":0.001,"y":0.504},"t":3,"s":[498.378,416.11,0],"to":[0,7.167,0],"ti":[0,0,0]},{"i":{"x":0.999,"y":0.609},"o":{"x":0.54,"y":0},"t":12,"s":[498.378,459.11,0],"to":[0,0,0],"ti":[1.844,44.19,0]},{"i":{"x":0.16,"y":1},"o":{"x":0.54,"y":0},"t":19,"s":[498.378,416.11,0],"to":[19.917,-49.917,0],"ti":[-20.594,42.719,0]},{"t":35,"s":[621.94,159.798,0]}],"ix":2},"a":{"a":0,"k":[-144.56,-34.931,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.4,0.4,0.4],"y":[1.335,1.335,0]},"t":21,"s":[55.407,55.407,100]},{"t":35,"s":[10.1,10.1,100]}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[355.037,355.037],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.845751594095,0.012161032359,0.012161032359,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-144.56,-34.931],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[62.211,62.211],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":130,"st":3,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"Shape Layer 3","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.46,"y":1},"o":{"x":0.001,"y":0.504},"t":4,"s":[521.864,548.108,0],"to":[0,9,0],"ti":[0,0,0]},{"i":{"x":0.999,"y":0.608},"o":{"x":0.54,"y":0},"t":13,"s":[521.864,602.108,0],"to":[0,0,0],"ti":[2.053,34.822,0]},{"i":{"x":0.16,"y":1},"o":{"x":0.301,"y":1},"t":20,"s":[521.864,548.108,0],"to":[9.4,-19.933,0],"ti":[-9.4,10.933,0]},{"t":35,"s":[578.264,482.508,0]}],"ix":2},"a":{"a":0,"k":[-144.56,-34.931,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.16,0.16,0.16],"y":[1,1,1]},"o":{"x":[0.4,0.4,0.4],"y":[1.4,1.4,0]},"t":21,"s":[53,53,100]},{"t":35,"s":[11,11,100]}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[355.037,355.037],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.996078431373,0.733333333333,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-144.56,-34.931],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[62.211,62.211],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":36,"st":4,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"Shape Layer 2","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.999,"y":0.496},"o":{"x":0.001,"y":0.504},"t":6,"s":[575.274,318.062,0],"to":[0,6.833,0],"ti":[0,0,0]},{"i":{"x":0.999,"y":0.619},"o":{"x":0.54,"y":0},"t":15,"s":[575.274,359.062,0],"to":[0,0,0],"ti":[-9.167,15.167,0]},{"i":{"x":0.16,"y":1},"o":{"x":0.27,"y":1},"t":22,"s":[575.274,318.062,0],"to":[9.167,-15.167,0],"ti":[-9.167,8.333,0]},{"t":35,"s":[630.274,268.062,0]}],"ix":2},"a":{"a":0,"k":[-144.56,-34.931,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.16,0.16,0.16],"y":[1,1,1]},"o":{"x":[0.4,0.4,0.4],"y":[1.4,1.4,0]},"t":21,"s":[35,35,100]},{"t":35,"s":[12.2,12.2,100]}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[355.037,355.037],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.182193397073,0.579084927428,0.000757008265,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-144.56,-34.931],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[62.211,62.211],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":36,"st":6,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"Shape Layer 1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.46,"y":1},"o":{"x":0.001,"y":0.56},"t":0,"s":[324.44,338.069,0],"to":[0,5.167,0],"ti":[-0.191,0.573,0]},{"i":{"x":0.999,"y":0.496},"o":{"x":0.54,"y":0},"t":10,"s":[324.44,369.069,0],"to":[0.191,-0.573,0],"ti":[-1.576,28.726,0]},{"i":{"x":0.999,"y":0.953},"o":{"x":0.54,"y":0},"t":20,"s":[325.585,334.633,0],"to":[49.678,18.231,0],"ti":[-49.487,-23.97,0]},{"t":29,"s":[622.507,478.452,0]}],"ix":2},"a":{"a":0,"k":[-144.56,-34.931,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.16,0.16,0.16],"y":[1,1,1]},"o":{"x":[0.4,0.4,0.4],"y":[1.4,1.4,0]},"t":21,"s":[100,100,100]},{"t":35,"s":[10.5,10.5,100]}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[355.037,355.037],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.207843137255,0.517647058824,0.964705882353,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-144.56,-34.931],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[62.211,62.211],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":36,"st":0,"bm":0}],"markers":[]}