Browse Source

[New]IAA版本初始提交

litchi98 2 months ago
parent
commit
16118b5cdf
100 changed files with 2295 additions and 1590 deletions
  1. 25 11
      app/build.gradle
  2. BIN
      app/keystore/ltjl.jks
  3. BIN
      app/keystore/recover.jks
  4. 4 1
      app/src/main/AndroidManifest.xml
  5. BIN
      app/src/main/assets/anim/loading.mp4
  6. 17 3
      app/src/main/java/com/datarecovery/master/App.java
  7. 20 0
      app/src/main/java/com/datarecovery/master/data/api/V8Api.java
  8. 12 0
      app/src/main/java/com/datarecovery/master/data/api/response/AtmobUserResponse.java
  9. 32 0
      app/src/main/java/com/datarecovery/master/data/consts/AdFuncId.java
  10. 14 7
      app/src/main/java/com/datarecovery/master/data/consts/Constants.java
  11. 1 97
      app/src/main/java/com/datarecovery/master/data/consts/EventId.java
  12. 0 2
      app/src/main/java/com/datarecovery/master/data/repositories/AccountRepository.java
  13. 59 0
      app/src/main/java/com/datarecovery/master/data/repositories/AdRepository.java
  14. 0 23
      app/src/main/java/com/datarecovery/master/data/repositories/DeviceFuncRepository.java
  15. 0 22
      app/src/main/java/com/datarecovery/master/data/repositories/MemberRepository.java
  16. 15 0
      app/src/main/java/com/datarecovery/master/di/NetworkModule.java
  17. 96 0
      app/src/main/java/com/datarecovery/master/dialog/AdLoadingDialog.java
  18. 1 5
      app/src/main/java/com/datarecovery/master/dialog/AgreementDialog.java
  19. 1 1
      app/src/main/java/com/datarecovery/master/dialog/AlipayQrCodeDialog.java
  20. 317 0
      app/src/main/java/com/datarecovery/master/dialog/BaseDialog.java
  21. 1 1
      app/src/main/java/com/datarecovery/master/dialog/ChoosePaymentWayDialog.java
  22. 2 2
      app/src/main/java/com/datarecovery/master/dialog/CommonLoadingDialog.java
  23. 1 1
      app/src/main/java/com/datarecovery/master/dialog/CommonSureDialog.java
  24. 76 0
      app/src/main/java/com/datarecovery/master/dialog/DialogQueue.java
  25. 1 5
      app/src/main/java/com/datarecovery/master/dialog/MemberRetentionDialog.java
  26. 1 1
      app/src/main/java/com/datarecovery/master/dialog/PermissionDialog.java
  27. 1 1
      app/src/main/java/com/datarecovery/master/dialog/ScanFileDialog.java
  28. 1 1
      app/src/main/java/com/datarecovery/master/dialog/ScanProgressDialog.java
  29. 35 0
      app/src/main/java/com/datarecovery/master/dialog/UnlockFunctionDialog.java
  30. 1 1
      app/src/main/java/com/datarecovery/master/dialog/WechatPayQrCodeDialog.java
  31. 10 13
      app/src/main/java/com/datarecovery/master/module/about/AboutActivity.java
  32. 35 53
      app/src/main/java/com/datarecovery/master/module/audiorecover/AudioRecoverActivity.java
  33. 18 54
      app/src/main/java/com/datarecovery/master/module/audiorecover/AudioRecoverViewModel.java
  34. 45 0
      app/src/main/java/com/datarecovery/master/module/backup_helper/BackupHelperActivity.java
  35. 1 7
      app/src/main/java/com/datarecovery/master/module/example/ExampleFragment.java
  36. 0 4
      app/src/main/java/com/datarecovery/master/module/feedback/UserFeedbackViewModel.java
  37. 29 31
      app/src/main/java/com/datarecovery/master/module/filerecover/FileRecoverActivity.java
  38. 15 64
      app/src/main/java/com/datarecovery/master/module/filerecover/FileRecoverViewModel.java
  39. 0 21
      app/src/main/java/com/datarecovery/master/module/filerecover/fragment/FileRecoverFragment.java
  40. 16 18
      app/src/main/java/com/datarecovery/master/module/homepage/FunctionBean.java
  41. 3 1
      app/src/main/java/com/datarecovery/master/module/homepage/HomePageFragment.java
  42. 59 56
      app/src/main/java/com/datarecovery/master/module/homepage/HomePageViewModel.java
  43. 20 6
      app/src/main/java/com/datarecovery/master/module/homepage/OtherFunctionAdapter.java
  44. 43 59
      app/src/main/java/com/datarecovery/master/module/imgrecover/ImageRecoverActivity.java
  45. 45 148
      app/src/main/java/com/datarecovery/master/module/imgrecover/ImageRecoverViewModel.java
  46. 0 23
      app/src/main/java/com/datarecovery/master/module/login/LoginActivity.java
  47. 0 27
      app/src/main/java/com/datarecovery/master/module/login/LoginViewModel.java
  48. 8 16
      app/src/main/java/com/datarecovery/master/module/main/MainActivity.java
  49. 1 3
      app/src/main/java/com/datarecovery/master/module/main/MainPagerAdapter.java
  50. 1 6
      app/src/main/java/com/datarecovery/master/module/member/MemberActivity.java
  51. 0 95
      app/src/main/java/com/datarecovery/master/module/member/MemberViewModel.java
  52. 7 19
      app/src/main/java/com/datarecovery/master/module/mine/MineFragment.java
  53. 2 40
      app/src/main/java/com/datarecovery/master/module/mine/MineViewModel.java
  54. 0 1
      app/src/main/java/com/datarecovery/master/module/order/OrderItemAdapter.java
  55. 0 8
      app/src/main/java/com/datarecovery/master/module/order/OrderViewModel.java
  56. 37 41
      app/src/main/java/com/datarecovery/master/module/preview/PreviewActivity.java
  57. 4 11
      app/src/main/java/com/datarecovery/master/module/preview/PreviewImagePagerAdapter.java
  58. 33 68
      app/src/main/java/com/datarecovery/master/module/preview/PreviewViewModel.java
  59. 46 21
      app/src/main/java/com/datarecovery/master/module/splash/SplashActivity.java
  60. 31 47
      app/src/main/java/com/datarecovery/master/module/videorecover/VideoRecoverActivity.java
  61. 13 52
      app/src/main/java/com/datarecovery/master/module/videorecover/VideoRecoverViewModel.java
  62. 0 23
      app/src/main/java/com/datarecovery/master/module/wxrecover/WeChatViewModel.java
  63. 610 0
      app/src/main/java/com/datarecovery/master/sdk/ad/AtmobAdHelper.java
  64. 53 0
      app/src/main/java/com/datarecovery/master/sdk/ad/InterstitialListenerAdapter.java
  65. 75 0
      app/src/main/java/com/datarecovery/master/sdk/ad/RewardVideoListenerAdapter.java
  66. 59 0
      app/src/main/java/com/datarecovery/master/sdk/ad/SplashListenerAdapter.java
  67. 0 84
      app/src/main/java/com/datarecovery/master/sdk/qiyu/GlideImageLoader.java
  68. 0 225
      app/src/main/java/com/datarecovery/master/sdk/qiyu/QiYuHelper.java
  69. 79 0
      app/src/main/java/com/datarecovery/master/utils/CounterUtil.java
  70. 1 50
      app/src/main/java/com/datarecovery/master/utils/FilePermissionHelper.java
  71. 82 0
      app/src/main/java/com/datarecovery/master/utils/SplashHandler.java
  72. BIN
      app/src/main/res/drawable-xxhdpi/bg_dialog_unlock_function.webp
  73. BIN
      app/src/main/res/drawable-xxhdpi/bg_enter_image_recover.webp
  74. BIN
      app/src/main/res/drawable-xxhdpi/bg_home_banner.webp
  75. BIN
      app/src/main/res/drawable-xxhdpi/bg_home_recover_btn.webp
  76. BIN
      app/src/main/res/drawable-xxhdpi/bg_qq_backup_helper.webp
  77. BIN
      app/src/main/res/drawable-xxhdpi/bg_tab_qq_selected.webp
  78. BIN
      app/src/main/res/drawable-xxhdpi/bg_tab_wechat_selected.webp
  79. BIN
      app/src/main/res/drawable-xxhdpi/bg_wechat_backup_helper.webp
  80. BIN
      app/src/main/res/drawable-xxhdpi/icon_backup_helper_enter.webp
  81. BIN
      app/src/main/res/drawable-xxhdpi/icon_dialog_close.webp
  82. BIN
      app/src/main/res/drawable-xxhdpi/icon_home_page_audio_recovery.webp
  83. BIN
      app/src/main/res/drawable-xxhdpi/icon_home_page_file_recovery.webp
  84. BIN
      app/src/main/res/drawable-xxhdpi/icon_home_page_img_clearing.webp
  85. BIN
      app/src/main/res/drawable-xxhdpi/icon_home_page_img_recover.webp
  86. BIN
      app/src/main/res/drawable-xxhdpi/icon_home_page_video_recovery.webp
  87. BIN
      app/src/main/res/drawable-xxhdpi/icon_home_recover_btn.webp
  88. BIN
      app/src/main/res/drawable-xxhdpi/icon_qq.webp
  89. BIN
      app/src/main/res/drawable-xxhdpi/icon_unlock.webp
  90. BIN
      app/src/main/res/drawable-xxhdpi/icon_wechat.webp
  91. 12 0
      app/src/main/res/drawable/bg_ad_skip_button.xml
  92. 8 0
      app/src/main/res/drawable/bg_backup_helper_button.xml
  93. 6 0
      app/src/main/res/drawable/bg_backup_helper_tab.xml
  94. 8 0
      app/src/main/res/drawable/bg_dialog_unlock_btn.xml
  95. 0 5
      app/src/main/res/drawable/bg_home_page_information.xml
  96. 1 5
      app/src/main/res/drawable/bg_home_page_scroll.xml
  97. 14 0
      app/src/main/res/drawable/bg_qq_tutorial.xml
  98. 14 0
      app/src/main/res/drawable/bg_wechat_tutorial.xml
  99. 17 0
      app/src/main/res/drawable/selector_home_page_information.xml
  100. 0 0
      app/src/main/res/drawable/selector_home_page_tab_indicator.xml

+ 25 - 11
app/build.gradle

