Browse Source

增加会员试用标签显示

zk 1 year ago
parent
commit
f30909b4a6

+ 33 - 13
app/src/main/java/com/datarecovery/master/data/repositories/ConfigRepository.java

@@ -3,9 +3,12 @@ package com.datarecovery.master.data.repositories;
 
 import android.text.TextUtils;
 
+import androidx.lifecycle.LiveData;
+import androidx.lifecycle.MutableLiveData;
+
 import com.atmob.common.logging.AtmobLog;
+import com.atmob.common.runtime.ContextUtil;
 import com.atmob.user.AtmobUser;
-import com.datarecovery.master.BuildConfig;
 import com.datarecovery.master.data.api.AtmobApi;
 import com.datarecovery.master.data.api.request.CustomerUrlRequest;
 import com.datarecovery.master.data.api.response.CustomerUrlResponse;
@@ -18,18 +21,20 @@ import com.datarecovery.master.utils.RxHttpHandler;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.List;
-import java.util.Objects;
 
 import javax.inject.Inject;
 import javax.inject.Singleton;
 
 import atmob.reactivex.rxjava3.core.Single;
 import atmob.rxjava.utils.RxJavaUtil;
+import dagger.hilt.EntryPoint;
+import dagger.hilt.InstallIn;
+import dagger.hilt.android.EntryPointAccessors;
+import dagger.hilt.components.SingletonComponent;
 
 @Singleton
 public class ConfigRepository {
 
-    private static boolean isOpenTrialMembership = false;
 
     private static final String[] trialMember = new String[]{
             MemberType.APP_IMAGE_RECOVER,
@@ -38,7 +43,8 @@ public class ConfigRepository {
             MemberType.APP_AUDIO_RECOVER,
     };
 
-    private static final List<String> trialMemberList = new ArrayList<>(Arrays.asList(trialMember));
+    private final MutableLiveData<Boolean> isOpenTrialMembership = new MutableLiveData<>();
+    private final List<String> trialMemberList = new ArrayList<>(Arrays.asList(trialMember));
     private final AtmobApi atmobApi;
 
     @Inject
@@ -57,40 +63,54 @@ public class ConfigRepository {
     private void getTrialMembershipStatus() {
         //如果是商店包,都开启试用会员
         if (AtmobUser.getAtmobTgPlatformId() == ChannelId.SD) {
-            isOpenTrialMembership = true;
+            isOpenTrialMembership.setValue(true);
             return;
         }
         GravityHelper.registerAttributionResultCallback(attributed -> {
             AtmobLog.d("ConfigRepository", "registerAttributionResultCallback attributed: " + attributed);
             if (BoxingUtil.boxing(attributed)) {
                 //归因成功
-                isOpenTrialMembership = false;
+                isOpenTrialMembership.setValue(false);
                 return;
             }
             if (AtmobUser.getAtmobTgPlatformId() != ChannelId.SD || TextUtils.isEmpty(AtmobUser.getAtmobChannel())) {
-                isOpenTrialMembership = false;
+                isOpenTrialMembership.setValue(false);
                 return;
             }
-            isOpenTrialMembership = true;
+            isOpenTrialMembership.setValue(true);
         });
     }
 
-
-    public static boolean isIsOpenTrialMembership() {
+    public LiveData<Boolean> getIsOpenTrialMembership() {
         return isOpenTrialMembership;
     }
 
-    public static boolean isConformTrialAuths(@MemberType String auth) {
-        if (!isOpenTrialMembership) {
+    public boolean isIsOpenTrialMembership() {
+        return BoxingUtil.boxing(isOpenTrialMembership.getValue());
+    }
+
+    public boolean isConformTrialAuths(@MemberType String auth) {
+        if (!BoxingUtil.boxing(isOpenTrialMembership.getValue())) {
             return false;
         }
         return isHaveTrialAuth(auth);
     }
 
-    private static boolean isHaveTrialAuth(@MemberType String auth) {
+    private boolean isHaveTrialAuth(@MemberType String auth) {
         if (TextUtils.isEmpty(auth)) {
             return false;
         }
         return trialMemberList.contains(auth);
     }
+
+    public static ConfigRepository getInstance() {
+        ConfigRepositoryPoint configRepositoryPoint = EntryPointAccessors.fromApplication(ContextUtil.getContext(), ConfigRepositoryPoint.class);
+        return configRepositoryPoint.configRepository();
+    }
+
+    @InstallIn(SingletonComponent.class)
+    @EntryPoint
+    interface ConfigRepositoryPoint {
+        ConfigRepository configRepository();
+    }
 }

+ 30 - 0
app/src/main/java/com/datarecovery/master/data/repositories/DeviceFuncRepository.java

@@ -3,6 +3,9 @@ package com.datarecovery.master.data.repositories;
 
 import android.text.TextUtils;
 
+import androidx.lifecycle.LiveData;
+import androidx.lifecycle.MutableLiveData;
+
 import com.datarecovery.master.BuildConfig;
 import com.datarecovery.master.data.api.AtmobApi;
 import com.datarecovery.master.data.api.request.BaseRequest;
@@ -12,7 +15,9 @@ import com.datarecovery.master.module.member.MemberType;
 import com.datarecovery.master.utils.RxHttpHandler;
 
 import java.util.ArrayList;
+import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
 import java.util.Objects;
 import java.util.concurrent.TimeUnit;
 
@@ -32,6 +37,11 @@ public class DeviceFuncRepository {
     private final List<String> authsList = new ArrayList<>();
     private final AtmobApi atmobApi;
 
+    private final MutableLiveData<Boolean> isHasImageFunc = new MutableLiveData<>();
+    private final MutableLiveData<Boolean> isHasFileFunc = new MutableLiveData<>();
+    private final MutableLiveData<Boolean> isHasVideoFunc = new MutableLiveData<>();
+    private final MutableLiveData<Boolean> isHasAudioFunc = new MutableLiveData<>();
+
     private boolean refreshFunAuthsFlag;
 
     @Inject
@@ -74,6 +84,10 @@ public class DeviceFuncRepository {
                         refreshFunAuthsFlag = false;
                         authsList.clear();
                         authsList.addAll(funcAuthsResponse.getAuths());
+                        isHasImageFunc.setValue(authsList.contains(MemberType.APP_IMAGE_RECOVER));
+                        isHasFileFunc.setValue(authsList.contains(MemberType.APP_FILE_RECOVER));
+                        isHasVideoFunc.setValue(authsList.contains(MemberType.APP_VIDEO_RECOVER));
+                        isHasAudioFunc.setValue(authsList.contains(MemberType.APP_AUDIO_RECOVER));
                     }
 
                     @Override
@@ -83,6 +97,22 @@ public class DeviceFuncRepository {
                 });
     }
 
+    public LiveData<Boolean> getIsHasAudioFunc() {
+        return isHasAudioFunc;
+    }
+
+    public LiveData<Boolean> getIsHasFileFunc() {
+        return isHasFileFunc;
+    }
+
+    public LiveData<Boolean> getIsHasImageFunc() {
+        return isHasImageFunc;
+    }
+
+    public LiveData<Boolean> getIsHasVideoFunc() {
+        return isHasVideoFunc;
+    }
+
     public void clearAuths() {
         authsList.clear();
     }

+ 1 - 1
app/src/main/java/com/datarecovery/master/module/about/AboutActivity.java

@@ -106,7 +106,7 @@ public class AboutActivity extends BaseActivity<ActivityAboutBinding> {
         //显示 是否开启试用 -- 打包渠道 -- 归因结果 -- 归因渠道
         StringBuilder sb = new StringBuilder();
         sb.append("--");
-        sb.append(ConfigRepository.isIsOpenTrialMembership());
+        sb.append(ConfigRepository.getInstance().isIsOpenTrialMembership());
 
         sb.append("--");
         sb.append(AtmobUser.getAtmobChannel());

+ 13 - 4
app/src/main/java/com/datarecovery/master/module/homepage/FunctionBean.java

@@ -1,8 +1,11 @@
 package com.datarecovery.master.module.homepage;
 
+import android.graphics.drawable.Drawable;
+
 import androidx.annotation.DrawableRes;
 import androidx.annotation.IntDef;
 import androidx.annotation.StringRes;
+import androidx.lifecycle.LiveData;
 
 import java.lang.annotation.Retention;
 import java.lang.annotation.RetentionPolicy;
@@ -21,16 +24,21 @@ public class FunctionBean {
     }
 
     private int functionId;
-    @StringRes
-    private int functionName;
+    private String functionName;
     @DrawableRes
     private int functionIcon;
 
+    private LiveData<Boolean> isHasFunc;
 
-    public FunctionBean(@FunctionId int functionId, int functionName, int functionIcon) {
+    public FunctionBean(@FunctionId int functionId, String functionName, int functionIcon, LiveData<Boolean> isHasFunc) {
         this.functionId = functionId;
         this.functionName = functionName;
         this.functionIcon = functionIcon;
+        this.isHasFunc = isHasFunc;
+    }
+
+    public LiveData<Boolean> getIsHasFunc() {
+        return isHasFunc;
     }
 
     @FunctionId
@@ -38,11 +46,12 @@ public class FunctionBean {
         return functionId;
     }
 
-    public int getFunctionName() {
+    public String getFunctionName() {
         return functionName;
     }
 
     public int getFunctionIcon() {
         return functionIcon;
     }
+
 }

+ 1 - 1
app/src/main/java/com/datarecovery/master/module/homepage/HomePageFragment.java

@@ -88,7 +88,7 @@ public class HomePageFragment extends BaseFragment<FragmentHomePageBinding> {
     }
 
     private void initOtherFunction() {
-        otherFunctionAdapter = new OtherFunctionAdapter(homePageViewModel.getFunctionList());
+        otherFunctionAdapter = new OtherFunctionAdapter(getViewLifecycleOwner(), homePageViewModel.getFunctionList(), homePageViewModel.getIsOpenTrialMembership());
         binding.ryOtherFunction.setAdapter(otherFunctionAdapter);
         otherFunctionAdapter.setOnItemClick(bean -> homePageViewModel.clickItemFunction(bean));
     }

+ 32 - 7
app/src/main/java/com/datarecovery/master/module/homepage/HomePageViewModel.java

@@ -3,6 +3,7 @@ package com.datarecovery.master.module.homepage;
 import com.atmob.app.lib.base.BaseViewModel;
 import com.atmob.app.lib.livedata.SingleLiveEvent;
 import com.atmob.common.runtime.ActivityUtil;
+import com.atmob.common.runtime.ContextUtil;
 import com.datarecovery.master.R;
 import com.datarecovery.master.data.consts.EventId;
 import com.datarecovery.master.data.repositories.ConfigRepository;
@@ -28,6 +29,7 @@ import dagger.hilt.android.lifecycle.HiltViewModel;
 import android.util.Pair;
 
 import androidx.lifecycle.LiveData;
+import androidx.lifecycle.MutableLiveData;
 
 
 @HiltViewModel
@@ -40,14 +42,37 @@ public class HomePageViewModel extends BaseViewModel {
     private final SingleLiveEvent<?> requestManagePermission = new SingleLiveEvent<>();
     private final SingleLiveEvent<?> requestAndroidDataPermission = new SingleLiveEvent<>();
     private final DeviceFuncRepository deviceFuncRepository;
+    private final ConfigRepository configRepository;
 
 
     @Inject
-    public HomePageViewModel(DeviceFuncRepository deviceFuncRepository) {
+    public HomePageViewModel(DeviceFuncRepository deviceFuncRepository, ConfigRepository configRepository) {
         this.deviceFuncRepository = deviceFuncRepository;
+        this.configRepository = configRepository;
         initList();
     }
 
+    public LiveData<Boolean> getIsOpenTrialMembership() {
+        return configRepository.getIsOpenTrialMembership();
+    }
+
+    public LiveData<Boolean> getIsHasAudioFunc() {
+        return deviceFuncRepository.getIsHasAudioFunc();
+    }
+
+    public LiveData<Boolean> getIsHasFileFunc() {
+        return deviceFuncRepository.getIsHasFileFunc();
+    }
+
+    public LiveData<Boolean> getIsHasImageFunc() {
+        return deviceFuncRepository.getIsHasImageFunc();
+    }
+
+    public LiveData<Boolean> getIsHasVideoFunc() {
+        return deviceFuncRepository.getIsHasVideoFunc();
+    }
+
+
     public List<FunctionBean> getFunctionList() {
         return functionList;
     }
@@ -64,10 +89,10 @@ public class HomePageViewModel extends BaseViewModel {
         informationList.add(new Pair<>("153*****912 购买了音频恢复", "11分钟前"));
         informationList.add(new Pair<>("159*****864 购买了视频恢复", "15分钟前"));
 
-        functionList.add(new FunctionBean(FunctionBean.FILE_RECOVERY, R.string.home_page_file_recovery, R.drawable.icon_home_page_file_recovery));
-        functionList.add(new FunctionBean(FunctionBean.VIDEO_RECOVERY, R.string.home_page_video_recovery, R.drawable.icon_home_page_video_recovery));
-        functionList.add(new FunctionBean(FunctionBean.AUDIO_RECOVERY, R.string.home_page_audio_recovery, R.drawable.icon_home_page_audio_recovery));
-        functionList.add(new FunctionBean(FunctionBean.IMG_CLEARING, R.string.home_page_img_clearing, R.drawable.icon_home_page_img_clearing));
+        functionList.add(new FunctionBean(FunctionBean.FILE_RECOVERY, ContextUtil.getContext().getString(R.string.home_page_file_recovery), R.drawable.icon_home_page_file_recovery, getIsHasFileFunc()));
+        functionList.add(new FunctionBean(FunctionBean.VIDEO_RECOVERY, ContextUtil.getContext().getString(R.string.home_page_video_recovery), R.drawable.icon_home_page_video_recovery, getIsHasVideoFunc()));
+        functionList.add(new FunctionBean(FunctionBean.AUDIO_RECOVERY, ContextUtil.getContext().getString(R.string.home_page_audio_recovery), R.drawable.icon_home_page_audio_recovery, getIsHasAudioFunc()));
+        functionList.add(new FunctionBean(FunctionBean.IMG_CLEARING, ContextUtil.getContext().getString(R.string.home_page_img_clearing), R.drawable.icon_home_page_img_clearing, null));
     }
 
     public LiveData<?> getRequestManagePermission() {
@@ -94,7 +119,7 @@ public class HomePageViewModel extends BaseViewModel {
         reportFirstClickFunction(type);
         if (deviceFuncRepository.isHaveAuth(type)) {
             if (stepCallback != null) stepCallback.onNextStep(false);
-        } else if (ConfigRepository.isConformTrialAuths(type)) {
+        } else if (configRepository.isConformTrialAuths(type)) {
             if (stepCallback != null) stepCallback.onNextStep(true);
         } else {
             MemberActivity.start(ActivityUtil.getTopActivity(), type);
@@ -102,7 +127,7 @@ public class HomePageViewModel extends BaseViewModel {
     }
 
     public void reportFirstClickFunction(@MemberType String type) {
-        if (ConfigRepository.isIsOpenTrialMembership()) {
+        if (configRepository.isIsOpenTrialMembership()) {
             if (ReportUtil.isRecordOneEvent(EventId.hf1001116)) {
                 EventHelper.report(EventId.hf1001130, Maps.asMap(EventId.EVENT_ID, ReportUtil.getReportId(type)));
                 return;

+ 10 - 1
app/src/main/java/com/datarecovery/master/module/homepage/OtherFunctionAdapter.java

@@ -6,6 +6,8 @@ import android.view.View;
 import android.view.ViewGroup;
 
 import androidx.annotation.NonNull;
+import androidx.lifecycle.LifecycleOwner;
+import androidx.lifecycle.LiveData;
 import androidx.recyclerview.widget.RecyclerView;
 
 import com.datarecovery.master.databinding.ItemHomePageOtherFunctionBinding;
@@ -18,10 +20,15 @@ public class OtherFunctionAdapter extends RecyclerView.Adapter<OtherFunctionAdap
     @NonNull
     private final List<FunctionBean> beanList;
 
+    private final LiveData<Boolean> isOpenTrial;
+    private final LifecycleOwner lifecycleOwner;
+
     private onItemClick onItemClick;
 
-    public OtherFunctionAdapter(@NonNull List<FunctionBean> beanList) {
+    public OtherFunctionAdapter(LifecycleOwner lifecycleOwner, @NonNull List<FunctionBean> beanList, LiveData<Boolean> isOpenTrial) {
+        this.lifecycleOwner = lifecycleOwner;
         this.beanList = beanList;
+        this.isOpenTrial = isOpenTrial;
     }
 
     public void setOnItemClick(OtherFunctionAdapter.onItemClick onItemClick) {
@@ -54,6 +61,8 @@ public class OtherFunctionAdapter extends RecyclerView.Adapter<OtherFunctionAdap
         public ViewHolder(@NonNull ItemHomePageOtherFunctionBinding binding) {
             super(binding.getRoot());
             this.binding = binding;
+            binding.setLifecycleOwner(lifecycleOwner);
+            this.binding.setIsOpenTrial(isOpenTrial);
             binding.getRoot().setOnClickListener(v -> {
                 if (onItemClick != null) onItemClick.onClick(binding.getBean());
             });

+ 10 - 0
app/src/main/res/drawable/bg_trial_tag.xml

@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8"?>
+<shape xmlns:android="http://schemas.android.com/apk/res/android">
+    <corners
+        android:bottomLeftRadius="8dp"
+        android:topRightRadius="8dp" />
+
+    <gradient
+        android:startColor="#FF4E4E"
+        android:endColor="#F32C00" />
+</shape>

+ 15 - 0
app/src/main/res/drawable/bg_trial_tag_other.xml

@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="utf-8"?>
+<shape xmlns:android="http://schemas.android.com/apk/res/android">
+    <gradient
+        android:endColor="#FF8E4E"
+        android:startColor="#FF4107" />
+
+    <corners
+        android:bottomLeftRadius="4dp"
+        android:bottomRightRadius="10dp"
+        android:topLeftRadius="10dp"
+        android:topRightRadius="10dp" />
+    <stroke
+        android:width="1dp"
+        android:color="@color/white" />
+</shape>

+ 21 - 8
app/src/main/res/layout/fragment_home_page.xml

@@ -15,8 +15,8 @@
 
     <androidx.constraintlayout.widget.ConstraintLayout
         android:layout_width="match_parent"
-        android:background="@color/white"
-        android:layout_height="match_parent">
+        android:layout_height="match_parent"
+        android:background="@color/white">
 
 
         <View
@@ -97,8 +97,8 @@
                 <View
                     android:layout_width="match_parent"
                     android:layout_height="0dp"
-                    app:layout_constraintBottom_toBottomOf="@+id/space9"
                     android:background="@drawable/bg_home_page_content"
+                    app:layout_constraintBottom_toBottomOf="@+id/space9"
                     app:layout_constraintTop_toBottomOf="@+id/space3" />
 
                 <Space
@@ -170,12 +170,12 @@
                     app:layout_constraintTop_toBottomOf="@+id/tv_hot_function" />
 
                 <View
-                    android:onClick="@{()-> homePageViewModel.onWxMessageRecoveryClick()}"
                     android:id="@+id/v_wx_message_recovery"
                     android:layout_width="0dp"
                     android:layout_height="0dp"
                     android:layout_marginStart="@dimen/app_common_page_horizontal_padding"
                     android:background="@drawable/bg_wx_message_recovery"
+                    android:onClick="@{()-> homePageViewModel.onWxMessageRecoveryClick()}"
                     app:layout_constraintDimensionRatio="152:108"
                     app:layout_constraintHorizontal_chainStyle="spread_inside"
                     app:layout_constraintLeft_toLeftOf="parent"
@@ -220,12 +220,12 @@
 
 
                 <View
-                    android:onClick="@{()-> homePageViewModel.onWxFriendRecoveryClick()}"
                     android:id="@+id/v_wx_friend_recovery"
                     android:layout_width="0dp"
                     android:layout_height="0dp"
                     android:layout_marginEnd="@dimen/app_common_page_horizontal_padding"
                     android:background="@drawable/bg_wx_friend_recovery"
+                    android:onClick="@{()-> homePageViewModel.onWxFriendRecoveryClick()}"
                     app:layout_constraintDimensionRatio="168:50"
                     app:layout_constraintLeft_toRightOf="@+id/v_wx_message_recovery"
                     app:layout_constraintRight_toRightOf="parent"
@@ -271,17 +271,30 @@
                     app:layout_constraintTop_toBottomOf="@+id/tv_wx_friend_recovery" />
 
                 <View
-                    android:onClick="@{()-> homePageViewModel.onImgRecoveryClick()}"
                     android:id="@+id/v_img_recovery"
                     android:layout_width="0dp"
                     android:layout_height="0dp"
                     android:background="@drawable/bg_img_recovery"
+                    android:onClick="@{()-> homePageViewModel.onImgRecoveryClick()}"
                     app:layout_constraintBottom_toBottomOf="@id/v_wx_message_recovery"
                     app:layout_constraintDimensionRatio="168:50"
                     app:layout_constraintEnd_toEndOf="@+id/v_wx_friend_recovery"
                     app:layout_constraintLeft_toRightOf="@+id/v_wx_message_recovery"
                     app:layout_constraintWidth_percent="0.4666666666666667" />
 
+                <TextView
+                    isGone="@{!homePageViewModel.isOpenTrialMembership || homePageViewModel.isHasImageFunc}"
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:background="@drawable/bg_trial_tag"
+                    android:paddingHorizontal="9dp"
+                    android:paddingVertical="2dp"
+                    android:text="@string/trial"
+                    android:textColor="@color/white"
+                    android:textSize="10dp"
+                    app:layout_constraintEnd_toEndOf="@+id/v_img_recovery"
+                    app:layout_constraintTop_toTopOf="@+id/v_img_recovery" />
+
                 <ImageView
                     android:id="@+id/iv_img_recovery"
                     android:layout_width="0dp"
@@ -347,11 +360,11 @@
 
                 <androidx.recyclerview.widget.RecyclerView
                     android:id="@+id/ry_other_function"
-                    android:scrollbars="none"
-                    android:overScrollMode="never"
                     android:layout_width="match_parent"
                     android:layout_height="wrap_content"
                     android:layout_marginHorizontal="@dimen/app_common_page_horizontal_padding"
+                    android:overScrollMode="never"
+                    android:scrollbars="none"
                     app:layoutManager="androidx.recyclerview.widget.GridLayoutManager"
                     app:layout_constraintTop_toBottomOf="@+id/space8"
                     app:spanCount="4"

+ 22 - 2
app/src/main/res/layout/item_home_page_other_function.xml

@@ -6,6 +6,10 @@
     <data>
 
         <variable
+            name="isOpenTrial"
+            type="androidx.lifecycle.LiveData&lt;Boolean>" />
+
+        <variable
             name="bean"
             type="com.datarecovery.master.module.homepage.FunctionBean" />
 
@@ -14,14 +18,14 @@
 
     <androidx.constraintlayout.widget.ConstraintLayout
         android:layout_width="match_parent"
-        android:layout_height="wrap_content"
-        android:paddingVertical="6dp">
+        android:layout_height="wrap_content">
 
         <ImageView
             android:id="@+id/iv_function_img"
             imageRes="@{bean.functionIcon}"
             android:layout_width="@{(float)SizeUtil.getScreenWidth() * 0.1222222222222222f, default=wrap_content}"
             android:layout_height="0dp"
+            android:layout_marginTop="6dp"
             app:layout_constraintBottom_toTopOf="@+id/tv_function_name"
             app:layout_constraintDimensionRatio="1:1"
             app:layout_constraintEnd_toEndOf="parent"
@@ -31,10 +35,26 @@
             tools:src="@drawable/icon_home_page_file_recovery" />
 
         <TextView
+            isGone="@{!isOpenTrial || bean.isHasFunc == null  || bean.isHasFunc}"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_marginStart="-14dp"
+            android:layout_marginTop="-3dp"
+            android:background="@drawable/bg_trial_tag_other"
+            android:paddingHorizontal="7dp"
+            android:paddingVertical="3dp"
+            android:text="@string/trial"
+            android:textColor="@color/white"
+            android:textSize="8dp"
+            app:layout_constraintStart_toEndOf="@+id/iv_function_img"
+            app:layout_constraintTop_toTopOf="@+id/iv_function_img" />
+
+        <TextView
             android:id="@+id/tv_function_name"
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"
             android:layout_marginTop="4dp"
+            android:layout_marginBottom="6dp"
             android:text="@{bean.functionName}"
             android:textColor="#202020"
             android:textSize="13sp"

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

@@ -218,4 +218,5 @@
     <string name="about_record_number">App服务备案号:皖ICP备2023011908号-8A</string>
     <string name="about_personal_information_list">个人信息收集清单</string>
     <string name="about_sdk_sharing_list">第三方SDK共享清单</string>
+    <string name="trial">试用</string>
 </resources>