Browse Source

完成会员页部分调整

zk 1 year ago
parent
commit
f81d906d78
28 changed files with 488 additions and 337 deletions
  1. 0 3
      app/src/main/java/com/datarecovery/master/data/api/bean/MemberGoodsBean.java
  2. 1 0
      app/src/main/java/com/datarecovery/master/data/consts/ErrorCode.java
  3. 3 0
      app/src/main/java/com/datarecovery/master/data/repositories/MemberRepository.java
  4. 21 37
      app/src/main/java/com/datarecovery/master/module/member/MemberActivity.java
  5. 111 40
      app/src/main/java/com/datarecovery/master/module/member/MemberViewModel.java
  6. 18 0
      app/src/main/java/com/datarecovery/master/widget/InformationSwitchBanner.java
  7. BIN
      app/src/main/res/drawable-xxhdpi/bg_member_header_img.webp
  8. BIN
      app/src/main/res/drawable-xxhdpi/bg_user_evaluate_header.webp
  9. BIN
      app/src/main/res/drawable-xxhdpi/icon_back_white.webp
  10. BIN
      app/src/main/res/drawable-xxhdpi/icon_member_bottom.webp
  11. BIN
      app/src/main/res/drawable-xxhdpi/icon_member_serve.webp
  12. BIN
      app/src/main/res/drawable-xxhdpi/icon_memeber_buy_avatar.webp
  13. BIN
      app/src/main/res/drawable-xxhdpi/icon_scenes_1.webp
  14. BIN
      app/src/main/res/drawable-xxhdpi/icon_scenes_2.webp
  15. BIN
      app/src/main/res/drawable-xxhdpi/icon_scenes_3.webp
  16. BIN
      app/src/main/res/drawable-xxhdpi/icon_scenes_4.webp
  17. BIN
      app/src/main/res/drawable-xxhdpi/icon_scenes_5.webp
  18. BIN
      app/src/main/res/drawable-xxhdpi/icon_scenes_6.webp
  19. BIN
      app/src/main/res/drawable-xxhdpi/icon_scenes_7.webp
  20. 5 0
      app/src/main/res/drawable/bg_member_buy.xml
  21. 3 7
      app/src/main/res/drawable/bg_member_buy_btn.xml
  22. 7 4
      app/src/main/res/drawable/bg_member_container.xml
  23. 7 0
      app/src/main/res/drawable/bg_member_evaluate_container.xml
  24. 7 0
      app/src/main/res/drawable/bg_member_label.xml
  25. 1 1
      app/src/main/res/drawable/bg_scenes_container.xml
  26. 300 244
      app/src/main/res/layout/activity_member.xml
  27. 1 0
      app/src/main/res/layout/view_home_page_switch_text.xml
  28. 3 1
      app/src/main/res/values/strings.xml

+ 0 - 3
app/src/main/java/com/datarecovery/master/data/api/bean/MemberGoodsBean.java

@@ -88,8 +88,5 @@ public class MemberGoodsBean extends BaseObservable {
         return description;
     }
 
-    public boolean isSuperRecover() {
-        return Objects.equals(auths, MemberType.APP_SUPER_RECOVER);
-    }
 
 }

+ 1 - 0
app/src/main/java/com/datarecovery/master/data/consts/ErrorCode.java

@@ -5,4 +5,5 @@ public interface ErrorCode {
     int ERROR_CODE_NO_LOGIN_ERROR = 1006;
     int ERROR_CODE_VERIFICATION_CODE_ERROR = 2002;
     int ERROR_CODE_CANCEL_ORDER_ERROR = 3000;
+    int ERROR_CODE_HAS_PERMISSION_ERROR = 9004;
 }

+ 3 - 0
app/src/main/java/com/datarecovery/master/data/repositories/MemberRepository.java