@@ -40,16 +40,16 @@ android {
 
     signingConfigs {
         debug {
-            storeFile file("keystore/recover.jks")
-            storePassword "recover888"
-            keyAlias "recover"
-            keyPassword "recover888"
+            storeFile file("keystore/ltjl.jks")
+            storePassword "ltjl888"
+            keyAlias "ltjl"
+            keyPassword "ltjl888"
         }
         release {
-            storeFile file("keystore/recover.jks")
-            storePassword "recover888"
-            keyAlias "recover"
-            keyPassword "recover888"
+            storeFile file("keystore/ltjl.jks")
+            storePassword "ltjl888"
+            keyAlias "ltjl"
+            keyPassword "ltjl888"
         }
     }
 
@@ -63,6 +63,9 @@ android {
             proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
             signingConfig signingConfigs.release
 
+            buildConfigField "boolean", "isLocalNetwork", "false"
+            buildConfigField "boolean", "isSkipVideoAd", "false" //不要修改release的值
+            buildConfigField "boolean", "isSkipOtherAd", "false" //不要修改release的值
             buildConfigField "String", "ENV", "\"$env_release\""
             buildConfigField "String", "HOST", "\"${getServerHost(env_release)}\""
             buildConfigField "String", "LOCAL", "\"$LOCAL\""
@@ -84,6 +87,9 @@ android {
             proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
             signingConfig signingConfigs.debug
 
+            buildConfigField "boolean", "isLocalNetwork", "false"
+            buildConfigField "boolean", "isSkipVideoAd", "false"
+            buildConfigField "boolean", "isSkipOtherAd", "false"
             buildConfigField "String", "ENV", "\"$env_debug\""
             buildConfigField "String", "HOST", "\"${getServerHost(env_debug)}\""
             buildConfigField "String", "LOCAL", "\"$LOCAL\""
@@ -234,9 +240,6 @@ dependencies {
     //SVGA
     implementation 'com.github.svga:SVGAPlayer-Android:2.6.1'
 
-    //网易七鱼客服
-    implementation 'com.qiyukf.unicorn:unicorn:9.2.0'
-
     //dokit
     debugImplementation("io.github.didi.dokit:dokitx:$rootProject.dokit_version")
             {
@@ -246,4 +249,15 @@ dependencies {
 
     //网易一键登录
     implementation 'io.github.yidun:quicklogin:3.5.4'
+
+    // Atmob Ad
+    implementation "plus.ad:mediation:3.0.11.0-SNAPSHOT" //广告聚合模块
+    implementation("plus.ad:mediation-gromore:6.8.4.0.1-SNAPSHOT") {
+        exclude group: 'plus.bytedance', module: 'mediation-adscope'
+    } //Gromore adapter
+    implementation "plus.ad:mediation-tobid:4.5.4.1-SNAPSHOT" //Tobid adapter
+    implementation "plus.ad:mediation-taku:6.4.87.1-SNAPSHOT"
+
+    //VapPlayer 动效
+    implementation "io.github.tencent:vap:2.0.28"
 }

BIN
app/keystore/ltjl.jks


BIN
app/keystore/recover.jks


+ 4 - 1
app/src/main/AndroidManifest.xml

@@ -20,10 +20,10 @@
         android:fullBackupContent="@xml/backup_rules"
         android:icon="@mipmap/ic_launcher"
         android:label="@string/app_name"
+        android:largeHeap="true"
         android:networkSecurityConfig="@xml/network_config"
         android:roundIcon="@mipmap/ic_launcher_round"
         android:supportsRtl="true"
-        android:largeHeap="true"
         android:theme="@style/Theme.DataRecover"
         tools:ignore="LockedOrientationActivity"
         tools:replace="android:allowBackup"
@@ -100,6 +100,9 @@
             android:name=".module.customerservice.CustomerServiceActivity"
             android:launchMode="singleTask"
             android:screenOrientation="portrait" />
+        <activity
+            android:name=".module.backup_helper.BackupHelperActivity"
+            android:screenOrientation="portrait" />
 
     </application>
 

BIN
app/src/main/assets/anim/loading.mp4


+ 17 - 3
app/src/main/java/com/datarecovery/master/App.java

@@ -5,15 +5,17 @@ import android.content.Context;
 import com.atmob.app.lib.base.BaseApplication;
 import com.atmob.channelreader.ChannelReader;
 import com.atmob.common.runtime.ProcessUtil;
+import com.atmob.compliance.AtmobCompliance;
 import com.atmob.sdk.appconvert.AppConvert;
 import com.atmob.sdk.gravity_engine.GravityEngine;
 import com.atmob.user.AtmobUser;
 import com.datarecovery.master.data.consts.Constants;
+import com.datarecovery.master.sdk.ad.AtmobAdHelper;
 import com.datarecovery.master.sdk.bugly.BuglyHelper;
 import com.datarecovery.master.sdk.central.AtmobCentralHelper;
-import com.datarecovery.master.sdk.qiyu.QiYuHelper;
 import com.datarecovery.master.sdk.quicklogin.QuickLoginHelper;
 import com.datarecovery.master.sdk.umeng.UmengHelper;
+import com.datarecovery.master.utils.SplashHandler;
 import com.datarecovery.master.utils.ToastUtil;
 import com.didichuxing.doraemonkit.DoKit;
 
@@ -21,7 +23,6 @@ import java.util.Objects;
 
 import dagger.hilt.android.HiltAndroidApp;
 
-
 @HiltAndroidApp
 public class App extends BaseApplication {
 
@@ -98,13 +99,14 @@ public class App extends BaseApplication {
             initCentral();
             initAppConvert();
             initGravityEngine();
+            initAtmobAd();
+            initSplash();
         }
     }
 
     @Override
     public void initAfterGrant(boolean isMainProcess) {
         if (isMainProcess) {
-            QiYuHelper.init(this);
             QuickLoginHelper.init(this);
         }
     }
@@ -145,4 +147,16 @@ public class App extends BaseApplication {
         BuglyHelper.initAfterGrantedAgreement();
         initAfterGrant(ProcessUtil.isMainProcess(this));
     }
+
+    private void initAtmobAd() {
+        AtmobCompliance.addPolicyGrantListener(isGranted -> {
+            if (isGranted) {
+                AtmobAdHelper.init(this);
+            }
+        });
+    }
+
+    private void initSplash() {
+        SplashHandler.init();
+    }
 }

+ 20 - 0
app/src/main/java/com/datarecovery/master/data/api/V8Api.java

@@ -0,0 +1,20 @@
+package com.datarecovery.master.data.api;
+
+import com.atmob.app.lib.base.BaseResponse;
+import com.datarecovery.master.data.api.request.BaseRequest;
+import com.datarecovery.master.data.api.response.AtmobUserResponse;
+
+import atmob.reactivex.rxjava3.core.Single;
+import atmob.retrofit2.http.Body;
+import atmob.retrofit2.http.POST;
+
+public interface V8Api {
+
+
+    /**
+     * 获取Atmob 广告侧用户信息
+     */
+//    @POST("http://192.168.10.10:48389/v8ds/v1/user/info")
+    @POST("/v8ds/v1/user/info")
+    Single<BaseResponse<AtmobUserResponse>> getAtmobUser(@Body BaseRequest request);
+}

+ 12 - 0
app/src/main/java/com/datarecovery/master/data/api/response/AtmobUserResponse.java

@@ -0,0 +1,12 @@
+package com.datarecovery.master.data.api.response;
+
+import com.google.gson.annotations.SerializedName;
+
+public class AtmobUserResponse {
+    @SerializedName("attributed")
+    private boolean attributed;
+
+    public boolean isAttributed() {
+        return attributed;
+    }
+}

+ 32 - 0
app/src/main/java/com/datarecovery/master/data/consts/AdFuncId.java

@@ -0,0 +1,32 @@
+package com.datarecovery.master.data.consts;
+
+public interface AdFuncId {
+    //冷启动-开屏
+    int SPLASH_COLD_LAUNCH_1 = 101;
+    //冷启动-开屏
+    int SPLASH_COLD_LAUNCH_2 = 102;
+    //热启动-开屏
+    int SPLASH_HOT_LAUNCH = 103;
+    //列表返回-插屏
+    int INTERSTITIAL_RESULT_BACK = 104;
+    //预览-插屏
+    int INTERSTITIAL_PREVIEW = 105;
+    //立即备份-激励点
+    int REWARD_RECOVER = 106;
+    //备份成功-插屏
+    int INTERSTITIAL_RECOVER_SUCCESS = 107;
+    //案例tab-插屏
+    int INTERSTITIAL_CASE = 108;
+    //我的tab-插屏
+    int INTERSTITIAL_MINE = 109;
+    //我的tab-信息流
+    int NATIVE_MINE = 110;
+    //切换按钮-插屏
+    int INTERSTITIAL_HOME_SWITCH = 111;
+    //立即清除-激励点
+    int REWARD_CLEAN = 112;
+    //清除成功-插屏
+    int INTERSTITIAL_CLEAN_SUCCESS = 113;
+    //点击备份教程-激励
+    int REWARD_BACKUP_TUTORIAL = 114;
+}

+ 14 - 7
app/src/main/java/com/datarecovery/master/data/consts/Constants.java

@@ -1,5 +1,6 @@
 package com.datarecovery.master.data.consts;
 
+import com.atmob.central.AtmobCentral;
 import com.datarecovery.master.BuildConfig;
 
 public class Constants {
@@ -7,20 +8,26 @@ public class Constants {
 
     public static final String Atmob_Server_Base_URL = BuildConfig.HOST;
 
-    public static final String App_DefaultChannel = "Android";
+    public static final String App_DefaultChannel = "SDLTJLBFCCOP";
     public static final int App_DefaultAppId = 0;
     public static final int App_DefaultTgPlatformId = 0;
 
-    public static final String PRIVACY_POLICY = "http://cdn.myaskai.cn/manyue/static/wjsjhfds-manyue-a-privacy.html";
-
-    public static final String USER_AGREEMENT = "http://cdn.myaskai.cn/manyue/static/wjsjhfds-manyue-clause.html";
-
-    public static final String USER_INFO_LIST = "https://cdn.myaskai.cn/manyue/wjsjhfds/user_inifo_list.html";
-    public static final String THREE_SDK_LIST = "https://cdn.myaskai.cn/manyue/wjsjhfds/sdk_list.html";
+    public static final String PRIVACY_POLICY = "https://doc.v8dashen.com/doc/230effac21758b18";
+    public static final String USER_AGREEMENT = "https://doc.v8dashen.com/doc/254ebea85603b26e";
+    public static final String KID_PROTECTION = "https://cdn.myaskai.cn/static/default-kid-privacy.html";
+    public static final String USER_INFO_LIST = "";
+    public static final String THREE_SDK_LIST = "";
 
     public static final int PAYMENT_WAY_WECHAT = 1;
     public static final int PAYMENT_WAY_WECHAT_SCAN = 2;
     public static final int PAYMENT_WAY_ALIPAY = 3;
     public static final int PAYMENT_WAY_ALIPAY_SCAN = 4;
 
+    public static final int Dialog_VIDEO_LOADING_COUNTDOWN = 3000;
+
+    public static final String KEY_LIST_BACK_AD_COUNTER = "list_back_ad_counter";
+
+    public static boolean isStoreChannel() {
+        return AtmobCentral.getTgPlatform() == 0;
+    }
 }

+ 1 - 97
app/src/main/java/com/datarecovery/master/data/consts/EventId.java

@@ -2,100 +2,4 @@ package com.datarecovery.master.data.consts;
 
 public interface EventId {
 
-    String EVENT_ID = "id";
-    String EVENT_TYPE1 = "type1";
-    String hf1000101 = "hf1000101"; // 启动页-隐私弹窗-同意并继续
-    String hf1000201 = "hf1000201"; // 启动页-温馨提示-同意
-    String hf1000301 = "hf1000301"; // 登录跳转页   带跳转页面ID:我的hf11018,微信消息恢复hf11011,微信好友恢复hf11009,图片恢复hf11001,文件恢复hf11003,视频恢复hf11005,音频恢复hf11007,图片清除hf11013
-    String hf200009 = "hf200009"; // 登录-手机号码输入框-点击
-    String hf200010 = "hf200010"; // 登录-验证码输入框-点击
-    String hf200011 = "hf200011"; // 登录-获取验证码-点击
-    String hf1000302 = "hf1000302"; // 登录-登录按钮-点击
-    String hf1000303 = "hf1000303"; // 登录-登录按钮-登录成功
-    String hf1000304 = "hf1000304"; // 登录-登录按钮-登录失败 ID:请勾选并同意协议hf11019,验证码错误hf11020,网络错误hf11021,其他原因hf11022
-    String hf1000305 = "hf1000305"; // 获取验证码-验证码报错  ID:手机号错误hf11034,其他原因hf11022
-    String hf1000401 = "hf1000401"; // 申请文件管理权限-取消
-    String hf1000402 = "hf1000402"; // 申请文件管理权限-授权权限
-    String hf1000403 = "hf1000403"; // 申请文件目录权限-等会在说
-    String hf1000404 = "hf1000404"; // 申请文件目录权限-授权权限
-    String hf1000501 = "hf1000501"; // 微信消息恢复-进入服务详情页
-    String hf1000502 = "hf1000502"; // 微信消息恢复-使用服务
-    String hf1000503 = "hf1000503"; // 微信好友恢复-进入服务详情页
-    String hf1000504 = "hf1000504"; // 微信好友恢复-使用服务
-    String hf1000505 = "hf1000505"; // 图片恢复-进入服务详情页
-    String hf1000506 = "hf1000506"; // 图片恢复-使用服务
-    String hf1000507 = "hf1000507"; // 文件恢复-进入服务详情页
-    String hf1000508 = "hf1000508"; // 文件恢复-使用服务
-    String hf1000509 = "hf1000509"; // 视频恢复-进入服务详情页
-    String hf1000510 = "hf1000510"; // 视频恢复-使用服务
-    String hf1000511 = "hf1000511"; // 音频恢复-进入服务详情页
-    String hf1000512 = "hf1000512"; // 音频恢复-使用服务
-    String hf1000513 = "hf1000513"; // 图片清除-进入服务详情页
-    String hf1000514 = "hf1000514"; // 图片清除-使用服务
-    String hf1000515 = "hf1000515"; // 底部导航栏-点击 ID:首页hf11015,案例hf11016,我的hf11018
-    String hf200008 = "hf200008"; // 首页-首次点击的功能 id:微信消息恢复hf11011,微信好友恢复hf11009,图片恢复hf11001,文件恢复hf11003,视频恢复hf11005,音频恢复hf11007,图片清除hf11013
-    String hf1000601 = "hf1000601"; // 服务详情-价格分类-点击 ID:超级恢复hf11035,微信消息恢复hf11011,微信好友恢复hf11009,图片恢复hf11001,文件恢复hf11003,视频恢复hf11005,音频恢复hf11007,图片清除hf11013
-    String hf1000602 = "hf1000602"; // 服务详情-支付按钮-点击 id:微信消息恢复hf11011,微信好友恢复hf11009,图片恢复hf11001,文件恢复hf11003,视频恢复hf11005,音频恢复hf11007,图片清除hf11013
-    String hf1000603 = "hf1000603"; // 服务详情-支付按钮-选择支付方式 ID:支付宝支付hf11023,支付宝扫码支付hf11024
-    String hf1000604 = "hf1000604"; // 服务详情-支付成功-带页面跳转ID ID:微信消息恢复hf11011,微信好友恢复hf11009,图片恢复hf11001,文件恢复hf11003,视频恢复hf11005,音频恢复hf11007,图片清除hf11013
-    String hf1000605 = "hf1000605"; // 服务详情-支付成功-带价格服务类型ID id:单功能一年hf11025,超级恢复一年hf11026,永久清除hf11027 type1:微信消息恢复hf11011,微信好友恢复hf11009,图片恢复hf11001,文件恢复hf11003,视频恢复hf11005,音频恢复hf11007,图片清除hf11013
-    String hf1000606 = "hf1000606"; // 服务详情-支付失败 ID:放弃支付hf11028,网络错误hf11021,其他原因hf11022
-    String hf1000607 = "hf1000607"; // 服务详情-挽留弹窗-关闭图标-点击 id:微信消息恢复hf11011,微信好友恢复hf11009,图片恢复hf11001,文件恢复hf11003,视频恢复hf11005,音频恢复hf11007,图片清除hf11013
-    String hf1000608 = "hf1000608"; // 服务详情-挽留弹窗-立即恢复按钮-点击 id:微信消息恢复hf11011,微信好友恢复hf11009,图片恢复hf11001,文件恢复hf11003,视频恢复hf11005,音频恢复hf11007,图片清除hf11013
-    String hf1001133 = "hf1001133"; // 服务详情-服务说明 id:微信消息恢复hf11011,微信好友恢复hf11009,图片恢复hf11001,文件恢复hf11003,视频恢复hf11005,音频恢复hf11007,图片清除hf11013
-    String hf1000801 = "hf1000801"; // 案例-案例详情
-    String hf1000901 = "hf1000901"; // 订单-点击
-    String hf1001129 = "hf1001129"; //订单-点击复制教程
-    String hf1001131 = "hf1001131"; //订单-取消订单 id:微信消息恢复hf11011,微信好友恢复hf11009,图片恢复hf11001,文件恢复hf11003,视频恢复hf11005,音频恢复hf11007,图片清除hf11013
-    String hf1001132 = "hf1001132"; // 订单-去支付 id:微信消息恢复hf11011,微信好友恢复hf11009,图片恢复hf11001,文件恢复hf11003,视频恢复hf11005,音频恢复hf11007,图片清除hf11013 type1:支付宝支付hf11023,支付宝扫码支付hf11024
-    String hf1001101 = "hf1001101"; // 我的-banner图-点击
-    String hf1001102 = "hf1001102"; // 我的-关于我们-点击
-    String hf1001103 = "hf1001103"; // 我的-关于我们-用户协议
-    String hf1001104 = "hf1001104"; // 我的-关于我们-隐私协议
-    String hf1001105 = "hf1001105"; // 我的-意见反馈-点击
-    String hf1001106 = "hf1001106"; // 我的-意见反馈-提交成功 带反馈内容
-    String hf1001107 = "hf1001107"; // 我的-意见反馈-提交失败 ID:网络错误hf11021,其他原因hf11022
-    String hf1001108 = "hf1001108"; // 我的-联系客服-点击
-    String hf1001115 = "hf1001115"; // 我的-申诉/退款-点击
-    String hf1001109 = "hf1001109"; // 我的-注销账号-点击
-    String hf1001110 = "hf1001110"; // 我的-注销账号-二次确认弹窗-确认
-    String hf1001111 = "hf1001111"; // 我的-注销账号-二次确认弹窗-取消
-    String hf1001112 = "hf1001112"; // 我的-退出账号-点击
-    String hf1001113 = "hf1001113"; // 我的-退出账号-二次确认弹窗-确认
-    String hf1001114 = "hf1001114"; // 我的-退出账号-二次确认弹窗-取消
-
-    String hf1000516 = "hf1000516"; //微信消息恢复-进入服务详情页-停留时长
-    String hf1000517 = "hf1000517"; //微信消息恢复-使用服务-停留时长
-    String hf200006 = "hf200006"; //微信消息恢复-点击复制教程
-    String hf1000518 = "hf1000518"; //微信好友恢复-进入服务详情页-停留时长
-    String hf1000519 = "hf1000519"; //微信好友恢复-使用服务-停留时长
-    String hf200007 = "hf200007"; //微信好友恢复-点击复制教程
-    String hf1000520 = "hf1000520"; //图片恢复-进入服务详情页-停留时长
-    String hf1000521 = "hf1000521"; //图片恢复-使用服务-停留时长
-    String hf1000522 = "hf1000522"; //文件恢复-进入服务详情页-停留时长
-    String hf1000523 = "hf1000523"; //文件恢复-使用服务-停留时长
-    String hf1000524 = "hf1000524"; //视频恢复-进入服务详情页-停留时长
-    String hf1000525 = "hf1000525"; //视频恢复-使用服务-停留时长
-    String hf1000526 = "hf1000526"; //音频恢复-进入服务详情页-停留时长
-    String hf1000527 = "hf1000527"; //音频恢复-使用服务-停留时长
-    String hf1000528 = "hf1000528"; //图片清除-进入服务详情页-停留时长
-    String hf1000529 = "hf1000529"; //图片清除-使用服务-停留时长
-
-    //试用
-
-    String hf1001116 = "hf1001116";//首页-试用状态-首次点击的功能  id:微信消息恢复hf11011,微信好友恢复hf11009,图片恢复hf11001,文件恢复hf11003,视频恢复hf11005,音频恢复hf11007,图片清除hf11013
-    String hf1001130 = "hf1001130";//首页-试用状态-首页各功能点击 id:微信消息恢复hf11011,微信好友恢复hf11009,图片恢复hf11001,文件恢复hf11003,视频恢复hf11005,音频恢复hf11007,图片清除hf11013
-    String hf1001117 = "hf1001117";//试用-提示框  id:图片恢复hf11001,文件恢复hf11003,视频恢复hf11005,音频恢复hf11007
-    String hf1001118 = "hf1001118";//试用-文字提示框  id:图片恢复hf11001,文件恢复hf11003,视频恢复hf11005,音频恢复hf11007
-    String hf1001119 = "hf1001119";//试用-下滑弹出框  id:图片恢复hf11001,文件恢复hf11003,视频恢复hf11005,音频恢复hf11007
-    String hf1001120 = "hf1001120";//试用-导出弹窗  id:图片恢复hf11001,文件恢复hf11003,视频恢复hf11005,音频恢复hf11007
-    String hf1001121 = "hf1001121";//试用-扫描弹窗-去恢复-点击  id:图片恢复hf11001,文件恢复hf11003,视频恢复hf11005,音频恢复hf11007
-    String hf1001122 = "hf1001122";//试用-扫描弹窗-取消-点击  id:图片恢复hf11001,文件恢复hf11003,视频恢复hf11005,音频恢复hf11007
-    String hf1001123 = "hf1001123";//试用-导出弹窗-去恢复-点击  id:图片恢复hf11001,文件恢复hf11003,视频恢复hf11005,音频恢复hf11007
-    String hf1001124 = "hf1001124";//试用-导出弹窗-取消-点击  id:图片恢复hf11001,文件恢复hf11003,视频恢复hf11005,音频恢复hf11007
-    String hf1001125 = "hf1001125";//视频恢复-试看结束弹窗-去恢复-点击
-    String hf1001126 = "hf1001126";//视频恢复-试看结束弹窗-取消-点击
-    String hf1001127 = "hf1001127";//音频恢复-试听结束弹窗-去恢复-点击
-    String hf1001128 = "hf1001128";//音频恢复-试听结束弹窗-取消-点击
-
-}
+}

+ 0 - 2
app/src/main/java/com/datarecovery/master/data/repositories/AccountRepository.java

@@ -17,7 +17,6 @@ import com.datarecovery.master.data.api.request.SendCodeRequest;
 import com.datarecovery.master.data.api.response.LoginResponse;
 import com.datarecovery.master.data.api.response.UserInfoResponse;
 import com.datarecovery.master.data.consts.ErrorCode;
-import com.datarecovery.master.sdk.qiyu.QiYuHelper;
 import com.datarecovery.master.utils.BoxingUtil;
 import com.datarecovery.master.utils.RxHttpHandler;
 import com.datarecovery.master.utils.ToastUtil;
@@ -126,7 +125,6 @@ public class AccountRepository {
             public void onSuccess(@NonNull UserInfoResponse userInfoResponse) {
                 requestUserInfoDisabled = false;
                 setLoginPhoneNum(userInfoResponse.getPhone());
-                QiYuHelper.setUserInfo(getKeyLoginPhoneNum(), userInfoResponse.getUserId(), token);
                 KVUtils.getDefault().putString(KEY_LOGIN_USER_ID, userInfoResponse.getUserId());
             }
 

+ 59 - 0
app/src/main/java/com/datarecovery/master/data/repositories/AdRepository.java

@@ -0,0 +1,59 @@
+package com.datarecovery.master.data.repositories;
+
+import com.atmob.common.data.KVUtils;
+import com.atmob.sdk.gravity_engine.GravityEngine;
+import com.datarecovery.master.data.api.V8Api;
+import com.datarecovery.master.data.api.request.BaseRequest;
+import com.datarecovery.master.data.api.response.AtmobUserResponse;
+import com.datarecovery.master.utils.BoxingUtil;
+import com.datarecovery.master.utils.RxHttpHandler;
+
+import java.util.concurrent.TimeUnit;
+
+import javax.inject.Inject;
+import javax.inject.Singleton;
+
+import atmob.reactivex.rxjava3.core.Single;
+import atmob.rxjava.utils.RxJavaUtil;
+
+@Singleton
+public class AdRepository {
+    private static final String KEY_IS_ATTRIBUTED = "ad_repository_is_attributed";
+    private final V8Api v8Api;
+
+    @Inject
+    public AdRepository(V8Api v8Api) {
+        this.v8Api = v8Api;
+    }
+
+    public Single<AtmobUserResponse> getAtmobUser() {
+        return v8Api.getAtmobUser(new BaseRequest())
+                .compose(RxHttpHandler.handle(false))
+                .doOnSuccess(atmobUserResponse -> {
+                    if (atmobUserResponse.isAttributed()) {
+                        KVUtils.getDefault().putBoolean(KEY_IS_ATTRIBUTED, true);
+                    }
+                })
+                .retryWhen(RxJavaUtil.exponentialBackOff(null, 8, TimeUnit.SECONDS))
+                .compose(RxJavaUtil.SingleSchedule.io2Main());
+    }
+
+    public Single<Boolean> isAttributed() {
+        boolean isAttribute = KVUtils.getDefault().getBoolean(KEY_IS_ATTRIBUTED, false);
+        if (isAttribute) {
+            return Single.just(true);
+        }
+        if (BoxingUtil.boxing(GravityEngine.getAttributionStatus() == GravityEngine.ATTRIBUTED)) {
+            return Single.just(true);
+        }
+        return getAtmobUser()
+                .map(AtmobUserResponse::isAttributed)
+                .map(isAttributed -> isAttributed || BoxingUtil.boxing(GravityEngine.getAttributionStatus() == GravityEngine.ATTRIBUTED))
+                .doOnSuccess(isAttributed -> {
+                    if (isAttributed) {
+                        KVUtils.getDefault().putBoolean(KEY_IS_ATTRIBUTED, true);
+                    }
+                })
+                .compose(RxJavaUtil.SingleSchedule.io2Main());
+    }
+}

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

@@ -1,12 +1,8 @@
 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;
 import com.datarecovery.master.data.api.response.FuncAuthsResponse;
@@ -16,7 +12,6 @@ import com.datarecovery.master.utils.RxHttpHandler;
 
 import java.util.ArrayList;
 import java.util.List;
-import java.util.Objects;
 import java.util.concurrent.TimeUnit;
 
 import javax.inject.Inject;
@@ -31,7 +26,6 @@ import atmob.rxjava.utils.RxJavaUtil;
 @Singleton
 public class DeviceFuncRepository {
 
-
     private final List<String> authsList = new ArrayList<>();
     private final AtmobApi atmobApi;
 
@@ -47,23 +41,6 @@ public class DeviceFuncRepository {
         this.atmobApi = atmobApi;
     }
 
-
-    public boolean isHaveAuth(@MemberType String auth) {
-        if (BuildConfig.DEBUG) {
-            return true;
-        }
-        if (TextUtils.isEmpty(auth) || authsList.isEmpty()) {
-            return false;
-        }
-        if (!Objects.equals(auth, MemberType.APP_IMAGE_CLEAN) && authsList.contains(MemberType.APP_SUPER_RECOVER)) {
-            return true;
-        }
-        if (Objects.equals(auth, MemberType.APP_WX_MESSAGE_RECOVER) || Objects.equals(auth, MemberType.APP_WX_FRIEND_RECOVER)) {
-            return authsList.contains(MemberType.APP_WX_MESSAGE_RECOVER) || authsList.contains(MemberType.APP_WX_FRIEND_RECOVER);
-        }
-        return authsList.contains(auth);
-    }
-
     public void refreshFuncAuths() {
         if (refreshFunAuthsFlag) {
             return;

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

@@ -16,21 +16,16 @@ import com.datarecovery.master.data.api.response.MemberPayResponse;
 import com.datarecovery.master.data.api.response.PaymentStatusResponse;
 import com.datarecovery.master.data.consts.Constants;
 import com.datarecovery.master.data.consts.ErrorCode;
-import com.datarecovery.master.data.consts.EventId;
 import com.datarecovery.master.handler.EventHelper;
 import com.datarecovery.master.module.login.LoginActivity;
 import com.datarecovery.master.module.member.MemberType;
 import com.datarecovery.master.utils.BoxingUtil;
-import com.datarecovery.master.utils.Maps;
 import com.datarecovery.master.utils.OrderReportHelper;
 import com.datarecovery.master.utils.ReportUtil;
 import com.datarecovery.master.utils.RxHttpHandler;
 import com.datarecovery.master.utils.ToastUtil;
 import com.google.gson.Gson;
 
-import java.util.HashMap;
-import java.util.Map;
-import java.util.Objects;
 import java.util.concurrent.TimeUnit;
 
 import javax.inject.Inject;
@@ -149,10 +144,8 @@ public class MemberRepository {
             public void error(int errno, String error) {
                 if (errno == 6001) {
                     //用户取消支付
-                    EventHelper.report(EventId.hf1000606, Maps.asMap(EventId.EVENT_ID, "hf11028"));
                     return;
                 }
-                EventHelper.report(EventId.hf1000606, Maps.asMap(EventId.EVENT_ID, "hf11022"));
                 ToastUtil.show(R.string.member_payment_failed, ToastUtil.LENGTH_SHORT);
             }
 
@@ -160,10 +153,8 @@ public class MemberRepository {
             public void payError(int errno, String error) {
                 if (errno == 6001) {
                     //用户取消支付
-                    EventHelper.report(EventId.hf1000606, Maps.asMap(EventId.EVENT_ID, "hf11028"));
                     return;
                 }
-                EventHelper.report(EventId.hf1000606, Maps.asMap(EventId.EVENT_ID, "hf11022"));
                 ToastUtil.show(R.string.member_payment_failed, ToastUtil.LENGTH_SHORT);
             }
 
@@ -201,19 +192,6 @@ public class MemberRepository {
                 .subscribe(aBoolean -> {
                     payOptions.setShowLoadingEvent(false);
                     if (BoxingUtil.boxing(aBoolean)) {
-                        EventHelper.report(EventId.hf1000604, Maps.asMap(EventId.EVENT_ID, ReportUtil.getReportId(payOptions.getMemberType())));
-                        Map<String, Object> map = new HashMap<>();
-                        if (Objects.equals(payOptions.getMemberType(), MemberType.APP_SUPER_RECOVER)) {
-                            map.put(EventId.EVENT_ID, "hf11026");
-                            EventHelper.report(EventId.hf1000605, map);
-                        } else if (Objects.equals(payOptions.getMemberType(), MemberType.APP_IMAGE_CLEAN) && payOptions.isPermanent()) {
-                            map.put(EventId.EVENT_ID, "hf11027");
-                            EventHelper.report(EventId.hf1000605, map);
-                        } else {
-                            map.put(EventId.EVENT_ID, "hf11025");
-                        }
-                        map.put(EventId.EVENT_TYPE1, ReportUtil.getReportId(payOptions.getMemberType()));
-                        EventHelper.report(EventId.hf1000605, map);
                         payRepository.refreshOrderPageList();
                         payOptions.setOnSubscribeSuccessEvent(orderId);
                     }

+ 15 - 0
app/src/main/java/com/datarecovery/master/di/NetworkModule.java

@@ -4,6 +4,7 @@ import com.atmob.network.interceptor.crypto.AtmobCryptoInterceptor;
 import com.atmob.network.okhttp.AtmobOkHttpClient;
 import com.datarecovery.master.BuildConfig;
 import com.datarecovery.master.data.api.AtmobApi;
+import com.datarecovery.master.data.api.V8Api;
 import com.datarecovery.master.data.consts.Constants;
 import com.google.gson.Gson;
 
@@ -42,4 +43,18 @@ public class NetworkModule {
                 .create(AtmobApi.class);
     }
 
+    @Singleton
+    @Provides
+    public static V8Api provideV8Api(Gson gson) {
+        OkHttpClient okHttpClient = AtmobOkHttpClient.newInstance("V8Api", BuildConfig.DEBUG)
+                .newBuilder()
+                .build();
+        return new Retrofit.Builder()
+                .client(okHttpClient)
+                .addConverterFactory(GsonConverterFactory.create(gson))
+                .addCallAdapterFactory(RxJava3CallAdapterFactory.create())
+                .baseUrl("https://i90okxj.v8dashen.com:4695")
+                .build()
+                .create(V8Api.class);
+    }
 }

+ 96 - 0
app/src/main/java/com/datarecovery/master/dialog/AdLoadingDialog.java

@@ -0,0 +1,96 @@
+package com.datarecovery.master.dialog;
+
+import android.content.Context;
+import android.os.Handler;
+import android.os.Looper;
+import android.view.View;
+
+import androidx.annotation.LayoutRes;
+import androidx.annotation.NonNull;
+
+import com.datarecovery.master.R;
+import com.datarecovery.master.data.consts.Constants;
+import com.tencent.qgame.animplayer.AnimView;
+
+import java.util.concurrent.TimeUnit;
+
+import atmob.reactivex.rxjava3.disposables.Disposable;
+import atmob.rxjava.utils.RxJavaUtil;
+
+@BaseDialog.FullScreen
+public class AdLoadingDialog extends BaseDialog {
+
+    private static final int DismissWhat = 588;
+    private Disposable dismissTimer;
+    private long showTime;
+    private final Handler handler;
+
+    public AdLoadingDialog(@NonNull Context context, @LayoutRes int loadingLayoutRes, int loadingStyleRes) {
+        super(context, loadingStyleRes);
+        setCancelable(false);
+        setContentView(loadingLayoutRes);
+        handler = new Handler(Looper.getMainLooper(), msg -> {
+            if (msg.what == DismissWhat) {
+                dismiss();
+                return true;
+            }
+            return false;
+        });
+    }
+
+    @Override
+    protected void onShow() {
+        super.onShow();
+        showTime = System.currentTimeMillis();
+        dismissTimer = RxJavaUtil.timer(
+                Constants.Dialog_VIDEO_LOADING_COUNTDOWN,
+                TimeUnit.MILLISECONDS, this::dismiss
+        );
+        startLoadingAnim();
+    }
+
+    private void startLoadingAnim() {
+        View loadingAnim = findViewById(R.id.ad_loading_anim);
+        AnimView animView = loadingAnim instanceof AnimView ? ((AnimView) loadingAnim) : null;
+        if (animView != null) {
+            animView.setLoop(Integer.MAX_VALUE);
+            animView.startPlay(getContext().getAssets(), "anim/loading.mp4");
+        }
+    }
+
+    private void stopLoadingAnim() {
+        View loadingAnim = findViewById(R.id.ad_loading_anim);
+        AnimView animView = loadingAnim instanceof AnimView ? ((AnimView) loadingAnim) : null;
+        if (animView != null) {
+            animView.stopPlay();
+        }
+    }
+
+    @Override
+    protected void onDismiss() {
+        super.onDismiss();
+        if (dismissTimer != null) {
+            dismissTimer.dispose();
+        }
+        stopLoadingAnim();
+    }
+
+    @Override
+    public void dismiss() {
+        long l = System.currentTimeMillis() - showTime;
+        if (l < 1500) {
+            handler.sendEmptyMessageDelayed(DismissWhat, 1500 - l);
+            return;
+        }
+        super.dismiss();
+    }
+
+    public final void forceDismiss() {
+        super.dismiss();
+    }
+
+    @Override
+    public boolean useQueue() {
+        return false;
+    }
+}

+ 1 - 5
app/src/main/java/com/datarecovery/master/dialog/AgreementDialog.java

@@ -10,12 +10,10 @@ import android.view.View;
 
 import androidx.annotation.NonNull;
 
-import com.atmob.app.lib.base.BaseDialog;
+import com.datarecovery.master.dialog.BaseDialog;
 import com.datarecovery.master.R;
 import com.datarecovery.master.data.consts.Constants;
-import com.datarecovery.master.data.consts.EventId;
 import com.datarecovery.master.databinding.DialogAgreementBinding;
-import com.datarecovery.master.handler.EventHelper;
 import com.datarecovery.master.module.browser.BrowserActivity;
 
 
@@ -30,7 +28,6 @@ public class AgreementDialog extends BaseDialog<DialogAgreementBinding> {
         setCancelable(false);
         binding.setIsTwoStep(false);
         binding.setOnAgreeClickListener(v -> {
-            EventHelper.report(EventId.hf1000101);
             dismiss();
             if (agreementAction != null) {
                 agreementAction.onAgree();
@@ -47,7 +44,6 @@ public class AgreementDialog extends BaseDialog<DialogAgreementBinding> {
 
         });
         binding.setOnStepTwoDisagreeClickListener(v -> {
-            EventHelper.report(EventId.hf1000201);
             dismiss();
             if (agreementAction != null) {
                 agreementAction.onDisagree();

+ 1 - 1
app/src/main/java/com/datarecovery/master/dialog/AlipayQrCodeDialog.java

@@ -8,7 +8,7 @@ import android.webkit.WebViewClient;
 
 import androidx.annotation.NonNull;
 
-import com.atmob.app.lib.base.BaseDialog;
+import com.datarecovery.master.dialog.BaseDialog;
 import com.atmob.common.ui.SizeUtil;
 import com.datarecovery.master.R;
 import com.datarecovery.master.data.consts.Constants;

+ 317 - 0
app/src/main/java/com/datarecovery/master/dialog/BaseDialog.java

@@ -0,0 +1,317 @@
+package com.datarecovery.master.dialog;
+
+import android.app.Activity;
+import android.app.Dialog;
+import android.content.Context;
+import android.os.Handler;
+import android.os.Looper;
+import android.view.Gravity;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.Window;
+import android.view.WindowManager;
+
+import androidx.annotation.CallSuper;
+import androidx.annotation.IntDef;
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.appcompat.app.AppCompatActivity;
+import androidx.databinding.ViewDataBinding;
+import androidx.lifecycle.Lifecycle;
+import androidx.lifecycle.LifecycleEventObserver;
+import androidx.lifecycle.LifecycleOwner;
+import androidx.lifecycle.LifecycleRegistry;
+import androidx.viewbinding.ViewBinding;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.lang.reflect.ParameterizedType;
+
+public class BaseDialog<T extends ViewBinding> extends Dialog implements Comparable<BaseDialog<T>>,
+        LifecycleOwner, LifecycleEventObserver {
+
+    protected T binding;
+
+    private Handler handler;
+
+    private int gravity;
+
+    private int margin;
+
+    private LifecycleRegistry lifecycleRegistry;
+
+    private Lifecycle ownerActivityLifecycle;
+
+    @Retention(RetentionPolicy.SOURCE)
+    @IntDef({
+            HIGH_PRIORITY,
+            DEFAULT_PRIORITY,
+            LOW_PRIORITY
+    })
+    @interface Priority {
+
+    }
+
+    static final int HIGH_PRIORITY = 100;
+
+    static final int DEFAULT_PRIORITY = 50;
+    static final int LOW_PRIORITY = 0;
+    private OnDismissListener onDismissListener;
+
+    private OnShowListener onShowListener;
+    private boolean widthFullScreen;
+    private boolean heightFullScreen;
+
+    public BaseDialog(@NonNull Context context) {
+        super(context);
+        init(context);
+    }
+
+    public BaseDialog(@NonNull Context context, int themeResId) {
+        super(context, themeResId);
+        init(context);
+    }
+
+    protected BaseDialog(@NonNull Context context, boolean cancelable, @Nullable OnCancelListener cancelListener) {
+        super(context, cancelable, cancelListener);
+        init(context);
+    }
+
+    private void init(Context context) {
+        handler = new Handler(Looper.getMainLooper());
+
+        lifecycleRegistry = new LifecycleRegistry(this);
+
+        initBinding();
+
+        initDialogParams();
+
+        initDialogOwner(context);
+
+        initListener();
+
+        lifecycleRegistry.handleLifecycleEvent(Lifecycle.Event.ON_CREATE);
+    }
+
+    private void initDialogOwner(Context context) {
+        Activity activity = context instanceof Activity ? ((Activity) context) : null;
+        if (activity != null) {
+            setOwnerActivity(activity);
+        }
+        AppCompatActivity appCompatActivity = activity instanceof AppCompatActivity ? ((AppCompatActivity) activity) : null;
+        if (appCompatActivity != null) {
+            ownerActivityLifecycle = appCompatActivity.getLifecycle();
+            ownerActivityLifecycle.addObserver(this);
+        }
+    }
+
+    private void initListener() {
+        super.setOnDismissListener(dialog -> {
+            if (lifecycleRegistry.getCurrentState() != Lifecycle.State.DESTROYED) {
+                lifecycleRegistry.handleLifecycleEvent(Lifecycle.Event.ON_STOP);
+            }
+            if (onDismissListener != null) {
+                onDismissListener.onDismiss(dialog);
+            }
+            onDismiss();
+            if (useQueue()) {
+                DialogQueue.nextDialog();
+            }
+        });
+        super.setOnShowListener(dialog -> {
+            lifecycleRegistry.handleLifecycleEvent(Lifecycle.Event.ON_RESUME);
+            if (onShowListener != null) {
+                onShowListener.onShow(dialog);
+            }
+            onShow();
+        });
+    }
+
+    private void initDialogParams() {
+        Class<? extends BaseDialog> aClass = this.getClass();
+        FullScreen annotation = aClass.getAnnotation(FullScreen.class);
+        if (annotation != null) {
+            widthFullScreen = annotation.width();
+            heightFullScreen = annotation.height();
+            gravity = annotation.gravity();
+        }
+    }
+
+    private void initBinding() {
+        try {
+            ParameterizedType type = getClass().getGenericSuperclass() instanceof ParameterizedType
+                    ? ((ParameterizedType) getClass().getGenericSuperclass()) : null;
+            if (type == null) {
+                return;
+            }
+            Class<? extends ViewBinding> bindingClass = (Class<? extends ViewBinding>) type.getActualTypeArguments()[0];
+            try {
+                Method inflate = bindingClass.getMethod("inflate", LayoutInflater.class);
+                binding = (T) inflate.invoke(null, getLayoutInflater());
+            } catch (NoSuchMethodException | IllegalAccessException | InvocationTargetException e) {
+                e.printStackTrace();
+            }
+            ViewDataBinding viewDataBinding = binding instanceof ViewDataBinding ? ((ViewDataBinding) binding) : null;
+            if (viewDataBinding != null) {
+                viewDataBinding.setLifecycleOwner(this);
+            }
+            if (binding != null) {
+                setContentView(binding.getRoot());
+            }
+        } catch (Exception e) {
+        }
+    }
+
+    public void setMargin(int margin) {
+        this.margin = margin;
+    }
+
+    protected void onShow() {
+    }
+
+    protected void onDismiss() {
+    }
+
+    @Override
+    public void setOnDismissListener(@Nullable OnDismissListener listener) {
+        onDismissListener = listener;
+    }
+
+    @Override
+    public void setOnShowListener(@Nullable OnShowListener listener) {
+        onShowListener = listener;
+    }
+
+    @Override
+    @CallSuper
+    public void show() {
+        if (useQueue()) {
+            DialogQueue.requestShow(this);
+        } else {
+            showInternal();
+        }
+    }
+
+    void showInternal() {
+        if (couldShow()) {
+            super.show();
+            Window window = getWindow();
+            WindowManager.LayoutParams attributes = window.getAttributes();
+            attributes.height = heightFullScreen ? WindowManager.LayoutParams.MATCH_PARENT : WindowManager.LayoutParams.WRAP_CONTENT;
+            attributes.width = widthFullScreen ? WindowManager.LayoutParams.MATCH_PARENT : WindowManager.LayoutParams.WRAP_CONTENT;
+            attributes.gravity = gravity;
+            //todo 暂时只处理TOP的margin,bottom待添加
+            if (gravity == Gravity.TOP) {
+                attributes.y = margin;
+            }
+
+            window.setAttributes(attributes);
+        } else {
+            if (useQueue()) {
+                DialogQueue.nextDialog();
+            }
+        }
+    }
+
+    private boolean couldShow() {
+        if (isShowing()) {
+            return false;
+        }
+        if (getOwnerActivity() != null) {
+            return !getOwnerActivity().isDestroyed() && !getOwnerActivity().isFinishing();
+        }
+        Context context = getContext();
+        if (context instanceof Activity) {
+            Activity activity = (Activity) context;
+            return !activity.isDestroyed() && !activity.isFinishing();
+        }
+        return true;
+    }
+
+    @Override
+    @CallSuper
+    public void dismiss() {
+        handler.post(() -> {
+            if (isShowing() && isDecorViewAttach()) {
+                super.dismiss();
+            }
+        });
+    }
+
+    private boolean isDecorViewAttach() {
+        Window window = getWindow();
+        if (window == null) {
+            return false;
+        }
+        View decorView = window.getDecorView();
+        if (decorView == null) {
+            return false;
+        }
+        return decorView.isAttachedToWindow();
+    }
+
+    @Override
+    public int compareTo(BaseDialog other) {
+        if (other == null) {
+            return 1;
+        }
+        if (getPriority() == other.getPriority()) {
+            return 0;
+        }
+        return getPriority() < other.getPriority() ? 1 : -1;
+    }
+
+    @Priority
+    protected int getPriority() {
+        return DEFAULT_PRIORITY;
+    }
+
+    protected boolean useQueue() {
+        return true;
+    }
+
+    @NonNull
+    @Override
+    public Lifecycle getLifecycle() {
+        return lifecycleRegistry;
+    }
+
+    @Override
+    public void onStateChanged(@NonNull LifecycleOwner source, @NonNull Lifecycle.Event event) {
+        if (event == Lifecycle.Event.ON_DESTROY) {
+            if (ownerActivityLifecycle != null) {
+                ownerActivityLifecycle.removeObserver(this);
+            }
+            dismiss();
+            lifecycleRegistry.handleLifecycleEvent(Lifecycle.Event.ON_DESTROY);
+            return;
+        }
+        if (!isShowing()) {
+            return;
+        }
+        if (event == Lifecycle.Event.ON_RESUME) {
+            lifecycleRegistry.handleLifecycleEvent(Lifecycle.Event.ON_RESUME);
+        } else if (event == Lifecycle.Event.ON_PAUSE) {
+            lifecycleRegistry.handleLifecycleEvent(Lifecycle.Event.ON_PAUSE);
+        } else if (event == Lifecycle.Event.ON_START) {
+            lifecycleRegistry.handleLifecycleEvent(Lifecycle.Event.ON_START);
+        } else if (event == Lifecycle.Event.ON_STOP) {
+            lifecycleRegistry.handleLifecycleEvent(Lifecycle.Event.ON_STOP);
+        }
+    }
+
+    @Target(ElementType.TYPE)
+    @Retention(RetentionPolicy.RUNTIME)
+    public @interface FullScreen {
+        boolean width() default true;
+
+        boolean height() default true;
+
+        int gravity() default Gravity.CENTER;
+    }
+
+}

+ 1 - 1
app/src/main/java/com/datarecovery/master/dialog/ChoosePaymentWayDialog.java

@@ -12,7 +12,7 @@ import androidx.lifecycle.LiveData;
 import androidx.lifecycle.MutableLiveData;
 
 
-import com.atmob.app.lib.base.BaseDialog;
+import com.datarecovery.master.dialog.BaseDialog;
 import com.datarecovery.master.R;
 import com.datarecovery.master.data.api.bean.PayOptionsBean;
 import com.datarecovery.master.databinding.DialogChoosePaymentWayBinding;

+ 2 - 2
app/src/main/java/com/datarecovery/master/dialog/CommonLoadingDialog.java

@@ -1,6 +1,6 @@
 package com.datarecovery.master.dialog;
 
-import static com.atmob.app.lib.base.BaseDialog.*;
+import static com.datarecovery.master.dialog.BaseDialog.*;
 
 import android.content.Context;
 import android.view.View;
@@ -8,7 +8,7 @@ import android.view.View;
 import androidx.annotation.NonNull;
 import androidx.annotation.StringRes;
 
-import com.atmob.app.lib.base.BaseDialog;
+import com.datarecovery.master.dialog.BaseDialog;
 import com.datarecovery.master.R;
 import com.datarecovery.master.databinding.DialogCommonLoadingBinding;
 

+ 1 - 1
app/src/main/java/com/datarecovery/master/dialog/CommonSureDialog.java

@@ -6,7 +6,7 @@ import android.view.View;
 import androidx.annotation.NonNull;
 import androidx.annotation.StringRes;
 
-import com.atmob.app.lib.base.BaseDialog;
+import com.datarecovery.master.dialog.BaseDialog;
 import com.datarecovery.master.R;
 import com.datarecovery.master.databinding.DialogCommonSureBinding;
 

+ 76 - 0
app/src/main/java/com/datarecovery/master/dialog/DialogQueue.java

@@ -0,0 +1,76 @@
+package com.datarecovery.master.dialog;
+
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.PriorityQueue;
+import java.util.Queue;
+
+//todo 优化
+public class DialogQueue {
+
+    private static final String TAG = DialogQueue.class.getSimpleName();
+
+    private static final Queue<BaseDialog<?>> dialogQueue = new PriorityQueue<>();
+
+    private static final List<OnQueueStatusChangeCallback> callbacks = new ArrayList<>();
+
+    private DialogQueue() {
+
+    }
+
+    public static void requestShow(BaseDialog<?> dialog) {
+        dialogQueue.add(dialog);
+        notifyDialogAdd();
+        if (dialogQueue.size() == 1) {
+            dialog.showInternal();
+        }
+    }
+
+    public static void nextDialog() {
+        BaseDialog<?> currentDialog = dialogQueue.poll();
+        BaseDialog<?> nextDialog = dialogQueue.peek();
+        if (nextDialog != null) {
+            nextDialog.showInternal();
+        } else {
+            notifyQueueEmpty();
+        }
+    }
+
+    public static boolean hasDialogShowing() {
+        return !dialogQueue.isEmpty();
+    }
+
+    private static void notifyDialogAdd() {
+        for (OnQueueStatusChangeCallback callback : callbacks) {
+            if (callback != null) {
+                callback.onDialogAdded();
+            }
+        }
+    }
+
+    private static void notifyQueueEmpty() {
+        for (OnQueueStatusChangeCallback callback : callbacks) {
+            if (callback != null) {
+                callback.onQueueEmpty();
+            }
+        }
+    }
+
+    public static void registerQueueStatusCallback(OnQueueStatusChangeCallback callback) {
+        if (callback == null) {
+            return;
+        }
+        callbacks.add(callback);
+    }
+
+    public static void unregisterQueueStatusCallback(OnQueueStatusChangeCallback callback) {
+        callbacks.remove(callback);
+    }
+
+    public interface OnQueueStatusChangeCallback {
+        void onQueueEmpty();
+
+        void onDialogAdded();
+    }
+}

+ 1 - 5
app/src/main/java/com/datarecovery/master/dialog/MemberRetentionDialog.java

@@ -4,13 +4,9 @@ import android.content.Context;
 
 import androidx.annotation.NonNull;
 
-import com.atmob.app.lib.base.BaseDialog;
+import com.datarecovery.master.dialog.BaseDialog;
 import com.datarecovery.master.R;
-import com.datarecovery.master.data.consts.EventId;
 import com.datarecovery.master.databinding.DialogMemberRetentionBinding;
-import com.datarecovery.master.handler.EventHelper;
-import com.datarecovery.master.utils.Maps;
-import com.datarecovery.master.utils.ReportUtil;
 
 @BaseDialog.FullScreen
 public class MemberRetentionDialog extends BaseDialog<DialogMemberRetentionBinding> {

+ 1 - 1
app/src/main/java/com/datarecovery/master/dialog/PermissionDialog.java

@@ -5,7 +5,7 @@ import android.content.Context;
 import androidx.annotation.NonNull;
 import androidx.annotation.StringRes;
 
-import com.atmob.app.lib.base.BaseDialog;
+import com.datarecovery.master.dialog.BaseDialog;
 import com.datarecovery.master.R;
 import com.datarecovery.master.databinding.DialogCommonSureBinding;
 

+ 1 - 1
app/src/main/java/com/datarecovery/master/dialog/ScanFileDialog.java

@@ -5,7 +5,7 @@ import android.content.Context;
 import androidx.annotation.NonNull;
 import androidx.lifecycle.LiveData;
 
-import com.atmob.app.lib.base.BaseDialog;
+import com.datarecovery.master.dialog.BaseDialog;
 import com.datarecovery.master.R;
 import com.datarecovery.master.databinding.DialogScanFileBinding;
 

+ 1 - 1
app/src/main/java/com/datarecovery/master/dialog/ScanProgressDialog.java

@@ -9,7 +9,7 @@ import android.view.animation.DecelerateInterpolator;
 import androidx.annotation.NonNull;
 import androidx.lifecycle.LiveData;
 
-import com.atmob.app.lib.base.BaseDialog;
+import com.datarecovery.master.dialog.BaseDialog;
 import com.datarecovery.master.R;
 import com.datarecovery.master.databinding.DialogScanProgressBinding;
 

+ 35 - 0
app/src/main/java/com/datarecovery/master/dialog/UnlockFunctionDialog.java

@@ -0,0 +1,35 @@
+package com.datarecovery.master.dialog;
+
+import android.content.Context;
+
+import androidx.annotation.NonNull;
+
+import com.datarecovery.master.R;
+import com.datarecovery.master.databinding.DialogUnlockFunctionBinding;
+
+@BaseDialog.FullScreen
+public class UnlockFunctionDialog extends BaseDialog<DialogUnlockFunctionBinding> {
+
+    private ActionHandler actionHandler;
+
+    public UnlockFunctionDialog(@NonNull Context context) {
+        super(context, R.style.Theme_Common_Dialog);
+        setCancelable(false);
+        binding.setOnUnlockClickListener(v -> {
+            if (actionHandler != null) {
+                actionHandler.onUnlock();
+            }
+            dismiss();
+        });
+        binding.setOnCloseClickListener(v -> dismiss());
+    }
+
+    public UnlockFunctionDialog setActionHandler(ActionHandler actionHandler) {
+        this.actionHandler = actionHandler;
+        return this;
+    }
+
+    public interface ActionHandler {
+        void onUnlock();
+    }
+}

+ 1 - 1
app/src/main/java/com/datarecovery/master/dialog/WechatPayQrCodeDialog.java

@@ -5,7 +5,7 @@ import android.content.Context;
 import androidx.annotation.NonNull;
 
 
-import com.atmob.app.lib.base.BaseDialog;
+import com.datarecovery.master.dialog.BaseDialog;
 import com.datarecovery.master.R;
 import com.datarecovery.master.data.consts.Constants;
 import com.datarecovery.master.databinding.DialogWechatPayQrCodeBinding;

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

@@ -12,12 +12,12 @@ import com.atmob.app.lib.base.BaseActivity;
 import com.atmob.central.AtmobCentral;
 import com.atmob.sdk.gravity_engine.GravityEngine;
 import com.atmob.user.AtmobUser;
+import com.datarecovery.master.data.consts.AdFuncId;
 import com.datarecovery.master.data.consts.Constants;
-import com.datarecovery.master.data.consts.EventId;
 import com.datarecovery.master.data.repositories.ConfigRepository;
 import com.datarecovery.master.databinding.ActivityAboutBinding;
-import com.datarecovery.master.handler.EventHelper;
 import com.datarecovery.master.module.browser.BrowserActivity;
+import com.datarecovery.master.sdk.ad.AtmobAdHelper;
 import com.datarecovery.master.utils.SystemUtil;
 import com.datarecovery.master.utils.ToastUtil;
 import com.gyf.immersionbar.ImmersionBar;
@@ -35,6 +35,9 @@ import dagger.hilt.android.AndroidEntryPoint;
 public class AboutActivity extends BaseActivity<ActivityAboutBinding> {
 
 
+    private int times = 0;
+    private Disposable subscribe;
+
     public static void start(Context context) {
         Intent intent = new Intent(context, AboutActivity.class);
         if (!(context instanceof Activity)) {
@@ -43,9 +46,6 @@ public class AboutActivity extends BaseActivity<ActivityAboutBinding> {
         context.startActivity(intent);
     }
 
-    private int times = 0;
-    private Disposable subscribe;
-
     @Override
     protected void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
@@ -66,14 +66,8 @@ public class AboutActivity extends BaseActivity<ActivityAboutBinding> {
         binding.tvVersionCode.setText(SystemUtil.getVersionName(getBaseContext()));
         binding.toolBar.setNavigationOnClickListener(v -> onBackPressed());
         addTopStatusBarHeight(binding.toolBar);
-        binding.setUserAgreementClick(v -> {
-            EventHelper.report(EventId.hf1001103);
-            BrowserActivity.start(this, Constants.USER_AGREEMENT);
-        });
-        binding.setPrivacyAgreementClick(v -> {
-            EventHelper.report(EventId.hf1001104);
-            BrowserActivity.start(this, Constants.PRIVACY_POLICY);
-        });
+        binding.setUserAgreementClick(v -> BrowserActivity.start(this, Constants.USER_AGREEMENT));
+        binding.setPrivacyAgreementClick(v -> BrowserActivity.start(this, Constants.PRIVACY_POLICY));
         binding.vTrial.setOnClickListener(v -> {
             if (times == 0) {
                 if (subscribe != null && !subscribe.isDisposed()) {
@@ -90,6 +84,9 @@ public class AboutActivity extends BaseActivity<ActivityAboutBinding> {
         });
         binding.setInformationListClick(v -> BrowserActivity.start(this, Constants.USER_INFO_LIST));
         binding.setSdkSharingListClick(v -> BrowserActivity.start(this, Constants.THREE_SDK_LIST));
+        binding.setKipProtectionClick(v -> BrowserActivity.start(this, Constants.KID_PROTECTION));
+
+        AtmobAdHelper.showNative(AdFuncId.NATIVE_MINE, binding.adContainer);
     }
 
     @Override

+ 35 - 53
app/src/main/java/com/datarecovery/master/module/audiorecover/AudioRecoverActivity.java

@@ -15,26 +15,25 @@ import android.widget.TextView;
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
 import androidx.recyclerview.widget.LinearLayoutManager;
-import androidx.recyclerview.widget.RecyclerView;
 
 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.data.consts.AdFuncId;
+import com.datarecovery.master.data.consts.Constants;
 import com.datarecovery.master.databinding.ActivityAudioRecoverBinding;
 import com.datarecovery.master.databinding.PopupAudioRecoverFilterBinding;
 import com.datarecovery.master.dialog.CommonLoadingDialog;
 import com.datarecovery.master.dialog.CommonSureDialog;
 import com.datarecovery.master.dialog.ScanFileDialog;
-import com.datarecovery.master.dialog.ScanProgressDialog;
-import com.datarecovery.master.handler.EventHelper;
-import com.datarecovery.master.module.member.MemberType;
+import com.datarecovery.master.dialog.UnlockFunctionDialog;
 import com.datarecovery.master.module.preview.PreviewActivity;
+import com.datarecovery.master.sdk.ad.AtmobAdHelper;
+import com.datarecovery.master.sdk.ad.RewardVideoListenerAdapter;
 import com.datarecovery.master.utils.BoxingUtil;
+import com.datarecovery.master.utils.CounterUtil;
 import com.datarecovery.master.utils.FilePermissionHelper;
 import com.datarecovery.master.utils.FilesSearch;
-import com.datarecovery.master.utils.Maps;
-import com.datarecovery.master.utils.ReportUtil;
 import com.gyf.immersionbar.ImmersionBar;
 
 import dagger.hilt.android.AndroidEntryPoint;
@@ -43,7 +42,6 @@ import dagger.hilt.android.AndroidEntryPoint;
 @AndroidEntryPoint
 public class AudioRecoverActivity extends BaseActivity<ActivityAudioRecoverBinding> {
 
-    private static final String IS_TRIAL = "is_trial";
     private AudioRecoverViewModel audioRecoverViewModel;
 
     private CommonLoadingDialog loadingDialog;
@@ -57,14 +55,14 @@ public class AudioRecoverActivity extends BaseActivity<ActivityAudioRecoverBindi
     private int popupHeight;
     private CommonSureDialog showTrialExportFailDialog;
     private CommonSureDialog showTrialFinishDialog;
+    private UnlockFunctionDialog unlockFunctionDialog;
 
 
-    public static void start(Context context, boolean isTrial) {
+    public static void start(Context context) {
         Intent intent = new Intent(context, AudioRecoverActivity.class);
         if (!(context instanceof Activity)) {
             intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
         }
-        intent.putExtra(IS_TRIAL, isTrial);
         context.startActivity(intent);
     }
 
@@ -72,21 +70,13 @@ public class AudioRecoverActivity extends BaseActivity<ActivityAudioRecoverBindi
     @Override
     protected void onCreate(@Nullable Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
-        initData();
         initView();
         initObserver();
         initPermission();
     }
 
-    private void initData() {
-        Intent intent = getIntent();
-        if (intent != null) {
-            audioRecoverViewModel.setIsTrial(intent.getBooleanExtra(IS_TRIAL, false));
-        }
-    }
-
     private void initPermission() {
-        new FilePermissionHelper().requestDataFilePermission(this, MemberType.APP_AUDIO_RECOVER, audioRecoverViewModel.isTrial(), new FilePermissionHelper.NextStepCallback() {
+        new FilePermissionHelper().requestDataFilePermission(this, new FilePermissionHelper.NextStepCallback() {
             @Override
             public void onNextStep() {
                 audioRecoverViewModel.startAudioScanning();
@@ -117,30 +107,9 @@ public class AudioRecoverActivity extends BaseActivity<ActivityAudioRecoverBindi
 
             @Override
             public void onItemClick(FilesSearch.DocumentFile file) {
-                PreviewActivity.startDocumentPreView(AudioRecoverActivity.this, PreviewActivity.TYPE_AUDIO, file, audioRecoverViewModel.isTrial());
+                PreviewActivity.startDocumentPreView(AudioRecoverActivity.this, PreviewActivity.TYPE_AUDIO, file);
             }
         });
-        if (audioRecoverViewModel.isTrial()) {
-            binding.ryAudioRecover.addOnScrollListener(new RecyclerView.OnScrollListener() {
-                @Override
-                public void onScrolled(@NonNull RecyclerView recyclerView, int dx, int dy) {
-                    if (audioRecoverViewModel.isTrial()) {
-                        audioRecoverViewModel.scrollPosition(linearLayoutManager.findFirstCompletelyVisibleItemPosition(), linearLayoutManager.findLastCompletelyVisibleItemPosition(), linearLayoutManager.getItemCount());
-                    }
-                }
-            });
-            binding.ryAudioRecover.setOnFlingListener(new RecyclerView.OnFlingListener() {
-                @Override
-                public boolean onFling(int velocityX, int velocityY) {
-                    int firstCompletelyVisibleItemPosition = linearLayoutManager.findFirstCompletelyVisibleItemPosition();
-                    if ((firstCompletelyVisibleItemPosition == -1 && velocityY > 0) || (linearLayoutManager.findFirstCompletelyVisibleItemPosition() == 0 && linearLayoutManager.findLastCompletelyVisibleItemPosition() == linearLayoutManager.getItemCount() - 1 && velocityY > 0)) {
-                        showTrialFinishDialog();
-                        return true;
-                    }
-                    return false;
-                }
-            });
-        }
     }
 
     @SuppressLint("NotifyDataSetChanged")
@@ -153,6 +122,26 @@ public class AudioRecoverActivity extends BaseActivity<ActivityAudioRecoverBindi
         audioRecoverViewModel.getDetectedVideoList().observe(this, list -> audioItemAdapter.submit(list));
         audioRecoverViewModel.getShowScanDialogEvent().observe(this, this::showScanProgressDialog);
         audioRecoverViewModel.getShowFilterPopup().observe(this, o -> showFilterPopup());
+        audioRecoverViewModel.getShowUnlockEvent().observe(this, o -> showUnlockDialog());
+    }
+
+    private void showUnlockDialog() {
+        if (unlockFunctionDialog == null) {
+            unlockFunctionDialog = new UnlockFunctionDialog(this)
+                    .setActionHandler(new UnlockFunctionDialog.ActionHandler() {
+                        @Override
+                        public void onUnlock() {
+                            AtmobAdHelper.showVideo(AdFuncId.REWARD_RECOVER, new RewardVideoListenerAdapter() {
+                                @Override
+                                public void onRewarded(@androidx.annotation.NonNull String token) {
+                                    super.onRewarded(token);
+                                    audioRecoverViewModel.doExport();
+                                }
+                            });
+                        }
+                    });
+        }
+        unlockFunctionDialog.show();
     }
 
     private void showTrialFinishDialog() {
@@ -160,14 +149,9 @@ public class AudioRecoverActivity extends BaseActivity<ActivityAudioRecoverBindi
             showTrialFinishDialog = new CommonSureDialog(this);
             showTrialFinishDialog.setDialogTitle(getString(R.string.scanning_progress, 7))
                     .setDialogContent(getString(R.string.trial_scanning_finish_content, 7)).setSureText(R.string.dialog_trial_recover);
-            showTrialFinishDialog.setOnDialogClickListener(() -> {
-                audioRecoverViewModel.onTrialRecoverClick();
-                EventHelper.report(EventId.hf1001121, Maps.asMap(EventId.EVENT_ID, ReportUtil.getReportId(MemberType.APP_AUDIO_RECOVER)));
-            });
-            showTrialFinishDialog.setOnDismissListener(dialog -> EventHelper.report(EventId.hf1001122, Maps.asMap(EventId.EVENT_ID, ReportUtil.getReportId(MemberType.APP_AUDIO_RECOVER))));
+            showTrialFinishDialog.setOnDialogClickListener(() -> audioRecoverViewModel.onTrialRecoverClick());
         }
         if (!showTrialFinishDialog.isShowing()) {
-            EventHelper.report(EventId.hf1001118, Maps.asMap(EventId.EVENT_ID, ReportUtil.getReportId(MemberType.APP_AUDIO_RECOVER)));
             showTrialFinishDialog.show();
         }
     }
@@ -177,16 +161,11 @@ public class AudioRecoverActivity extends BaseActivity<ActivityAudioRecoverBindi
             showTrialExportFailDialog = new CommonSureDialog(this);
             showTrialExportFailDialog.setDialogTitle(R.string.trial_export_fail_title)
                     .setDialogContent(R.string.trial_export_fail_content).setSureText(R.string.dialog_trial_recover);
-            showTrialExportFailDialog.setOnDialogClickListener(() -> {
-                audioRecoverViewModel.onTrialRecoverClick();
-                EventHelper.report(EventId.hf1001123, Maps.asMap(EventId.EVENT_ID, ReportUtil.getReportId(MemberType.APP_AUDIO_RECOVER)));
-            });
-            showTrialExportFailDialog.setOnDismissListener(dialog -> EventHelper.report(EventId.hf1001124, Maps.asMap(EventId.EVENT_ID, ReportUtil.getReportId(MemberType.APP_AUDIO_RECOVER))));
+            showTrialExportFailDialog.setOnDialogClickListener(() -> audioRecoverViewModel.onTrialRecoverClick());
 
         }
         if (!showTrialExportFailDialog.isShowing()) {
             showTrialExportFailDialog.show();
-            EventHelper.report(EventId.hf1001120, Maps.asMap(EventId.EVENT_ID, ReportUtil.getReportId(MemberType.APP_AUDIO_RECOVER)));
         }
     }
 
@@ -247,6 +226,9 @@ public class AudioRecoverActivity extends BaseActivity<ActivityAudioRecoverBindi
 
     @Override
     public void onBackPressed() {
+        if (!CounterUtil.checkAndIncrementByDay(Constants.KEY_LIST_BACK_AD_COUNTER, 2)) {
+            AtmobAdHelper.showInterstitial(AdFuncId.INTERSTITIAL_RESULT_BACK, null);
+        }
         showBackDialog();
     }
 

+ 18 - 54
app/src/main/java/com/datarecovery/master/module/audiorecover/AudioRecoverViewModel.java

@@ -9,18 +9,16 @@ 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.consts.AdFuncId;
 import com.datarecovery.master.data.repositories.DeviceFuncRepository;
-import com.datarecovery.master.handler.EventHelper;
 import com.datarecovery.master.module.member.MemberActivity;
 import com.datarecovery.master.module.member.MemberType;
+import com.datarecovery.master.sdk.ad.AtmobAdHelper;
 import com.datarecovery.master.sdk.bugly.BuglyHelper;
 import com.datarecovery.master.utils.BoxingUtil;
 import com.datarecovery.master.utils.FileUtil;
 import com.datarecovery.master.utils.FilesSearch;
-import com.datarecovery.master.utils.Maps;
 import com.datarecovery.master.utils.MediaStoreHelper;
-import com.datarecovery.master.utils.ReportUtil;
 import com.datarecovery.master.utils.ToastUtil;
 
 import org.reactivestreams.Subscriber;
@@ -66,9 +64,7 @@ public class AudioRecoverViewModel extends BaseViewModel {
     private final MutableLiveData<Boolean> isDateFilterArrowUp = new MutableLiveData<>(false);
     private final MutableLiveData<Boolean> isSizeSortArrowUp = new MutableLiveData<>(false);
     private final MutableLiveData<Integer> dataFilterCondition = new MutableLiveData<>();
-
-    private Disposable scanDisposable;
-
+    private final SingleLiveEvent<?> showUnlockEvent = new SingleLiveEvent<>();
     private final int[] dateFilterArray = new int[]{
             R.string.all,
             R.string.within_a_week,
@@ -76,11 +72,7 @@ public class AudioRecoverViewModel extends BaseViewModel {
             R.string.a_month_ago,
             R.string.a_year_ago
     };
-    private boolean isTrial;
-
-    public LiveData<?> getNotifyAudioData() {
-        return notifyAudioData;
-    }
+    private Disposable scanDisposable;
 
     @Inject
     public AudioRecoverViewModel(DeviceFuncRepository deviceFuncRepository) {
@@ -91,8 +83,10 @@ public class AudioRecoverViewModel extends BaseViewModel {
             }
             return ContextUtil.getContext().getString(R.string.export_count, list.size());
         });
-        EventHelper.report(EventId.hf1000512);
-        EventHelper.timeEvent(EventId.hf1000527);
+    }
+
+    public LiveData<?> getNotifyAudioData() {
+        return notifyAudioData;
     }
 
     public LiveData<?> getScrollTop() {
@@ -115,10 +109,6 @@ public class AudioRecoverViewModel extends BaseViewModel {
         return detectedLastFileName;
     }
 
-    public boolean isTrial() {
-        return isTrial;
-    }
-
     public LiveData<Integer> getDataFilterCondition() {
         return dataFilterCondition;
     }
@@ -165,12 +155,16 @@ public class AudioRecoverViewModel extends BaseViewModel {
         return showScanDialogEvent;
     }
 
+    public LiveData<?> getShowUnlockEvent() {
+        return showUnlockEvent;
+    }
+
     public void startAudioScanning() {
         if (scanDisposable != null && !scanDisposable.isDisposed()) {
             return;
         }
         FilesSearch.search(ContextUtil.getContext(), FilesSearch.DocumentFile.AUDIO)
-                .take(isTrial ? SCANNING_IS_TRIAL_COUNTDOWN : SCANNING_COUNTDOWN, TimeUnit.MILLISECONDS)
+                .take(SCANNING_COUNTDOWN, TimeUnit.MILLISECONDS)
                 .observeOn(AndroidSchedulers.mainThread())
                 .subscribe(new Subscriber<List<FilesSearch.DocumentFile>>() {
                     @Override
@@ -205,29 +199,14 @@ public class AudioRecoverViewModel extends BaseViewModel {
 
                     @Override
                     public void onComplete() {
-                        setFreeExport();
-                        if (isTrial) {
-                            showTrialFinishDialog.call();
-                        }
                         showScanDialogEvent.setValue(false);
                     }
                 });
     }
 
-    private void setFreeExport() {
-        if (isTrial) {
-            showTrialView.setValue(true);
-            List<FilesSearch.DocumentFile> list = getList(detectedVideoList);
-            if (!list.isEmpty()) {
-                list.get(0).setTrial(true);
-            }
-        }
-    }
-
     public void cancelScan() {
         if (scanDisposable != null && !scanDisposable.isDisposed()) scanDisposable.dispose();
         showScanDialogEvent.setValue(false);
-        setFreeExport();
     }
 
     private List<FilesSearch.DocumentFile> getList(LiveData<List<FilesSearch.DocumentFile>> liveData) {
@@ -255,23 +234,14 @@ public class AudioRecoverViewModel extends BaseViewModel {
     }
 
     public void onExportClick() {
+        showUnlockEvent.call();
+    }
+
+    public void doExport() {
         List<FilesSearch.DocumentFile> list = selectedList.getValue();
         if (list == null || list.isEmpty()) {
             return;
         }
-        if (isTrial) {
-            for (FilesSearch.DocumentFile file : list) {
-                if (!file.isTrial()) {
-                    showTrialExportFailDialog.call();
-                    return;
-                }
-            }
-        } else {
-            if (!deviceFuncRepository.isHaveAuth(MemberType.APP_AUDIO_RECOVER)) {
-                return;
-            }
-        }
-
         Single.just(list.size())
                 .map(oldSize -> {
                     Iterator<FilesSearch.DocumentFile> iterator = list.iterator();
@@ -310,6 +280,7 @@ public class AudioRecoverViewModel extends BaseViewModel {
                         selectedList.setValue(list);
                         checkAll.setValue(false);
                         ToastUtil.show(R.string.export_success, ToastUtil.LENGTH_SHORT);
+                        AtmobAdHelper.showInterstitial(AdFuncId.INTERSTITIAL_RECOVER_SUCCESS, null);
                     }
 
                     @Override
@@ -440,11 +411,6 @@ public class AudioRecoverViewModel extends BaseViewModel {
     @Override
     protected void onCleared() {
         super.onCleared();
-        EventHelper.report(EventId.hf1000527);
-    }
-
-    public void setIsTrial(boolean isTrial) {
-        this.isTrial = isTrial;
     }
 
     public void onTrialRecoverClick() {
@@ -452,7 +418,6 @@ public class AudioRecoverViewModel extends BaseViewModel {
     }
 
     public void onViewTrialRecoverClick() {
-        EventHelper.report(EventId.hf1001117, Maps.asMap(EventId.EVENT_ID, ReportUtil.getReportId(MemberType.APP_AUDIO_RECOVER)));
         MemberActivity.start(ActivityUtil.getTopActivity(), MemberType.APP_AUDIO_RECOVER);
     }
 
@@ -462,7 +427,6 @@ public class AudioRecoverViewModel extends BaseViewModel {
         }
         if (lastCompletelyItemPosition == itemCount - 1 && firstCompletePosition > 0 && !BoxingUtil.boxing(showScanDialogEvent.getValue())) {
             showTrialFinishDialog.call();
-            EventHelper.report(EventId.hf1001119, Maps.asMap(EventId.EVENT_ID, ReportUtil.getReportId(MemberType.APP_AUDIO_RECOVER)));
         }
     }
 }

+ 45 - 0
app/src/main/java/com/datarecovery/master/module/backup_helper/BackupHelperActivity.java

@@ -0,0 +1,45 @@
+package com.datarecovery.master.module.backup_helper;
+
+
+import android.app.Activity;
+import android.content.Context;
+import android.content.Intent;
+import android.os.Bundle;
+
+import androidx.annotation.Nullable;
+import androidx.lifecycle.MutableLiveData;
+
+import com.atmob.app.lib.base.BaseActivity;
+import com.datarecovery.master.databinding.ActivityBackupHelperBinding;
+
+public class BackupHelperActivity extends BaseActivity<ActivityBackupHelperBinding> {
+
+    private final MutableLiveData<Boolean> isWechatSelected = new MutableLiveData<>(true);
+
+    public static void start(Context context) {
+        Intent intent = new Intent(context, BackupHelperActivity.class);
+        if (!(context instanceof Activity)) {
+            intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+        }
+        context.startActivity(intent);
+    }
+
+    @Override
+    protected boolean shouldImmersion() {
+        return true;
+    }
+
+    @Override
+    protected void onCreate(@Nullable Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        binding.setIsWechatSelected(isWechatSelected);
+        initView();
+    }
+
+    private void initView() {
+        addTopStatusBarHeight(binding.topSpace);
+        binding.setOnQQClickListener(v -> this.isWechatSelected.setValue(false));
+        binding.setOnWechatClickListener(v -> this.isWechatSelected.setValue(true));
+        binding.setOnBtnClickListener(v -> finish());
+    }
+}

+ 1 - 7
app/src/main/java/com/datarecovery/master/module/example/ExampleFragment.java

@@ -8,10 +8,7 @@ import androidx.annotation.Nullable;
 import androidx.recyclerview.widget.LinearLayoutManager;
 
 import com.atmob.app.lib.base.BaseFragment;
-import com.datarecovery.master.data.api.bean.ExampleBean;
-import com.datarecovery.master.data.consts.EventId;
 import com.datarecovery.master.databinding.FragmentExampleBinding;
-import com.datarecovery.master.handler.EventHelper;
 import com.datarecovery.master.module.browser.BrowserActivity;
 import com.gyf.immersionbar.ImmersionBar;
 
@@ -36,10 +33,7 @@ public class ExampleFragment extends BaseFragment<FragmentExampleBinding> {
         exampleAdapter = new ExampleAdapter(this);
         binding.ryExample.setLayoutManager(new LinearLayoutManager(getContext()));
         binding.ryExample.setAdapter(exampleAdapter);
-        exampleAdapter.setOnItemClickListener(itemBean -> {
-            EventHelper.report(EventId.hf1000801);
-            BrowserActivity.start(getActivity(), itemBean.getLink());
-        });
+        exampleAdapter.setOnItemClickListener(itemBean -> BrowserActivity.start(getActivity(), itemBean.getLink()));
     }
 
     private void initObserver() {

+ 0 - 4
app/src/main/java/com/datarecovery/master/module/feedback/UserFeedbackViewModel.java

@@ -6,9 +6,6 @@ import androidx.lifecycle.MutableLiveData;
 import com.atmob.app.lib.base.BaseViewModel;
 import com.atmob.app.lib.livedata.SingleLiveEvent;
 import com.datarecovery.master.R;
-import com.datarecovery.master.data.consts.EventId;
-import com.datarecovery.master.handler.EventHelper;
-import com.datarecovery.master.utils.Maps;
 import com.datarecovery.master.utils.ToastUtil;
 
 import javax.inject.Inject;
@@ -44,7 +41,6 @@ public class UserFeedbackViewModel extends BaseViewModel {
             ToastUtil.show(R.string.feedback_hint, ToastUtil.LENGTH_SHORT);
             return;
         }
-        EventHelper.report(EventId.hf1001106, Maps.asMap("hf11029", etContent.getValue()));
         ToastUtil.show(R.string.feed_back_success, ToastUtil.LENGTH_SHORT);
         finishEvent.call();
     }

+ 29 - 31
app/src/main/java/com/datarecovery/master/module/filerecover/FileRecoverActivity.java

@@ -12,30 +12,28 @@ import androidx.viewpager2.widget.ViewPager2;
 
 import com.atmob.app.lib.base.BaseActivity;
 import com.datarecovery.master.R;
-import com.datarecovery.master.data.consts.EventId;
+import com.datarecovery.master.data.consts.AdFuncId;
+import com.datarecovery.master.data.consts.Constants;
 import com.datarecovery.master.databinding.ActivityFileRecoverBinding;
 import com.datarecovery.master.databinding.ItemTabFileRecoverBinding;
 import com.datarecovery.master.dialog.CommonLoadingDialog;
 import com.datarecovery.master.dialog.CommonSureDialog;
 import com.datarecovery.master.dialog.ScanFileDialog;
-import com.datarecovery.master.dialog.ScanProgressDialog;
-import com.datarecovery.master.handler.EventHelper;
-import com.datarecovery.master.module.member.MemberType;
+import com.datarecovery.master.dialog.UnlockFunctionDialog;
+import com.datarecovery.master.sdk.ad.AtmobAdHelper;
+import com.datarecovery.master.sdk.ad.RewardVideoListenerAdapter;
 import com.datarecovery.master.utils.BoxingUtil;
+import com.datarecovery.master.utils.CounterUtil;
 import com.datarecovery.master.utils.FilePermissionHelper;
-import com.datarecovery.master.utils.Maps;
-import com.datarecovery.master.utils.ReportUtil;
 import com.google.android.material.tabs.TabLayout;
 import com.google.android.material.tabs.TabLayoutMediator;
 
-
 import dagger.hilt.android.AndroidEntryPoint;
 
 
 @AndroidEntryPoint
 public class FileRecoverActivity extends BaseActivity<ActivityFileRecoverBinding> {
 
-    private static final String IS_TRIAL = "is_trial";
     private FileRecoverViewModel fileRecoverViewModel;
 
     private FileRecoverPageAdapter fileRecoverPageAdapter;
@@ -47,34 +45,26 @@ public class FileRecoverActivity extends BaseActivity<ActivityFileRecoverBinding
     private ViewPager2.OnPageChangeCallback onPageChangeCallback;
     private CommonSureDialog showTrialExportFailDialog;
     private CommonSureDialog showTrialFinishDialog;
+    private UnlockFunctionDialog unlockFunctionDialog;
 
-    public static void start(Context context, boolean isTrial) {
+    public static void start(Context context) {
         Intent intent = new Intent(context, FileRecoverActivity.class);
         if (!(context instanceof Activity)) {
             intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
         }
-        intent.putExtra(IS_TRIAL, isTrial);
         context.startActivity(intent);
     }
 
     @Override
     protected void onCreate(@Nullable Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
-        initData();
         initView();
         initObserver();
         initPermission();
     }
 
-    private void initData() {
-        Intent intent = getIntent();
-        if (intent != null) {
-            fileRecoverViewModel.setIsTrial(intent.getBooleanExtra(IS_TRIAL, false));
-        }
-    }
-
     private void initPermission() {
-        new FilePermissionHelper().requestDataFilePermission(this, MemberType.APP_FILE_RECOVER, fileRecoverViewModel.isTrial(), new FilePermissionHelper.NextStepCallback() {
+        new FilePermissionHelper().requestDataFilePermission(this, new FilePermissionHelper.NextStepCallback() {
             @Override
             public void onNextStep() {
                 fileRecoverViewModel.startFileScanning();
@@ -92,6 +82,21 @@ public class FileRecoverActivity extends BaseActivity<ActivityFileRecoverBinding
         fileRecoverViewModel.getShowTrialExportFailDialog().observe(this, o -> showTrialExportFailDialog());
         fileRecoverViewModel.getShowLoadingEvent().observe(this, this::showLoadingDialog);
         fileRecoverViewModel.getShowScanDialogEvent().observe(this, this::showScanProgressDialog);
+        fileRecoverViewModel.getShowUnlockEvent().observe(this, this::showUnlockDialog);
+    }
+
+    private void showUnlockDialog(Object o) {
+        if (unlockFunctionDialog == null) {
+            unlockFunctionDialog = new UnlockFunctionDialog(this)
+                    .setActionHandler(() -> AtmobAdHelper.showVideo(AdFuncId.REWARD_RECOVER, new RewardVideoListenerAdapter() {
+                        @Override
+                        public void onRewarded(@androidx.annotation.NonNull String token) {
+                            super.onRewarded(token);
+                            fileRecoverViewModel.doExport();
+                        }
+                    }));
+        }
+        unlockFunctionDialog.show();
     }
 
     private void initView() {
@@ -106,15 +111,10 @@ public class FileRecoverActivity extends BaseActivity<ActivityFileRecoverBinding
             showTrialFinishDialog = new CommonSureDialog(this);
             showTrialFinishDialog.setDialogTitle(getString(R.string.scanning_progress, 10))
                     .setDialogContent(getString(R.string.trial_scanning_finish_content, 10)).setSureText(R.string.dialog_trial_recover);
-            showTrialFinishDialog.setOnDialogClickListener(() -> {
-                fileRecoverViewModel.onTrialRecoverClick();
-                EventHelper.report(EventId.hf1001121, Maps.asMap(EventId.EVENT_ID, ReportUtil.getReportId(MemberType.APP_FILE_RECOVER)));
-            });
-            showTrialFinishDialog.setOnDismissListener(dialog -> EventHelper.report(EventId.hf1001122, Maps.asMap(EventId.EVENT_ID, ReportUtil.getReportId(MemberType.APP_FILE_RECOVER))));
+            showTrialFinishDialog.setOnDialogClickListener(() -> fileRecoverViewModel.onTrialRecoverClick());
         }
         if (!showTrialFinishDialog.isShowing()) {
             showTrialFinishDialog.show();
-            EventHelper.report(EventId.hf1001118, Maps.asMap(EventId.EVENT_ID, ReportUtil.getReportId(MemberType.APP_FILE_RECOVER)));
         }
     }
 
@@ -123,15 +123,10 @@ public class FileRecoverActivity extends BaseActivity<ActivityFileRecoverBinding
             showTrialExportFailDialog = new CommonSureDialog(this);
             showTrialExportFailDialog.setDialogTitle(R.string.trial_export_fail_title)
                     .setDialogContent(R.string.trial_export_fail_content).setSureText(R.string.dialog_trial_recover);
-            showTrialExportFailDialog.setOnDialogClickListener(() -> {
-                fileRecoverViewModel.onTrialRecoverClick();
-                EventHelper.report(EventId.hf1001123, Maps.asMap(EventId.EVENT_ID, ReportUtil.getReportId(MemberType.APP_FILE_RECOVER)));
-            });
-            showTrialExportFailDialog.setOnDismissListener(dialog -> EventHelper.report(EventId.hf1001124, Maps.asMap(EventId.EVENT_ID, ReportUtil.getReportId(MemberType.APP_FILE_RECOVER))));
+            showTrialExportFailDialog.setOnDialogClickListener(() -> fileRecoverViewModel.onTrialRecoverClick());
         }
         if (!showTrialExportFailDialog.isShowing()) {
             showTrialExportFailDialog.show();
-            EventHelper.report(EventId.hf1001120, Maps.asMap(EventId.EVENT_ID, ReportUtil.getReportId(MemberType.APP_FILE_RECOVER)));
         }
     }
 
@@ -164,6 +159,9 @@ public class FileRecoverActivity extends BaseActivity<ActivityFileRecoverBinding
 
     @Override
     public void onBackPressed() {
+        if (!CounterUtil.checkAndIncrementByDay(Constants.KEY_LIST_BACK_AD_COUNTER, 2)) {
+            AtmobAdHelper.showInterstitial(AdFuncId.INTERSTITIAL_RESULT_BACK, null);
+        }
         showBackDialog();
     }
 

+ 15 - 64
app/src/main/java/com/datarecovery/master/module/filerecover/FileRecoverViewModel.java

@@ -9,19 +9,16 @@ 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.consts.AdFuncId;
 import com.datarecovery.master.data.repositories.DeviceFuncRepository;
-import com.datarecovery.master.handler.EventHelper;
 import com.datarecovery.master.module.member.MemberActivity;
 import com.datarecovery.master.module.member.MemberType;
+import com.datarecovery.master.sdk.ad.AtmobAdHelper;
 import com.datarecovery.master.sdk.bugly.BuglyHelper;
 import com.datarecovery.master.utils.BoxingUtil;
 import com.datarecovery.master.utils.FileUtil;
 import com.datarecovery.master.utils.FilesSearch;
-import com.datarecovery.master.utils.ImageDeepDetector;
-import com.datarecovery.master.utils.Maps;
 import com.datarecovery.master.utils.MediaStoreHelper;
-import com.datarecovery.master.utils.ReportUtil;
 import com.datarecovery.master.utils.ReverseArrayList;
 import com.datarecovery.master.utils.ToastUtil;
 
@@ -75,10 +72,10 @@ public class FileRecoverViewModel extends BaseViewModel {
     private final SingleLiveEvent<?> showTrialExportFailDialog = new SingleLiveEvent<>();
     private final SingleLiveEvent<Boolean> showLoadingEvent = new SingleLiveEvent<>();
     private final SingleLiveEvent<Boolean> showScanDialogEvent = new SingleLiveEvent<>();
+    private final SingleLiveEvent<?> showUnlockEvent = new SingleLiveEvent<>();
     private final DeviceFuncRepository deviceFuncRepository;
     private final LiveData<String> selectedCountTxt;
     private Disposable scanDisposable;
-    private boolean isTrial;
 
     @Inject
     public FileRecoverViewModel(DeviceFuncRepository deviceFuncRepository) {
@@ -90,8 +87,6 @@ public class FileRecoverViewModel extends BaseViewModel {
             return ContextUtil.getContext().getString(R.string.export_count, list.size());
         });
         for (int i = 0; i < tabTitle.length; i++) checkList.add(new MutableLiveData<>(false));
-        EventHelper.report(EventId.hf1000508);
-        EventHelper.timeEvent(EventId.hf1000523);
     }
 
     public LiveData<?> getScrollTop() {
@@ -115,14 +110,14 @@ public class FileRecoverViewModel extends BaseViewModel {
         return detectedLastFileName;
     }
 
-    public boolean isTrial() {
-        return isTrial;
-    }
-
     public LiveData<Integer> getCheckPosition() {
         return checkPosition;
     }
 
+    public void setCheckPosition(int position) {
+        this.checkPosition.setValue(position);
+    }
+
     public int[] getTabTitle() {
         return tabTitle;
     }
@@ -143,7 +138,6 @@ public class FileRecoverViewModel extends BaseViewModel {
         return detectedPDFList;
     }
 
-
     public LiveData<Boolean> getShowLoadingEvent() {
         return showLoadingEvent;
     }
@@ -156,14 +150,12 @@ public class FileRecoverViewModel extends BaseViewModel {
         return selectedCountTxt;
     }
 
-
     public LiveData<Boolean> getShowScanDialogEvent() {
         return showScanDialogEvent;
     }
 
-
-    public void setCheckPosition(int position) {
-        this.checkPosition.setValue(position);
+    public LiveData<?> getShowUnlockEvent() {
+        return showUnlockEvent;
     }
 
     public void startFileScanning() {
@@ -171,7 +163,7 @@ public class FileRecoverViewModel extends BaseViewModel {
             return;
         }
         FilesSearch.search(ContextUtil.getContext(), FilesSearch.DocumentFile.WORD, FilesSearch.DocumentFile.EXCEL, FilesSearch.DocumentFile.PPT, FilesSearch.DocumentFile.PDF)
-                .take(isTrial ? SCANNING_IS_TRIAL_COUNTDOWN : SCANNING_COUNTDOWN, TimeUnit.MILLISECONDS)
+                .take(SCANNING_COUNTDOWN, TimeUnit.MILLISECONDS)
                 .observeOn(AndroidSchedulers.mainThread())
                 .subscribe(new Subscriber<List<FilesSearch.DocumentFile>>() {
                     @Override
@@ -234,8 +226,6 @@ public class FileRecoverViewModel extends BaseViewModel {
 
                     @Override
                     public void onComplete() {
-                        setFreeExport();
-                        if (isTrial) showTrialFinishDialog.call();
                         showScanDialogEvent.setValue(false);
                     }
                 });
@@ -244,25 +234,6 @@ public class FileRecoverViewModel extends BaseViewModel {
     public void cancelScan() {
         if (scanDisposable != null && !scanDisposable.isDisposed()) scanDisposable.dispose();
         showScanDialogEvent.setValue(false);
-        setFreeExport();
-    }
-
-    private void setFreeExport() {
-        if (isTrial) {
-            showTrialView.setValue(true);
-            if (!wordList.isEmpty()) {
-                wordList.get(0).setTrial(true);
-            }
-            if (!excelList.isEmpty()) {
-                excelList.get(0).setTrial(true);
-            }
-            if (!pptList.isEmpty()) {
-                pptList.get(0).setTrial(true);
-            }
-            if (!pdfList.isEmpty()) {
-                pdfList.get(0).setTrial(true);
-            }
-        }
     }
 
     public void onCheckAllClick(boolean isCheck) {
@@ -299,23 +270,14 @@ public class FileRecoverViewModel extends BaseViewModel {
         return checkList.get(position);
     }
 
-
     public void onExportClick() {
         if (selectList == null || selectList.isEmpty()) {
             return;
         }
-        if (isTrial) {
-            for (FilesSearch.DocumentFile file : selectList) {
-                if (!file.isTrial()) {
-                    showTrialExportFailDialog.call();
-                    return;
-                }
-            }
-        } else {
-            if (!deviceFuncRepository.isHaveAuth(MemberType.APP_FILE_RECOVER)) {
-                return;
-            }
-        }
+        showUnlockEvent.call();
+    }
+
+    public void doExport() {
         Single.just(selectList.size())
                 .map(oldSize -> {
                     Iterator<FilesSearch.DocumentFile> iterator = selectList.iterator();
@@ -354,6 +316,7 @@ public class FileRecoverViewModel extends BaseViewModel {
                         selectedList.setValue(selectList);
                         ToastUtil.show(R.string.export_success, ToastUtil.LENGTH_SHORT);
                         getCheckAll(BoxingUtil.boxing(checkPosition.getValue())).setValue(false);
+                        AtmobAdHelper.showInterstitial(AdFuncId.INTERSTITIAL_RECOVER_SUCCESS, null);
                     }
 
                     @Override
@@ -378,22 +341,11 @@ public class FileRecoverViewModel extends BaseViewModel {
         this.selectedList.setValue(selectList);
     }
 
-    @Override
-    protected void onCleared() {
-        super.onCleared();
-        EventHelper.report(EventId.hf1000523);
-    }
-
-    public void setIsTrial(boolean isTrial) {
-        this.isTrial = isTrial;
-    }
-
     public void onTrialRecoverClick() {
         MemberActivity.start(ActivityUtil.getTopActivity(), MemberType.APP_FILE_RECOVER);
     }
 
     public void onViewTrialRecoverClick() {
-        EventHelper.report(EventId.hf1001117, Maps.asMap(EventId.EVENT_ID, ReportUtil.getReportId(MemberType.APP_FILE_RECOVER)));
         MemberActivity.start(ActivityUtil.getTopActivity(), MemberType.APP_FILE_RECOVER);
     }
 
@@ -403,7 +355,6 @@ public class FileRecoverViewModel extends BaseViewModel {
         }
         if (lastCompletelyItemPosition == itemCount - 1 && !BoxingUtil.boxing(showScanDialogEvent.getValue())) {
             showTrialFinishDialog.call();
-            EventHelper.report(EventId.hf1001119, Maps.asMap(EventId.EVENT_ID, ReportUtil.getReportId(MemberType.APP_FILE_RECOVER)));
         }
     }
 

+ 0 - 21
app/src/main/java/com/datarecovery/master/module/filerecover/fragment/FileRecoverFragment.java

@@ -8,10 +8,8 @@ import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
 import androidx.lifecycle.LiveData;
 import androidx.recyclerview.widget.LinearLayoutManager;
-import androidx.recyclerview.widget.RecyclerView;
 
 import com.atmob.app.lib.base.BaseFragment;
-import com.atmob.common.logging.AtmobLog;
 import com.datarecovery.master.R;
 import com.datarecovery.master.databinding.FragmentFileRecoverListBinding;
 import com.datarecovery.master.module.filerecover.FileRecoverViewModel;
@@ -58,25 +56,6 @@ public class FileRecoverFragment extends BaseFragment<FragmentFileRecoverListBin
         LinearLayoutManager linearLayoutManager = new LinearLayoutManager(getContext());
         binding.rvFileRecoverList.setLayoutManager(linearLayoutManager);
         binding.rvFileRecoverList.setAdapter(fileRecoverAdapter);
-        if (fileRecoverViewModel.isTrial()) {
-            binding.rvFileRecoverList.addOnScrollListener(new RecyclerView.OnScrollListener() {
-                @Override
-                public void onScrolled(@NonNull RecyclerView recyclerView, int dx, int dy) {
-                    fileRecoverViewModel.scrollPosition(linearLayoutManager.findLastCompletelyVisibleItemPosition(), linearLayoutManager.getItemCount());
-                }
-            });
-            binding.rvFileRecoverList.setOnFlingListener(new RecyclerView.OnFlingListener() {
-                @Override
-                public boolean onFling(int velocityX, int velocityY) {
-                    int firstCompletelyVisibleItemPosition = linearLayoutManager.findFirstCompletelyVisibleItemPosition();
-                    if ((firstCompletelyVisibleItemPosition == -1 && velocityY > 0) || (linearLayoutManager.findFirstCompletelyVisibleItemPosition() == 0 && linearLayoutManager.findLastCompletelyVisibleItemPosition() == linearLayoutManager.getItemCount() - 1 && velocityY > 0)) {
-                        fileRecoverViewModel.showTrialFinishDialog();
-                        return true;
-                    }
-                    return false;
-                }
-            });
-        }
     }
 
     private void initObserver() {

+ 16 - 18
app/src/main/java/com/datarecovery/master/module/homepage/FunctionBean.java

@@ -2,40 +2,34 @@ package com.datarecovery.master.module.homepage;
 
 import androidx.annotation.DrawableRes;
 import androidx.annotation.IntDef;
-import androidx.lifecycle.LiveData;
 
 import java.lang.annotation.Retention;
 import java.lang.annotation.RetentionPolicy;
 
 public class FunctionBean {
 
-    public static final int FILE_RECOVERY = 1;
-    public static final int VIDEO_RECOVERY = 2;
-    public static final int AUDIO_RECOVERY = 3;
-    public static final int IMG_CLEARING = 4;
+    public static final int IMG_RECOVERY = 1;
+    public static final int FILE_RECOVERY = 2;
+    public static final int VIDEO_RECOVERY = 3;
+    public static final int AUDIO_RECOVERY = 4;
+    public static final int IMG_CLEARING = 5;
 
-
-    @IntDef({FILE_RECOVERY, VIDEO_RECOVERY, AUDIO_RECOVERY, IMG_CLEARING})
+    @IntDef({IMG_RECOVERY, FILE_RECOVERY, VIDEO_RECOVERY, AUDIO_RECOVERY, IMG_CLEARING})
     @Retention(RetentionPolicy.SOURCE)
     public @interface FunctionId {
     }
 
-    private int functionId;
-    private String functionName;
+    private final int functionId;
+    private final String functionName;
+    private final String functionDesc;
     @DrawableRes
-    private int functionIcon;
-
-    private LiveData<Boolean> isShowTrial;
+    private final int functionIcon;
 
-    public FunctionBean(@FunctionId int functionId, String functionName, int functionIcon, LiveData<Boolean> isShowTrial) {
+    public FunctionBean(@FunctionId int functionId, String functionName, String functionDesc, int functionIcon) {
         this.functionId = functionId;
         this.functionName = functionName;
+        this.functionDesc = functionDesc;
         this.functionIcon = functionIcon;
-        this.isShowTrial = isShowTrial;
-    }
-
-    public LiveData<Boolean> getIsShowTrial() {
-        return isShowTrial;
     }
 
     @FunctionId
@@ -47,6 +41,10 @@ public class FunctionBean {
         return functionName;
     }
 
+    public String getFunctionDesc() {
+        return functionDesc;
+    }
+
     public int getFunctionIcon() {
         return functionIcon;
     }

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

@@ -6,6 +6,7 @@ import android.view.View;
 
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
+import androidx.recyclerview.widget.GridLayoutManager;
 
 import com.atmob.app.lib.base.BaseFragment;
 import com.datarecovery.master.R;
@@ -88,8 +89,9 @@ public class HomePageFragment extends BaseFragment<FragmentHomePageBinding> {
     }
 
     private void initOtherFunction() {
-        otherFunctionAdapter = new OtherFunctionAdapter(getViewLifecycleOwner(), homePageViewModel.getFunctionList(), homePageViewModel.getIsOpenTrialMembership());
+        otherFunctionAdapter = new OtherFunctionAdapter(getViewLifecycleOwner(), homePageViewModel.getFunctionList());
         binding.ryOtherFunction.setAdapter(otherFunctionAdapter);
+        binding.ryOtherFunction.setLayoutManager(new GridLayoutManager(requireContext(), 2));
         otherFunctionAdapter.setOnItemClick(bean -> homePageViewModel.clickItemFunction(bean));
     }
 

+ 59 - 56
app/src/main/java/com/datarecovery/master/module/homepage/HomePageViewModel.java

@@ -1,23 +1,27 @@
 package com.datarecovery.master.module.homepage;
 
+import android.util.Pair;
+
+import androidx.annotation.NonNull;
+import androidx.lifecycle.LiveData;
+import androidx.lifecycle.MutableLiveData;
+
 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.consts.AdFuncId;
 import com.datarecovery.master.data.repositories.ConfigRepository;
 import com.datarecovery.master.data.repositories.DeviceFuncRepository;
-import com.datarecovery.master.handler.EventHelper;
 import com.datarecovery.master.module.audiorecover.AudioRecoverActivity;
+import com.datarecovery.master.module.backup_helper.BackupHelperActivity;
 import com.datarecovery.master.module.filerecover.FileRecoverActivity;
 import com.datarecovery.master.module.imgrecover.ImageRecoverActivity;
-import com.datarecovery.master.module.member.MemberActivity;
 import com.datarecovery.master.module.member.MemberType;
 import com.datarecovery.master.module.videorecover.VideoRecoverActivity;
-import com.datarecovery.master.module.wxrecover.WeChatRecoverActivity;
-import com.datarecovery.master.utils.Maps;
-import com.datarecovery.master.utils.ReportUtil;
+import com.datarecovery.master.sdk.ad.AtmobAdHelper;
+import com.datarecovery.master.sdk.ad.RewardVideoListenerAdapter;
 
 import java.util.ArrayList;
 import java.util.List;
@@ -26,23 +30,18 @@ import javax.inject.Inject;
 
 import dagger.hilt.android.lifecycle.HiltViewModel;
 
-import android.util.Pair;
-
-import androidx.lifecycle.LiveData;
-
 
 @HiltViewModel
 public class HomePageViewModel extends BaseViewModel {
 
+    private final DeviceFuncRepository deviceFuncRepository;
+    private final ConfigRepository configRepository;
 
     private final List<Pair<CharSequence, CharSequence>> informationList = new ArrayList<>();
     private final List<FunctionBean> functionList = new ArrayList<>();
-
     private final SingleLiveEvent<?> requestManagePermission = new SingleLiveEvent<>();
     private final SingleLiveEvent<?> requestAndroidDataPermission = new SingleLiveEvent<>();
-    private final DeviceFuncRepository deviceFuncRepository;
-    private final ConfigRepository configRepository;
-
+    private final MutableLiveData<Boolean> isQQSelected = new MutableLiveData<>(false);
 
     @Inject
     public HomePageViewModel(DeviceFuncRepository deviceFuncRepository, ConfigRepository configRepository) {
@@ -51,6 +50,10 @@ public class HomePageViewModel extends BaseViewModel {
         initList();
     }
 
+    public LiveData<Boolean> getIsQQSelected() {
+        return isQQSelected;
+    }
+
     public LiveData<Boolean> getIsOpenTrialMembership() {
         return configRepository.getIsOpenTrialMembership();
     }
@@ -88,10 +91,26 @@ 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, ContextUtil.getContext().getString(R.string.home_page_file_recovery), R.drawable.icon_home_page_file_recovery, getIsShowFileTrialTag()));
-        functionList.add(new FunctionBean(FunctionBean.VIDEO_RECOVERY, ContextUtil.getContext().getString(R.string.home_page_video_recovery), R.drawable.icon_home_page_video_recovery, getIsShowVideoTrialTag()));
-        functionList.add(new FunctionBean(FunctionBean.AUDIO_RECOVERY, ContextUtil.getContext().getString(R.string.home_page_audio_recovery), R.drawable.icon_home_page_audio_recovery, getIsShowAudioTrialTag()));
-        functionList.add(new FunctionBean(FunctionBean.IMG_CLEARING, ContextUtil.getContext().getString(R.string.home_page_img_clearing), R.drawable.icon_home_page_img_clearing, null));
+        functionList.add(new FunctionBean(FunctionBean.IMG_RECOVERY,
+                ContextUtil.getContext().getString(R.string.home_page_img_recovery),
+                ContextUtil.getContext().getString(R.string.home_page_img_recovery_desc),
+                R.drawable.icon_home_page_img_recover));
+        functionList.add(new FunctionBean(FunctionBean.FILE_RECOVERY,
+                ContextUtil.getContext().getString(R.string.home_page_file_recovery),
+                ContextUtil.getContext().getString(R.string.home_page_file_recovery_desc),
+                R.drawable.icon_home_page_file_recovery));
+        functionList.add(new FunctionBean(FunctionBean.VIDEO_RECOVERY,
+                ContextUtil.getContext().getString(R.string.home_page_video_recovery),
+                ContextUtil.getContext().getString(R.string.home_page_video_recovery_desc),
+                R.drawable.icon_home_page_video_recovery));
+        functionList.add(new FunctionBean(FunctionBean.AUDIO_RECOVERY,
+                ContextUtil.getContext().getString(R.string.home_page_audio_recovery),
+                ContextUtil.getContext().getString(R.string.home_page_audio_recovery_desc),
+                R.drawable.icon_home_page_audio_recovery));
+        functionList.add(new FunctionBean(FunctionBean.IMG_CLEARING,
+                ContextUtil.getContext().getString(R.string.home_page_img_clearing),
+                ContextUtil.getContext().getString(R.string.home_page_img_clearing_desc),
+                R.drawable.icon_home_page_img_clearing));
     }
 
     public LiveData<?> getRequestManagePermission() {
@@ -102,68 +121,52 @@ public class HomePageViewModel extends BaseViewModel {
         return requestAndroidDataPermission;
     }
 
-    public void onWxMessageRecoveryClick() {
-        isHaveAuths(MemberType.APP_WX_MESSAGE_RECOVER, isTrial -> WeChatRecoverActivity.start(ActivityUtil.getTopActivity(), MemberType.APP_WX_MESSAGE_RECOVER));
-    }
+    public void onQQAreaClick() {
+        isQQSelected.setValue(true);
 
-    public void onWxFriendRecoveryClick() {
-        isHaveAuths(MemberType.APP_WX_FRIEND_RECOVER, isTrial -> WeChatRecoverActivity.start(ActivityUtil.getTopActivity(), MemberType.APP_WX_FRIEND_RECOVER));
+        AtmobAdHelper.showInterstitial(AdFuncId.INTERSTITIAL_HOME_SWITCH, null);
     }
 
-    public void onImgRecoveryClick() {
-        isHaveAuths(MemberType.APP_IMAGE_RECOVER, isTrial -> ImageRecoverActivity.start(ActivityUtil.getTopActivity(), MemberType.APP_IMAGE_RECOVER, isTrial));
+    public void onWeChatAreaClick() {
+        isQQSelected.setValue(false);
+
+        AtmobAdHelper.showInterstitial(AdFuncId.INTERSTITIAL_HOME_SWITCH, null);
     }
 
-    public void isHaveAuths(@MemberType String type, NextStepCallback stepCallback) {
-        reportFirstClickFunction(type);
-        if (deviceFuncRepository.isHaveAuth(type)) {
-            if (stepCallback != null) stepCallback.onNextStep(false);
-        } else if (configRepository.isConformTrialAuths(type)) {
-            if (stepCallback != null) stepCallback.onNextStep(true);
-        } else {
-            MemberActivity.start(ActivityUtil.getTopActivity(), type);
-        }
+    public void onBannerClick() {
+        ImageRecoverActivity.start(ActivityUtil.getTopActivity(), MemberType.APP_IMAGE_RECOVER);
     }
 
-    public void reportFirstClickFunction(@MemberType String type) {
-        if (configRepository.isIsOpenTrialMembership()) {
-            if (ReportUtil.isRecordOneEvent(EventId.hf1001116)) {
-                EventHelper.report(EventId.hf1001130, Maps.asMap(EventId.EVENT_ID, ReportUtil.getReportId(type)));
-                return;
-            }
-            EventHelper.report(EventId.hf1001116, Maps.asMap(EventId.EVENT_ID, ReportUtil.getReportId(type)));
-        } else {
-            if (ReportUtil.isRecordOneEvent(EventId.hf200008)) {
-                return;
+    public void onBackupHelperClick() {
+        AtmobAdHelper.showVideo(AdFuncId.REWARD_BACKUP_TUTORIAL, new RewardVideoListenerAdapter() {
+            @Override
+            public void onRewarded(@NonNull String token) {
+                super.onRewarded(token);
+                BackupHelperActivity.start(ActivityUtil.getTopActivity());
             }
-            EventHelper.report(EventId.hf200008, Maps.asMap(EventId.EVENT_ID, ReportUtil.getReportId(type)));
-        }
+        });
     }
 
-
     public void clickItemFunction(FunctionBean bean) {
         if (bean == null) {
             return;
         }
         switch (bean.getFunctionId()) {
             case FunctionBean.AUDIO_RECOVERY:
-                isHaveAuths(MemberType.APP_AUDIO_RECOVER, isTrial -> AudioRecoverActivity.start(ActivityUtil.getTopActivity(), isTrial));
+                AudioRecoverActivity.start(ActivityUtil.getTopActivity());
                 break;
             case FunctionBean.FILE_RECOVERY:
-                isHaveAuths(MemberType.APP_FILE_RECOVER, isTrial -> FileRecoverActivity.start(ActivityUtil.getTopActivity(), isTrial));
+                FileRecoverActivity.start(ActivityUtil.getTopActivity());
                 break;
             case FunctionBean.IMG_CLEARING:
                 ImageRecoverActivity.start(ActivityUtil.getTopActivity(), MemberType.APP_IMAGE_CLEAN);
                 break;
             case FunctionBean.VIDEO_RECOVERY:
-                isHaveAuths(MemberType.APP_VIDEO_RECOVER, isTrial -> VideoRecoverActivity.start(ActivityUtil.getTopActivity(), isTrial));
+                VideoRecoverActivity.start(ActivityUtil.getTopActivity());
+                break;
+            case FunctionBean.IMG_RECOVERY:
+                ImageRecoverActivity.start(ActivityUtil.getTopActivity(), MemberType.APP_IMAGE_RECOVER);
                 break;
         }
     }
-
-    public interface NextStepCallback {
-        void onNextStep(boolean isTrial);
-    }
-
-
 }

+ 20 - 6
app/src/main/java/com/datarecovery/master/module/homepage/OtherFunctionAdapter.java

@@ -2,15 +2,14 @@ package com.datarecovery.master.module.homepage;
 
 import android.content.Context;
 import android.view.LayoutInflater;
-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;
+import com.datarecovery.master.utils.GridLayoutItemDecoration;
 
 import java.util.List;
 
@@ -20,21 +19,37 @@ 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;
+    private GridLayoutItemDecoration itemDecoration;
 
-    public OtherFunctionAdapter(LifecycleOwner lifecycleOwner, @NonNull List<FunctionBean> beanList, LiveData<Boolean> isOpenTrial) {
+    public OtherFunctionAdapter(LifecycleOwner lifecycleOwner, @NonNull List<FunctionBean> beanList) {
         this.lifecycleOwner = lifecycleOwner;
         this.beanList = beanList;
-        this.isOpenTrial = isOpenTrial;
     }
 
     public void setOnItemClick(OtherFunctionAdapter.onItemClick onItemClick) {
         this.onItemClick = onItemClick;
     }
 
+    @Override
+    public void onAttachedToRecyclerView(@NonNull RecyclerView recyclerView) {
+        super.onAttachedToRecyclerView(recyclerView);
+        if (itemDecoration == null) {
+            itemDecoration = new GridLayoutItemDecoration(2, 0.0365853658536585f, 0.0365853658536585f);
+        }
+        recyclerView.addItemDecoration(itemDecoration);
+    }
+
+    @Override
+    public void onDetachedFromRecyclerView(@NonNull RecyclerView recyclerView) {
+        super.onDetachedFromRecyclerView(recyclerView);
+        if (itemDecoration != null) {
+            recyclerView.removeItemDecoration(itemDecoration);
+        }
+    }
+
     @NonNull
     @Override
     public OtherFunctionAdapter.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
@@ -62,7 +77,6 @@ public class OtherFunctionAdapter extends RecyclerView.Adapter<OtherFunctionAdap
             super(binding.getRoot());
             this.binding = binding;
             binding.setLifecycleOwner(lifecycleOwner);
-            this.binding.setIsOpenTrial(isOpenTrial);
             binding.getRoot().setOnClickListener(v -> {
                 if (onItemClick != null) onItemClick.onClick(binding.getBean());
             });

+ 43 - 59
app/src/main/java/com/datarecovery/master/module/imgrecover/ImageRecoverActivity.java

@@ -4,16 +4,10 @@ import android.annotation.SuppressLint;
 import android.app.Activity;
 import android.app.PendingIntent;
 import android.content.Context;
-import android.content.DialogInterface;
 import android.content.Intent;
-import android.content.IntentSender;
-import android.net.Uri;
-import android.os.Build;
 import android.os.Bundle;
 import android.provider.MediaStore;
 import android.view.KeyEvent;
-import android.view.MotionEvent;
-import android.view.View;
 
 import androidx.activity.result.ActivityResult;
 import androidx.activity.result.IntentSenderRequest;
@@ -25,32 +19,28 @@ import androidx.recyclerview.widget.GridLayoutManager;
 import androidx.recyclerview.widget.RecyclerView;
 
 import com.atmob.app.lib.base.BaseActivity;
-import com.atmob.common.logging.AtmobLog;
-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.consts.AdFuncId;
+import com.datarecovery.master.data.consts.Constants;
 import com.datarecovery.master.databinding.ActivityImageRecoverBinding;
 import com.datarecovery.master.databinding.ItemTabImageRecoverBinding;
 import com.datarecovery.master.dialog.CommonLoadingDialog;
 import com.datarecovery.master.dialog.CommonSureDialog;
 import com.datarecovery.master.dialog.ScanFileDialog;
-import com.datarecovery.master.dialog.ScanProgressDialog;
-import com.datarecovery.master.handler.EventHelper;
+import com.datarecovery.master.dialog.UnlockFunctionDialog;
 import com.datarecovery.master.module.member.MemberType;
 import com.datarecovery.master.module.preview.PreviewActivity;
+import com.datarecovery.master.sdk.ad.AtmobAdHelper;
+import com.datarecovery.master.sdk.ad.RewardVideoListenerAdapter;
 import com.datarecovery.master.utils.ActivityForResultUtil;
 import com.datarecovery.master.utils.BoxingUtil;
+import com.datarecovery.master.utils.CounterUtil;
 import com.datarecovery.master.utils.FilePermissionHelper;
 import com.datarecovery.master.utils.GridRecoverItemDecoration;
 import com.datarecovery.master.utils.ImageDeepDetector;
-import com.datarecovery.master.utils.Maps;
-import com.datarecovery.master.utils.ReportUtil;
-import com.datarecovery.master.utils.ToastUtil;
 import com.google.android.material.tabs.TabLayout;
 import com.gyf.immersionbar.ImmersionBar;
 
-import java.util.List;
 import java.util.Objects;
 
 import dagger.hilt.android.AndroidEntryPoint;
@@ -60,15 +50,10 @@ import dagger.hilt.android.AndroidEntryPoint;
 public class ImageRecoverActivity extends BaseActivity<ActivityImageRecoverBinding> implements ImageItemAdapter.onItemClick {
 
 
-    private ConcatAdapter concatAdapter;
-
-
     private static final String TYPE = "type";
-    private static final String IS_TRIAL = "is_trial";
-    ImageRecoverViewModel imageRecoverViewModel;
-
     private final int[] tabTitle = {R.string.photo, R.string.wx, R.string.qq, R.string.other};
-
+    ImageRecoverViewModel imageRecoverViewModel;
+    private ConcatAdapter concatAdapter;
     private CommonSureDialog backDialog;
     private CommonSureDialog clearDialog;
 
@@ -81,19 +66,15 @@ public class ImageRecoverActivity extends BaseActivity<ActivityImageRecoverBindi
     private ImageItemAdapter qqAdapter;
     private ImageItemAdapter otherAdapter;
     private GridLayoutManager gridLayoutManager;
+    private UnlockFunctionDialog unlockFunctionDialog;
 
 
     public static void start(Context context, @MemberType String type) {
-        start(context, type, false);
-    }
-
-    public static void start(Context context, @MemberType String type, boolean isTrial) {
         Intent intent = new Intent(context, ImageRecoverActivity.class);
         if (!(context instanceof Activity)) {
             intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
         }
         intent.putExtra(TYPE, type);
-        intent.putExtra(IS_TRIAL, isTrial);
         context.startActivity(intent);
     }
 
@@ -107,7 +88,7 @@ public class ImageRecoverActivity extends BaseActivity<ActivityImageRecoverBindi
     }
 
     private void initPermission() {
-        new FilePermissionHelper().requestDataFilePermission(this, imageRecoverViewModel.getType(), imageRecoverViewModel.isTrial(), new FilePermissionHelper.NextStepCallback() {
+        new FilePermissionHelper().requestDataFilePermission(this, new FilePermissionHelper.NextStepCallback() {
             @Override
             public void onNextStep() {
                 imageRecoverViewModel.startImageScanning();
@@ -124,7 +105,6 @@ public class ImageRecoverActivity extends BaseActivity<ActivityImageRecoverBindi
         Intent intent = getIntent();
         if (intent != null) {
             imageRecoverViewModel.setType(intent.getStringExtra(TYPE));
-            imageRecoverViewModel.setIsTrial(intent.getBooleanExtra(IS_TRIAL, false));
         }
     }
 
@@ -182,9 +162,6 @@ public class ImageRecoverActivity extends BaseActivity<ActivityImageRecoverBindi
             public void onScrolled(@NonNull RecyclerView recyclerView, int dx, int dy) {
                 int firstVisibleItem = gridLayoutManager.findFirstVisibleItemPosition();
                 int lastVisibleItem = gridLayoutManager.findLastVisibleItemPosition();
-                if (imageRecoverViewModel.isTrial()) {
-                    imageRecoverViewModel.scrollPosition(gridLayoutManager.findLastCompletelyVisibleItemPosition(), gridLayoutManager.getItemCount());
-                }
                 int photoPosition = getPhotoPosition();
                 int wxPosition = getWxPosition();
                 int qqPosition = getQQPosition();
@@ -200,18 +177,6 @@ public class ImageRecoverActivity extends BaseActivity<ActivityImageRecoverBindi
                 }
             }
         };
-        if (imageRecoverViewModel.isTrial()) {
-            binding.ryImageRecover.setOnFlingListener(new RecyclerView.OnFlingListener() {
-                @Override
-                public boolean onFling(int velocityX, int velocityY) {
-                    if (gridLayoutManager.findFirstCompletelyVisibleItemPosition() == 0 && gridLayoutManager.findLastCompletelyVisibleItemPosition() == gridLayoutManager.getItemCount() - 1 && velocityY > 0) {
-                        showTrialFinishDialog();
-                        return true;
-                    }
-                    return false;
-                }
-            });
-        }
         binding.ryImageRecover.addOnScrollListener(onScrollListener);
     }
 
@@ -360,9 +325,35 @@ public class ImageRecoverActivity extends BaseActivity<ActivityImageRecoverBindi
         imageRecoverViewModel.getDetectedWxImg().observe(this, list -> wxAdapter.submit(list));
         imageRecoverViewModel.getDetectedQQImg().observe(this, list -> qqAdapter.submit(list));
         imageRecoverViewModel.getDetectedOtherImg().observe(this, list -> otherAdapter.submit(list));
-        imageRecoverViewModel.getPreviewEvent().observe(this, pair -> PreviewActivity.startImagePreView(this, pair.first, pair.second, imageRecoverViewModel.isTrial()));
+        imageRecoverViewModel.getPreviewEvent().observe(this, pair -> PreviewActivity.startImagePreView(this, pair.first, pair.second));
         imageRecoverViewModel.getShowLoadingEvent().observe(this, this::showLoadingDialog);
-        imageRecoverViewModel.getShowClearDialog().observe(this, o -> showClearDialog());
+        imageRecoverViewModel.getOnExportClickEvent().observe(this, o -> showUnlockDialog());
+    }
+
+    private void showUnlockDialog() {
+        if (unlockFunctionDialog == null) {
+            unlockFunctionDialog = new UnlockFunctionDialog(this)
+                    .setActionHandler(() -> {
+                        if (Objects.equals(imageRecoverViewModel.getType(), MemberType.APP_IMAGE_CLEAN)) {
+                            AtmobAdHelper.showVideo(AdFuncId.REWARD_CLEAN, new RewardVideoListenerAdapter() {
+                                @Override
+                                public void onRewarded(@androidx.annotation.NonNull String token) {
+                                    super.onRewarded(token);
+                                    showClearDialog();
+                                }
+                            });
+                        } else {
+                            AtmobAdHelper.showVideo(AdFuncId.REWARD_RECOVER, new RewardVideoListenerAdapter() {
+                                @Override
+                                public void onRewarded(@androidx.annotation.NonNull String token) {
+                                    super.onRewarded(token);
+                                    imageRecoverViewModel.exportImage();
+                                }
+                            });
+                        }
+                    });
+        }
+        unlockFunctionDialog.show();
     }
 
     private void showTrialExportFailDialog() {
@@ -370,15 +361,10 @@ public class ImageRecoverActivity extends BaseActivity<ActivityImageRecoverBindi
             showTrialExportFailDialog = new CommonSureDialog(this);
             showTrialExportFailDialog.setDialogTitle(R.string.trial_export_fail_title)
                     .setDialogContent(R.string.trial_export_fail_content).setSureText(R.string.dialog_trial_recover);
-            showTrialExportFailDialog.setOnDialogClickListener(() -> {
-                imageRecoverViewModel.onTrialRecoverClick();
-                EventHelper.report(EventId.hf1001123, Maps.asMap(EventId.EVENT_ID, ReportUtil.getReportId(MemberType.APP_IMAGE_RECOVER)));
-            });
-            showTrialExportFailDialog.setOnDismissListener(dialog -> EventHelper.report(EventId.hf1001124, Maps.asMap(EventId.EVENT_ID, ReportUtil.getReportId(MemberType.APP_IMAGE_RECOVER))));
+            showTrialExportFailDialog.setOnDialogClickListener(() -> imageRecoverViewModel.onTrialRecoverClick());
         }
         if (!showTrialExportFailDialog.isShowing()) {
             showTrialExportFailDialog.show();
-            EventHelper.report(EventId.hf1001120, Maps.asMap(EventId.EVENT_ID, ReportUtil.getReportId(MemberType.APP_IMAGE_RECOVER)));
         }
     }
 
@@ -387,15 +373,10 @@ public class ImageRecoverActivity extends BaseActivity<ActivityImageRecoverBindi
             showTrialFinishDialog = new CommonSureDialog(this);
             showTrialFinishDialog.setDialogTitle(getString(R.string.scanning_progress, 13))
                     .setDialogContent(getString(R.string.trial_scanning_finish_content, 13)).setSureText(R.string.dialog_trial_recover);
-            showTrialFinishDialog.setOnDialogClickListener(() -> {
-                imageRecoverViewModel.onTrialRecoverClick();
-                EventHelper.report(EventId.hf1001121, Maps.asMap(EventId.EVENT_ID, ReportUtil.getReportId(MemberType.APP_IMAGE_RECOVER)));
-            });
-            showTrialFinishDialog.setOnDismissListener(dialog -> EventHelper.report(EventId.hf1001122, Maps.asMap(EventId.EVENT_ID, ReportUtil.getReportId(MemberType.APP_IMAGE_RECOVER))));
+            showTrialFinishDialog.setOnDialogClickListener(() -> imageRecoverViewModel.onTrialRecoverClick());
         }
         if (!showTrialFinishDialog.isShowing()) {
             showTrialFinishDialog.show();
-            EventHelper.report(EventId.hf1001118, Maps.asMap(EventId.EVENT_ID, ReportUtil.getReportId(MemberType.APP_IMAGE_RECOVER)));
         }
     }
 
@@ -453,6 +434,9 @@ public class ImageRecoverActivity extends BaseActivity<ActivityImageRecoverBindi
 
     @Override
     public void onBackPressed() {
+        if (!CounterUtil.checkAndIncrementByDay(Constants.KEY_LIST_BACK_AD_COUNTER, 2)) {
+            AtmobAdHelper.showInterstitial(AdFuncId.INTERSTITIAL_RESULT_BACK, null);
+        }
         showBackDialog();
     }
 

+ 45 - 148
app/src/main/java/com/datarecovery/master/module/imgrecover/ImageRecoverViewModel.java

@@ -4,8 +4,6 @@ import android.content.ContentResolver;
 import android.content.ContentUris;
 import android.content.Context;
 import android.database.Cursor;
-import android.graphics.Bitmap;
-import android.graphics.BitmapFactory;
 import android.net.Uri;
 import android.os.Build;
 import android.provider.MediaStore;
@@ -22,25 +20,21 @@ import com.atmob.common.logging.AtmobLog;
 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.DeviceFuncRepository;
-import com.datarecovery.master.handler.EventHelper;
+import com.datarecovery.master.data.consts.AdFuncId;
 import com.datarecovery.master.module.member.MemberActivity;
 import com.datarecovery.master.module.member.MemberType;
+import com.datarecovery.master.sdk.ad.AtmobAdHelper;
 import com.datarecovery.master.sdk.bugly.BuglyHelper;
 import com.datarecovery.master.utils.BoxingUtil;
 import com.datarecovery.master.utils.FileUtil;
 import com.datarecovery.master.utils.ImageDeepDetector;
-import com.datarecovery.master.utils.Maps;
 import com.datarecovery.master.utils.MediaStoreHelper;
-import com.datarecovery.master.utils.ReportUtil;
 import com.datarecovery.master.utils.ReverseArrayList;
 import com.datarecovery.master.utils.ToastUtil;
 
 import org.reactivestreams.Subscription;
 
 import java.io.File;
-import java.io.InputStream;
 import java.util.ArrayList;
 import java.util.Iterator;
 import java.util.List;
@@ -86,14 +80,7 @@ public class ImageRecoverViewModel extends BaseViewModel {
     private final SingleLiveEvent<?> showTrialExportFailDialog = new SingleLiveEvent<>();
     private final SingleLiveEvent<ImageDeepDetector.ImageFile> failScrollPosition = new SingleLiveEvent<>();
     private final MutableLiveData<Boolean> showTrialView = new MutableLiveData<>();
-    private final DeviceFuncRepository deviceFuncRepository;
-    private LiveData<String> detectedPhotoTitle;
-    private LiveData<String> detectedWxTitle;
-    private LiveData<String> detectedQQTitle;
-    private LiveData<String> detectedOtherTitle;
-
     private final SingleLiveEvent<Pair<List<ImageDeepDetector.ImageFile>, Integer>> previewEvent = new SingleLiveEvent<>();
-    private final SingleLiveEvent<?> showClearDialog = new SingleLiveEvent<>();
     private final SingleLiveEvent<Boolean> showScanDialogEvent = new SingleLiveEvent<>();
     private final SingleLiveEvent<Boolean> showLoadingEvent = new SingleLiveEvent<>();
     private final SingleLiveEvent<?> scrollTop = new SingleLiveEvent<>();
@@ -101,6 +88,11 @@ public class ImageRecoverViewModel extends BaseViewModel {
     private final MutableLiveData<String> barTitle = new MutableLiveData<>();
     private final MutableLiveData<Boolean> checkAll = new MutableLiveData<>(false);
     private final MutableLiveData<String> detectedLastFileName = new MutableLiveData<>();
+    private final SingleLiveEvent<?> onExportClickEvent = new SingleLiveEvent<>();
+    private LiveData<String> detectedPhotoTitle;
+    private LiveData<String> detectedWxTitle;
+    private LiveData<String> detectedQQTitle;
+    private LiveData<String> detectedOtherTitle;
     private LiveData<String> selectedCountTxt;
     private Disposable scanDisposable;
 
@@ -108,19 +100,15 @@ public class ImageRecoverViewModel extends BaseViewModel {
     private String type;
 
     private SingleObserver<? super Boolean> dealMediaObserver;
-    //是否会员试用
-    private boolean isTrial;
 
     private long detectTime;
 
     @Inject
-    public ImageRecoverViewModel(DeviceFuncRepository deviceFuncRepository) {
-        this.deviceFuncRepository = deviceFuncRepository;
+    public ImageRecoverViewModel() {
         barTitle.setValue(ContextUtil.getContext().getString(R.string.iamge_recover_all));
         initLiveData();
     }
 
-
     public LiveData<ImageDeepDetector.ImageFile> getFailScrollPosition() {
         return failScrollPosition;
     }
@@ -145,22 +133,10 @@ public class ImageRecoverViewModel extends BaseViewModel {
         return showTrialView;
     }
 
-    public boolean isTrial() {
-        if (Objects.equals(type, MemberType.APP_IMAGE_CLEAN)) {
-            return !deviceFuncRepository.isHaveAuth(type);
-        } else {
-            return isTrial;
-        }
-    }
-
     public LiveData<List<Uri>> getDeleteUriListSdk11() {
         return deleteUriListSdk11;
     }
 
-    public LiveData<?> getShowClearDialog() {
-        return showClearDialog;
-    }
-
     public LiveData<?> getNotifyList() {
         return notifyList;
     }
@@ -217,7 +193,6 @@ public class ImageRecoverViewModel extends BaseViewModel {
         return showScanDialogEvent;
     }
 
-
     public LiveData<Boolean> getCheckAll() {
         return checkAll;
     }
@@ -226,10 +201,39 @@ public class ImageRecoverViewModel extends BaseViewModel {
         return barTitle;
     }
 
+    public LiveData<?> getOnExportClickEvent() {
+        return onExportClickEvent;
+    }
+
     public String getType() {
         return type;
     }
 
+    public void setType(@MemberType String type) {
+        if (!TextUtils.isEmpty(this.type)) {
+            return;
+        }
+        this.type = type;
+        switch (type) {
+            case MemberType.APP_IMAGE_CLEAN:
+                selectedCountTxt = Transformations.map(selectedList, list -> {
+                    if (list == null || list.isEmpty()) {
+                        return ContextUtil.getContext().getString(R.string.delete);
+                    }
+                    return ContextUtil.getContext().getString(R.string.delete_count, list.size());
+                });
+                break;
+            case MemberType.APP_IMAGE_RECOVER:
+                selectedCountTxt = Transformations.map(selectedList, list -> {
+                    if (list == null || list.isEmpty()) {
+                        return ContextUtil.getContext().getString(R.string.export);
+                    }
+                    return ContextUtil.getContext().getString(R.string.export_count, list.size());
+                });
+                break;
+        }
+    }
+
     private void initLiveData() {
         detectedPhotoTitle = Transformations.map(detectedPhotoImg, list ->
                 ContextUtil.getContext().getString(R.string.photo_count, (list == null || list.isEmpty()) ? 0 : list.size()));
@@ -268,13 +272,12 @@ public class ImageRecoverViewModel extends BaseViewModel {
         }
     }
 
-
     public void startImageScanning() {
         if (scanDisposable != null && !scanDisposable.isDisposed()) {
             return;
         }
         ImageDeepDetector.detect(ContextUtil.getContext(), type)
-                .take(isTrial ? SCANNING_IS_TRIAL_COUNTDOWN : SCANNING_COUNTDOWN, TimeUnit.MILLISECONDS)
+                .take(SCANNING_COUNTDOWN, TimeUnit.MILLISECONDS)
                 .observeOn(AndroidSchedulers.mainThread())
                 .subscribe(new FlowableSubscriber<List<ImageDeepDetector.ImageFile>>() {
                     @Override
@@ -339,42 +342,15 @@ public class ImageRecoverViewModel extends BaseViewModel {
 
                     @Override
                     public void onComplete() {
-                        setFreeExport();
                         AtmobLog.d("ImageRecoverViewModel", System.currentTimeMillis() - detectTime + "ms");
-                        if (isTrial) {
-                            showTrialFinishDialog.call();
-                        }
                         showScanDialogEvent.setValue(false);
                     }
                 });
     }
 
-    private void setFreeExport() {
-        if (isTrial) {
-            showTrialView.setValue(true);
-            if (!detectedPhotoList.isEmpty()) {
-                detectedPhotoList.get(0).setTrial(true);
-                return;
-            }
-            if (!detectedWxList.isEmpty()) {
-                detectedWxList.get(0).setTrial(true);
-                return;
-            }
-            if (!detectedQQList.isEmpty()) {
-                detectedQQList.get(0).setTrial(true);
-                return;
-            }
-            if (!detectedOtherList.isEmpty()) {
-                detectedOtherList.get(0).setTrial(true);
-                return;
-            }
-        }
-    }
-
     public void cancelScan() {
         if (scanDisposable != null && !scanDisposable.isDisposed()) scanDisposable.dispose();
         showScanDialogEvent.setValue(false);
-        setFreeExport();
     }
 
     public void setItemCheck(@NonNull ImageDeepDetector.ImageFile imageFile) {
@@ -388,18 +364,9 @@ public class ImageRecoverViewModel extends BaseViewModel {
     }
 
     public void checkPreview(@NonNull ImageDeepDetector.ImageFile imageFile) {
-        if (isTrial) {
-            sendPreviewEvent(imageFile);
-            return;
-        }
         if (Objects.equals(type, MemberType.APP_IMAGE_CLEAN)) {
             return;
         }
-        if (Objects.equals(type, MemberType.APP_IMAGE_RECOVER) && !deviceFuncRepository.isHaveAuth(type)) {
-            return;
-        } else if (Objects.equals(type, MemberType.APP_IMAGE_CLEAN) && !deviceFuncRepository.isHaveAuth(type)) {
-            return;
-        }
         sendPreviewEvent(imageFile);
     }
 
@@ -410,15 +377,7 @@ public class ImageRecoverViewModel extends BaseViewModel {
     }
 
     public void onOperationClick() {
-        if (Objects.equals(type, MemberType.APP_IMAGE_CLEAN)) {
-            if (deviceFuncRepository.isHaveAuth(type)) {
-                showClearDialog.call();
-            } else {
-                MemberActivity.start(ActivityUtil.getTopActivity(), type);
-            }
-        } else {
-            onExportClick();
-        }
+        onExportClickEvent.call();
     }
 
     public void executeImageDelete() {
@@ -479,6 +438,7 @@ public class ImageRecoverViewModel extends BaseViewModel {
                         if (pairPairPair.first.first == null && pairPairPair.second.first == null) {
                             ToastUtil.show(R.string.delete_success, ToastUtil.LENGTH_SHORT);
                         }
+                        AtmobAdHelper.showInterstitial(AdFuncId.INTERSTITIAL_CLEAN_SUCCESS, null);
                     }
 
                     @Override
@@ -489,7 +449,6 @@ public class ImageRecoverViewModel extends BaseViewModel {
                 });
     }
 
-
     private @NonNull Single<Pair<ImageDeepDetector.ImageFile, Exception>> externalDelete(List<ImageDeepDetector.ImageFile> externalList) {
         return Single.create((SingleOnSubscribe<List<Uri>>) emitter -> {
                     List<Uri> uriDeleteList = new ArrayList<>();
@@ -542,9 +501,6 @@ public class ImageRecoverViewModel extends BaseViewModel {
                 });
     }
 
-    private static class CancelDeleteException extends Exception {
-    }
-
     private Single<Pair<ImageDeepDetector.ImageFile, Exception>> imageDelete(List<ImageDeepDetector.ImageFile> safList) {
         return Single.create(emitter -> {
             Exception exception = null;
@@ -600,24 +556,10 @@ public class ImageRecoverViewModel extends BaseViewModel {
         return id;
     }
 
-    public void onExportClick() {
+    public void exportImage() {
         if (selectList.isEmpty()) {
             return;
         }
-        if (isTrial) {
-            for (ImageDeepDetector.ImageFile imageFile : selectList) {
-                if (!imageFile.isTrial()) {
-                    showTrialExportFailDialog.call();
-                    return;
-                }
-            }
-        } else {
-            if (Objects.equals(type, MemberType.APP_IMAGE_RECOVER) && !deviceFuncRepository.isHaveAuth(type)) {
-                return;
-            } else if (Objects.equals(type, MemberType.APP_IMAGE_CLEAN) && !deviceFuncRepository.isHaveAuth(type)) {
-                return;
-            }
-        }
         Single.just(selectList.size())
                 .map(oldSize -> {
                     Iterator<ImageDeepDetector.ImageFile> iterator = selectList.iterator();
@@ -656,6 +598,7 @@ public class ImageRecoverViewModel extends BaseViewModel {
                         selectedList.setValue(selectList);
                         checkAll.setValue(false);
                         ToastUtil.show(R.string.export_success, ToastUtil.LENGTH_SHORT);
+                        AtmobAdHelper.showInterstitial(AdFuncId.INTERSTITIAL_RECOVER_SUCCESS, null);
                     }
 
                     @Override
@@ -684,65 +627,17 @@ public class ImageRecoverViewModel extends BaseViewModel {
         return list.indexOf(target);
     }
 
-
-    public void setType(@MemberType String type) {
-        if (!TextUtils.isEmpty(this.type)) {
-            return;
-        }
-        this.type = type;
-        switch (type) {
-            case MemberType.APP_IMAGE_CLEAN:
-                EventHelper.report(EventId.hf1000514);
-                EventHelper.timeEvent(EventId.hf1000529);
-                selectedCountTxt = Transformations.map(selectedList, list -> {
-                    if (list == null || list.isEmpty()) {
-                        return ContextUtil.getContext().getString(R.string.delete);
-                    }
-                    return ContextUtil.getContext().getString(R.string.delete_count, list.size());
-                });
-                break;
-            case MemberType.APP_IMAGE_RECOVER:
-                EventHelper.report(EventId.hf1000506);
-                EventHelper.timeEvent(EventId.hf1000521);
-                selectedCountTxt = Transformations.map(selectedList, list -> {
-                    if (list == null || list.isEmpty()) {
-                        return ContextUtil.getContext().getString(R.string.export);
-                    }
-                    return ContextUtil.getContext().getString(R.string.export_count, list.size());
-                });
-                break;
-        }
-    }
-
-    @Override
-    protected void onCleared() {
-        super.onCleared();
-        switch (type) {
-            case MemberType.APP_IMAGE_CLEAN:
-                EventHelper.report(EventId.hf1000529);
-                break;
-            case MemberType.APP_IMAGE_RECOVER:
-                EventHelper.report(EventId.hf1000521);
-                break;
-        }
-    }
-
     public void callDealComplete(boolean isDelete) {
         if (dealMediaObserver != null) {
             dealMediaObserver.onSuccess(isDelete);
         }
     }
 
-    public void setIsTrial(boolean isTrial) {
-        this.isTrial = isTrial;
-    }
-
     public void onTrialRecoverClick() {
         MemberActivity.start(ActivityUtil.getTopActivity(), type);
     }
 
     public void onViewTrialRecoverClick() {
-        EventHelper.report(EventId.hf1001117, Maps.asMap(EventId.EVENT_ID, ReportUtil.getReportId(type)));
         MemberActivity.start(ActivityUtil.getTopActivity(), type);
     }
 
@@ -752,7 +647,9 @@ public class ImageRecoverViewModel extends BaseViewModel {
         }
         if (lastCompletelyItemPosition == itemCount - 1 && !BoxingUtil.boxing(showScanDialogEvent.getValue())) {
             showTrialFinishDialog.call();
-            EventHelper.report(EventId.hf1001119, Maps.asMap(EventId.EVENT_ID, ReportUtil.getReportId(type)));
         }
     }
+
+    private static class CancelDeleteException extends Exception {
+    }
 }

+ 0 - 23
app/src/main/java/com/datarecovery/master/module/login/LoginActivity.java

@@ -4,24 +4,17 @@ import android.app.Activity;
 import android.content.Context;
 import android.content.Intent;
 import android.os.Bundle;
-import android.view.View;
 
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
 
 import com.atmob.app.lib.base.BaseActivity;
-import com.atmob.common.logging.AtmobLog;
-import com.atmob.common.runtime.ContextUtil;
 import com.datarecovery.master.R;
 import com.datarecovery.master.data.consts.Constants;
-import com.datarecovery.master.data.consts.EventId;
 import com.datarecovery.master.databinding.ActivityLoginBinding;
-import com.datarecovery.master.handler.EventHelper;
 import com.datarecovery.master.module.browser.BrowserActivity;
 import com.datarecovery.master.utils.SpannableUtil;
 import com.gyf.immersionbar.ImmersionBar;
-import com.netease.nis.quicklogin.QuickLogin;
-import com.netease.nis.quicklogin.listener.QuickLoginPreMobileListener;
 
 import dagger.hilt.android.AndroidEntryPoint;
 
@@ -42,35 +35,19 @@ public class LoginActivity extends BaseActivity<ActivityLoginBinding> {
         context.startActivity(intent);
     }
 
-
     @Override
     protected void onCreate(@Nullable Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
-        initData();
         initView();
         initObserver();
     }
 
-    private void initData() {
-        loginViewModel.setReportId(getIntent().getStringExtra(REPORT_ID));
-    }
-
     private void initView() {
         String agreeText = getString(R.string.login_agree_text);
         String userTermsText = getString(R.string.login_agree_user_terms_text);
         String privacyPolicyText = getString(R.string.login_agree_privacy_policy_text);
         SpannableUtil.getAgreementSpannableStringBuilder(binding.loginAgreeText, agreeText, new String[]{userTermsText, privacyPolicyText}, getResources().getColor(R.color.colorPrimary), false,
                 v -> BrowserActivity.start(getBaseContext(), Constants.PRIVACY_POLICY), v -> BrowserActivity.start(getBaseContext(), Constants.USER_AGREEMENT));
-        binding.etPhone.setOnFocusChangeListener((v, hasFocus) -> {
-            if (hasFocus) {
-                EventHelper.report(EventId.hf200009);
-            }
-        });
-        binding.etCode.setOnFocusChangeListener((v, hasFocus) -> {
-            if (hasFocus) {
-                EventHelper.report(EventId.hf200010);
-            }
-        });
     }
 
     private void initObserver() {

+ 0 - 27
app/src/main/java/com/datarecovery/master/module/login/LoginViewModel.java

@@ -10,20 +10,14 @@ import androidx.lifecycle.MutableLiveData;
 import com.atmob.app.lib.base.BaseViewModel;
 import com.atmob.app.lib.livedata.SingleLiveEvent;
 import com.atmob.common.logging.AtmobLog;
-import com.atmob.common.runtime.ContextUtil;
 import com.datarecovery.master.R;
 import com.datarecovery.master.data.api.response.LoginResponse;
 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.handler.EventHelper;
 import com.datarecovery.master.sdk.quicklogin.QuickLoginHelper;
 import com.datarecovery.master.utils.BoxingUtil;
-import com.datarecovery.master.utils.Maps;
 import com.datarecovery.master.utils.RxHttpHandler;
 import com.datarecovery.master.utils.ToastUtil;
-import com.netease.nis.quicklogin.helper.UnifyUiConfig;
-import com.netease.nis.quicklogin.listener.QuickLoginPreMobileListener;
 
 import java.util.concurrent.TimeUnit;
 import java.util.regex.Matcher;
@@ -52,7 +46,6 @@ public class LoginViewModel extends BaseViewModel {
     private final SingleLiveEvent<?> finishEvent = new SingleLiveEvent<>();
     private final AccountRepository accountRepository;
     private Disposable getCodeCountdownDisposable;
-    private String reportId;
 
     @Inject
     public LoginViewModel(AccountRepository accountRepository) {
@@ -155,12 +148,10 @@ public class LoginViewModel extends BaseViewModel {
 
 
     public void onGetCodeClick() {
-        EventHelper.report(EventId.hf200011);
         String phoneNumText = phoneNum.getValue();
         if (isPhone(phoneNumText)) {
             doRequestVerificationCode(phoneNumText);
         } else {
-            EventHelper.report(EventId.hf1000305, Maps.asMap(EventId.EVENT_ID, "hf11034"));
             ToastUtil.show(R.string.login_phone_num_11, ToastUtil.LENGTH_SHORT);
         }
     }
@@ -189,13 +180,11 @@ public class LoginViewModel extends BaseViewModel {
                     public void onError(@NonNull Throwable e) {
                         showLoading.setValue(false);
                         if (e instanceof AccountRepository.RequestCodeTooOftenException) {
-                            EventHelper.report(EventId.hf1000305, Maps.asMap(EventId.EVENT_ID, "hf11022"));
                             ToastUtil.show(R.string.login_request_code_frequently_toast, ToastUtil.LENGTH_SHORT);
                             return;
                         }
                         e.printStackTrace();
                         stopGetCodeCountdown();
-                        EventHelper.report(EventId.hf1000305, Maps.asMap(EventId.EVENT_ID, "hf11022"));
                         ToastUtil.show(R.string.login_verification_code_request_failed_toast, ToastUtil.LENGTH_SHORT);
                     }
                 });
@@ -220,7 +209,6 @@ public class LoginViewModel extends BaseViewModel {
     }
 
     public void onLoginClick() {
-        EventHelper.report(EventId.hf1000302);
         String phoneNumText = phoneNum.getValue();
         if (!isPhone(phoneNumText)) {
             ToastUtil.show(R.string.login_phone_num_11, ToastUtil.LENGTH_SHORT);
@@ -232,7 +220,6 @@ public class LoginViewModel extends BaseViewModel {
             return;
         }
         if (!BoxingUtil.boxing(isCheckedAgreement.getValue())) {
-            EventHelper.report(EventId.hf1000304, Maps.asMap(EventId.EVENT_ID, "hf11019"));
             ToastUtil.show(R.string.login_please_agree, ToastUtil.LENGTH_SHORT);
             return;
         }
@@ -249,19 +236,16 @@ public class LoginViewModel extends BaseViewModel {
                         showLoading.setValue(false);
                         ToastUtil.show(R.string.login_success, ToastUtil.LENGTH_SHORT);
                         finishEvent.call();
-                        EventHelper.report(EventId.hf1000303);
                     }
 
                     @Override
                     public void onError(@NonNull Throwable e) {
                         showLoading.setValue(false);
                         if (e instanceof AccountRepository.LoginTooOftenException) {
-                            EventHelper.report(EventId.hf1000304, Maps.asMap(EventId.EVENT_ID, "hf11022"));
                             ToastUtil.show(R.string.login_too_often_toast, ToastUtil.LENGTH_SHORT);
                             return;
                         }
                         if (e instanceof NetworkErrorException) {
-                            EventHelper.report(EventId.hf1000304, Maps.asMap(EventId.EVENT_ID, "hf11019"));
                             ToastUtil.show(R.string.net_error, ToastUtil.LENGTH_SHORT);
                             return;
                         }
@@ -269,14 +253,11 @@ public class LoginViewModel extends BaseViewModel {
                                 = e instanceof RxHttpHandler.ServerErrorException ? ((RxHttpHandler.ServerErrorException) e) : null;
                         if (serverErrorException != null) {
                             if (serverErrorException.getCode() == ErrorCode.ERROR_CODE_VERIFICATION_CODE_ERROR) {
-                                EventHelper.report(EventId.hf1000304, Maps.asMap(EventId.EVENT_ID, "hf11021"));
                                 ToastUtil.show(R.string.login_verification_code_error_toast, ToastUtil.LENGTH_SHORT);
                             } else {
-                                EventHelper.report(EventId.hf1000304, Maps.asMap(EventId.EVENT_ID, "hf11022"));
                                 ToastUtil.show(serverErrorException.getMsg(), ToastUtil.LENGTH_SHORT);
                             }
                         } else {
-                            EventHelper.report(EventId.hf1000304, Maps.asMap(EventId.EVENT_ID, "hf11022"));
                             ToastUtil.show(R.string.login_failed_toast, ToastUtil.LENGTH_SHORT);
                         }
                     }
@@ -300,12 +281,4 @@ public class LoginViewModel extends BaseViewModel {
         Matcher matcher = phonePattern.matcher(phoneNumText);
         return matcher.matches();
     }
-
-    public void setReportId(String reportId) {
-        if (!TextUtils.isEmpty(this.reportId)) {
-            return;
-        }
-        this.reportId = reportId;
-        EventHelper.report(EventId.hf1000301, Maps.asMap(EventId.EVENT_ID, reportId));
-    }
 }

+ 8 - 16
app/src/main/java/com/datarecovery/master/module/main/MainActivity.java

@@ -11,10 +11,9 @@ import androidx.fragment.app.Fragment;
 
 import com.atmob.app.lib.base.BaseActivity;
 import com.datarecovery.master.R;
-import com.datarecovery.master.data.consts.EventId;
+import com.datarecovery.master.data.consts.AdFuncId;
 import com.datarecovery.master.databinding.ActivityMainBinding;
 import com.datarecovery.master.databinding.ItemMainTabLayoutBinding;
-import com.datarecovery.master.handler.EventHelper;
 import com.datarecovery.master.module.audiorecover.AudioRecoverActivity;
 import com.datarecovery.master.module.example.ExampleFragment;
 import com.datarecovery.master.module.filerecover.FileRecoverActivity;
@@ -24,12 +23,10 @@ import com.datarecovery.master.module.member.MemberType;
 import com.datarecovery.master.module.mine.MineFragment;
 import com.datarecovery.master.module.order.OrderFragment;
 import com.datarecovery.master.module.videorecover.VideoRecoverActivity;
-import com.datarecovery.master.sdk.qiyu.QiYuHelper;
-import com.datarecovery.master.utils.Maps;
+import com.datarecovery.master.sdk.ad.AtmobAdHelper;
 import com.datarecovery.master.utils.ToastUtil;
 import com.google.android.material.tabs.TabLayout;
 import com.google.android.material.tabs.TabLayoutMediator;
-import com.qiyukf.unicorn.api.Unicorn;
 
 import dagger.hilt.android.AndroidEntryPoint;
 
@@ -38,14 +35,12 @@ import dagger.hilt.android.AndroidEntryPoint;
 public class MainActivity extends BaseActivity<ActivityMainBinding> {
 
 
+    private static final String MEMBER_TYPE = "member_type";
     private MainViewModel mainViewModel;
-
     private TabLayoutMediator tabLayoutMediator;
     private MainPagerAdapter mainPagerAdapter;
     private long mExitTime;
 
-    private static final String MEMBER_TYPE = "member_type";
-
     public static void start(Context context) {
         Intent intent = new Intent(context, MainActivity.class);
         if (!(context instanceof Activity)) {
@@ -74,13 +69,13 @@ public class MainActivity extends BaseActivity<ActivityMainBinding> {
                         ImageRecoverActivity.start(this, MemberType.APP_IMAGE_RECOVER);
                         break;
                     case MemberType.APP_FILE_RECOVER:
-                        FileRecoverActivity.start(this, false);
+                        FileRecoverActivity.start(this);
                         break;
                     case MemberType.APP_VIDEO_RECOVER:
-                        VideoRecoverActivity.start(this, false);
+                        VideoRecoverActivity.start(this);
                         break;
                     case MemberType.APP_AUDIO_RECOVER:
-                        AudioRecoverActivity.start(this, false);
+                        AudioRecoverActivity.start(this);
                         break;
                     case MemberType.APP_IMAGE_CLEAN:
                         ImageRecoverActivity.start(this, MemberType.APP_IMAGE_CLEAN);
@@ -95,7 +90,6 @@ public class MainActivity extends BaseActivity<ActivityMainBinding> {
         super.onCreate(savedInstanceState);
         initView();
         initObserver();
-        QiYuHelper.initSdk();
     }
 
     private void initObserver() {
@@ -125,13 +119,11 @@ public class MainActivity extends BaseActivity<ActivityMainBinding> {
                 }
                 Class<? extends Fragment> pagerClass = mainPagerAdapter.getMainPagerItemByPosition(tab.getPosition()).getPagerClass();
                 if (pagerClass.equals(HomePageFragment.class)) {
-                    EventHelper.report(EventId.hf1000515, Maps.asMap(EventId.EVENT_ID, "hf11015"));
                 } else if (pagerClass.equals(ExampleFragment.class)) {
-                    EventHelper.report(EventId.hf1000515, Maps.asMap(EventId.EVENT_ID, "hf11016"));
+                    AtmobAdHelper.showInterstitial(AdFuncId.INTERSTITIAL_CASE, null);
                 } else if (pagerClass.equals(OrderFragment.class)) {
-                    EventHelper.report(EventId.hf1000901);
                 } else if (pagerClass.equals(MineFragment.class)) {
-                    EventHelper.report(EventId.hf1000515, Maps.asMap(EventId.EVENT_ID, "hf11018"));
+                    AtmobAdHelper.showInterstitial(AdFuncId.INTERSTITIAL_MINE, null);
                 }
             }
 

+ 1 - 3
app/src/main/java/com/datarecovery/master/module/main/MainPagerAdapter.java

@@ -6,10 +6,9 @@ import androidx.fragment.app.FragmentActivity;
 import androidx.viewpager2.adapter.FragmentStateAdapter;
 
 import com.datarecovery.master.R;
-import com.datarecovery.master.module.mine.MineFragment;
 import com.datarecovery.master.module.example.ExampleFragment;
 import com.datarecovery.master.module.homepage.HomePageFragment;
-import com.datarecovery.master.module.order.OrderFragment;
+import com.datarecovery.master.module.mine.MineFragment;
 
 import java.util.Arrays;
 import java.util.List;
@@ -19,7 +18,6 @@ public class MainPagerAdapter extends FragmentStateAdapter {
     private final List<MainPagerItem> mainPagerItems = Arrays.asList(
             new MainPagerItem(R.string.main_pager_front_page, R.drawable.selector_icon_main_tab_home_page, HomePageFragment.class),
             new MainPagerItem(R.string.main_pager_example, R.drawable.selector_icon_main_tab_example, ExampleFragment.class),
-            new MainPagerItem(R.string.main_pager_order, R.drawable.selector_icon_main_tab_order, OrderFragment.class),
             new MainPagerItem(R.string.main_pager_mine, R.drawable.selector_icon_main_tab_mine, MineFragment.class)
     );
 

+ 1 - 6
app/src/main/java/com/datarecovery/master/module/member/MemberActivity.java

@@ -115,10 +115,7 @@ public class MemberActivity extends BaseActivity<ActivityMemberBinding> {
                 new String[]{getResources().getString(R.string.member_service_description)},
                 Color.parseColor("#FCEAC7"),
                 false,
-                v -> {
-                    ServiceDescriptionActivity.start(this, memberViewModel.getServiceContentTxt());
-                    EventHelper.report(EventId.hf1001133, Maps.asMap(EventId.EVENT_ID, ReportUtil.getReportId(memberViewModel.getMemberType())));
-                }
+                v -> ServiceDescriptionActivity.start(this, memberViewModel.getServiceContentTxt())
         );
     }
 
@@ -225,13 +222,11 @@ public class MemberActivity extends BaseActivity<ActivityMemberBinding> {
                     .setActionHandler(new MemberRetentionDialog.ActionHandler() {
                         @Override
                         public void onCloseClick() {
-                            EventHelper.report(EventId.hf1000607, Maps.asMap(EventId.EVENT_ID, ReportUtil.getReportId(memberViewModel.getMemberType())));
                             finish();
                         }
 
                         @Override
                         public void onContinueClick() {
-                            EventHelper.report(EventId.hf1000608, Maps.asMap(EventId.EVENT_ID, ReportUtil.getReportId(memberViewModel.getMemberType())));
                             memberViewModel.onRetainMemberSubscribeClick();
                         }
                     });

+ 0 - 95
app/src/main/java/com/datarecovery/master/module/member/MemberViewModel.java

@@ -144,9 +144,6 @@ public class MemberViewModel extends BaseViewModel {
     }
 
     public void setSelectBean(MemberGoodsBean bean) {
-        if (bean != null) {
-            EventHelper.report(EventId.hf1000601, Maps.asMap(EventId.EVENT_ID, ReportUtil.getReportId(memberType)));
-        }
         selectBean.setValue(bean);
     }
 
@@ -177,44 +174,10 @@ public class MemberViewModel extends BaseViewModel {
         } else {
             subscribeTxt.setValue(ContextUtil.getContext().getString(R.string.member_recover_buy));
         }
-        reportId();
         initCommentData();
         refreshMemberDetail();
     }
 
-    private void reportId() {
-        switch (memberType) {
-            case MemberType.APP_WX_MESSAGE_RECOVER:
-                EventHelper.report(EventId.hf1000501);
-                EventHelper.timeEvent(EventId.hf1000516);
-                break;
-            case MemberType.APP_WX_FRIEND_RECOVER:
-                EventHelper.report(EventId.hf1000503);
-                EventHelper.timeEvent(EventId.hf1000518);
-                break;
-            case MemberType.APP_IMAGE_RECOVER:
-                EventHelper.report(EventId.hf1000505);
-                EventHelper.timeEvent(EventId.hf1000520);
-                break;
-            case MemberType.APP_FILE_RECOVER:
-                EventHelper.report(EventId.hf1000507);
-                EventHelper.timeEvent(EventId.hf1000522);
-                break;
-            case MemberType.APP_VIDEO_RECOVER:
-                EventHelper.report(EventId.hf1000509);
-                EventHelper.timeEvent(EventId.hf1000524);
-                break;
-            case MemberType.APP_AUDIO_RECOVER:
-                EventHelper.report(EventId.hf1000511);
-                EventHelper.timeEvent(EventId.hf1000526);
-                break;
-            case MemberType.APP_IMAGE_CLEAN:
-                EventHelper.report(EventId.hf1000513);
-                EventHelper.timeEvent(EventId.hf1000528);
-                break;
-        }
-    }
-
     private void initCommentData() {
         List<EvaluateBean> evaluateBeans = new ArrayList<>();
         evaluateBeans.add(new EvaluateBean(R.drawable.icon_evaluate_1, "冬季温暖优雅", "我非常满意数据恢复服务的效果。他们专业的团队帮助我成功恢复了丢失的文件,让我感到非常安心和放心。他们高效的工作速度和专业的技术水平让我对他们的服务印象深刻。强烈推荐!"));
@@ -324,7 +287,6 @@ public class MemberViewModel extends BaseViewModel {
                 return;
             }
         }
-        EventHelper.report(EventId.hf1000602, Maps.asMap(EventId.EVENT_ID, ReportUtil.getReportId(memberType)));
         MemberGoodsBean currentSelected = selectBean.getValue();
         if (currentSelected == null) {
             return;
@@ -339,15 +301,6 @@ public class MemberViewModel extends BaseViewModel {
         if (bean == null) {
             return;
         }
-        if (payPlatform == 1 && payMethod == 2) {
-
-        } else if (payPlatform == 4 && payMethod == 2) {
-
-        } else if (payPlatform == 1 && payMethod == 1) {
-            EventHelper.report(EventId.hf1000603, Maps.asMap(EventId.EVENT_ID, "hf11023"));
-        } else if (payPlatform == 4 && payMethod == 1) {
-            EventHelper.report(EventId.hf1000603, Maps.asMap(EventId.EVENT_ID, "hf11024"));
-        }
         memberRepository.requestPayOrder(bean.getId(), payPlatform, payMethod).subscribe(new SingleObserver<MemberPayResponse>() {
             @Override
             public void onSubscribe(@NonNull Disposable d) {
@@ -432,10 +385,8 @@ public class MemberViewModel extends BaseViewModel {
             public void error(int errno, String error) {
                 if (errno == 6001) {
                     //用户取消支付
-                    EventHelper.report(EventId.hf1000606, Maps.asMap(EventId.EVENT_ID, "hf11028"));
                     return;
                 }
-                EventHelper.report(EventId.hf1000606, Maps.asMap(EventId.EVENT_ID, "hf11022"));
                 ToastUtil.show(R.string.member_payment_failed, ToastUtil.LENGTH_SHORT);
             }
 
@@ -443,10 +394,8 @@ public class MemberViewModel extends BaseViewModel {
             public void payError(int errno, String error) {
                 if (errno == 6001) {
                     //用户取消支付
-                    EventHelper.report(EventId.hf1000606, Maps.asMap(EventId.EVENT_ID, "hf11028"));
                     return;
                 }
-                EventHelper.report(EventId.hf1000606, Maps.asMap(EventId.EVENT_ID, "hf11022"));
                 ToastUtil.show(R.string.member_payment_failed, ToastUtil.LENGTH_SHORT);
             }
 
@@ -488,21 +437,6 @@ public class MemberViewModel extends BaseViewModel {
                 .subscribe(aBoolean -> {
                     showLoadingEvent.setValue(false);
                     if (BoxingUtil.boxing(aBoolean)) {
-                        EventHelper.report(EventId.hf1000604, Maps.asMap(EventId.EVENT_ID, ReportUtil.getReportId(memberType)));
-                        if (memberBean != null) {
-                            Map<String, Object> map = new HashMap<>();
-                            if (Objects.equals(memberBean.getAuths(), MemberType.APP_SUPER_RECOVER)) {
-                                map.put(EventId.EVENT_ID, "hf11026");
-                                EventHelper.report(EventId.hf1000605, map);
-                            } else if (Objects.equals(memberBean.getAuths(), MemberType.APP_IMAGE_CLEAN) && memberBean.isPopular()) {
-                                map.put(EventId.EVENT_ID, "hf11027");
-                                EventHelper.report(EventId.hf1000605, map);
-                            } else {
-                                map.put(EventId.EVENT_ID, "hf11025");
-                            }
-                            map.put(EventId.EVENT_TYPE1, ReportUtil.getReportId(memberType));
-                            EventHelper.report(EventId.hf1000605, map);
-                        }
                         payRepository.refreshOrderPageList();
                         onSubscribeSuccessEvent.setValue(orderId);
                     }
@@ -512,35 +446,6 @@ public class MemberViewModel extends BaseViewModel {
                 });
     }
 
-
-    @Override
-    protected void onCleared() {
-        super.onCleared();
-        switch (memberType) {
-            case MemberType.APP_WX_MESSAGE_RECOVER:
-                EventHelper.report(EventId.hf1000516);
-                break;
-            case MemberType.APP_WX_FRIEND_RECOVER:
-                EventHelper.report(EventId.hf1000518);
-                break;
-            case MemberType.APP_IMAGE_RECOVER:
-                EventHelper.report(EventId.hf1000520);
-                break;
-            case MemberType.APP_FILE_RECOVER:
-                EventHelper.report(EventId.hf1000522);
-                break;
-            case MemberType.APP_VIDEO_RECOVER:
-                EventHelper.report(EventId.hf1000524);
-                break;
-            case MemberType.APP_AUDIO_RECOVER:
-                EventHelper.report(EventId.hf1000526);
-                break;
-            case MemberType.APP_IMAGE_CLEAN:
-                EventHelper.report(EventId.hf1000528);
-                break;
-        }
-    }
-
     public List<Pair<CharSequence, CharSequence>> getInformationList() {
         informationList.clear();
         switch (memberType) {

+ 7 - 19
app/src/main/java/com/datarecovery/master/module/mine/MineFragment.java

@@ -8,11 +8,11 @@ import androidx.annotation.Nullable;
 
 import com.atmob.app.lib.base.BaseFragment;
 import com.datarecovery.master.R;
-import com.datarecovery.master.data.consts.EventId;
+import com.datarecovery.master.data.consts.AdFuncId;
 import com.datarecovery.master.databinding.FragmentMineBinding;
 import com.datarecovery.master.dialog.CommonLoadingDialog;
 import com.datarecovery.master.dialog.CommonSureDialog;
-import com.datarecovery.master.handler.EventHelper;
+import com.datarecovery.master.sdk.ad.AtmobAdHelper;
 import com.datarecovery.master.utils.BoxingUtil;
 import com.gyf.immersionbar.ImmersionBar;
 
@@ -42,7 +42,7 @@ public class MineFragment extends BaseFragment<FragmentMineBinding> {
     }
 
     private void initView() {
-
+        AtmobAdHelper.showNative(AdFuncId.NATIVE_MINE, binding.adContainer);
     }
 
     public void showLoadingDialog(Boolean show) {
@@ -63,14 +63,8 @@ public class MineFragment extends BaseFragment<FragmentMineBinding> {
         if (exitDialog == null) {
             exitDialog = new CommonSureDialog(requireContext());
             exitDialog.setDialogTitle(R.string.dialog_kind_tips).setDialogContent(R.string.dialog_exit_content);
-            exitDialog.setOnDialogClickListener(() -> {
-                EventHelper.report(EventId.hf1001113);
-                mineViewModel.onAccountExit();
-            });
-            exitDialog.setOnCancelClick(v -> {
-                exitDialog.dismiss();
-                EventHelper.report(EventId.hf1001114);
-            });
+            exitDialog.setOnDialogClickListener(() -> mineViewModel.onAccountExit());
+            exitDialog.setOnCancelClick(v -> exitDialog.dismiss());
         }
         exitDialog.show();
     }
@@ -79,14 +73,8 @@ public class MineFragment extends BaseFragment<FragmentMineBinding> {
         if (logoutDialog == null) {
             logoutDialog = new CommonSureDialog(requireContext());
             logoutDialog.setDialogTitle(R.string.dialog_logout_tips).setDialogContent(R.string.dialog_logout_content);
-            logoutDialog.setOnDialogClickListener(() -> {
-                EventHelper.report(EventId.hf1001110);
-                mineViewModel.onAccountLogout();
-            });
-            logoutDialog.setOnCancelClick(v -> {
-                logoutDialog.dismiss();
-                EventHelper.report(EventId.hf1001111);
-            });
+            logoutDialog.setOnDialogClickListener(() -> mineViewModel.onAccountLogout());
+            logoutDialog.setOnCancelClick(v -> logoutDialog.dismiss());
         }
         logoutDialog.show();
     }

+ 2 - 40
app/src/main/java/com/datarecovery/master/module/mine/MineViewModel.java

@@ -14,27 +14,19 @@ import com.datarecovery.master.R;
 import com.datarecovery.master.data.api.response.CustomerUrlResponse;
 import com.datarecovery.master.data.consts.ChannelHelper;
 import com.datarecovery.master.data.consts.ChannelId;
-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.handler.EventHelper;
 import com.datarecovery.master.module.about.AboutActivity;
 import com.datarecovery.master.module.customerservice.CustomerServiceActivity;
 import com.datarecovery.master.module.feedback.UserFeedbackActivity;
-import com.datarecovery.master.module.homepage.HomePageViewModel;
+import com.datarecovery.master.module.imgrecover.ImageRecoverActivity;
 import com.datarecovery.master.module.login.LoginActivity;
-import com.datarecovery.master.module.member.MemberActivity;
 import com.datarecovery.master.module.member.MemberType;
-import com.datarecovery.master.module.wxrecover.WeChatRecoverActivity;
-import com.datarecovery.master.sdk.qiyu.QiYuHelper;
 import com.datarecovery.master.sdk.wechat.WechatHelper;
 import com.datarecovery.master.utils.BoxingUtil;
-import com.datarecovery.master.utils.ReportUtil;
 import com.datarecovery.master.utils.RxHttpHandler;
 import com.datarecovery.master.utils.ToastUtil;
-import com.qiyukf.unicorn.api.Unicorn;
 
 import javax.inject.Inject;
 
@@ -135,12 +127,10 @@ public class MineViewModel extends BaseViewModel {
     }
 
     public void onAboutClick() {
-        EventHelper.report(EventId.hf1001102);
         AboutActivity.start(ActivityUtil.getTopActivity());
     }
 
     public void onExitClick() {
-        EventHelper.report(EventId.hf1001112);
         showExitDialog.call();
     }
 
@@ -148,11 +138,6 @@ public class MineViewModel extends BaseViewModel {
         accountRepository.requestUserLogout();
     }
 
-    public void onLogoutClick() {
-        EventHelper.report(EventId.hf1001109);
-        showLogoutDialog.call();
-    }
-
     public void onAccountLogout() {
         accountRepository.userDeprecate().subscribe(new SingleObserver<Object>() {
             @Override
@@ -163,7 +148,6 @@ public class MineViewModel extends BaseViewModel {
             @Override
             public void onSuccess(@NonNull Object object) {
                 ToastUtil.show(R.string.account_logout_success, ToastUtil.LENGTH_SHORT);
-                QiYuHelper.logout();
                 accountRepository.logout();
             }
 
@@ -180,33 +164,16 @@ public class MineViewModel extends BaseViewModel {
     }
 
     public void onFeedbackClick() {
-        EventHelper.report(EventId.hf1001105);
         UserFeedbackActivity.start(ActivityUtil.getTopActivity());
     }
 
     public void onMemberClick() {
-        EventHelper.report(EventId.hf1001101);
-        //指定跳转至微信消息恢复
-        isHaveAuths(MemberType.APP_WX_MESSAGE_RECOVER, isTrial -> WeChatRecoverActivity.start(ActivityUtil.getTopActivity(), MemberType.APP_WX_MESSAGE_RECOVER));
-    }
-
-    public void isHaveAuths(@MemberType String type, HomePageViewModel.NextStepCallback stepCallback) {
-        if (deviceFuncRepository.isHaveAuth(type)) {
-            if (stepCallback != null) stepCallback.onNextStep(false);
-        } else {
-            MemberActivity.start(ActivityUtil.getTopActivity(), type);
-        }
-    }
-
-    public void onCustomerServiceClick() {
-        EventHelper.report(EventId.hf1001108);
-        refreshCustomerUrl();
+        ImageRecoverActivity.start(ActivityUtil.getTopActivity(), MemberType.APP_IMAGE_RECOVER);
     }
 
     private void goCustomer(@NonNull CustomerUrlResponse customerResponse) {
         switch (customerResponse.getMethod()) {
             case CustomerUrlResponse.CustomerMethod.METHOD_QIYU:
-                QiYuHelper.openServiceActivity(ContextUtil.getContext());
                 break;
             case CustomerUrlResponse.CustomerMethod.METHOD_ALI:
                 CustomerServiceActivity.start(ActivityUtil.getTopActivity(), customerResponse.getCustomerUrl());
@@ -219,9 +186,4 @@ public class MineViewModel extends BaseViewModel {
                 break;
         }
     }
-
-    public void onAppealClick() {
-        EventHelper.report(EventId.hf1001115);
-        refreshCustomerUrl();
-    }
 }

+ 0 - 1
app/src/main/java/com/datarecovery/master/module/order/OrderItemAdapter.java

@@ -115,7 +115,6 @@ public class OrderItemAdapter extends RecyclerView.Adapter<OrderItemAdapter.View
                 OrderBean orderBean = binding.getOrderBean();
                 ClipboardUtil.copy(orderBean.getTutorialLink());
                 ToastUtil.show(R.string.copy_success, ToastUtil.LENGTH_SHORT);
-                EventHelper.report(EventId.hf1001129);
             });
             binding.setCopyAuthCodeClick(v -> {
                 OrderBean orderBean = binding.getOrderBean();

+ 0 - 8
app/src/main/java/com/datarecovery/master/module/order/OrderViewModel.java

@@ -106,7 +106,6 @@ public class OrderViewModel extends BaseViewModel {
         if (orderBean == null) {
             return;
         }
-        EventHelper.report(EventId.hf1001131, Maps.asMap(EventId.EVENT_ID, ReportUtil.getReportId(orderBean.getAuths())));
         payRepository.cancelOrder(orderBean.getId()).subscribe(new SingleObserver<Object>() {
             @Override
             public void onSubscribe(@NonNull Disposable d) {
@@ -149,18 +148,11 @@ public class OrderViewModel extends BaseViewModel {
         int payPlatform = orderBean.getPayPlatform();
         int payMethod = orderBean.getPayMethod();
         int goodsId = orderBean.getItemId();
-        HashMap<String, Object> map = new HashMap<>(2);
-        map.put(EventId.EVENT_ID, ReportUtil.getReportId(orderBean.getAuths()));
         if (orderBean.getPayPlatform() == 1 && orderBean.getPayMethod() == 2) {
-
         } else if (orderBean.getPayPlatform() == 4 && orderBean.getPayMethod() == 2) {
-
         } else if (orderBean.getPayPlatform() == 1 && orderBean.getPayMethod() == 1) {//支付宝
-            map.put(EventId.EVENT_TYPE1, "hf11023");
         } else if (orderBean.getPayPlatform() == 4 && orderBean.getPayMethod() == 1) {//支付宝扫码
-            map.put(EventId.EVENT_TYPE1, "hf11024");
         }
-        EventHelper.report(EventId.hf1001132, map);
         memberRepository.payOrder(new PayOptions(
                 this::addDisposable,
                 goodsId,

+ 37 - 41
app/src/main/java/com/datarecovery/master/module/preview/PreviewActivity.java

@@ -7,7 +7,6 @@ import android.content.Intent;
 import android.media.MediaPlayer;
 import android.net.Uri;
 import android.os.Bundle;
-import android.text.TextUtils;
 import android.view.SurfaceHolder;
 import android.widget.SeekBar;
 
@@ -19,16 +18,16 @@ import androidx.viewpager2.widget.ViewPager2;
 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.data.consts.AdFuncId;
 import com.datarecovery.master.databinding.ActivityPreviewBinding;
 import com.datarecovery.master.dialog.CommonSureDialog;
-import com.datarecovery.master.handler.EventHelper;
+import com.datarecovery.master.dialog.UnlockFunctionDialog;
 import com.datarecovery.master.module.member.MemberType;
+import com.datarecovery.master.sdk.ad.AtmobAdHelper;
+import com.datarecovery.master.sdk.ad.RewardVideoListenerAdapter;
 import com.datarecovery.master.utils.BoxingUtil;
 import com.datarecovery.master.utils.FilesSearch;
 import com.datarecovery.master.utils.ImageDeepDetector;
-import com.datarecovery.master.utils.Maps;
-import com.datarecovery.master.utils.ReportUtil;
 import com.datarecovery.master.utils.SafeMediaPlayer;
 import com.datarecovery.master.utils.ToastUtil;
 import com.gyf.immersionbar.ImmersionBar;
@@ -52,16 +51,12 @@ public class PreviewActivity extends BaseActivity<ActivityPreviewBinding> {
 
     private ViewPager2.OnPageChangeCallback onPageChangeCallback;
     private CommonSureDialog showFreeStopDialog;
+    private UnlockFunctionDialog unlockFunctionDialog;
 
-    @IntDef({TYPE_IMG, TYPE_VIDEO, TYPE_AUDIO})
-    @interface Type {
-    }
-
-    public static void startImagePreView(Context context, List<ImageDeepDetector.ImageFile> imageFileList, int position, boolean isTrial) {
+    public static void startImagePreView(Context context, List<ImageDeepDetector.ImageFile> imageFileList, int position) {
         Intent intent = new Intent(context, PreviewActivity.class);
         intent.putExtra("type", TYPE_IMG);
         intent.putExtra("position", position);
-        intent.putExtra("isTrial", isTrial);
         PreviewViewModel.weakReference = new WeakReference<>(imageFileList);
         if (!(context instanceof Activity)) {
             intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
@@ -69,10 +64,9 @@ public class PreviewActivity extends BaseActivity<ActivityPreviewBinding> {
         context.startActivity(intent);
     }
 
-    public static void startDocumentPreView(Context context, @Type int type, FilesSearch.DocumentFile documentFile, boolean isTrial) {
+    public static void startDocumentPreView(Context context, @Type int type, FilesSearch.DocumentFile documentFile) {
         Intent intent = new Intent(context, PreviewActivity.class);
         intent.putExtra("type", type);
-        intent.putExtra("isTrial", isTrial);
         PreviewViewModel.weakReference = new WeakReference<>(documentFile);
         if (!(context instanceof Activity)) {
             intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
@@ -102,6 +96,8 @@ public class PreviewActivity extends BaseActivity<ActivityPreviewBinding> {
         initView();
         initIntentData();
         initObserver();
+
+        AtmobAdHelper.showInterstitial(AdFuncId.INTERSTITIAL_PREVIEW, null);
     }
 
     private void initObserver() {
@@ -124,6 +120,26 @@ public class PreviewActivity extends BaseActivity<ActivityPreviewBinding> {
         previewViewModel.getHandlePlayProgress().observe(this, o -> previewViewModel.handleMediaPlayerProgress(mediaPlayer.getCurrentPosition()));
         previewViewModel.getRefreshAudioCurrentProgress().observe(this, o -> binding.previewAudioSeekbar.setProgress(mediaPlayer.getCurrentPosition()));
         previewViewModel.getShowTrialExportFailDialog().observe(this, o -> showTrialExportFailDialog());
+        previewViewModel.getShowUnlockEvent().observe(this, o -> showUnlockDialog());
+    }
+
+    private void showUnlockDialog() {
+        if (unlockFunctionDialog == null) {
+            unlockFunctionDialog = new UnlockFunctionDialog(this)
+                    .setActionHandler(new UnlockFunctionDialog.ActionHandler() {
+                        @Override
+                        public void onUnlock() {
+                            AtmobAdHelper.showVideo(AdFuncId.REWARD_RECOVER, new RewardVideoListenerAdapter() {
+                                @Override
+                                public void onRewarded(@NonNull String token) {
+                                    super.onRewarded(token);
+                                    previewViewModel.doExport();
+                                }
+                            });
+                        }
+                    });
+        }
+        unlockFunctionDialog.show();
     }
 
     private void showFreeStopDialog() {
@@ -137,21 +153,7 @@ public class PreviewActivity extends BaseActivity<ActivityPreviewBinding> {
                         .setDialogContent(R.string.trial_export_audio_fail_content);
             }
             showFreeStopDialog.setSureText(R.string.dialog_trial_recover);
-            showFreeStopDialog.setOnDialogClickListener(() -> {
-                if (previewViewModel.getType() == TYPE_VIDEO) {
-                    EventHelper.report(EventId.hf1001125);
-                } else if (previewViewModel.getType() == TYPE_AUDIO) {
-                    EventHelper.report(EventId.hf1001127);
-                }
-                previewViewModel.onTrialRecoverClick();
-            });
-            showFreeStopDialog.setOnDismissListener(dialog -> {
-                if (previewViewModel.getType() == TYPE_VIDEO) {
-                    EventHelper.report(EventId.hf1001126);
-                } else if (previewViewModel.getType() == TYPE_AUDIO) {
-                    EventHelper.report(EventId.hf1001128);
-                }
-            });
+            showFreeStopDialog.setOnDialogClickListener(() -> previewViewModel.onTrialRecoverClick());
         }
         showFreeStopDialog.show();
     }
@@ -171,25 +173,15 @@ public class PreviewActivity extends BaseActivity<ActivityPreviewBinding> {
             } else {
                 evenType = null;
             }
-            showTrialExportFailDialog.setOnDialogClickListener(() -> {
-                EventHelper.report(EventId.hf1001123, Maps.asMap(EventId.EVENT_ID, ReportUtil.getReportId(evenType)));
-                previewViewModel.onTrialRecoverClick();
-            });
-            showTrialExportFailDialog.setOnDismissListener(dialog -> {
-                if (!TextUtils.isEmpty(evenType)) {
-                    EventHelper.report(EventId.hf1001124, Maps.asMap(EventId.EVENT_ID, ReportUtil.getReportId(evenType)));
-                }
-            });
+            showTrialExportFailDialog.setOnDialogClickListener(() -> previewViewModel.onTrialRecoverClick());
         }
         showTrialExportFailDialog.show();
     }
 
-
     private void initIntentData() {
         int type = getIntent().getIntExtra("type", 0);
         int position = getIntent().getIntExtra("position", 0);
-        boolean isTrial = getIntent().getBooleanExtra("isTrial", false);
-        previewViewModel.setPreviewData(type, position, isTrial);
+        previewViewModel.setPreviewData(type, position);
         if (type == TYPE_IMG) {
             initImagePreviewPager();
         } else {
@@ -233,7 +225,7 @@ public class PreviewActivity extends BaseActivity<ActivityPreviewBinding> {
     }
 
     private void initImagePreviewPager() {
-        PreviewImagePagerAdapter imagePagerAdapter = new PreviewImagePagerAdapter(previewViewModel.getImagePreviewList(), previewViewModel.isTrial());
+        PreviewImagePagerAdapter imagePagerAdapter = new PreviewImagePagerAdapter(previewViewModel.getImagePreviewList());
         binding.previewViewPager.setAdapter(imagePagerAdapter);
         onPageChangeCallback = new ViewPager2.OnPageChangeCallback() {
             @Override
@@ -314,4 +306,8 @@ public class PreviewActivity extends BaseActivity<ActivityPreviewBinding> {
         if (mediaPlayer != null) mediaPlayer.release();
         binding.previewViewPager.unregisterOnPageChangeCallback(onPageChangeCallback);
     }
+
+    @IntDef({TYPE_IMG, TYPE_VIDEO, TYPE_AUDIO})
+    @interface Type {
+    }
 }

+ 4 - 11
app/src/main/java/com/datarecovery/master/module/preview/PreviewImagePagerAdapter.java

@@ -15,11 +15,9 @@ import java.util.List;
 public class PreviewImagePagerAdapter extends RecyclerView.Adapter<PreviewImagePagerAdapter.ViewHolder> {
 
     private final List<ImageDeepDetector.ImageFile> imageFileList;
-    private final boolean watermark;
 
-    public PreviewImagePagerAdapter(List<ImageDeepDetector.ImageFile> imageFileList, boolean watermark) {
+    public PreviewImagePagerAdapter(List<ImageDeepDetector.ImageFile> imageFileList) {
         this.imageFileList = imageFileList;
-        this.watermark = watermark;
     }
 
     @NonNull
@@ -40,20 +38,15 @@ public class PreviewImagePagerAdapter extends RecyclerView.Adapter<PreviewImageP
     }
 
 
-    public class ViewHolder extends RecyclerView.ViewHolder {
+    public static class ViewHolder extends RecyclerView.ViewHolder {
 
         private final ItemPreviewImgBinding binding;
 
         public ViewHolder(@NonNull ItemPreviewImgBinding binding) {
             super(binding.getRoot());
             this.binding = binding;
-            if (watermark) {
-                binding.watermarkView.setVisibility(View.VISIBLE);
-                binding.previewImg.setEnabled(false);
-            } else {
-                binding.watermarkView.setVisibility(View.GONE);
-                binding.previewImg.setEnabled(true);
-            }
+            binding.previewImg.setEnabled(true);
+            binding.watermarkView.setVisibility(View.GONE);
         }
 
         public void bind(ImageDeepDetector.ImageFile imageFile) {

+ 33 - 68
app/src/main/java/com/datarecovery/master/module/preview/PreviewViewModel.java

@@ -22,7 +22,6 @@ import com.datarecovery.master.utils.MediaStoreHelper;
 import com.datarecovery.master.utils.ToastUtil;
 
 import java.lang.ref.WeakReference;
-import java.util.ArrayList;
 import java.util.List;
 import java.util.Timer;
 import java.util.TimerTask;
@@ -40,22 +39,19 @@ public class PreviewViewModel extends BaseViewModel {
     private final MutableLiveData<Uri> previewUri = new MutableLiveData<>();
     private final MutableLiveData<Boolean> isPlaying = new MutableLiveData<>();
     private final DeviceFuncRepository deviceFuncRepository;
-    private List<ImageDeepDetector.ImageFile> imagePreviewList;
-
     private final SingleLiveEvent<?> showTrialExportFailDialog = new SingleLiveEvent<>();
     private final SingleLiveEvent<?> showFreeStopDialog = new SingleLiveEvent<>();
     private final SingleLiveEvent<?> refreshAudioCurrentProgress = new SingleLiveEvent<>();
     private final SingleLiveEvent<?> handlePlayProgress = new SingleLiveEvent<>();
     private final SingleLiveEvent<?> clickMediaPlayerEvent = new SingleLiveEvent<>();
     private final MutableLiveData<Integer> seekBarProgress = new MutableLiveData<>();
-
-    private int type;
-
     private final MutableLiveData<Boolean> isPlayStart = new MutableLiveData<>();
     private final MutableLiveData<ImageDeepDetector.ImageFile> currentImageFile = new MutableLiveData<>();
+    private final SingleLiveEvent<?> showUnlockEvent = new SingleLiveEvent<>();
+    private List<ImageDeepDetector.ImageFile> imagePreviewList;
+    private int type;
     private FilesSearch.DocumentFile currentFileFile;
     private int position;
-    private boolean isTrial;
     private Timer timer;
     private boolean isSeekbarChanging;
     private int totalDuration;
@@ -104,6 +100,14 @@ public class PreviewViewModel extends BaseViewModel {
         return isPlayStart;
     }
 
+    public LiveData<?> getShowUnlockEvent() {
+        return showUnlockEvent;
+    }
+
+    public void setIsPlayStart(boolean isPlayStart) {
+        this.isPlayStart.setValue(isPlayStart);
+    }
+
     public LiveData<ImageDeepDetector.ImageFile> getCurrentImageFile() {
         return currentImageFile;
     }
@@ -112,6 +116,16 @@ public class PreviewViewModel extends BaseViewModel {
         return position;
     }
 
+    public void setPosition(int position) {
+        if (type == PreviewActivity.TYPE_IMG) {
+            if (position != -1 && imagePreviewList != null && position < imagePreviewList.size()) {
+                ImageDeepDetector.ImageFile imageFile = imagePreviewList.get(position);
+                currentImageFile.setValue(imageFile);
+            }
+
+        }
+    }
+
     public List<ImageDeepDetector.ImageFile> getImagePreviewList() {
         return imagePreviewList;
     }
@@ -124,26 +138,21 @@ public class PreviewViewModel extends BaseViewModel {
         return type;
     }
 
-    public boolean isTrial() {
-        return isTrial;
-    }
-
     public LiveData<Uri> getPreviewUri() {
         return previewUri;
     }
 
-    public void setIsPlaying(boolean isPlaying) {
-        this.isPlaying.setValue(isPlaying);
-    }
-
     public LiveData<Boolean> getIsPlaying() {
         return isPlaying;
     }
 
-    public void setPreviewData(@PreviewActivity.Type int type, int position, boolean isTrial) {
+    public void setIsPlaying(boolean isPlaying) {
+        this.isPlaying.setValue(isPlaying);
+    }
+
+    public void setPreviewData(@PreviewActivity.Type int type, int position) {
         this.type = type;
         this.position = position;
-        this.isTrial = isTrial;
         switch (type) {
             case PreviewActivity.TYPE_AUDIO:
                 dealAudioInit();
@@ -157,7 +166,6 @@ public class PreviewViewModel extends BaseViewModel {
         }
     }
 
-
     private void dealVideoInit() {
         title.setValue(ContextUtil.getContext().getString(R.string.preview_video));
         if (weakReference != null) {
@@ -192,6 +200,10 @@ public class PreviewViewModel extends BaseViewModel {
         return null;
     }
 
+    public void setUri(Uri uri) {
+        this.previewUri.setValue(uri);
+    }
+
     private void dealImageInit() {
         title.setValue(ContextUtil.getContext().getString(R.string.preview_img));
         if (weakReference != null) {
@@ -199,11 +211,6 @@ public class PreviewViewModel extends BaseViewModel {
         }
     }
 
-
-    public void setUri(Uri uri) {
-        this.previewUri.setValue(uri);
-    }
-
     public void setIsPlayStart() {
         if (BoxingUtil.boxing(this.isPlayStart.getValue())) {
             return;
@@ -211,44 +218,11 @@ public class PreviewViewModel extends BaseViewModel {
         this.isPlayStart.setValue(true);
     }
 
-    public void setIsPlayStart(boolean isPlayStart) {
-        this.isPlayStart.setValue(isPlayStart);
-    }
-
-
-    public void setPosition(int position) {
-        if (type == PreviewActivity.TYPE_IMG) {
-            if (position != -1 && imagePreviewList != null && position < imagePreviewList.size()) {
-                ImageDeepDetector.ImageFile imageFile = imagePreviewList.get(position);
-                currentImageFile.setValue(imageFile);
-            }
-
-        }
+    public void onExportClick() {
+        showUnlockEvent.call();
     }
 
-    public void onExportClick() {
-        if (isTrial) {
-            if (type == PreviewActivity.TYPE_IMG) {
-                ImageDeepDetector.ImageFile value = currentImageFile.getValue();
-                if (value == null) return;
-                if (!value.isTrial()) {
-                    showTrialExportFailDialog.call();
-                    return;
-                }
-            } else if (type == PreviewActivity.TYPE_AUDIO) {
-                if (currentFileFile == null) return;
-                if (!currentFileFile.isTrial()) {
-                    showTrialExportFailDialog.call();
-                    return;
-                }
-            }
-        } else {
-            if (type == PreviewActivity.TYPE_IMG && !deviceFuncRepository.isHaveAuth(MemberType.APP_IMAGE_RECOVER)) {
-                return;
-            } else if (type == PreviewActivity.TYPE_AUDIO && !deviceFuncRepository.isHaveAuth(MemberType.APP_AUDIO_RECOVER)) {
-                return;
-            }
-        }
+    public void doExport() {
         RxJavaUtil.doInBackground(() -> {
                     if (type == PreviewActivity.TYPE_IMG) {
                         ImageDeepDetector.ImageFile value = currentImageFile.getValue();
@@ -275,7 +249,6 @@ public class PreviewViewModel extends BaseViewModel {
 
                 }
         );
-
     }
 
     @Override
@@ -311,9 +284,6 @@ public class PreviewViewModel extends BaseViewModel {
                     }
                     refreshAudioCurrentProgress.postValue(null);
                 }
-                if (isTrial && isPlaying.getValue() != null && isPlaying.getValue()) {
-                    handlePlayProgress.postValue(null);
-                }
             }
         }, 0, 100);
     }
@@ -332,11 +302,6 @@ public class PreviewViewModel extends BaseViewModel {
     }
 
     public void setSeekbarTo(int progress) {
-        if (isTrial && progress >= halfwayDuration) {
-            this.seekBarProgress.setValue(halfwayDuration);
-            showFreeStopDialog.call();
-            return;
-        }
         this.seekBarProgress.setValue(progress);
     }
 

+ 46 - 21
app/src/main/java/com/datarecovery/master/module/splash/SplashActivity.java

@@ -3,24 +3,36 @@ package com.datarecovery.master.module.splash;
 
 import android.annotation.SuppressLint;
 import android.os.Bundle;
-import android.os.Handler;
 
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
 
 import com.atmob.app.lib.base.BaseActivity;
+import com.atmob.common.runtime.ActivityUtil;
 import com.atmob.user.AtmobUser;
 import com.datarecovery.master.App;
+import com.datarecovery.master.data.consts.AdFuncId;
 import com.datarecovery.master.databinding.ActivitySplashBinding;
 import com.datarecovery.master.dialog.AgreementDialog;
 import com.datarecovery.master.module.main.MainActivity;
+import com.datarecovery.master.sdk.ad.AtmobAdHelper;
+import com.datarecovery.master.sdk.ad.SplashListenerAdapter;
 import com.gyf.immersionbar.ImmersionBar;
 
 @SuppressLint("CustomSplashScreen")
 public class SplashActivity extends BaseActivity<ActivitySplashBinding> {
 
     private AgreementDialog agreementDialog;
-    private final int delayMillis = 2000;
+
+    @Override
+    protected boolean shouldImmersion() {
+        return true;
+    }
+
+    @Override
+    protected void configImmersion(@NonNull ImmersionBar immersionBar) {
+        immersionBar.statusBarDarkFont(false);
+    }
 
     @Override
     protected void onCreate(@Nullable Bundle savedInstanceState) {
@@ -36,19 +48,6 @@ public class SplashActivity extends BaseActivity<ActivitySplashBinding> {
         }
     }
 
-    private void nextStep() {
-        showMain();
-    }
-
-    private void showMain() {
-        new Handler().postDelayed(this::goMain, delayMillis);
-    }
-
-    private void goMain() {
-        MainActivity.start(this);
-        finishAfterTransition();
-    }
-
     private void showPolicyDialog() {
         if (agreementDialog == null) {
             agreementDialog = new AgreementDialog(this);
@@ -70,14 +69,40 @@ public class SplashActivity extends BaseActivity<ActivitySplashBinding> {
         agreementDialog.show();
     }
 
-    @Override
-    protected boolean shouldImmersion() {
-        return true;
+    private void nextStep() {
+        if (ActivityUtil.isActivityExist(MainActivity.class)) {
+            // hot start
+            hotLaunchAd();
+        } else {
+            // cold start
+            coldLaunchAd();
+        }
     }
 
-    @Override
-    protected void configImmersion(@NonNull ImmersionBar immersionBar) {
-        immersionBar.statusBarDarkFont(false);
+    private void coldLaunchAd() {
+        showSplashAd(AdFuncId.SPLASH_COLD_LAUNCH_1, () -> showSplashAd(AdFuncId.SPLASH_COLD_LAUNCH_2, this::goMain));
     }
 
+    private void hotLaunchAd() {
+        showSplashAd(AdFuncId.SPLASH_HOT_LAUNCH, this::goMain);
+    }
+
+    private void showSplashAd(int adFuncId, Runnable action) {
+        AtmobAdHelper.showSplash(adFuncId, binding.clLayout, new SplashListenerAdapter() {
+            @Override
+            public void action() {
+                super.action();
+                if (action != null) {
+                    action.run();
+                }
+            }
+        });
+    }
+
+    private void goMain() {
+        if (!ActivityUtil.isActivityExist(MainActivity.class)) {
+            MainActivity.start(this);
+        }
+        finishAfterTransition();
+    }
 }

+ 31 - 47
app/src/main/java/com/datarecovery/master/module/videorecover/VideoRecoverActivity.java

@@ -9,24 +9,24 @@ import android.view.KeyEvent;
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
 import androidx.recyclerview.widget.GridLayoutManager;
-import androidx.recyclerview.widget.RecyclerView;
 
 import com.atmob.app.lib.base.BaseActivity;
 import com.datarecovery.master.R;
-import com.datarecovery.master.data.consts.EventId;
+import com.datarecovery.master.data.consts.AdFuncId;
+import com.datarecovery.master.data.consts.Constants;
 import com.datarecovery.master.databinding.ActivityVideoRecoverBinding;
 import com.datarecovery.master.dialog.CommonLoadingDialog;
 import com.datarecovery.master.dialog.CommonSureDialog;
 import com.datarecovery.master.dialog.ScanFileDialog;
-import com.datarecovery.master.handler.EventHelper;
-import com.datarecovery.master.module.member.MemberType;
+import com.datarecovery.master.dialog.UnlockFunctionDialog;
 import com.datarecovery.master.module.preview.PreviewActivity;
+import com.datarecovery.master.sdk.ad.AtmobAdHelper;
+import com.datarecovery.master.sdk.ad.RewardVideoListenerAdapter;
 import com.datarecovery.master.utils.BoxingUtil;
+import com.datarecovery.master.utils.CounterUtil;
 import com.datarecovery.master.utils.FilePermissionHelper;
 import com.datarecovery.master.utils.FilesSearch;
 import com.datarecovery.master.utils.GridRecoverItemDecoration;
-import com.datarecovery.master.utils.Maps;
-import com.datarecovery.master.utils.ReportUtil;
 import com.gyf.immersionbar.ImmersionBar;
 
 import dagger.hilt.android.AndroidEntryPoint;
@@ -43,14 +43,14 @@ public class VideoRecoverActivity extends BaseActivity<ActivityVideoRecoverBindi
     private VideoItemAdapter videoItemAdapter;
     private CommonSureDialog showTrialExportFailDialog;
     private CommonSureDialog showTrialFinishDialog;
+    private UnlockFunctionDialog unlockFunctionDialog;
 
 
-    public static void start(Context context, boolean isTrial) {
+    public static void start(Context context) {
         Intent intent = new Intent(context, VideoRecoverActivity.class);
         if (!(context instanceof Activity)) {
             intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
         }
-        intent.putExtra(IS_TRIAL, isTrial);
         context.startActivity(intent);
     }
 
@@ -64,14 +64,11 @@ public class VideoRecoverActivity extends BaseActivity<ActivityVideoRecoverBindi
     }
 
     private void initData() {
-        Intent intent = getIntent();
-        if (intent != null) {
-            videoRecoverViewModel.setIsTrial(intent.getBooleanExtra(IS_TRIAL, false));
-        }
+
     }
 
     private void initPermission() {
-        new FilePermissionHelper().requestDataFilePermission(this, MemberType.APP_VIDEO_RECOVER, videoRecoverViewModel.isTrial(), new FilePermissionHelper.NextStepCallback() {
+        new FilePermissionHelper().requestDataFilePermission(this, new FilePermissionHelper.NextStepCallback() {
             @Override
             public void onNextStep() {
                 videoRecoverViewModel.startVideoScanning();
@@ -91,6 +88,7 @@ public class VideoRecoverActivity extends BaseActivity<ActivityVideoRecoverBindi
         videoRecoverViewModel.getDetectedVideoList().observe(this, list -> videoItemAdapter.submit(list));
         videoRecoverViewModel.getScrollTop().observe(this, o -> binding.ryVideoRecover.scrollToPosition(0));
         videoRecoverViewModel.getShowScanDialogEvent().observe(this, this::showScanProgressDialog);
+        videoRecoverViewModel.getShowUnlockEvent().observe(this, o -> showUnlockDialog());
     }
 
     private void initView() {
@@ -99,19 +97,28 @@ public class VideoRecoverActivity extends BaseActivity<ActivityVideoRecoverBindi
         initRecycleView();
     }
 
+    private void showUnlockDialog() {
+        if (unlockFunctionDialog == null) {
+            unlockFunctionDialog = new UnlockFunctionDialog(this)
+                    .setActionHandler(() -> AtmobAdHelper.showVideo(AdFuncId.REWARD_RECOVER, new RewardVideoListenerAdapter() {
+                        @Override
+                        public void onRewarded(@NonNull String token) {
+                            super.onRewarded(token);
+                            videoRecoverViewModel.doExport();
+                        }
+                    }));
+        }
+        unlockFunctionDialog.show();
+    }
+
     private void showTrialFinishDialog() {
         if (showTrialFinishDialog == null) {
             showTrialFinishDialog = new CommonSureDialog(this);
             showTrialFinishDialog.setDialogTitle(getString(R.string.scanning_progress, 8))
                     .setDialogContent(getString(R.string.trial_scanning_finish_content, 8)).setSureText(R.string.dialog_trial_recover);
-            showTrialFinishDialog.setOnDialogClickListener(() -> {
-                videoRecoverViewModel.onTrialRecoverClick();
-                EventHelper.report(EventId.hf1001121, Maps.asMap(EventId.EVENT_ID, ReportUtil.getReportId(MemberType.APP_VIDEO_RECOVER)));
-            });
-            showTrialFinishDialog.setOnDismissListener(dialog -> EventHelper.report(EventId.hf1001122, Maps.asMap(EventId.EVENT_ID, ReportUtil.getReportId(MemberType.APP_VIDEO_RECOVER))));
+            showTrialFinishDialog.setOnDialogClickListener(() -> videoRecoverViewModel.onTrialRecoverClick());
         }
         if (!showTrialFinishDialog.isShowing()) {
-            EventHelper.report(EventId.hf1001118, Maps.asMap(EventId.EVENT_ID, ReportUtil.getReportId(MemberType.APP_VIDEO_RECOVER)));
             showTrialFinishDialog.show();
         }
     }
@@ -121,16 +128,11 @@ public class VideoRecoverActivity extends BaseActivity<ActivityVideoRecoverBindi
             showTrialExportFailDialog = new CommonSureDialog(this);
             showTrialExportFailDialog.setDialogTitle(R.string.trial_export_fail_title)
                     .setDialogContent(R.string.trial_export_fail_content).setSureText(R.string.dialog_trial_recover);
-            showTrialExportFailDialog.setOnDialogClickListener(() -> {
-                videoRecoverViewModel.onTrialRecoverClick();
-                EventHelper.report(EventId.hf1001123, Maps.asMap(EventId.EVENT_ID, ReportUtil.getReportId(MemberType.APP_VIDEO_RECOVER)));
-            });
-            showTrialExportFailDialog.setOnDismissListener(dialog -> EventHelper.report(EventId.hf1001124, Maps.asMap(EventId.EVENT_ID, ReportUtil.getReportId(MemberType.APP_VIDEO_RECOVER))));
+            showTrialExportFailDialog.setOnDialogClickListener(() -> videoRecoverViewModel.onTrialRecoverClick());
 
         }
         if (!showTrialExportFailDialog.isShowing()) {
             showTrialExportFailDialog.show();
-            EventHelper.report(EventId.hf1001120, Maps.asMap(EventId.EVENT_ID, ReportUtil.getReportId(MemberType.APP_VIDEO_RECOVER)));
         }
     }
 
@@ -151,30 +153,9 @@ public class VideoRecoverActivity extends BaseActivity<ActivityVideoRecoverBindi
 
             @Override
             public void onItemClick(FilesSearch.DocumentFile file) {
-                PreviewActivity.startDocumentPreView(VideoRecoverActivity.this, PreviewActivity.TYPE_VIDEO, file, videoRecoverViewModel.isTrial());
+                PreviewActivity.startDocumentPreView(VideoRecoverActivity.this, PreviewActivity.TYPE_VIDEO, file);
             }
         });
-        if (videoRecoverViewModel.isTrial()) {
-            binding.ryVideoRecover.addOnScrollListener(new RecyclerView.OnScrollListener() {
-                @Override
-                public void onScrolled(@NonNull RecyclerView recyclerView, int dx, int dy) {
-                    if (videoRecoverViewModel.isTrial()) {
-                        videoRecoverViewModel.scrollPosition(gridLayoutManager.findFirstCompletelyVisibleItemPosition(), gridLayoutManager.findLastCompletelyVisibleItemPosition(), gridLayoutManager.getItemCount());
-                    }
-                }
-            });
-            binding.ryVideoRecover.setOnFlingListener(new RecyclerView.OnFlingListener() {
-                @Override
-                public boolean onFling(int velocityX, int velocityY) {
-                    int firstCompletelyVisibleItemPosition = gridLayoutManager.findFirstCompletelyVisibleItemPosition();
-                    if ((firstCompletelyVisibleItemPosition == -1 && velocityY > 0) || (gridLayoutManager.findFirstCompletelyVisibleItemPosition() == 0 && gridLayoutManager.findLastCompletelyVisibleItemPosition() == gridLayoutManager.getItemCount() - 1 && velocityY > 0)) {
-                        showTrialFinishDialog();
-                        return true;
-                    }
-                    return false;
-                }
-            });
-        }
     }
 
     public void showScanProgressDialog(Boolean show) {
@@ -206,6 +187,9 @@ public class VideoRecoverActivity extends BaseActivity<ActivityVideoRecoverBindi
 
     @Override
     public void onBackPressed() {
+        if (!CounterUtil.checkAndIncrementByDay(Constants.KEY_LIST_BACK_AD_COUNTER, 2)) {
+            AtmobAdHelper.showInterstitial(AdFuncId.INTERSTITIAL_RESULT_BACK, null);
+        }
         showBackDialog();
     }
 

+ 13 - 52
app/src/main/java/com/datarecovery/master/module/videorecover/VideoRecoverViewModel.java

@@ -10,18 +10,16 @@ import com.atmob.common.data.KVUtils;
 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.consts.AdFuncId;
 import com.datarecovery.master.data.repositories.DeviceFuncRepository;
-import com.datarecovery.master.handler.EventHelper;
 import com.datarecovery.master.module.member.MemberActivity;
 import com.datarecovery.master.module.member.MemberType;
+import com.datarecovery.master.sdk.ad.AtmobAdHelper;
 import com.datarecovery.master.sdk.bugly.BuglyHelper;
 import com.datarecovery.master.utils.BoxingUtil;
 import com.datarecovery.master.utils.FileUtil;
 import com.datarecovery.master.utils.FilesSearch;
-import com.datarecovery.master.utils.Maps;
 import com.datarecovery.master.utils.MediaStoreHelper;
-import com.datarecovery.master.utils.ReportUtil;
 import com.datarecovery.master.utils.ReverseArrayList;
 import com.datarecovery.master.utils.ToastUtil;
 
@@ -67,8 +65,8 @@ public class VideoRecoverViewModel extends BaseViewModel {
     private final SingleLiveEvent<Boolean> showLoadingEvent = new SingleLiveEvent<>();
     private final DeviceFuncRepository deviceFuncRepository;
     private final MutableLiveData<Boolean> isShowHint = new MutableLiveData<>();
+    private final SingleLiveEvent<Void> showUnlockEvent = new SingleLiveEvent<>();
     private Disposable scanDisposable;
-    private boolean isTrial;
 
 
     @Inject
@@ -83,8 +81,6 @@ public class VideoRecoverViewModel extends BaseViewModel {
         if (KVUtils.getDefault().getBoolean(IS_SHOW_VIDEO_HINT, true)) {
             isShowHint.setValue(true);
         }
-        EventHelper.report(EventId.hf1000510);
-        EventHelper.timeEvent(EventId.hf1000525);
     }
 
     public LiveData<?> getShowTrialFinishDialog() {
@@ -104,10 +100,6 @@ public class VideoRecoverViewModel extends BaseViewModel {
         return showTrialView;
     }
 
-    public boolean isTrial() {
-        return isTrial;
-    }
-
     public LiveData<Boolean> getIsShowHint() {
         return isShowHint;
     }
@@ -136,17 +128,20 @@ public class VideoRecoverViewModel extends BaseViewModel {
         return selectedCountTxt;
     }
 
-
     public LiveData<Boolean> getShowLoadingEvent() {
         return showLoadingEvent;
     }
 
+    public LiveData<?> getShowUnlockEvent() {
+        return showUnlockEvent;
+    }
+
     public void startVideoScanning() {
         if (scanDisposable != null && !scanDisposable.isDisposed()) {
             return;
         }
         FilesSearch.search(ContextUtil.getContext(), FilesSearch.DocumentFile.VIDEO)
-                .take(isTrial ? SCANNING_IS_TRIAL_COUNTDOWN : SCANNING_COUNTDOWN, TimeUnit.MILLISECONDS)
+                .take(SCANNING_COUNTDOWN, TimeUnit.MILLISECONDS)
                 .observeOn(AndroidSchedulers.mainThread())
                 .subscribe(new Subscriber<List<FilesSearch.DocumentFile>>() {
                     @Override
@@ -178,25 +173,11 @@ public class VideoRecoverViewModel extends BaseViewModel {
 
                     @Override
                     public void onComplete() {
-                        setFreeExport();
-                        if (isTrial) {
-                            showTrialFinishDialog.call();
-                        }
                         showScanDialogEvent.setValue(false);
-
                     }
                 });
     }
 
-    private void setFreeExport() {
-        if (isTrial) {
-            showTrialView.setValue(true);
-            if (!videoList.isEmpty()) {
-                videoList.get(0).setTrial(true);
-            }
-        }
-    }
-
     public void onCheckAllClick(boolean isCheck) {
         checkAll.setValue(isCheck);
         for (FilesSearch.DocumentFile videoFile : videoList) {
@@ -214,25 +195,16 @@ public class VideoRecoverViewModel extends BaseViewModel {
     public void cancelScan() {
         if (scanDisposable != null && !scanDisposable.isDisposed()) scanDisposable.dispose();
         showScanDialogEvent.setValue(false);
-        setFreeExport();
     }
 
     public void onExportClick() {
         if (selectList.isEmpty()) {
             return;
         }
-        if (isTrial) {
-            for (FilesSearch.DocumentFile file : selectList) {
-                if (!file.isTrial()) {
-                    showTrialExportFailDialog.call();
-                    return;
-                }
-            }
-        } else {
-            if (!deviceFuncRepository.isHaveAuth(MemberType.APP_VIDEO_RECOVER)) {
-                return;
-            }
-        }
+        showUnlockEvent.call();
+    }
+
+    public void doExport() {
         Single.just(selectList.size())
                 .map(oldSize -> {
                     Iterator<FilesSearch.DocumentFile> iterator = selectList.iterator();
@@ -271,6 +243,7 @@ public class VideoRecoverViewModel extends BaseViewModel {
                         selectedList.setValue(selectList);
                         checkAll.setValue(false);
                         ToastUtil.show(R.string.export_success, ToastUtil.LENGTH_SHORT);
+                        AtmobAdHelper.showInterstitial(AdFuncId.INTERSTITIAL_RECOVER_SUCCESS, null);
                     }
 
                     @Override
@@ -297,22 +270,11 @@ public class VideoRecoverViewModel extends BaseViewModel {
         isShowHint.setValue(false);
     }
 
-    @Override
-    protected void onCleared() {
-        super.onCleared();
-        EventHelper.report(EventId.hf1000525);
-    }
-
-    public void setIsTrial(boolean isTrial) {
-        this.isTrial = isTrial;
-    }
-
     public void onTrialRecoverClick() {
         MemberActivity.start(ActivityUtil.getTopActivity(), MemberType.APP_VIDEO_RECOVER);
     }
 
     public void onViewTrialRecoverClick() {
-        EventHelper.report(EventId.hf1001117, Maps.asMap(EventId.EVENT_ID, ReportUtil.getReportId(MemberType.APP_VIDEO_RECOVER)));
         MemberActivity.start(ActivityUtil.getTopActivity(), MemberType.APP_VIDEO_RECOVER);
     }
 
@@ -322,7 +284,6 @@ public class VideoRecoverViewModel extends BaseViewModel {
         }
         if (lastCompletelyItemPosition == itemCount - 1 && firstCompletePosition > 0 && !BoxingUtil.boxing(showScanDialogEvent.getValue())) {
             showTrialFinishDialog.call();
-            EventHelper.report(EventId.hf1001119, Maps.asMap(EventId.EVENT_ID, ReportUtil.getReportId(MemberType.APP_VIDEO_RECOVER)));
         }
     }
 }

+ 0 - 23
app/src/main/java/com/datarecovery/master/module/wxrecover/WeChatViewModel.java

@@ -92,11 +92,6 @@ public class WeChatViewModel extends BaseViewModel {
         }
         ClipboardUtil.copy(value.getTutorialUrl());
         ToastUtil.show(R.string.copy_success, ToastUtil.LENGTH_SHORT);
-        if (Objects.equals(type, MemberType.APP_WX_MESSAGE_RECOVER)) {
-            EventHelper.report(EventId.hf200006);
-        } else if (Objects.equals(type, MemberType.APP_WX_FRIEND_RECOVER)) {
-            EventHelper.report(EventId.hf200007);
-        }
     }
 
     public void onCopyOrderNoClick() {
@@ -122,27 +117,9 @@ public class WeChatViewModel extends BaseViewModel {
             return;
         }
         this.type = type;
-        if (Objects.equals(type, MemberType.APP_WX_MESSAGE_RECOVER)) {
-            EventHelper.report(EventId.hf1000502);
-            EventHelper.timeEvent(EventId.hf1000517);
-        } else if (Objects.equals(type, MemberType.APP_WX_FRIEND_RECOVER)) {
-            EventHelper.report(EventId.hf1000504);
-            EventHelper.timeEvent(EventId.hf1000519);
-        }
     }
 
     public String getType() {
         return type;
     }
-
-
-    @Override
-    protected void onCleared() {
-        super.onCleared();
-        if (Objects.equals(type, MemberType.APP_WX_MESSAGE_RECOVER)) {
-            EventHelper.report(EventId.hf1000517);
-        } else if (Objects.equals(type, MemberType.APP_WX_FRIEND_RECOVER)) {
-            EventHelper.report(EventId.hf1000519);
-        }
-    }
 }

+ 610 - 0
app/src/main/java/com/datarecovery/master/sdk/ad/AtmobAdHelper.java

@@ -0,0 +1,610 @@
+package com.datarecovery.master.sdk.ad;
+
+import android.annotation.SuppressLint;
+import android.app.Activity;
+import android.app.Application;
+import android.os.Handler;
+import android.os.Looper;
+import android.view.View;
+import android.view.ViewGroup;
+import android.view.WindowManager;
+import android.widget.PopupWindow;
+
+import com.atmob.common.logging.AtmobLog;
+import com.atmob.common.runtime.ActivityUtil;
+import com.atmob.common.runtime.ProcessUtil;
+import com.atmob.common.ui.SizeUtil;
+import com.atmob.mediation.api.AdConstants;
+import com.atmob.mediation.api.AdError;
+import com.atmob.mediation.api.AtmobAdSdk;
+import com.atmob.mediation.api.EcpmInfo;
+import com.atmob.mediation.api.ad.AtmobAdLoadCallback;
+import com.atmob.mediation.api.ad.interstitial.AtmobInterstitialAd;
+import com.atmob.mediation.api.ad.nativead.AtmobNativeAd;
+import com.atmob.mediation.api.ad.nativead.AtmobNativeAdListener;
+import com.atmob.mediation.api.ad.reward.AtmobRewardAd;
+import com.atmob.mediation.api.ad.splash.AtmobSplashAd;
+import com.atmob.mediation.api.config.AtmobAdConfig;
+import com.atmob.sdk.gravity_engine.GravityEngine;
+import com.datarecovery.master.BuildConfig;
+import com.datarecovery.master.R;
+import com.datarecovery.master.data.consts.Constants;
+import com.datarecovery.master.data.repositories.AdRepository;
+import com.datarecovery.master.databinding.LayoutAdSkipButtonBinding;
+import com.datarecovery.master.dialog.AdLoadingDialog;
+
+import java.math.BigDecimal;
+import java.math.RoundingMode;
+
+import atmob.reactivex.rxjava3.disposables.Disposable;
+import atmob.rxjava.utils.RxJavaUtil;
+import dagger.hilt.EntryPoint;
+import dagger.hilt.InstallIn;
+import dagger.hilt.android.EntryPointAccessors;
+import dagger.hilt.components.SingletonComponent;
+
+public class AtmobAdHelper {
+
+    private static final String TAG = "AtmobAdHelper";
+    private static Handler handler;
+    private static AdRepository adRepository;
+
+    @SuppressLint("WrongConstant")
+    public static void init(Application application) {
+        if (!ProcessUtil.isMainProcess(application)) {
+            return;
+        }
+        AtmobAdSdk.init(application, new AtmobAdConfig.Builder()
+                .setDebug(BuildConfig.DEBUG)
+                .setUseServerConfig(true)
+                .setServerUrl("https://i90okxj.v8dashen.com:4695", false) // isOversea, false: 国内, true: 海外
+                .build(), new AtmobAdSdk.AtmobAdSdkInitCallback() {
+            @Override
+            public void onSuccess() {
+                AtmobLog.d(TAG, "AtmobAdSdk init success.");
+            }
+
+            @Override
+            public void onFailed(AdError adError) {
+                AtmobLog.e(TAG, "AtmobAdSdk init failed: %s.", adError);
+            }
+        });
+        AtmobAdHelperEntryPoint entryPoint = EntryPointAccessors.fromApplication(application, AtmobAdHelperEntryPoint.class);
+        adRepository = entryPoint.adRepository();
+        handler = new Handler(Looper.getMainLooper());
+    }
+
+    public static void showVideo(int adFuncId, RewardVideoListenerAdapter listener) {
+        if (BuildConfig.isSkipVideoAd) {
+            simulateVideo(adFuncId, listener);
+            return;
+        }
+        Activity topActivity = ActivityUtil.getTopActivity();
+        int loadingLayoutRes = R.layout.dialog_ad_loading;
+        int loadingStyleRes = R.style.Theme_Common_Dialog;
+        AdLoadingDialog adLoadingDialog = new AdLoadingDialog(topActivity, loadingLayoutRes, loadingStyleRes);
+        Runnable showVideoRunnable = () -> {
+            if (!adLoadingDialog.isShowing()) {
+                adLoadingDialog.show();
+            }
+            AtmobRewardAd atmobRewardAd = new AtmobRewardAd(ActivityUtil.getTopActivity(), String.valueOf(adFuncId));
+            RewardVideoListenerAdapter atmobRewardAdListener = new RewardVideoListenerAdapter() {
+                private PopupWindow adSkipPopWindow;
+                private String token;
+                private Disposable showSkipButtonDisposable;
+                private long startTime;
+
+                @Override
+                public void onShow() {
+                    AtmobLog.d(TAG, "showVideo(%d) onShow.", adFuncId);
+                    adLoadingDialog.forceDismiss();
+                    getVideoToken();
+                    showSkipButton();
+                    startTime = System.currentTimeMillis();
+                    AtmobAdHelper.onAdPlayStart(atmobRewardAd.getEcpmInfo());
+                    AtmobAdHelper.onAdShow(AdConstants.RewardVideo, atmobRewardAd.getEcpmInfo());
+                }
+
+                private void showSkipButton() {
+                    if (!Constants.isStoreChannel()) {
+                        return;
+                    }
+                    showSkipButtonDisposable = adRepository.isAttributed()
+                            .compose(RxJavaUtil.SingleSchedule.io2Main())
+                            .subscribe(attributed -> {
+                                if (attributed) {
+                                    return;
+                                }
+                                Activity topActivity = ActivityUtil.getTopActivity();
+                                if (topActivity == null || topActivity.isFinishing() || topActivity.isDestroyed()) {
+                                    return;
+                                }
+                                if (!isAdActivity(topActivity)) {
+                                    return;
+                                }
+                                LayoutAdSkipButtonBinding binding = LayoutAdSkipButtonBinding.inflate(topActivity.getLayoutInflater());
+                                binding.getRoot().setOnClickListener(v -> {
+                                    topActivity.finish();
+                                    dispose();
+                                });
+                                adSkipPopWindow = new PopupWindow(topActivity);
+                                adSkipPopWindow.setBackgroundDrawable(null);
+                                adSkipPopWindow.setWidth(WindowManager.LayoutParams.WRAP_CONTENT);
+                                adSkipPopWindow.setHeight(WindowManager.LayoutParams.WRAP_CONTENT);
+                                adSkipPopWindow.setContentView(binding.getRoot());
+                                adSkipPopWindow.showAsDropDown(topActivity.getWindow().getDecorView(),
+                                        (int) SizeUtil.dp2px(16),
+                                        (int) (SizeUtil.getStatusBarHeight() + SizeUtil.dp2px(10)));
+                            }, throwable -> AtmobLog.e(TAG, "showVideo(%d) showSkipButton error: %s.", adFuncId, throwable.getMessage()));
+                }
+
+                private void getVideoToken() {
+                }
+
+                @Override
+                public void onClose() {
+                    AtmobLog.d(TAG, "showVideo(%d) onClose.", adFuncId);
+                    dispose();
+                    if (listener != null) {
+                        if (isRewarded) {
+                            listener.onRewarded(token);
+                        }
+                        listener.onClose();
+                    }
+
+                    int duration = (int) ((System.currentTimeMillis() - startTime) / 1000);
+                    onAdPlayEnd(atmobRewardAd.getEcpmInfo(), duration, isRewarded);
+                }
+
+                @Override
+                public void onFail(String s) {
+                    AtmobLog.e(TAG, "showVideo(%d) onFail: %s.", adFuncId, s);
+                    dispose();
+                    if (listener != null) {
+                        listener.onFail(s);
+                    }
+                    adLoadingDialog.dismiss();
+                }
+
+                @Override
+                public void onClick() {
+                    AtmobLog.d(TAG, "showVideo(%d) onClick.", adFuncId);
+                    if (listener != null) {
+                        listener.onClick();
+                    }
+
+                    AtmobAdHelper.onAdClick(AdConstants.RewardVideo, atmobRewardAd.getEcpmInfo());
+                }
+
+                @Override
+                public void onAdLoaded() {
+                    super.onAdLoaded();
+                    AtmobLog.d(TAG, "showVideo(%d) onAdLoaded.", adFuncId);
+                    atmobRewardAd.showRewardAd();
+
+                    AtmobAdHelper.onAdLoaded(AdConstants.RewardVideo, atmobRewardAd.getEcpmInfo());
+                }
+
+                private void dispose() {
+                    if (showSkipButtonDisposable != null) {
+                        showSkipButtonDisposable.dispose();
+                    }
+                    if (adSkipPopWindow != null) {
+                        adSkipPopWindow.dismiss();
+                    }
+                }
+            };
+            atmobRewardAd.setRewardAdListener(atmobRewardAdListener);
+            AtmobLog.d(TAG, "showVideo(%d) start.", adFuncId);
+            atmobRewardAd.loadAd(atmobRewardAdListener);
+        };
+        showVideoRunnable.run();
+    }
+
+    private static boolean isAdActivity(Activity topActivity) {
+        if (topActivity == null) {
+            return false;
+        }
+        return AtmobAdSdk.isAdActivity(topActivity.getClass());
+    }
+
+    @SuppressLint("CheckResult")
+    private static void simulateVideo(int adFuncId, RewardVideoListenerAdapter listener) {
+        AdLoadingDialog adLoadingDialog = new AdLoadingDialog(ActivityUtil.getTopActivity(), R.layout.dialog_simulate_ad, R.style.Theme_Common_Dialog);
+        adLoadingDialog.show();
+        if (listener != null) {
+            listener.onShow();
+        }
+        handler.postDelayed(() -> {
+            adLoadingDialog.dismiss();
+            if (listener != null) {
+                listener.onRewarded("");
+            }
+            if (listener != null) {
+                listener.onClose();
+            }
+        }, 3000);
+    }
+
+    public static void showInterstitial(int adFuncId, InterstitialListenerAdapter listener) {
+        if (BuildConfig.isSkipOtherAd) {
+            if (listener != null) {
+                listener.onFail("debug skip.");
+            }
+            return;
+        }
+        Runnable showInterstitialRunnable = () -> {
+            AtmobInterstitialAd atmobInterstitialAd = new AtmobInterstitialAd(ActivityUtil.getTopActivity(), String.valueOf(adFuncId));
+            InterstitialListenerAdapter interstitialListenerAdapter = new InterstitialListenerAdapter() {
+                @Override
+                public void onShow() {
+                    AtmobLog.d(TAG, "showInterstitial(%d) onShow.", adFuncId);
+                    if (listener != null) {
+                        listener.onShow();
+                    }
+
+                    AtmobAdHelper.onAdShow(AdConstants.Interstitial, atmobInterstitialAd.getEcpmInfo());
+                }
+
+                @Override
+                public void onClose() {
+                    AtmobLog.d(TAG, "showInterstitial(%d) onClose.", adFuncId);
+                    if (listener != null) {
+                        listener.onClose();
+                    }
+                }
+
+                @Override
+                public void onFail(String s) {
+                    AtmobLog.e(TAG, "showInterstitial(%d) onFail: %s.", adFuncId, s);
+                    if (listener != null) {
+                        listener.onFail(s);
+                    }
+                }
+
+                @Override
+                public void onClick() {
+                    AtmobLog.d(TAG, "showInterstitial(%d) onClick.", adFuncId);
+                    if (listener != null) {
+                        listener.onClick();
+                    }
+
+                    AtmobAdHelper.onAdClick(AdConstants.Interstitial, atmobInterstitialAd.getEcpmInfo());
+                }
+
+                @Override
+                public void onAdLoaded() {
+                    super.onAdLoaded();
+                    AtmobLog.d(TAG, "showInterstitial(%d) onAdLoaded.", adFuncId);
+                    atmobInterstitialAd.showInterstitial();
+
+                    AtmobAdHelper.onAdLoaded(AdConstants.Interstitial, atmobInterstitialAd.getEcpmInfo());
+                }
+            };
+            atmobInterstitialAd.setInterstitialListener(interstitialListenerAdapter);
+            AtmobLog.d(TAG, "showInterstitial(%d) start.", adFuncId);
+            atmobInterstitialAd.loadAd(interstitialListenerAdapter);
+        };
+//        if (Constants.isStoreChannel()) {
+//            AtmobLog.d(TAG, "showInterstitial(%d) attribute start.", adFuncId);
+//            adRepository.isAttributed().compose(RxJavaUtil.SingleSchedule.io2Main()).subscribe(new SingleObserver<Boolean>() {
+//                @Override
+//                public void onSubscribe(@NonNull Disposable d) {
+//
+//                }
+//
+//                @Override
+//                public void onSuccess(@NonNull Boolean attributed) {
+//                    if (attributed) {
+//                        AtmobLog.d(TAG, "showInterstitial(%d) attribute success.", adFuncId);
+//                        showInterstitialRunnable.run();
+//                    } else {
+//                        AtmobLog.d(TAG, "showInterstitial(%d) skip, not attributed.", adFuncId);
+//                        if (listener != null) {
+//                            listener.onFail("not attributed.");
+//                        }
+//                    }
+//                }
+//
+//                @Override
+//                public void onError(@NonNull Throwable e) {
+//                    AtmobLog.e(TAG, "showInterstitial(%d) attributed error: %s.", adFuncId, e.getMessage());
+//                    showInterstitialRunnable.run();
+//                }
+//            });
+//        } else {
+//            showInterstitialRunnable.run();
+//        }
+        showInterstitialRunnable.run();
+    }
+
+    public static void showNative(int adFuncId, ViewGroup viewGroup) {
+        if (BuildConfig.isSkipOtherAd) {
+            return;
+        }
+        Runnable showNativeRunnable = () -> {
+            AtmobNativeAd atmobNativeAd = new AtmobNativeAd(ActivityUtil.getTopActivity(), String.valueOf(adFuncId));
+            atmobNativeAd.setNativeAdListener(new AtmobNativeAdListener() {
+                @Override
+                public void onAdClick() {
+                    AtmobLog.d(TAG, "showNative(%d) onAdClick.", adFuncId);
+
+                    AtmobAdHelper.onAdClick(AdConstants.NativeUnified, atmobNativeAd.getEcpmInfo());
+                }
+
+                @Override
+                public void onAdShow() {
+                    AtmobLog.d(TAG, "showNative(%d) onAdShow.", adFuncId);
+
+                    AtmobAdHelper.onAdShow(AdConstants.NativeUnified, atmobNativeAd.getEcpmInfo());
+                }
+            });
+            atmobNativeAd.loadAd(new AtmobAdLoadCallback() {
+                @Override
+                public void onAdLoaded() {
+                    AtmobLog.d(TAG, "showNative(%d) onAdLoaded.", adFuncId);
+                    View nativeView = atmobNativeAd.getNativeView();
+                    if (nativeView != null) {
+                        viewGroup.removeAllViews();
+                        viewGroup.addView(nativeView, new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT));
+                    }
+
+                    AtmobAdHelper.onAdLoaded(AdConstants.NativeUnified, atmobNativeAd.getEcpmInfo());
+                }
+
+                @Override
+                public void onLoadFailed(AdError adError) {
+                    AtmobLog.e(TAG, "showNative(%d) onLoadFailed: %s.", adFuncId, adError);
+                }
+            });
+        };
+//        if (Constants.isStoreChannel()) {
+//            AtmobLog.d(TAG, "showNative(%d) attribute start.", adFuncId);
+//            adRepository.isAttributed().compose(RxJavaUtil.SingleSchedule.io2Main()).subscribe(new SingleObserver<Boolean>() {
+//                @Override
+//                public void onSubscribe(@NonNull Disposable d) {
+//
+//                }
+//
+//                @Override
+//                public void onSuccess(@NonNull Boolean attributed) {
+//                    if (attributed) {
+//                        AtmobLog.d(TAG, "showNative(%d) attribute success.", adFuncId);
+//                        showNativeRunnable.run();
+//                    } else {
+//                        AtmobLog.d(TAG, "showNative(%d) skip, not attributed.", adFuncId);
+//                    }
+//                }
+//
+//                @Override
+//                public void onError(@NonNull Throwable e) {
+//                    AtmobLog.e(TAG, "showNative(%d) attributed error: %s.", adFuncId, e.getMessage());
+//                    showNativeRunnable.run();
+//                }
+//            });
+//        } else {
+//            showNativeRunnable.run();
+//        }
+        showNativeRunnable.run();
+    }
+
+    public static void showSplash(int adFuncId, ViewGroup viewGroup, SplashListenerAdapter listener) {
+        if (BuildConfig.isSkipOtherAd) {
+            if (listener != null) {
+                listener.action();
+            }
+            return;
+        }
+        Runnable showSplashRunnable = () -> {
+            AtmobSplashAd atmobSplashAd = new AtmobSplashAd(ActivityUtil.getTopActivity(), String.valueOf(adFuncId));
+            SplashListenerAdapter splashListenerAdapter = new SplashListenerAdapter() {
+                @Override
+                public void onShow() {
+                    AtmobLog.d(TAG, "showSplash(%d) onShow.", adFuncId);
+                    if (listener != null) {
+                        listener.onShow();
+                    }
+
+                    AtmobAdHelper.onAdShow(AdConstants.Splash, atmobSplashAd.getEcpmInfo());
+                }
+
+                @Override
+                public void onClose() {
+                    AtmobLog.d(TAG, "showSplash(%d) onClose.", adFuncId);
+                    if (listener != null) {
+                        listener.onClose();
+                    }
+                }
+
+                @Override
+                public void onFail(String s) {
+                    AtmobLog.e(TAG, "showSplash(%d) onFail: %s.", adFuncId, s);
+                    if (listener != null) {
+                        listener.onFail(s);
+                    }
+                }
+
+                @Override
+                public void onClick() {
+                    AtmobLog.d(TAG, "showSplash(%d) onClick.", adFuncId);
+                    if (listener != null) {
+                        listener.onClick();
+                    }
+
+                    AtmobAdHelper.onAdClick(AdConstants.Splash, atmobSplashAd.getEcpmInfo());
+                }
+
+                @Override
+                public void action() {
+                    AtmobLog.d(TAG, "showSplash(%d) action.", adFuncId);
+                    if (listener != null) {
+                        listener.action();
+                    }
+                }
+
+                @Override
+                public void onAdLoaded() {
+                    super.onAdLoaded();
+                    AtmobLog.d(TAG, "showSplash(%d) onAdLoaded.", adFuncId);
+                    atmobSplashAd.showSplashAd(viewGroup);
+
+                    AtmobAdHelper.onAdLoaded(AdConstants.Splash, atmobSplashAd.getEcpmInfo());
+                }
+            };
+            atmobSplashAd.setSplashAdListener(splashListenerAdapter);
+            AtmobLog.d(TAG, "showSplash(%d) start.", adFuncId);
+            atmobSplashAd.loadAd(splashListenerAdapter, 6000);
+        };
+//        if (Constants.isStoreChannel()) {
+//            AtmobLog.d(TAG, "showSplash(%d) attribute start.", adFuncId);
+//            adRepository.isAttributed().compose(RxJavaUtil.SingleSchedule.io2Main()).subscribe(new SingleObserver<Boolean>() {
+//                @Override
+//                public void onSubscribe(@NonNull Disposable d) {
+//
+//                }
+//
+//                @Override
+//                public void onSuccess(@NonNull Boolean attributed) {
+//                    if (attributed) {
+//                        AtmobLog.d(TAG, "showSplash(%d) attribute success.", adFuncId);
+//                        showSplashRunnable.run();
+//                    } else {
+//                        AtmobLog.d(TAG, "showSplash(%d) skip, not attributed.", adFuncId);
+//                        if (listener != null) {
+//                            listener.onFail("not attributed.");
+//                            listener.action();
+//                        }
+//                    }
+//                }
+//
+//                @Override
+//                public void onError(@NonNull Throwable e) {
+//                    AtmobLog.e(TAG, "showSplash(%d) attributed error: %s.", adFuncId, e.getMessage());
+//                    showSplashRunnable.run();
+//                }
+//            });
+//        } else {
+//            showSplashRunnable.run();
+//        }
+        showSplashRunnable.run();
+    }
+
+    private static void onAdLoaded(int adType, EcpmInfo ecpmInfo) {
+        String adUnionType = getAdUnionType(ecpmInfo);
+        String adPlacementId = ecpmInfo.getPositionId();
+        String adSourceId = ecpmInfo.getShowPositionId();
+        String adnType = getAdnType(ecpmInfo);
+        GravityEngine.trackAdLoad(adUnionType, adPlacementId, adSourceId, getAdType(adType), adnType);
+    }
+
+    private static void onAdShow(int adType, EcpmInfo ecpmInfo) {
+        String adUnionType = getAdUnionType(ecpmInfo);
+        String adPlacementId = ecpmInfo.getPositionId();
+        String adSourceId = ecpmInfo.getShowPositionId();
+        String adnType = getAdnType(ecpmInfo);
+        float ecpm = getEcpm(ecpmInfo);
+        GravityEngine.trackAdShow(adUnionType, adPlacementId, adSourceId, getAdType(adType), adnType, ecpm);
+    }
+
+    private static void onAdClick(int adType, EcpmInfo ecpmInfo) {
+        String adUnionType = getAdUnionType(ecpmInfo);
+        String adPlacementId = ecpmInfo.getPositionId();
+        String adSourceId = ecpmInfo.getShowPositionId();
+        String adnType = getAdnType(ecpmInfo);
+        float ecpm = getEcpm(ecpmInfo);
+        GravityEngine.trackAdClick(adUnionType, adPlacementId, adSourceId, getAdType(adType), adnType, ecpm);
+    }
+
+    private static void onAdPlayStart(EcpmInfo ecpmInfo) {
+        String adUnionType = getAdUnionType(ecpmInfo);
+        String adPlacementId = ecpmInfo.getPositionId();
+        String adSourceId = ecpmInfo.getShowPositionId();
+        String adnType = getAdnType(ecpmInfo);
+        float ecpm = getEcpm(ecpmInfo);
+        GravityEngine.trackAdPlayStart(adUnionType, adPlacementId, adSourceId, getAdType(AdConstants.RewardVideo), adnType, ecpm);
+    }
+
+    private static void onAdPlayEnd(EcpmInfo ecpmInfo, int duration, boolean isPlayOver) {
+        String adUnionType = getAdUnionType(ecpmInfo);
+        String adPlacementId = ecpmInfo.getPositionId();
+        String adSourceId = ecpmInfo.getShowPositionId();
+        String adnType = getAdnType(ecpmInfo);
+        float ecpm = getEcpm(ecpmInfo);
+        GravityEngine.trackAdPlayEnd(adUnionType, adPlacementId, adSourceId, getAdType(AdConstants.RewardVideo), adnType, ecpm, duration, isPlayOver);
+    }
+
+    private static String getAdType(int adType) {
+        switch (adType) {
+            case AdConstants.Splash:
+                return "splash";
+            case AdConstants.NativeExpress:
+            case AdConstants.NativeUnified:
+                return "native";
+            case AdConstants.Interstitial:
+            case AdConstants.InterstitialFull:
+                return "interstitial";
+            case AdConstants.RewardVideo:
+                return "reward";
+            case AdConstants.BannerExpress:
+                return "banner";
+        }
+        return "";
+    }
+
+    private static String getAdUnionType(EcpmInfo ecpmInfo) {
+        if (ecpmInfo == null) {
+            return "self";
+        }
+        int platformId = ecpmInfo.getPlatformId();
+        switch (platformId) {
+            case AdConstants.Gromore:
+                return "gromore";
+            case AdConstants.Taku:
+            case AdConstants.TopOn:
+                return "topon";
+            case AdConstants.Max:
+                return "max";
+            case AdConstants.ToBid:
+                return "tobid";
+        }
+        return "self";
+    }
+
+    private static String getAdnType(EcpmInfo ecpmInfo) {
+        if (ecpmInfo == null) {
+            return "other";
+        }
+        int showPlatformId = ecpmInfo.getShowPlatformId();
+        switch (showPlatformId) {
+            case AdConstants.CSJ:
+                return "csj";
+            case AdConstants.Tencent:
+                return "gdt";
+            case AdConstants.Kuaishou:
+                return "ks";
+            case AdConstants.Mintegral:
+                return "mint";
+            case AdConstants.Baidu:
+                return "baidu";
+        }
+        return "other";
+    }
+
+    /**
+     * @return 单位元
+     */
+    private static float getEcpm(EcpmInfo ecpmInfo) {
+        if (ecpmInfo == null) {
+            return 0;
+        }
+        double ecpmCent = ecpmInfo.getEcpmCent();
+        BigDecimal bigDecimal = new BigDecimal(ecpmCent);
+        return bigDecimal.divide(new BigDecimal(100), 2, RoundingMode.HALF_DOWN).floatValue();
+    }
+
+    @InstallIn(SingletonComponent.class)
+    @EntryPoint
+    interface AtmobAdHelperEntryPoint {
+        AdRepository adRepository();
+    }
+}

+ 53 - 0
app/src/main/java/com/datarecovery/master/sdk/ad/InterstitialListenerAdapter.java

@@ -0,0 +1,53 @@
+package com.datarecovery.master.sdk.ad;
+
+import com.atmob.mediation.api.AdError;
+import com.atmob.mediation.api.ad.AtmobAdLoadCallback;
+import com.atmob.mediation.api.ad.interstitial.AtmobInterstitialAdListener;
+
+public abstract class InterstitialListenerAdapter implements AtmobInterstitialAdListener, AtmobAdLoadCallback {
+    public void onShow() {
+
+    }
+
+    public void onClose() {
+
+    }
+
+    public void onFail(String s) {
+
+    }
+
+    public void onClick() {
+
+    }
+
+    @Override
+    public final void onInterstitialShow() {
+        onShow();
+    }
+
+    @Override
+    public final void onInterstitialShowFail(AdError adError) {
+        onFail(adError.toString());
+    }
+
+    @Override
+    public final void onInterstitialAdClick() {
+        onClick();
+    }
+
+    @Override
+    public final void onInterstitialClosed() {
+        onClose();
+    }
+
+    @Override
+    public void onAdLoaded() {
+
+    }
+
+    @Override
+    public final void onLoadFailed(AdError adError) {
+        onFail(adError.toString());
+    }
+}

+ 75 - 0
app/src/main/java/com/datarecovery/master/sdk/ad/RewardVideoListenerAdapter.java

@@ -0,0 +1,75 @@
+package com.datarecovery.master.sdk.ad;
+
+import androidx.annotation.NonNull;
+
+import com.atmob.mediation.api.AdError;
+import com.atmob.mediation.api.ad.AtmobAdLoadCallback;
+import com.atmob.mediation.api.ad.reward.AtmobRewardAdListener;
+import com.atmob.mediation.api.ad.reward.RewardInfo;
+
+public abstract class RewardVideoListenerAdapter implements AtmobRewardAdListener, AtmobAdLoadCallback {
+
+    protected boolean isRewarded;
+
+    public void onRewarded(@NonNull String token) {
+
+    }
+
+    public void onShow() {
+
+    }
+
+    public void onClose() {
+
+    }
+
+    public void onFail(String s) {
+
+    }
+
+    public void onClick() {
+
+    }
+
+    @Override
+    public final void onRewardAdShow() {
+        onShow();
+    }
+
+    @Override
+    public final void onRewardAdShowFail(AdError adError) {
+        onFail(adError.toString());
+    }
+
+    @Override
+    public final void onRewardClick() {
+        onClick();
+    }
+
+    @Override
+    public final void onRewardAdClosed() {
+        onClose();
+    }
+
+    @Override
+    public final void onVideoComplete() {
+
+    }
+
+    @Override
+    public final void onRewardVerify(boolean b, RewardInfo rewardInfo) {
+        if (b) {
+            isRewarded = true;
+        }
+    }
+
+    @Override
+    public final void onLoadFailed(AdError adError) {
+        onFail(adError.toString());
+    }
+
+    @Override
+    public void onAdLoaded() {
+
+    }
+}

+ 59 - 0
app/src/main/java/com/datarecovery/master/sdk/ad/SplashListenerAdapter.java

@@ -0,0 +1,59 @@
+package com.datarecovery.master.sdk.ad;
+
+import com.atmob.mediation.api.AdError;
+import com.atmob.mediation.api.ad.AtmobAdLoadCallback;
+import com.atmob.mediation.api.ad.splash.AtmobSplashAdListener;
+
+public class SplashListenerAdapter implements AtmobSplashAdListener, AtmobAdLoadCallback {
+    public void action() {
+
+    }
+
+    public void onShow() {
+
+    }
+
+    public void onClose() {
+
+    }
+
+    public void onFail(String s) {
+
+    }
+
+    public void onClick() {
+
+    }
+
+    @Override
+    public final void onAdClicked() {
+        onClick();
+    }
+
+    @Override
+    public final void onAdShow() {
+        onShow();
+    }
+
+    @Override
+    public final void onAdShowFail(AdError adError) {
+        onFail(adError.toString());
+        action();
+    }
+
+    @Override
+    public final void onAdDismiss() {
+        action();
+    }
+
+    @Override
+    public void onAdLoaded() {
+
+    }
+
+    @Override
+    public final void onLoadFailed(AdError adError) {
+        onFail(adError.toString());
+        action();
+    }
+}

+ 0 - 84
app/src/main/java/com/datarecovery/master/sdk/qiyu/GlideImageLoader.java

@@ -1,84 +0,0 @@
-package com.datarecovery.master.sdk.qiyu;
-
-import android.content.Context;
-import android.graphics.Bitmap;
-import android.graphics.drawable.Drawable;
-
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
-
-import com.bumptech.glide.Glide;
-import com.bumptech.glide.request.target.CustomTarget;
-import com.bumptech.glide.request.transition.Transition;
-import com.qiyukf.unicorn.api.ImageLoaderListener;
-import com.qiyukf.unicorn.api.UnicornImageLoader;
-
-import java.util.concurrent.ExecutionException;
-
-/**
- * Created by zhoujianghua on 2016/12/27.
- */
-
-public class GlideImageLoader implements UnicornImageLoader {
-    private Context context;
-
-    public GlideImageLoader(Context context) {
-        this.context = context.getApplicationContext();
-    }
-
-    @Nullable
-    @Override
-    public Bitmap loadImageSync(String uri, int width, int height) {
-        Bitmap bitmap = null;
-        try {
-            bitmap = Glide.with(context)
-                    .asBitmap()
-                    .load(uri)
-                    .submit().get();
-        } catch (ExecutionException e) {
-            e.printStackTrace();
-        } catch (InterruptedException e) {
-            e.printStackTrace();
-        }
-        return bitmap;
-    }
-
-    @Override
-    public void loadImage(String uri, int width, int height, final ImageLoaderListener listener) {
-        if (width <= 0) {
-            width = Integer.MIN_VALUE;
-        }
-
-        if (height <= 0) {
-            height = Integer.MIN_VALUE;
-        }
-
-        Glide.with(context).
-                asBitmap()
-                .load(uri)
-                .into(new CustomTarget<Bitmap>(width, height) {
-
-                    @Override
-                    public void onLoadStarted(@Nullable Drawable placeholder) {
-
-                    }
-
-                    @Override
-                    public void onLoadFailed(@Nullable Drawable errorDrawable) {
-
-                    }
-
-                    @Override
-                    public void onResourceReady(@NonNull Bitmap resource, Transition<? super Bitmap> transition) {
-                        if (listener != null) {
-                            listener.onLoadComplete(resource);
-                        }
-                    }
-
-                    @Override
-                    public void onLoadCleared(@Nullable Drawable placeholder) {
-
-                    }
-                });
-    }
-}

+ 0 - 225
app/src/main/java/com/datarecovery/master/sdk/qiyu/QiYuHelper.java

@@ -1,225 +0,0 @@
-package com.datarecovery.master.sdk.qiyu;
-
-import android.app.AlertDialog;
-import android.app.Application;
-import android.content.Context;
-import android.content.DialogInterface;
-import android.text.TextUtils;
-import android.widget.Toast;
-
-import com.atmob.common.data.KVUtils;
-import com.atmob.common.logging.AtmobLog;
-import com.atmob.common.runtime.ContextUtil;
-import com.datarecovery.master.BuildConfig;
-import com.datarecovery.master.R;
-import com.datarecovery.master.data.repositories.AccountRepository;
-import com.datarecovery.master.dialog.CommonSureDialog;
-import com.datarecovery.master.module.browser.BrowserActivity;
-import com.datarecovery.master.utils.SystemUtil;
-import com.qiyukf.nimlib.sdk.RequestCallback;
-import com.qiyukf.nimlib.sdk.StatusBarNotificationConfig;
-import com.qiyukf.unicorn.api.OnMessageItemClickListener;
-import com.qiyukf.unicorn.api.UICustomization;
-import com.qiyukf.unicorn.api.Unicorn;
-import com.qiyukf.unicorn.api.YSFOptions;
-import com.qiyukf.unicorn.api.YSFUserInfo;
-import com.qiyukf.unicorn.api.event.EventCallback;
-import com.qiyukf.unicorn.api.event.EventProcessFactory;
-import com.qiyukf.unicorn.api.event.SDKEvents;
-import com.qiyukf.unicorn.api.event.UnicornEventBase;
-import com.qiyukf.unicorn.api.event.entry.RequestPermissionEventEntry;
-
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.UUID;
-
-public class QiYuHelper {
-
-    private static final String TAG = "QiYuHelper";
-
-    private static final String ysfAppId = BuildConfig.QIYU_APP_KEY;
-    private static final String VISITOR_KEY = "visitor_key";
-
-    public static void init(Application application) {
-        Unicorn.config(application, ysfAppId, options(), new GlideImageLoader(application));
-    }
-
-    public static void initSdk() {
-        Unicorn.initSdk();
-        if (TextUtils.isEmpty(AccountRepository.token)) {
-            setVisitorInfo();
-        }
-    }
-
-
-    private static void setVisitorInfo() {
-        YSFUserInfo userInfo = new YSFUserInfo();
-        userInfo.userId = getUserId();
-        String appName = ContextUtil.getContext().getString(R.string.app_name) + "-访客";
-        // CRM 扩展字段
-        userInfo.data = "[\n" +
-                "    {\"key\":\"real_name\", \"value\":\"" + appName + "\"},\n" +
-                getAppCommonInfo() +
-                "]";
-        Unicorn.setUserInfo(userInfo, new RequestCallback<Void>() {
-            @Override
-            public void onSuccess(Void aVoid) {
-                AtmobLog.d(TAG, "set visitor info success");
-            }
-
-            @Override
-            public void onFailed(int errorCode) {
-                AtmobLog.d(TAG, "set visitor info failed, errorCode: " + errorCode);
-            }
-
-            @Override
-            public void onException(Throwable throwable) {
-                AtmobLog.d(TAG, "set visitor info exception: " + throwable.getMessage());
-            }
-        });
-    }
-
-
-    private static YSFOptions options() {
-        YSFOptions options = new YSFOptions();
-        options.statusBarNotificationConfig = new StatusBarNotificationConfig();
-        options.onMessageItemClickListener = BrowserActivity::start;
-        options.sdkEvents = new SDKEvents();
-        options.sdkEvents.eventProcessFactory = eventType -> {
-            if (eventType == 5) {
-                return new RequestPermissionEvent();
-            }
-            return null;
-        };
-        return options;
-    }
-
-    public static class RequestPermissionEvent implements UnicornEventBase<RequestPermissionEventEntry> {
-        private final Map<String, String> h5MessageHandlerMap = new HashMap<>();
-
-
-        public RequestPermissionEvent() {
-            h5MessageHandlerMap.put("android.permission.RECORD_AUDIO", "麦克风");
-            h5MessageHandlerMap.put("android.permission.CAMERA", "相机");
-            h5MessageHandlerMap.put("android.permission.READ_EXTERNAL_STORAGE", "存储");
-            h5MessageHandlerMap.put("android.permission.WRITE_EXTERNAL_STORAGE", "存储");
-            h5MessageHandlerMap.put("android.permission.READ_MEDIA_AUDIO", "多媒体文件");
-            h5MessageHandlerMap.put("android.permission.READ_MEDIA_IMAGES", "多媒体文件");
-            h5MessageHandlerMap.put("android.permission.READ_MEDIA_VIDEO", "多媒体文件");
-            h5MessageHandlerMap.put("android.permission.POST_NOTIFICATIONS", "通知栏权限");
-        }
-
-        /**
-         * @param requestPermissionEventEntry 获取权限相关的类
-         * @param context                     当前界面的 context 对象,使用之前请判断是否为 null
-         * @param callback                    sdk 的回调对象  注意:如果该事件 sdk 不需要回调的时候,这个对象会为 null,所以当使用的时候需要做一下非null判断
-         */
-        @Override
-        public void onEvent(RequestPermissionEventEntry requestPermissionEventEntry, Context context, EventCallback<RequestPermissionEventEntry> callback) {
-
-            //申请权限的场景
-            //从本地选择媒体文件(视频和图片):0
-            //拍摄视频场景:1
-            //保存图片到本地:2
-            //保存视频到本地:3
-            //选择本地视频:4
-            //选择本地文件:5
-            //选择本地图片:6
-            //拍照:7
-            //录音:8
-            //视频客服:9
-            //通知栏权限:10
-            int type = requestPermissionEventEntry.getScenesType();
-            String content = null;
-            switch (type) {
-                case 4:
-                    content = "使用视频权限,用于发送视频文件,与在线客服联系并协助您解答疑惑";
-                    break;
-                case 0:
-                case 5:
-                    content = "使用存储权限,用于发送文件,与在线客服联系并协助您解答疑惑";
-                    break;
-                case 6:
-                    content = "使用相册权限,用于发送图片文件,与在线客服联系并协助您解答疑惑";
-                    break;
-                case 7:
-                    content = "使用相机拍摄权限,用于发送图片,与在线客服联系并协助您解答疑惑";
-                    break;
-                case 8:
-                    content = "使用麦克风录音权限,用于发送语音,与在线客服联系并协助您解答疑惑";
-                    break;
-            }
-            if (TextUtils.isEmpty(content)) {
-                callback.onProcessEventSuccess(requestPermissionEventEntry);
-            } else {
-                CommonSureDialog permissionDialog = new CommonSureDialog(context);
-                permissionDialog.setDialogTitle(R.string.dialog_kind_tips);
-                permissionDialog.setDialogContent(content);
-                permissionDialog.setOnDialogClickListener(() -> callback.onProcessEventSuccess(requestPermissionEventEntry));
-                permissionDialog.show();
-            }
-        }
-
-    }
-
-    /**
-     * 账号注销使用
-     */
-    public static void logout() {
-        Unicorn.logout();
-        KVUtils.getDefault().putString(VISITOR_KEY, null);
-    }
-
-    public static void openServiceActivity(Context context) {
-        Unicorn.openServiceActivity(context, "客服", null);
-    }
-
-    private static String getUserId() {
-        String userId;
-        if (TextUtils.isEmpty(userId = KVUtils.getDefault().getString(VISITOR_KEY, null))) {
-            userId = UUID.randomUUID().toString();
-            KVUtils.getDefault().putString(VISITOR_KEY, userId);
-        }
-        return userId;
-    }
-
-    public static void setUserInfo(String phone, String serverUserId, String token) {
-        YSFUserInfo userInfo = new YSFUserInfo();
-        // App 的用户 ID
-        userInfo.userId = getUserId();
-        // 当且仅当开发者在管理后台开启了 authToken 校验功能时,该字段才有效
-//        userInfo.authToken = token;
-        String appName = ContextUtil.getContext().getString(R.string.app_name) + "-已登录";
-        // CRM 扩展字段
-        userInfo.data = "[\n" +
-                "    {\"key\":\"real_name\", \"value\":\"" + appName + "\"},\n" +
-                "    {\"index\":0, \"key\":\"version\", \"label\":\"用户Id\", \"value\":\"" + serverUserId + "\" },\n" +
-                getAppCommonInfo() +
-                "]";
-        Unicorn.setUserInfo(userInfo, new RequestCallback<Void>() {
-            @Override
-            public void onSuccess(Void aVoid) {
-                AtmobLog.d(TAG, "set visitor info success");
-            }
-
-            @Override
-            public void onFailed(int errorCode) {
-                AtmobLog.d(TAG, "set visitor info failed, errorCode: " + errorCode);
-            }
-
-            @Override
-            public void onException(Throwable throwable) {
-                AtmobLog.d(TAG, "set visitor info exception: " + throwable.getMessage());
-            }
-        });
-    }
-
-    private static String getAppCommonInfo() {
-        String info = "    {\"index\":1, \"key\":\"version\", \"label\":\"应用版本\", \"value\":\"v" + SystemUtil.getVersionName(ContextUtil.getContext()) + "\" },\n" +
-                "    {\"index\":2, \"key\":\"appName\", \"label\":\"应用名称\", \"value\":\"" + ContextUtil.getContext().getString(R.string.app_name) + "\" },\n" +
-                "    {\"index\":3, \"key\":\"packageName\", \"label\":\"包名\", \"value\":\"" + ContextUtil.getApplication().getPackageName() + "\" },\n";
-        return info;
-    }
-}

+ 79 - 0
app/src/main/java/com/datarecovery/master/utils/CounterUtil.java

@@ -0,0 +1,79 @@
+package com.datarecovery.master.utils;
+
+import android.text.format.DateUtils;
+
+import com.atmob.common.data.KVUtils;
+
+public class CounterUtil {
+
+    private static final String COUNTER_PREFIX = "COUNTER_UTIL_";
+
+    private static final String COUNTER_DATE_SUFFIX = "_DATE";
+
+    private CounterUtil() {
+
+    }
+
+    /**
+     * 检查并增加计数(当天)
+     *
+     * @param key        计数器key
+     * @param limitTimes 限制次数
+     * @return 是否超过限制
+     */
+    public static boolean checkAndIncrementByDay(String key, int limitTimes) {
+        if (key == null || key.isEmpty() || limitTimes == 0) {
+            return false;
+        }
+        long lastTime = KVUtils.getDefault().getLong(COUNTER_PREFIX + key + COUNTER_DATE_SUFFIX, 0L);
+        if (DateUtils.isToday(lastTime)) {
+            int count = KVUtils.getDefault().getInt(COUNTER_PREFIX + key, 0);
+            if (count >= limitTimes) {
+                return false;
+            } else {
+                KVUtils.getDefault().putInt(COUNTER_PREFIX + key, count + 1);
+                return true;
+            }
+        } else {
+            KVUtils.getDefault().putLong(COUNTER_PREFIX + key + COUNTER_DATE_SUFFIX, System.currentTimeMillis());
+            KVUtils.getDefault().putInt(COUNTER_PREFIX + key, 1);
+            return true;
+        }
+    }
+
+    /**
+     * 检查是否超过计数(当天)
+     *
+     * @param key        计数器key
+     * @param limitTimes 限制次数
+     * @return 是否超过限制
+     */
+    public static boolean checkLimitByDay(String key, int limitTimes) {
+        if (key == null || key.isEmpty() || limitTimes == 0) {
+            return false;
+        }
+        long lastTime = KVUtils.getDefault().getLong(COUNTER_PREFIX + key + COUNTER_DATE_SUFFIX, 0L);
+        if (DateUtils.isToday(lastTime)) {
+            int count = KVUtils.getDefault().getInt(COUNTER_PREFIX + key, 0);
+            return count < limitTimes;
+        }
+        return true;
+    }
+
+    /**
+     * 增加计数器(当天)
+     *
+     * @param key 计数器key
+     */
+    public static void incrementByDay(String key) {
+        long lastTime = KVUtils.getDefault().getLong(COUNTER_PREFIX + key + COUNTER_DATE_SUFFIX, 0L);
+        if (DateUtils.isToday(lastTime)) {
+            int count = KVUtils.getDefault().getInt(COUNTER_PREFIX + key, 0);
+            KVUtils.getDefault().putLong(COUNTER_PREFIX + key + COUNTER_DATE_SUFFIX, System.currentTimeMillis());
+            KVUtils.getDefault().putInt(COUNTER_PREFIX + key, count + 1);
+        } else {
+            KVUtils.getDefault().putLong(COUNTER_PREFIX + key + COUNTER_DATE_SUFFIX, System.currentTimeMillis());
+            KVUtils.getDefault().putInt(COUNTER_PREFIX + key, 1);
+        }
+    }
+}

+ 1 - 50
app/src/main/java/com/datarecovery/master/utils/FilePermissionHelper.java

@@ -1,7 +1,6 @@
 package com.datarecovery.master.utils;
 
 import android.os.Build;
-import android.text.TextUtils;
 import android.view.Gravity;
 
 import androidx.activity.ComponentActivity;
@@ -11,14 +10,10 @@ import androidx.lifecycle.LifecycleOwner;
 
 import com.atmob.common.data.KVUtils;
 import com.atmob.common.runtime.ContextUtil;
-import com.datarecovery.master.BuildConfig;
 import com.datarecovery.master.R;
 import com.datarecovery.master.data.consts.EventId;
-import com.datarecovery.master.data.repositories.AccountRepository;
 import com.datarecovery.master.dialog.PermissionDialog;
 import com.datarecovery.master.handler.EventHelper;
-import com.datarecovery.master.module.login.LoginActivity;
-import com.datarecovery.master.module.member.MemberType;
 import com.datarecovery.master.utils.xfile.XFilePermission;
 
 import atmob.reactivex.rxjava3.annotations.NonNull;
@@ -35,48 +30,8 @@ public class FilePermissionHelper {
 
     Disposable disposable;
 
-    public void requestDataFilePermission(ComponentActivity activity, @MemberType String memberType, boolean isSkipLogin, NextStepCallback stepCallback) {
+    public void requestDataFilePermission(ComponentActivity activity, NextStepCallback stepCallback) {
         Single.just(Build.VERSION.SDK_INT)
-                .flatMap(sdkInt -> {
-                    if (isSkipLogin || BuildConfig.DEBUG) {
-                        return Single.just(sdkInt);
-                    }
-                    if (TextUtils.isEmpty(AccountRepository.token)) {
-                        return (SingleSource<Integer>) observer -> activity.runOnUiThread(() -> {
-                            PermissionDialog loginDialog = new PermissionDialog(activity);
-                            loginDialog.setDialogContent(R.string.dialog_no_login)
-                                    .setDialogTitle(R.string.dialog_no_login_title)
-                                    .setOnDialogClickListener(new PermissionDialog.OnDialogClickListener() {
-                                        @Override
-                                        public void onClickSure() {
-                                            LoginActivity.start(activity, ReportUtil.getReportId(memberType));
-                                            activity.getLifecycle().addObserver(new LifecycleEventObserver() {
-                                                @Override
-                                                public void onStateChanged(@androidx.annotation.NonNull LifecycleOwner lifecycleOwner, @androidx.annotation.NonNull Lifecycle.Event event) {
-                                                    if (event == Lifecycle.Event.ON_RESUME) {
-                                                        if (!TextUtils.isEmpty(AccountRepository.token)) {
-                                                            loginDialog.dismiss();
-                                                            activity.getLifecycle().removeObserver(this);
-                                                            observer.onSuccess(sdkInt);
-                                                        }
-                                                    } else if (event == Lifecycle.Event.ON_DESTROY) {
-                                                        activity.getLifecycle().removeObserver(this);
-                                                    }
-                                                }
-                                            });
-                                        }
-
-                                        @Override
-                                        public void onClickCancel() {
-                                            observer.onError(new CancelException());
-                                        }
-                                    });
-                            loginDialog.show();
-                        });
-                    } else {
-                        return Single.just(sdkInt);
-                    }
-                })
                 .flatMap((Function<Integer, SingleSource<Integer>>) sdkInt -> {
                     //判断是否有所有文件权限
                     boolean result = PermissionUtil.hasFilePermission();
@@ -91,7 +46,6 @@ public class FilePermissionHelper {
                                     .setOnDialogClickListener(new PermissionDialog.OnDialogClickListener() {
                                         @Override
                                         public void onClickSure() {
-                                            EventHelper.report(EventId.hf1000402);
                                             PermissionUtil.requestWriteStoragePermission(activity, new PermissionUtil.PermissionCallback() {
                                                 @Override
                                                 public void onPermissionGranted() {
@@ -110,7 +64,6 @@ public class FilePermissionHelper {
 
                                         @Override
                                         public void onClickCancel() {
-                                            EventHelper.report(EventId.hf1000401);
                                             observer.onError(new CancelException());
                                         }
                                     });
@@ -135,7 +88,6 @@ public class FilePermissionHelper {
                                     .setOnDialogClickListener(new PermissionDialog.OnDialogClickListener() {
                                         @Override
                                         public void onClickSure() {
-                                            EventHelper.report(EventId.hf1000404);
                                             XFilePermission.requestAndroidDataPermission(activity, new XFilePermission.PermissionCallback() {
                                                 @Override
                                                 public void onPermissionGranted() {
@@ -154,7 +106,6 @@ public class FilePermissionHelper {
 
                                         @Override
                                         public void onClickCancel() {
-                                            EventHelper.report(EventId.hf1000403);
                                             observer.onError(new CancelException());
                                         }
                                     });

+ 82 - 0
app/src/main/java/com/datarecovery/master/utils/SplashHandler.java

@@ -0,0 +1,82 @@
+package com.datarecovery.master.utils;
+
+import android.app.Activity;
+import android.content.Context;
+import android.content.Intent;
+
+import androidx.lifecycle.Lifecycle;
+import androidx.lifecycle.LifecycleEventObserver;
+import androidx.lifecycle.ProcessLifecycleOwner;
+
+import com.atmob.common.runtime.ActivityUtil;
+import com.atmob.common.runtime.ContextUtil;
+import com.atmob.mediation.api.AtmobAdSdk;
+import com.datarecovery.master.module.splash.SplashActivity;
+
+import java.util.Arrays;
+import java.util.List;
+
+public class SplashHandler {
+    private static final String TAG = SplashHandler.class.getSimpleName();
+
+    public static final int SplashRequestCode = 2843;
+
+    private static final List<Class<? extends Activity>> WHITE_LIST = Arrays.asList(
+            SplashActivity.class
+    );
+
+    private static boolean appInBackground = true;
+
+    private static volatile boolean skipOnce;
+
+    private SplashHandler() {
+
+    }
+
+    public static void init() {
+        ProcessLifecycleOwner.get().getLifecycle().addObserver((LifecycleEventObserver) (source, event) -> {
+            if (event == Lifecycle.Event.ON_START) {
+                appInBackground = false;
+                showSplash();
+            } else if (event == Lifecycle.Event.ON_STOP) {
+                appInBackground = true;
+            } else if (event == Lifecycle.Event.ON_DESTROY) {
+            }
+        });
+    }
+
+    public static boolean isAppInBackground() {
+        return appInBackground;
+    }
+
+    private static void showSplash() {
+        Activity topActivity = ActivityUtil.getTopActivity();
+        if (topActivity == null) {
+            Context context = ContextUtil.getContext();
+            Intent intent = new Intent(context, SplashActivity.class);
+            intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+            context.startActivity(intent);
+            return;
+        }
+        if (couldShow(topActivity.getClass())) {
+            Intent intent = new Intent(topActivity, SplashActivity.class);
+            topActivity.startActivityForResult(intent, SplashRequestCode);
+        }
+    }
+
+    private static boolean couldShow(Class<? extends Activity> activityClass) {
+        if (skipOnce) {
+            skipOnce = false;
+            return false;
+        }
+        return !inWhiteList(activityClass);
+    }
+
+    public static boolean inWhiteList(Class<? extends Activity> activityClass) {
+        return WHITE_LIST.contains(activityClass) || AtmobAdSdk.isAdActivity(activityClass);
+    }
+
+    public static void doNotShowNextTime() {
+        skipOnce = true;
+    }
+}

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


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


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


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


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


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


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


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


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


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


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


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


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


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


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


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


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


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


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


+ 12 - 0
app/src/main/res/drawable/bg_ad_skip_button.xml

@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8"?>
+<shape xmlns:android="http://schemas.android.com/apk/res/android"
+    android:shape="rectangle">
+
+    <stroke
+        android:width="1dp"
+        android:color="@color/white" />
+
+    <corners android:radius="20dp" />
+
+    <solid android:color="@color/black50" />
+</shape>

+ 8 - 0
app/src/main/res/drawable/bg_backup_helper_button.xml

@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8"?>
+<shape xmlns:android="http://schemas.android.com/apk/res/android"
+    android:shape="rectangle">
+    <gradient
+        android:endColor="#40B1FD"
+        android:startColor="#227AFF" />
+    <corners android:radius="10dp" />
+</shape>

+ 6 - 0
app/src/main/res/drawable/bg_backup_helper_tab.xml

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

+ 8 - 0
app/src/main/res/drawable/bg_dialog_unlock_btn.xml

@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8"?>
+<shape xmlns:android="http://schemas.android.com/apk/res/android"
+    android:shape="rectangle">
+    <corners android:radius="5dp" />
+    <gradient
+        android:endColor="#2670FD"
+        android:startColor="#0434DA" />
+</shape>

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

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

+ 1 - 5
app/src/main/res/drawable/bg_home_page_scroll.xml

@@ -1,9 +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="#EBF6FF" />
-    <stroke
-        android:width="0.2dp"
-        android:color="#E8EFFF" />
-
+    <solid android:color="#fff" />
 </shape>

+ 14 - 0
app/src/main/res/drawable/bg_qq_tutorial.xml

@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="utf-8"?>
+<selector xmlns:android="http://schemas.android.com/apk/res/android">
+    <item android:state_selected="true">
+        <shape android:shape="rectangle">
+            <corners android:radius="100dp" />
+            <stroke android:width="1dp" android:color="#46AAFD" />
+            <gradient android:endColor="#D0EAFD" android:startColor="#EDF3F9" />
+        </shape>
+    </item>
+    <item>
+        <shape android:shape="rectangle">
+        </shape>
+    </item>
+</selector>

+ 14 - 0
app/src/main/res/drawable/bg_wechat_tutorial.xml

@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="utf-8"?>
+<selector xmlns:android="http://schemas.android.com/apk/res/android">
+    <item android:state_selected="true">
+        <shape android:shape="rectangle">
+            <corners android:radius="100dp" />
+            <stroke android:width="1dp" android:color="#64DB4C" />
+            <gradient android:endColor="#DCFFD5" android:startColor="#F9FFFA" />
+        </shape>
+    </item>
+    <item>
+        <shape android:shape="rectangle">
+        </shape>
+    </item>
+</selector>

+ 17 - 0
app/src/main/res/drawable/selector_home_page_information.xml

@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="utf-8"?>
+<selector xmlns:android="http://schemas.android.com/apk/res/android">
+    <item android:state_selected="true">
+        <shape>
+            <corners android:radius="3dp" />
+            <solid android:color="#0259FE" />
+        </shape>
+    </item>
+
+    <item>
+        <shape>
+            <corners android:radius="3dp" />
+            <solid android:color="#22bf03" />
+        </shape>
+    </item>
+
+</selector>

+ 0 - 0
app/src/main/res/drawable/selector_home_page_tab_indicator.xml


Some files were not shown because too many files changed in this diff