@@ -97,6 +97,9 @@ public class MemberRepository {
                     if (serverErrorException.getCode() == ErrorCode.ERROR_CODE_NO_LOGIN_ERROR) {
                         ToastUtil.show(R.string.no_login, ToastUtil.LENGTH_SHORT);
                         LoginActivity.start(ActivityUtil.getTopActivity(), ReportUtil.getReportId(payOptions.getMemberType()));
+                    } else if (serverErrorException.getCode() == ErrorCode.ERROR_CODE_HAS_PERMISSION_ERROR) {
+                        deviceFuncRepository.refreshFuncAuths();
+                        payRepository.refreshOrderPageList();
                     } else {
                         ToastUtil.show(serverErrorException.getMsg(), ToastUtil.LENGTH_SHORT);
                     }

+ 21 - 37
app/src/main/java/com/datarecovery/master/module/member/MemberActivity.java

@@ -1,5 +1,6 @@
 package com.datarecovery.master.module.member;
 
+import android.annotation.SuppressLint;
 import android.app.Activity;
 import android.content.Context;
 import android.content.Intent;
@@ -14,6 +15,7 @@ import androidx.recyclerview.widget.LinearLayoutManager;
 
 import com.atmob.app.lib.base.BaseActivity;
 import com.atmob.common.ui.SizeUtil;
+import com.datarecovery.master.R;
 import com.datarecovery.master.data.consts.EventId;
 import com.datarecovery.master.databinding.ActivityMemberBinding;
 import com.datarecovery.master.dialog.AlipayQrCodeDialog;
@@ -32,6 +34,7 @@ import com.datarecovery.master.utils.BoxingUtil;
 import com.datarecovery.master.utils.GridLayoutItemDecoration;
 import com.datarecovery.master.utils.Maps;
 import com.datarecovery.master.utils.ReportUtil;
+import com.datarecovery.master.widget.InformationSwitchBanner;
 import com.gyf.immersionbar.ImmersionBar;
 
 import java.util.Objects;
@@ -49,7 +52,6 @@ public class MemberActivity extends BaseActivity<ActivityMemberBinding> {
     private GoodsItemAdapter goodsItemAdapter;
 
     private NormalScenesAdapter normalScenesAdapter;
-    private SuperScenesAdapter superScenesAdapter;
     private GridLayoutManager gridLayoutManager;
     private GridLayoutItemDecoration gridLayoutItemDecoration;
     private MemberEvaluateAdapter memberEvaluateAdapter;
@@ -59,8 +61,6 @@ public class MemberActivity extends BaseActivity<ActivityMemberBinding> {
     private AlipayQrCodeDialog alipayQrCodeDialog;
     private WechatPayQrCodeDialog wechatPayQrCodeDialog;
 
-    private int maxScrollY;
-
 
     public static void start(Context context, @MemberType String type) {
         Intent intent = new Intent(context, MemberActivity.class);
@@ -84,38 +84,37 @@ public class MemberActivity extends BaseActivity<ActivityMemberBinding> {
         if (intent != null) {
             memberViewModel.setMemberType(intent.getStringExtra(MEMBER_TYPE));
         }
+        initTextViewBanner();
+    }
+
+    @SuppressLint("UseCompatLoadingForDrawables")
+    private void initTextViewBanner() {
+        InformationSwitchBanner mTextSwitchBanner = new InformationSwitchBanner(this, binding.viewSwitcher);
+        mTextSwitchBanner.setTextColor(getResources().getDrawable(R.drawable.icon_memeber_buy_avatar), 6, getResources().getColor(com.atmob.app.base.R.color.white), getResources().getColor(com.atmob.app.base.R.color.white));
+        mTextSwitchBanner.update(memberViewModel.getInformationList());
     }
 
     private void initView() {
+        addTopStatusBarHeight(binding.toolBar);
+
         goodsItemAdapter = new GoodsItemAdapter(this);
         binding.memberDetailList.setAdapter(goodsItemAdapter);
-        binding.memberDetailList.setLayoutManager(new LinearLayoutManager(this, LinearLayoutManager.HORIZONTAL, false));
+        binding.memberDetailList.setLayoutManager(new LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false));
         goodsItemAdapter.setOnItemSelectListener(goodsBean -> memberViewModel.setSelectBean(goodsBean));
+
         normalScenesAdapter = new NormalScenesAdapter();
-        superScenesAdapter = new SuperScenesAdapter();
-        gridLayoutManager = new GridLayoutManager(this, 4);
-        binding.scenesRyView.setLayoutManager(gridLayoutManager);
+        gridLayoutManager = new GridLayoutManager(this, 2);
         gridLayoutItemDecoration = new GridLayoutItemDecoration();
+        gridLayoutItemDecoration.setParam(2, 0, 0.0166666666666667f);
         binding.scenesRyView.addItemDecoration(gridLayoutItemDecoration);
+        binding.scenesRyView.setLayoutManager(gridLayoutManager);
+        binding.scenesRyView.setAdapter(normalScenesAdapter);
 
         memberEvaluateAdapter = new MemberEvaluateAdapter();
         binding.userEvaluateRyView.setLayoutManager(new LinearLayoutManager(this));
         binding.userEvaluateRyView.setAdapter(memberEvaluateAdapter);
 
-        binding.iconBack.setOnClickListener(v -> onBackPressed());
-
-        maxScrollY = (int) (SizeUtil.getScreenHeight() * 0.2f);
-        binding.nestedScrollView.setOnScrollChangeListener((NestedScrollView.OnScrollChangeListener) (v, scrollX, scrollY, oldScrollX, oldScrollY) -> {
-            if (scrollY > maxScrollY) {
-                binding.viewStatusBar.setAlpha(1f);
-                binding.viewToolBar.setAlpha(1f);
-                binding.tvTitle.setAlpha(1f);
-            } else {
-                binding.viewStatusBar.setAlpha(scrollY * 1f / maxScrollY);
-                binding.viewToolBar.setAlpha(scrollY * 1f / maxScrollY);
-                binding.tvTitle.setAlpha(scrollY * 1f / maxScrollY);
-            }
-        });
+        binding.toolBar.setNavigationOnClickListener(v -> onBackPressed());
     }
 
     private void initObserver() {
@@ -123,26 +122,11 @@ public class MemberActivity extends BaseActivity<ActivityMemberBinding> {
             dismissQrCodeDialog(orderId);
             setPaySuccessGo();
         });
+        memberViewModel.getScenesDataList().observe(this, strings -> normalScenesAdapter.setData(strings));
         memberViewModel.getShowAliQRPaymentEvent().observe(this, this::showAlipayQrCodeDialog);
         memberViewModel.getShowWxQRPaymentEvent().observe(this, this::showWxQrCodeDialog);
         memberViewModel.getShowLoadingEvent().observe(this, this::showLoading);
         memberViewModel.getMemberGoodsList().observe(this, goodsItemAdapter::submit);
-        memberViewModel.getSelectBean().observe(this, bean -> {
-            if (bean == null) {
-                return;
-            }
-            if (Objects.equals(bean.getAuths(), MemberType.APP_SUPER_RECOVER)) {
-                gridLayoutManager.setSpanCount(4);
-                gridLayoutItemDecoration.setParam(4, 0, 0.0361111111111111f);
-                superScenesAdapter.setData(memberViewModel.getSuperScenesBeans());
-                binding.scenesRyView.setAdapter(superScenesAdapter);
-            } else {
-                gridLayoutManager.setSpanCount(2);
-                gridLayoutItemDecoration.setParam(2, 0, 0.0166666666666667f);
-                normalScenesAdapter.setData(bean.getScenesArray());
-                binding.scenesRyView.setAdapter(normalScenesAdapter);
-            }
-        });
         memberViewModel.getEvaluateList().observe(this, evaluateBeans -> memberEvaluateAdapter.submit(evaluateBeans));
         memberViewModel.getShowChoicePayWayDialog().observe(this, o -> showChoosePaymentWayDialog());
     }

+ 111 - 40
app/src/main/java/com/datarecovery/master/module/member/MemberViewModel.java

@@ -1,6 +1,10 @@
 package com.datarecovery.master.module.member;
 
+import android.graphics.Color;
+import android.text.SpannableStringBuilder;
+import android.text.Spanned;
 import android.text.TextUtils;
+import android.text.style.ForegroundColorSpan;
 import android.util.Pair;
 
 import androidx.lifecycle.LiveData;
@@ -22,12 +26,16 @@ import com.datarecovery.master.data.consts.ErrorCode;
 import com.datarecovery.master.data.consts.EventId;
 import com.datarecovery.master.data.repositories.AccountRepository;
 import com.datarecovery.master.data.repositories.ConfigRepository;
+import com.datarecovery.master.data.repositories.DeviceFuncRepository;
 import com.datarecovery.master.data.repositories.MemberRepository;
 import com.datarecovery.master.data.repositories.PayRepository;
 import com.datarecovery.master.handler.EventHelper;
+import com.datarecovery.master.module.imgrecover.ImageRecoverActivity;
 import com.datarecovery.master.module.login.LoginActivity;
+import com.datarecovery.master.module.main.MainActivity;
 import com.datarecovery.master.module.member.bean.EvaluateBean;
 import com.datarecovery.master.module.member.bean.SuperScenesBean;
+import com.datarecovery.master.module.wxrecover.WeChatRecoverActivity;
 import com.datarecovery.master.utils.BoxingUtil;
 import com.datarecovery.master.utils.Maps;
 import com.datarecovery.master.utils.OrderReportHelper;
@@ -73,11 +81,13 @@ public class MemberViewModel extends BaseViewModel {
     private final Gson gson;
     private final AccountRepository accountRepository;
     private final PayRepository payRepository;
-    private List<SuperScenesBean> superScenesBeans;
+    private final DeviceFuncRepository deviceFuncRepository;
 
     private final SingleLiveEvent<Boolean> showLoadingEvent = new SingleLiveEvent<>();
     private final SingleLiveEvent<?> showChoicePayWayDialog = new SingleLiveEvent<>();
 
+    private final MutableLiveData<String[]> scenesDataList = new MutableLiveData<>();
+
     private final SingleLiveEvent<Pair<String, String>> showWxQRPaymentEvent = new SingleLiveEvent<>();
     private final SingleLiveEvent<Pair<String, String>> showAliQRPaymentEvent = new SingleLiveEvent<>();
 
@@ -85,14 +95,20 @@ public class MemberViewModel extends BaseViewModel {
     @MemberType
     private String memberType;
 
+    private final List<Pair<CharSequence, CharSequence>> informationList = new ArrayList<>();
+
     @Inject
-    public MemberViewModel(MemberRepository memberRepository, Gson gson, AccountRepository accountRepository, PayRepository payRepository) {
+    public MemberViewModel(MemberRepository memberRepository, Gson gson, AccountRepository accountRepository, PayRepository payRepository, DeviceFuncRepository deviceFuncRepository) {
         this.memberRepository = memberRepository;
+        this.deviceFuncRepository = deviceFuncRepository;
         this.accountRepository = accountRepository;
         this.payRepository = payRepository;
         this.gson = gson;
     }
 
+    public LiveData<String[]> getScenesDataList() {
+        return scenesDataList;
+    }
 
     public String getMemberType() {
         return memberType;
@@ -141,9 +157,6 @@ public class MemberViewModel extends BaseViewModel {
         return payWayList;
     }
 
-    public List<SuperScenesBean> getSuperScenesBeans() {
-        return superScenesBeans;
-    }
 
     public LiveData<List<EvaluateBean>> getEvaluateList() {
         return evaluateList;
@@ -164,7 +177,6 @@ public class MemberViewModel extends BaseViewModel {
             subscribeTxt.setValue(ContextUtil.getContext().getString(R.string.member_recover_buy));
         }
         reportId();
-        initScenes();
         initCommentData();
         refreshMemberDetail();
     }
@@ -210,46 +222,12 @@ public class MemberViewModel extends BaseViewModel {
         evaluateList.setValue(evaluateBeans);
     }
 
-    private void initScenes() {
-        superScenesBeans = new ArrayList<>();
-        superScenesBeans.add(new SuperScenesBean(R.drawable.icon_scenes_1, R.string.scenes_message_recover));
-        superScenesBeans.add(new SuperScenesBean(R.drawable.icon_scenes_2, R.string.scenes_friend_recover));
-        superScenesBeans.add(new SuperScenesBean(R.drawable.icon_scenes_3, R.string.scenes_img_recover));
-        superScenesBeans.add(new SuperScenesBean(R.drawable.icon_scenes_4, R.string.scenes_file_recover));
-        superScenesBeans.add(new SuperScenesBean(R.drawable.icon_scenes_5, R.string.scenes_video_recover));
-        superScenesBeans.add(new SuperScenesBean(R.drawable.icon_scenes_6, R.string.scenes_audio_recover));
-        superScenesBeans.add(new SuperScenesBean(R.drawable.icon_scenes_7, R.string.scenes_more, ContextUtil.getContext().getString(R.string.stay_tuned)));
-    }
-
 
     public void refreshMemberDetail() {
         if (TextUtils.isEmpty(memberType)) {
             return;
         }
         memberRepository.memberDetail(memberType)
-                .map(memberDetailResponse -> {
-                    List<MemberGoodsBean> list = memberDetailResponse.getList();
-                    if (list != null && !list.isEmpty()) {
-                        for (MemberGoodsBean bean : list) {
-                            if (Objects.equals(bean.getAuths(), MemberType.APP_WX_MESSAGE_RECOVER)) {
-                                bean.setScenesArray(new String[]{"微信好友误删", "微信信息恢复", "导出微信记录", "左滑误删消息"});
-                            } else if (Objects.equals(bean.getAuths(), MemberType.APP_WX_FRIEND_RECOVER)) {
-                                bean.setScenesArray(new String[]{"微信好友被删", "微信好友找回", "恢复恢复好友"});
-                            } else if (Objects.equals(bean.getAuths(), MemberType.APP_IMAGE_RECOVER)) {
-                                bean.setScenesArray(new String[]{"相册误删图片", "手机图片丢失", "手机照片找回"});
-                            } else if (Objects.equals(bean.getAuths(), MemberType.APP_FILE_RECOVER)) {
-                                bean.setScenesArray(new String[]{"手机文件清理", "多类型文件找回", "微信/QQ文件找回"});
-                            } else if (Objects.equals(bean.getAuths(), MemberType.APP_VIDEO_RECOVER)) {
-                                bean.setScenesArray(new String[]{"误删手机视频", "手机视频丢失", "手机视频找回"});
-                            } else if (Objects.equals(bean.getAuths(), MemberType.APP_AUDIO_RECOVER)) {
-                                bean.setScenesArray(new String[]{"误删手机音频", "手机音频丢失", "手机音频找回"});
-                            } else if (Objects.equals(bean.getAuths(), MemberType.APP_IMAGE_CLEAN)) {
-                                bean.setScenesArray(new String[]{"手机图片彻底删除", "选择清除手机图片", "扫描手机图片"});
-                            }
-                        }
-                    }
-                    return memberDetailResponse;
-                })
                 .subscribe(new SingleObserver<MemberDetailResponse>() {
                     @Override
                     public void onSubscribe(@NonNull Disposable d) {
@@ -261,6 +239,33 @@ public class MemberViewModel extends BaseViewModel {
                         memberGoodsList.setValue(memberDetailResponse.getList());
                         payWayList.setValue(memberDetailResponse.getPayOptions());
                         serviceContentTxt.setValue(memberDetailResponse.getDescription());
+                        List<MemberGoodsBean> list = memberDetailResponse.getList();
+                        if (list != null && !list.isEmpty()) {
+                            for (MemberGoodsBean bean : list) {
+                                if (Objects.equals(bean.getAuths(), MemberType.APP_WX_MESSAGE_RECOVER)) {
+                                    scenesDataList.setValue(new String[]{"微信好友误删", "微信信息恢复", "导出微信记录", "左滑误删消息"});
+                                    break;
+                                } else if (Objects.equals(bean.getAuths(), MemberType.APP_WX_FRIEND_RECOVER)) {
+                                    scenesDataList.setValue(new String[]{"微信好友被删", "微信好友找回", "恢复恢复好友"});
+                                    break;
+                                } else if (Objects.equals(bean.getAuths(), MemberType.APP_IMAGE_RECOVER)) {
+                                    scenesDataList.setValue(new String[]{"相册误删图片", "手机图片丢失", "手机照片找回"});
+                                    break;
+                                } else if (Objects.equals(bean.getAuths(), MemberType.APP_FILE_RECOVER)) {
+                                    scenesDataList.setValue(new String[]{"手机文件清理", "多类型文件找回", "微信/QQ文件找回"});
+                                    break;
+                                } else if (Objects.equals(bean.getAuths(), MemberType.APP_VIDEO_RECOVER)) {
+                                    scenesDataList.setValue(new String[]{"误删手机视频", "手机视频丢失", "手机视频找回"});
+                                    break;
+                                } else if (Objects.equals(bean.getAuths(), MemberType.APP_AUDIO_RECOVER)) {
+                                    scenesDataList.setValue(new String[]{"误删手机音频", "手机音频丢失", "手机音频找回"});
+                                    break;
+                                } else if (Objects.equals(bean.getAuths(), MemberType.APP_IMAGE_CLEAN)) {
+                                    scenesDataList.setValue(new String[]{"手机图片彻底删除", "选择清除手机图片", "扫描手机图片"});
+                                    break;
+                                }
+                            }
+                        }
                     }
 
                     @Override
@@ -374,6 +379,9 @@ public class MemberViewModel extends BaseViewModel {
                     if (serverErrorException.getCode() == ErrorCode.ERROR_CODE_NO_LOGIN_ERROR) {
                         ToastUtil.show(R.string.no_login, ToastUtil.LENGTH_SHORT);
                         LoginActivity.start(ActivityUtil.getTopActivity(), ReportUtil.getReportId(memberType));
+                    } else if (serverErrorException.getCode() == ErrorCode.ERROR_CODE_HAS_PERMISSION_ERROR) {
+                        deviceFuncRepository.refreshFuncAuths();
+                        payRepository.refreshOrderPageList();
                     } else {
                         ToastUtil.show(serverErrorException.getMsg(), ToastUtil.LENGTH_SHORT);
                     }
@@ -530,4 +538,67 @@ public class MemberViewModel extends BaseViewModel {
                 break;
         }
     }
+
+    public List<Pair<CharSequence, CharSequence>> getInformationList() {
+        informationList.clear();
+        switch (memberType) {
+            case MemberType.APP_WX_MESSAGE_RECOVER:
+                informationList.add(new Pair<>(getInformationCharSequence("134*****190 购买了", "超级恢复"), "1分钟前"));
+                informationList.add(new Pair<>(getInformationCharSequence("123*****810 购买了", "微信消息恢复"), "3分钟前"));
+                informationList.add(new Pair<>(getInformationCharSequence("122*****910 购买了", "超级恢复"), "7分钟前"));
+                informationList.add(new Pair<>(getInformationCharSequence("187*****724 购买了", "超级恢复"), "9分钟前"));
+                informationList.add(new Pair<>(getInformationCharSequence("156*****586 购买了", "微信消息恢复"), "11分钟前"));
+                break;
+            case MemberType.APP_WX_FRIEND_RECOVER:
+                informationList.add(new Pair<>(getInformationCharSequence("145*****356 购买了", "微信好友恢复"), "2分钟前"));
+                informationList.add(new Pair<>(getInformationCharSequence("176*****457 购买了", "微信好友恢复"), "6分钟前"));
+                informationList.add(new Pair<>(getInformationCharSequence("163*****246 购买了", "超级恢复"), "10分钟前"));
+                informationList.add(new Pair<>(getInformationCharSequence("162*****471 购买了", "超级恢复"), "13分钟前"));
+                informationList.add(new Pair<>(getInformationCharSequence("192*****279 购买了", "微信好友恢复"), "14分钟前"));
+                break;
+            case MemberType.APP_IMAGE_RECOVER:
+                informationList.add(new Pair<>(getInformationCharSequence("194*****356 购买了", "图片恢复"), "5分钟前"));
+                informationList.add(new Pair<>(getInformationCharSequence("176*****457 购买了", "超级恢复"), "6分钟前"));
+                informationList.add(new Pair<>(getInformationCharSequence("165*****126 购买了", "超级恢复"), "9分钟前"));
+                informationList.add(new Pair<>(getInformationCharSequence("174*****471 购买了", "超级恢复"), "13分钟前"));
+                informationList.add(new Pair<>(getInformationCharSequence("175*****279 购买了", "图片恢复"), "16分钟前"));
+                break;
+            case MemberType.APP_FILE_RECOVER:
+                informationList.add(new Pair<>(getInformationCharSequence("143*****356 购买了", "文件恢复"), "5分钟前"));
+                informationList.add(new Pair<>(getInformationCharSequence("144*****352 购买了", "超级恢复"), "6分钟前"));
+                informationList.add(new Pair<>(getInformationCharSequence("153*****421 购买了", "文件恢复"), "9分钟前"));
+                informationList.add(new Pair<>(getInformationCharSequence("159*****471 购买了", "超级恢复"), "13分钟前"));
+                informationList.add(new Pair<>(getInformationCharSequence("165*****279 购买了", "文件恢复"), "16分钟前"));
+                break;
+            case MemberType.APP_VIDEO_RECOVER:
+                informationList.add(new Pair<>(getInformationCharSequence("165*****356 购买了", "视频恢复"), "2分钟前"));
+                informationList.add(new Pair<>(getInformationCharSequence("167*****245 购买了", "超级恢复"), "6分钟前"));
+                informationList.add(new Pair<>(getInformationCharSequence("182*****412 购买了", "视频恢复"), "7分钟前"));
+                informationList.add(new Pair<>(getInformationCharSequence("199*****471 购买了", "超级恢复"), "13分钟前"));
+                informationList.add(new Pair<>(getInformationCharSequence("131*****276 购买了", "超级恢复"), "15分钟前"));
+                break;
+            case MemberType.APP_AUDIO_RECOVER:
+                informationList.add(new Pair<>(getInformationCharSequence("187*****096 购买了", "视频恢复"), "2分钟前"));
+                informationList.add(new Pair<>(getInformationCharSequence("178*****045 购买了", "超级恢复"), "3分钟前"));
+                informationList.add(new Pair<>(getInformationCharSequence("193*****012 购买了", "视频恢复"), "6分钟前"));
+                informationList.add(new Pair<>(getInformationCharSequence("199*****571 购买了", "超级恢复"), "8分钟前"));
+                informationList.add(new Pair<>(getInformationCharSequence("150*****170 购买了", "超级恢复"), "11分钟前"));
+                break;
+            case MemberType.APP_IMAGE_CLEAN:
+                informationList.add(new Pair<>(getInformationCharSequence("163*****754 购买了", "图片清除(永久)"), "2分钟前"));
+                informationList.add(new Pair<>(getInformationCharSequence("195*****346 购买了", "图片清除(永久)"), "3分钟前"));
+                informationList.add(new Pair<>(getInformationCharSequence("193*****054 购买了", "图片清除(年)"), "6分钟前"));
+                informationList.add(new Pair<>(getInformationCharSequence("131*****571 购买了", "图片清除(永久)"), "8分钟前"));
+                informationList.add(new Pair<>(getInformationCharSequence("148*****117 购买了", "图片清除(年)"), "11分钟前"));
+                break;
+        }
+        return informationList;
+    }
+
+
+    public CharSequence getInformationCharSequence(String prefix, String suffix) {
+        return new SpannableStringBuilder()
+                .append(prefix)
+                .append(String.format("%s", suffix), new ForegroundColorSpan(Color.parseColor("#FFF187")), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
+    }
 }

+ 18 - 0
app/src/main/java/com/datarecovery/master/widget/InformationSwitchBanner.java

@@ -1,6 +1,7 @@
 package com.datarecovery.master.widget;
 
 import android.content.Context;
+import android.graphics.drawable.Drawable;
 import android.os.Handler;
 import android.util.Pair;
 import android.view.LayoutInflater;
@@ -62,6 +63,23 @@ public class InformationSwitchBanner implements ViewSwitcher.ViewFactory, View.O
         viewSwitcher.showNext();
     }
 
+    public void setTextColor(Drawable leftDrawable, int padding, int prefixColor, int suffixColor) {
+        ViewHomePageSwitchTextBinding currentView = ViewHomePageSwitchTextBinding.bind(viewSwitcher.getCurrentView());
+        ViewHomePageSwitchTextBinding nextView = ViewHomePageSwitchTextBinding.bind(viewSwitcher.getNextView());
+
+        currentView.tvSwitchText.setTextColor(prefixColor);
+        nextView.tvSwitchText.setTextColor(prefixColor);
+
+        currentView.tvSwitchDate.setTextColor(suffixColor);
+        nextView.tvSwitchDate.setTextColor(suffixColor);
+
+        leftDrawable.setBounds(0, 0, leftDrawable.getMinimumWidth(), leftDrawable.getMinimumHeight());
+        currentView.tvSwitchText.setCompoundDrawablePadding(padding);
+        nextView.tvSwitchText.setCompoundDrawablePadding(padding);
+        currentView.tvSwitchText.setCompoundDrawables(leftDrawable, null, null, null);
+        nextView.tvSwitchText.setCompoundDrawables(leftDrawable, null, null, null);
+    }
+
     @Override
     public View makeView() {
         ViewHomePageSwitchTextBinding viewHomePageSwitchTextBinding = ViewHomePageSwitchTextBinding.inflate(inflater);

BIN
app/src/main/res/drawable-xxhdpi/bg_member_header_img.webp


BIN
app/src/main/res/drawable-xxhdpi/bg_user_evaluate_header.webp


BIN
app/src/main/res/drawable-xxhdpi/icon_back_white.webp


BIN
app/src/main/res/drawable-xxhdpi/icon_member_bottom.webp


BIN
app/src/main/res/drawable-xxhdpi/icon_member_serve.webp


BIN
app/src/main/res/drawable-xxhdpi/icon_memeber_buy_avatar.webp


BIN
app/src/main/res/drawable-xxhdpi/icon_scenes_1.webp


BIN
app/src/main/res/drawable-xxhdpi/icon_scenes_2.webp


BIN
app/src/main/res/drawable-xxhdpi/icon_scenes_3.webp


BIN
app/src/main/res/drawable-xxhdpi/icon_scenes_4.webp


BIN
app/src/main/res/drawable-xxhdpi/icon_scenes_5.webp


BIN
app/src/main/res/drawable-xxhdpi/icon_scenes_6.webp


BIN
app/src/main/res/drawable-xxhdpi/icon_scenes_7.webp


+ 5 - 0
app/src/main/res/drawable/bg_member_buy.xml

@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8"?>
+<shape xmlns:android="http://schemas.android.com/apk/res/android">
+    <corners android:radius="16dp" />
+    <solid android:color="#ACBEFF" />
+</shape>

+ 3 - 7
app/src/main/res/drawable/bg_member_buy_btn.xml

@@ -1,12 +1,8 @@
 <?xml version="1.0" encoding="utf-8"?>
 <shape xmlns:android="http://schemas.android.com/apk/res/android">
     <corners android:radius="8dp" />
-    <stroke
-        android:width="1dp"
-        android:color="#FFD99D" />
     <gradient
-        android:centerX="0.375"
-        android:centerColor="#FFEEC3"
-        android:endColor="#FFC977"
-        android:startColor="#FFE0A4" />
+        android:angle="-90"
+        android:endColor="#FFC285"
+        android:startColor="#FCEBC8" />
 </shape>

+ 7 - 4
app/src/main/res/drawable/bg_member_container.xml

@@ -1,7 +1,10 @@
 <?xml version="1.0" encoding="utf-8"?>
 <shape xmlns:android="http://schemas.android.com/apk/res/android">
-    <corners
-        android:topLeftRadius="20dp"
-        android:topRightRadius="20dp" />
-    <solid android:color="@color/white" />
+    <corners android:radius="10dp" />
+    <gradient
+        android:angle="-90"
+        android:endColor="@color/white"
+        android:centerColor="@color/white"
+        android:centerX="0.2"
+        android:startColor="#ECF1FF" />
 </shape>

+ 7 - 0
app/src/main/res/drawable/bg_member_evaluate_container.xml

@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8"?>
+<shape xmlns:android="http://schemas.android.com/apk/res/android">
+    <corners
+        android:topLeftRadius="10dp"
+        android:topRightRadius="10dp" />
+    <solid android:color="#FAFAFA" />
+</shape>

+ 7 - 0
app/src/main/res/drawable/bg_member_label.xml

@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8"?>
+<shape xmlns:android="http://schemas.android.com/apk/res/android">
+    <corners
+        android:bottomRightRadius="2dp"
+        android:topRightRadius="2dp" />
+    <solid android:color="#4C61E5" />
+</shape>

+ 1 - 1
app/src/main/res/drawable/bg_scenes_container.xml

@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="utf-8"?>
 <shape xmlns:android="http://schemas.android.com/apk/res/android">
     <corners android:radius="8dp" />
-    <solid android:color="#FAF8F7" />
+    <solid android:color="#F8F8FF" />
 </shape>

+ 300 - 244
app/src/main/res/layout/activity_member.xml

@@ -14,295 +14,351 @@
 
     <androidx.constraintlayout.widget.ConstraintLayout
         android:layout_width="match_parent"
+        android:background="#4C61E5"
         android:layout_height="match_parent">
 
+        <androidx.appcompat.widget.Toolbar
+            android:id="@+id/tool_bar"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            app:layout_constraintStart_toStartOf="parent"
+            app:layout_constraintTop_toTopOf="parent"
+            app:navigationIcon="@drawable/icon_back_white">
+
+            <TextView
+                style="@style/Tool_Bar_Title_Txt"
+                android:text="@string/member_action_title"
+                android:textColor="@color/white" />
+
+        </androidx.appcompat.widget.Toolbar>
+
 
         <androidx.core.widget.NestedScrollView
             android:id="@+id/nested_scroll_view"
             android:layout_width="match_parent"
             android:layout_height="0dp"
-            app:layout_constraintBottom_toTopOf="@+id/view_bottom"
-            app:layout_constraintTop_toTopOf="parent">
+            app:layout_constraintBottom_toBottomOf="parent"
+            app:layout_constraintTop_toBottomOf="@+id/tool_bar">
 
             <androidx.constraintlayout.widget.ConstraintLayout
                 android:layout_width="match_parent"
                 android:layout_height="wrap_content">
 
-                <ImageView
+                <Space
+                    android:id="@+id/space1"
                     android:layout_width="match_parent"
                     android:layout_height="0dp"
-                    android:src="@drawable/bg_member_header_img"
-                    app:layout_constraintDimensionRatio="1080:789"
+                    app:layout_constraintDimensionRatio="360:8"
                     app:layout_constraintTop_toTopOf="parent" />
 
+                <View
+                    android:id="@+id/v_buy_bg"
+                    android:layout_width="0dp"
+                    android:layout_height="0dp"
+                    android:layout_marginStart="8dp"
+                    android:alpha="0.5"
+                    android:background="@drawable/bg_member_buy"
+                    app:layout_constraintDimensionRatio="284:28"
+                    app:layout_constraintStart_toStartOf="parent"
+                    app:layout_constraintTop_toBottomOf="@id/space1"
+                    app:layout_constraintWidth_percent="0.7888888888888889" />
+
+
+                <ViewSwitcher
+                    android:id="@+id/view_switcher"
+                    android:layout_width="0dp"
+                    android:layout_height="wrap_content"
+                    android:layout_marginHorizontal="8dp"
+                    app:layout_constraintBottom_toBottomOf="@+id/v_buy_bg"
+                    app:layout_constraintEnd_toEndOf="@+id/v_buy_bg"
+                    app:layout_constraintStart_toStartOf="@+id/v_buy_bg"
+                    app:layout_constraintTop_toTopOf="@+id/v_buy_bg" />
+
                 <Space
-                    android:id="@+id/space1"
+                    android:id="@+id/space2"
                     android:layout_width="match_parent"
                     android:layout_height="0dp"
-                    app:layout_constraintDimensionRatio="360:187"
-                    app:layout_constraintTop_toTopOf="parent" />
+                    app:layout_constraintDimensionRatio="360:16"
+                    app:layout_constraintTop_toBottomOf="@id/v_buy_bg" />
 
-                <androidx.constraintlayout.widget.ConstraintLayout
+                <Space
+                    android:id="@+id/space3"
                     android:layout_width="match_parent"
-                    android:layout_height="match_parent"
+                    android:layout_height="0dp"
+                    app:layout_constraintDimensionRatio="360:20"
+                    app:layout_constraintTop_toBottomOf="@+id/space2" />
+
+                <View
+                    android:id="@+id/v_buy_list_bg"
+                    android:layout_width="match_parent"
+                    android:layout_height="0dp"
+                    android:layout_marginHorizontal="8dp"
                     android:background="@drawable/bg_member_container"
-                    app:layout_constraintTop_toBottomOf="@+id/space1">
-
-                    <Space
-                        android:id="@+id/space_detail_top"
-                        android:layout_width="match_parent"
-                        android:layout_height="0dp"
-                        app:layout_constraintDimensionRatio="360:21"
-                        app:layout_constraintTop_toTopOf="parent" />
-
-                    <View
-                        android:id="@+id/icon_member_benefit"
-                        android:layout_width="0dp"
-                        android:layout_height="0dp"
-                        android:layout_marginBottom="-2dp"
-                        android:background="@drawable/bg_member_title"
-                        app:layout_constraintBottom_toBottomOf="@+id/member_func_title"
-                        app:layout_constraintDimensionRatio="64:8"
-                        app:layout_constraintLeft_toLeftOf="@+id/member_func_title"
-                        app:layout_constraintWidth_percent="0.1777777777777778" />
-
-
-                    <TextView
-                        android:id="@+id/member_func_title"
-                        android:layout_width="wrap_content"
-                        android:layout_height="wrap_content"
-                        android:layout_marginStart="@dimen/app_common_page_horizontal_padding"
-                        android:text="@string/member_func_title"
-                        android:textColor="#202020"
-                        android:textSize="16sp"
-                        android:textStyle="bold"
-                        app:layout_constraintStart_toStartOf="parent"
-                        app:layout_constraintTop_toBottomOf="@+id/space_detail_top" />
-
-                    <Space
-                        android:id="@+id/space2"
-                        android:layout_width="match_parent"
-                        android:layout_height="0dp"
-                        app:layout_constraintDimensionRatio="360:14"
-                        app:layout_constraintTop_toBottomOf="@+id/member_func_title" />
-
-                    <androidx.recyclerview.widget.RecyclerView
-                        android:id="@+id/member_detail_list"
-                        android:layout_width="match_parent"
-                        android:layout_height="wrap_content"
-                        android:paddingHorizontal="@dimen/app_common_page_horizontal_padding"
-                        app:layout_constraintTop_toBottomOf="@id/space2"
-                        tools:layoutManager="androidx.recyclerview.widget.LinearLayoutManager"
-                        tools:listitem="@layout/item_member_goods"
-                        tools:orientation="horizontal" />
-
-                    <Space
-                        android:id="@+id/space3"
-                        android:layout_width="match_parent"
-                        android:layout_height="0dp"
-                        app:layout_constraintDimensionRatio="360:20"
-                        app:layout_constraintTop_toBottomOf="@+id/member_detail_list" />
-
-                    <TextView
-                        android:id="@+id/member_scenes_title"
-                        android:layout_width="wrap_content"
-                        android:layout_height="wrap_content"
-                        android:text="@{memberViewModel.selectBean.superRecover ? @string/member_super_title : @string/member_scenes_title }"
-                        android:textColor="#202020"
-                        android:textSize="14sp"
-                        android:textStyle="bold"
-                        app:layout_constraintLeft_toLeftOf="@+id/member_func_title"
-                        app:layout_constraintTop_toBottomOf="@+id/space3"
-                        tools:text="使用场景" />
-
-                    <Space
-                        android:id="@+id/space4"
-                        android:layout_width="match_parent"
-                        android:layout_height="0dp"
-                        app:layout_constraintDimensionRatio="360:12"
-                        app:layout_constraintTop_toBottomOf="@+id/member_scenes_title" />
-
-
-                    <androidx.recyclerview.widget.RecyclerView
-                        android:id="@+id/scenes_ry_view"
-                        android:layout_width="match_parent"
-                        android:layout_height="wrap_content"
-                        android:layout_marginHorizontal="16dp"
-                        android:background="@{memberViewModel.selectBean.superRecover ? null: @drawable/bg_scenes_container}"
-                        android:overScrollMode="never"
-                        android:padding="8dp"
-                        app:layout_constraintTop_toBottomOf="@+id/space4" />
-
-                    <Space
-                        android:id="@+id/space5"
-                        android:layout_width="match_parent"
-                        android:layout_height="0dp"
-                        app:layout_constraintDimensionRatio="360:20"
-                        app:layout_constraintTop_toBottomOf="@+id/scenes_ry_view" />
-
-                    <View
-                        android:id="@+id/v_divider"
-                        android:layout_width="match_parent"
-                        android:layout_height="0dp"
-                        android:background="#F9FAFC"
-                        app:layout_constraintDimensionRatio="360:8"
-                        app:layout_constraintTop_toBottomOf="@+id/space5" />
-
-                    <Space
-                        android:id="@+id/space6"
-                        android:layout_width="match_parent"
-                        android:layout_height="0dp"
-                        app:layout_constraintDimensionRatio="360:20"
-                        app:layout_constraintTop_toBottomOf="@+id/v_divider" />
-
-                    <View
-                        android:id="@+id/icon_user_evaluate"
-                        android:layout_width="0dp"
-                        android:layout_height="0dp"
-                        android:layout_marginBottom="-2dp"
-                        android:background="@drawable/bg_member_title"
-                        app:layout_constraintBottom_toBottomOf="@+id/member_user_evaluate_title"
-                        app:layout_constraintDimensionRatio="64:8"
-                        app:layout_constraintLeft_toLeftOf="@+id/member_user_evaluate_title"
-                        app:layout_constraintWidth_percent="0.1777777777777778" />
-
-
-                    <TextView
-                        android:id="@+id/member_user_evaluate_title"
-                        android:layout_width="wrap_content"
-                        android:layout_height="wrap_content"
-                        android:layout_marginStart="@dimen/app_common_page_horizontal_padding"
-                        android:text="@string/member_user_evaluate"
-                        android:textColor="#202020"
-                        android:textSize="16sp"
-                        android:textStyle="bold"
-                        app:layout_constraintStart_toStartOf="parent"
-                        app:layout_constraintTop_toBottomOf="@+id/space6" />
-
-                    <androidx.recyclerview.widget.RecyclerView
-                        android:id="@+id/user_evaluate_ry_view"
-                        android:layout_width="match_parent"
-                        android:layout_height="wrap_content"
-                        android:overScrollMode="never"
-                        app:layout_constraintTop_toBottomOf="@+id/icon_user_evaluate" />
-
-                    <TextView
-                        android:id="@+id/member_service_content"
-                        android:layout_width="wrap_content"
-                        android:layout_height="wrap_content"
-                        android:text="@string/member_service_description"
-                        android:textColor="#404040"
-                        android:textSize="14sp"
-                        android:textStyle="bold"
-                        app:layout_constraintStart_toStartOf="@+id/member_scenes_title"
-                        app:layout_constraintTop_toBottomOf="@+id/user_evaluate_ry_view" />
-
-                    <TextView
-                        android:id="@+id/member_service_content_txt"
-                        android:layout_width="match_parent"
-                        android:layout_height="wrap_content"
-                        android:layout_marginHorizontal="@dimen/app_common_page_horizontal_padding"
-                        android:layout_marginTop="8dp"
-                        android:text="@{memberViewModel.getServiceContentTxt}"
-                        app:layout_constraintTop_toBottomOf="@+id/member_service_content"
-                        tools:text="1.根据相关法律对个人隐私保护的规定,需购买会员才可使用,请在购买套餐前仔细阅读我们的《隐私协议》,您在付费会员服务时必须完全,严格的遵守本服务协议的规则。
-2.会员服务说明:您购买的任何会员服务购买成功后一年有效,但请注意,您如果先买了单个功能恢复,后续又买了全部功能恢复,那么您之前购买的单个功能恢复则无法退款。
-3.若您在支付过程中遇到问题,无法支付或支付失败,请先检查自己账户内的余额,若还是存在支付问题请联系客服解决。
-4.在线客服工作时间7*18小时
-5.本产品功能只作为本人数据恢复,请用于合法用途经发现违法使用则立即封停账号并视情节严重与否追究法律。
-6.付费会员服务仅供您自行使用,使用过程中需要电脑配合,可根据详细的恢复教程,通过获取的授权码和软件自行操作,使用过程中遇到问题可以联系官方客服解决
-7.我们的软件会尽可能为您恢复出数据中可能恢复的记录,越早操作恢复概率越高。
-8.支付后可开具增值税发票(纸质发票,邮寄到付)" />
-
-                    <Space
-                        android:layout_width="match_parent"
-                        android:layout_height="0dp"
-                        app:layout_constraintDimensionRatio="360:37"
-                        app:layout_constraintTop_toBottomOf="@+id/member_service_content_txt" />
-
-
-                </androidx.constraintlayout.widget.ConstraintLayout>
+                    app:layout_constraintBottom_toBottomOf="@+id/space6"
+                    app:layout_constraintTop_toTopOf="@+id/space3" />
 
+                <ImageView
+                    android:layout_width="match_parent"
+                    android:layout_height="0dp"
+                    android:layout_marginHorizontal="8dp"
+                    android:src="@drawable/icon_member_serve"
+                    app:layout_constraintDimensionRatio="1032:300"
+                    app:layout_constraintTop_toTopOf="@id/v_buy_list_bg" />
+
+                <View
+                    android:id="@+id/v_label1"
+                    android:layout_width="0dp"
+                    android:layout_height="0dp"
+                    android:layout_marginStart="@dimen/app_common_page_horizontal_padding"
+                    android:background="@drawable/bg_member_label"
+                    app:layout_constraintBottom_toBottomOf="@+id/tv_choose_services"
+                    app:layout_constraintDimensionRatio="5:16"
+                    app:layout_constraintStart_toStartOf="@id/v_buy_list_bg"
+                    app:layout_constraintTop_toTopOf="@+id/tv_choose_services"
+                    app:layout_constraintWidth_percent="0.0138888888888889" />
+
+                <TextView
+                    android:id="@+id/tv_choose_services"
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:layout_marginStart="6dp"
+                    android:text="@string/member_choose_services"
+                    android:textColor="#202020"
+                    android:textSize="17sp"
+                    android:textStyle="bold"
+                    app:layout_constraintStart_toEndOf="@+id/v_label1"
+                    app:layout_constraintTop_toBottomOf="@+id/space3" />
 
-            </androidx.constraintlayout.widget.ConstraintLayout>
+                <Space
+                    android:id="@+id/space4"
+                    android:layout_width="match_parent"
+                    android:layout_height="0dp"
+                    app:layout_constraintDimensionRatio="360:19"
+                    app:layout_constraintTop_toBottomOf="@+id/tv_choose_services" />
+
+                <androidx.recyclerview.widget.RecyclerView
+                    android:id="@+id/member_detail_list"
+                    android:overScrollMode="never"
+                    android:layout_width="0dp"
+                    android:layout_height="wrap_content"
+                    android:layout_marginHorizontal="@dimen/app_common_page_horizontal_padding"
+                    app:layout_constraintEnd_toEndOf="@id/v_buy_list_bg"
+                    app:layout_constraintStart_toStartOf="@id/v_buy_list_bg"
+                    app:layout_constraintTop_toBottomOf="@+id/space4"
+                    tools:itemCount="2"
+                    tools:listitem="@layout/item_member_goods" />
 
-        </androidx.core.widget.NestedScrollView>
+                <Space
+                    android:id="@+id/space5"
+                    android:layout_width="match_parent"
+                    android:layout_height="0dp"
+                    app:layout_constraintDimensionRatio="360:26"
+                    app:layout_constraintTop_toBottomOf="@+id/member_detail_list" />
 
-        <View
-            android:alpha="0"
-            android:background="@color/white"
-            android:id="@+id/view_status_bar"
-            android:layout_width="match_parent"
-            android:layout_height="@{SizeUtil.getStatusBarHeight(), default=@dimen/app_status_bar_height}"
-            app:layout_constraintTop_toTopOf="parent" />
+                <View
+                    android:id="@+id/v_label2"
+                    android:layout_width="0dp"
+                    android:layout_height="0dp"
+                    android:layout_marginStart="@dimen/app_common_page_horizontal_padding"
+                    android:background="@drawable/bg_member_label"
+                    app:layout_constraintBottom_toBottomOf="@+id/tv_scenes_title"
+                    app:layout_constraintDimensionRatio="5:16"
+                    app:layout_constraintStart_toStartOf="@id/v_buy_list_bg"
+                    app:layout_constraintTop_toTopOf="@+id/tv_scenes_title"
+                    app:layout_constraintWidth_percent="0.0138888888888889" />
+
+                <TextView
+                    android:id="@+id/tv_scenes_title"
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:layout_marginStart="6dp"
+                    android:text="@string/member_scenes_title"
+                    android:textColor="#202020"
+                    android:textSize="17sp"
+                    android:textStyle="bold"
+                    app:layout_constraintStart_toEndOf="@+id/v_label2"
+                    app:layout_constraintTop_toBottomOf="@+id/space5" />
+
+                <androidx.recyclerview.widget.RecyclerView
+                    android:id="@+id/scenes_ry_view"
+                    android:layout_width="0dp"
+                    android:layout_height="wrap_content"
+                    android:layout_marginHorizontal="16dp"
+                    android:layout_marginTop="10dp"
+                    android:background="@drawable/bg_scenes_container"
+                    android:overScrollMode="never"
+                    android:padding="8dp"
+                    app:layoutManager="androidx.recyclerview.widget.GridLayoutManager"
+                    app:layout_constraintEnd_toEndOf="@id/v_buy_list_bg"
+                    app:layout_constraintStart_toStartOf="@id/v_buy_list_bg"
+                    app:layout_constraintTop_toBottomOf="@+id/tv_scenes_title"
+                    app:spanCount="2"
+                    tools:itemCount="4"
+                    tools:listitem="@layout/item_normal_scenes" />
 
-        <View
-            android:alpha="0"
-            android:background="@color/white"
-            android:id="@+id/view_tool_bar"
-            android:layout_width="match_parent"
-            android:layout_height="0dp"
-            app:layout_constraintBottom_toBottomOf="@+id/toolbar"
-            app:layout_constraintTop_toTopOf="@+id/toolbar" />
+                <Space
+                    android:id="@+id/space6"
+                    android:layout_width="match_parent"
+                    android:layout_height="0dp"
+                    app:layout_constraintDimensionRatio="360:28"
+                    app:layout_constraintTop_toBottomOf="@+id/scenes_ry_view" />
 
-        <androidx.appcompat.widget.Toolbar
-            android:id="@+id/toolbar"
-            android:layout_width="match_parent"
-            android:layout_height="wrap_content"
-            app:layout_constraintTop_toBottomOf="@+id/view_status_bar">
+                <Space
+                    android:id="@+id/space7"
+                    android:layout_width="match_parent"
+                    android:layout_height="0dp"
+                    app:layout_constraintDimensionRatio="360:28"
+                    app:layout_constraintTop_toBottomOf="@+id/space6" />
 
+                <Space
+                    android:id="@+id/space8"
+                    android:layout_width="match_parent"
+                    android:layout_height="0dp"
+                    app:layout_constraintDimensionRatio="360:20"
+                    app:layout_constraintTop_toBottomOf="@+id/space7" />
 
-            <ImageView
-                android:id="@+id/icon_back"
-                android:layout_width="wrap_content"
-                android:layout_height="wrap_content"
-                android:layout_gravity="start"
-                android:layout_marginStart="@dimen/app_common_page_horizontal_padding"
-                android:background="?android:selectableItemBackgroundBorderless"
-                android:src="@drawable/icon_member_back" />
+                <View
+                    android:id="@+id/v_user_evaluate_bg"
+                    android:layout_width="match_parent"
+                    android:layout_height="0dp"
+                    app:layout_constraintBottom_toBottomOf="@+id/space10"
+                    android:background="@drawable/bg_member_evaluate_container"
+                    app:layout_constraintTop_toTopOf="@id/space8" />
 
-            <TextView
-                android:alpha="0"
-                android:id="@+id/tv_title"
-                android:layout_width="wrap_content"
-                android:layout_height="wrap_content"
-                android:layout_gravity="center"
-                android:text="@string/member_action_title"
-                android:textColor="#202020"
-                android:textSize="17sp"
-                android:textStyle="bold" />
+                <ImageView
+                    android:layout_width="match_parent"
+                    android:layout_height="0dp"
+                    android:src="@drawable/bg_user_evaluate_header"
+                    app:layout_constraintDimensionRatio="1080:378"
+                    app:layout_constraintTop_toTopOf="@+id/v_user_evaluate_bg" />
+
+
+                <View
+                    android:id="@+id/v_label3"
+                    android:layout_width="0dp"
+                    android:layout_height="0dp"
+                    android:layout_marginStart="@dimen/app_common_page_horizontal_padding"
+                    android:background="@drawable/bg_user_evaluate_label"
+                    app:layout_constraintBottom_toBottomOf="@+id/tv_user_evaluate"
+                    app:layout_constraintDimensionRatio="5:16"
+                    app:layout_constraintStart_toStartOf="@+id/v_user_evaluate_bg"
+                    app:layout_constraintTop_toTopOf="@+id/tv_user_evaluate"
+                    app:layout_constraintWidth_percent="0.0138888888888889" />
+
+                <TextView
+                    android:id="@+id/tv_user_evaluate"
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:layout_marginStart="4dp"
+                    android:text="@string/member_user_evaluate"
+                    android:textColor="#633B00"
+                    android:textSize="16sp"
+                    android:textStyle="bold"
+                    app:layout_constraintStart_toEndOf="@+id/v_label3"
+                    app:layout_constraintTop_toBottomOf="@+id/space8" />
+
+                <Space
+                    android:id="@+id/space9"
+                    android:layout_width="match_parent"
+                    android:layout_height="0dp"
+                    app:layout_constraintDimensionRatio="360:12"
+                    app:layout_constraintTop_toBottomOf="@+id/tv_user_evaluate" />
+
+
+                <androidx.recyclerview.widget.RecyclerView
+                    android:id="@+id/user_evaluate_ry_view"
+                    android:layout_width="match_parent"
+                    android:layout_height="wrap_content"
+                    android:overScrollMode="never"
+                    app:layout_constraintTop_toBottomOf="@+id/space9"
+                    tools:itemCount="2"
+                    tools:listitem="@layout/item_member_evaluate" />
+
+                <TextView
+                    android:id="@+id/tv_evaluate_bottom"
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:text="@string/member_good_comment"
+                    android:textColor="#AAAAAA"
+                    android:textSize="13sp"
+                    app:layout_constraintEnd_toEndOf="@+id/user_evaluate_ry_view"
+                    app:layout_constraintStart_toStartOf="@+id/user_evaluate_ry_view"
+                    app:layout_constraintTop_toBottomOf="@+id/user_evaluate_ry_view" />
+
+                <Space
+                    android:id="@+id/space10"
+                    android:layout_width="match_parent"
+                    android:layout_height="0dp"
+                    app:layout_constraintDimensionRatio="360:16"
+                    app:layout_constraintTop_toBottomOf="@+id/tv_evaluate_bottom" />
+
+                <View
+                    android:id="@+id/v_bottom_bg"
+                    android:layout_width="match_parent"
+                    android:layout_height="0dp"
+                    android:background="#F5353D6C"
+                    app:layout_constraintDimensionRatio="360:56"
+                    app:layout_constraintTop_toBottomOf="@+id/space10" />
+
+                <ImageView
+                    android:layout_width="0dp"
+                    android:layout_height="0dp"
+                    android:src="@drawable/icon_member_bottom"
+                    app:layout_constraintBottom_toBottomOf="@+id/v_bottom_bg"
+                    app:layout_constraintDimensionRatio="804:72"
+                    app:layout_constraintEnd_toEndOf="@+id/v_bottom_bg"
+                    app:layout_constraintStart_toStartOf="@+id/v_bottom_bg"
+                    app:layout_constraintTop_toTopOf="@+id/v_bottom_bg"
+                    app:layout_constraintWidth_percent="0.7444444444444444" />
+
+                <Space
+                    app:layout_constraintDimensionRatio="360:90"
+                    app:layout_constraintTop_toBottomOf="@+id/v_bottom_bg"
+                    android:layout_width="match_parent"
+                    android:layout_height="0dp" />
+
+            </androidx.constraintlayout.widget.ConstraintLayout>
+
+        </androidx.core.widget.NestedScrollView>
 
-        </androidx.appcompat.widget.Toolbar>
 
         <View
-            android:id="@+id/view_bottom"
+            android:id="@+id/v_bottom"
             android:layout_width="match_parent"
             android:layout_height="0dp"
-            android:background="@drawable/bg_member_bottom"
-            android:elevation="10dp"
+            android:background="#F5353D6C"
             app:layout_constraintBottom_toBottomOf="parent"
-            app:layout_constraintDimensionRatio="360:86" />
-
+            app:layout_constraintDimensionRatio="360:90" />
 
         <TextView
-            android:layout_width="0dp"
+            android:id="@+id/tv_buy_member"
+            android:layout_width="match_parent"
             android:layout_height="0dp"
+            android:layout_marginHorizontal="@dimen/app_common_page_horizontal_padding"
+            android:layout_marginTop="12dp"
             android:background="@drawable/bg_member_buy_btn"
-            android:elevation="10dp"
             android:gravity="center"
             android:onClick="@{() -> memberViewModel.onMemberSubscribeClick()}"
             android:text="@{memberViewModel.getSubscribeTxt}"
-            android:textColor="#6A3420"
-            android:textSize="16sp"
+            android:textColor="#202020"
+            android:textSize="17sp"
             android:textStyle="bold"
-            app:layout_constraintBottom_toBottomOf="@+id/view_bottom"
-            app:layout_constraintDimensionRatio="328:48"
-            app:layout_constraintEnd_toEndOf="@+id/view_bottom"
-            app:layout_constraintStart_toStartOf="@+id/view_bottom"
-            app:layout_constraintTop_toTopOf="@+id/view_bottom"
-            app:layout_constraintVertical_bias="0.3684210526315789"
-            app:layout_constraintWidth_percent="0.9111111111111111" />
+            app:layout_constraintDimensionRatio="328:44"
+            app:layout_constraintEnd_toEndOf="@+id/v_bottom"
+            app:layout_constraintStart_toStartOf="@+id/v_bottom"
+            app:layout_constraintTop_toTopOf="@+id/v_bottom"
+            tools:text="立即开通" />
 
+        <TextView
+            android:textColor="@color/white60"
+            android:id="@+id/tv_buy_member_desc"
+            android:layout_marginTop="8dp"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            app:layout_constraintEnd_toEndOf="@+id/tv_buy_member"
+            app:layout_constraintStart_toStartOf="@+id/tv_buy_member"
+            app:layout_constraintTop_toBottomOf="@+id/tv_buy_member"
+            tools:text="支付即代表您已阅读并同意《服务说明》" />
 
     </androidx.constraintlayout.widget.ConstraintLayout>
-</layout>
+</layout>

+ 1 - 0
app/src/main/res/layout/view_home_page_switch_text.xml

@@ -6,6 +6,7 @@
     android:layout_height="wrap_content">
 
     <TextView
+        android:gravity="center_vertical"
         android:id="@+id/tv_switch_text"
         android:layout_width="0dp"
         android:layout_height="wrap_content"

+ 3 - 1
app/src/main/res/values/strings.xml

@@ -153,7 +153,7 @@
     <string name="scenes_video_recover">视频恢复</string>
     <string name="scenes_audio_recover">音频恢复</string>
     <string name="scenes_more">更多权益</string>
-    <string name="member_user_evaluate">用户评价</string>
+    <string name="member_user_evaluate">优质用户评价</string>
     <string name="member_service_description">服务说明</string>
     <string name="retention_give_up_title">确定放弃恢复数据吗?</string>
     <string name="retention_give_up_text">如果旧数据被覆盖,数据将永久丢失</string>
@@ -208,4 +208,6 @@
     <string name="order_todo_pay">订单待支付</string>
     <string name="order_number">订单号</string>
     <string name="order_cancel_content">您确定要取消订单吗?取消后将无法支付此订单。</string>
+    <string name="member_choose_services">选择开通服务</string>
+    <string name="member_good_comment">随机挑选3条优质评论</string>
 </resources>