Forráskód Böngészése

[New]新增埋点

litchi98 6 hónapja
szülő
commit
8d71ee012e
25 módosított fájl, 885 hozzáadás és 25 törlés
  1. 371 0
      app/src/main/java/com/datarecovery/master/data/consts/EventId.java
  2. 4 1
      app/src/main/java/com/datarecovery/master/dialog/CommonSureDialog.java
  3. 31 2
      app/src/main/java/com/datarecovery/master/dialog/ScanFileDialog.java
  4. 34 2
      app/src/main/java/com/datarecovery/master/dialog/UnlockFunctionDialog.java
  5. 18 4
      app/src/main/java/com/datarecovery/master/module/about/AboutActivity.java
  6. 26 2
      app/src/main/java/com/datarecovery/master/module/audiorecover/AudioRecoverActivity.java
  7. 6 0
      app/src/main/java/com/datarecovery/master/module/audiorecover/AudioRecoverViewModel.java
  8. 26 3
      app/src/main/java/com/datarecovery/master/module/backup_helper/BackupHelperActivity.java
  9. 31 1
      app/src/main/java/com/datarecovery/master/module/example/ExampleFragment.java
  10. 4 0
      app/src/main/java/com/datarecovery/master/module/feedback/UserFeedbackViewModel.java
  11. 25 2
      app/src/main/java/com/datarecovery/master/module/filerecover/FileRecoverActivity.java
  12. 6 0
      app/src/main/java/com/datarecovery/master/module/filerecover/FileRecoverViewModel.java
  13. 6 1
      app/src/main/java/com/datarecovery/master/module/filerecover/fragment/FileRecoverFragment.java
  14. 119 0
      app/src/main/java/com/datarecovery/master/module/homepage/HomePageViewModel.java
  15. 46 2
      app/src/main/java/com/datarecovery/master/module/imgrecover/ImageRecoverActivity.java
  16. 8 0
      app/src/main/java/com/datarecovery/master/module/imgrecover/ImageRecoverViewModel.java
  17. 14 0
      app/src/main/java/com/datarecovery/master/module/main/MainActivity.java
  18. 7 0
      app/src/main/java/com/datarecovery/master/module/mine/MineViewModel.java
  19. 45 1
      app/src/main/java/com/datarecovery/master/module/preview/PreviewActivity.java
  20. 15 0
      app/src/main/java/com/datarecovery/master/module/preview/PreviewViewModel.java
  21. 4 0
      app/src/main/java/com/datarecovery/master/module/splash/SplashActivity.java
  22. 25 2
      app/src/main/java/com/datarecovery/master/module/videorecover/VideoRecoverActivity.java
  23. 6 0
      app/src/main/java/com/datarecovery/master/module/videorecover/VideoRecoverViewModel.java
  24. 6 2
      app/src/main/java/com/datarecovery/master/utils/FilePermissionHelper.java
  25. 2 0
      app/src/main/res/values/strings.xml

+ 371 - 0
app/src/main/java/com/datarecovery/master/data/consts/EventId.java

@@ -1,5 +1,376 @@
 package com.datarecovery.master.data.consts;
 
+/**
+ * 事件ID常量接口,定义系统中所有事件的唯一标识符
+ */
 public interface EventId {
+    /**
+     * 正在扫描数据弹窗-展示
+     * 触发入口ID(整数型), key-id:
+     * 1. 图片备份——101
+     * 2. 文件备份——102
+     * 3. 视频备份——103
+     * 4. 音频备份——104
+     * 5. 图片清除——105
+     */
+    String EVENT_3000000 = "3000000";
 
+    /**
+     * 正在扫描数据弹窗-取消扫描
+     * 触发入口ID(整数型), key-id:
+     * 1. 图片备份——101
+     * 2. 文件备份——102
+     * 3. 视频备份——103
+     * 4. 音频备份——104
+     * 5. 图片清除——105
+     */
+    String EVENT_3000001 = "3000001";
+
+    /**
+     * 功能列表页-点击返回
+     * 出广告位
+     * 触发入口ID(整数型), key-id:
+     * 1. 图片备份——101
+     * 2. 文件备份——102
+     * 3. 视频备份——103
+     * 4. 音频备份——104
+     * 5. 图片清除——105
+     */
+    String EVENT_3000002 = "3000002";
+
+    /**
+     * 回到首页tab
+     * 触发入口ID(整数型), key-id:
+     * 1. 图片备份——101
+     * 2. 文件备份——102
+     * 3. 视频备份——103
+     * 4. 音频备份——104
+     * 5. 图片清除——105
+     * 6. 未授权文件权限——106
+     * 7. 备份教程——107
+     */
+    String EVENT_3000003 = "3000003";
+
+    /**
+     * toast提示备份成功
+     * 出广告位
+     */
+    String EVENT_3000004 = "3000004";
+
+    /**
+     * 点击立即备份
+     * 触发入口ID(整数型), key-id:
+     * 1. 图片备份——101
+     * 2. 文件备份——102
+     * 3. 视频备份——103
+     * 4. 音频备份——104
+     * 5. 我的-banner——105
+     */
+    String EVENT_3000005 = "3000005";
+
+    /**
+     * 点击全选按钮
+     */
+    String EVENT_3000006 = "3000006";
+
+    /**
+     * 文件授权弹窗-展示
+     */
+    String EVENT_3000100 = "3000100";
+
+    /**
+     * 文件授权弹窗-授权权限
+     */
+    String EVENT_3000101 = "3000101";
+
+    /**
+     * 文件授权弹窗-取消
+     */
+    String EVENT_3000102 = "3000102";
+
+    /**
+     * 二次确认返回弹窗-展示
+     * 触发入口ID(整数型), key-id:
+     * 1. 图片备份——101
+     * 2. 文件备份——102
+     * 3. 视频备份——103
+     * 4. 音频备份——104
+     * 5. 图片清除——105
+     */
+    String EVENT_3000200 = "3000200";
+
+    /**
+     * 二次确认返回弹窗-确认
+     */
+    String EVENT_3000201 = "3000201";
+
+    /**
+     * 二次确认返回弹窗-取消
+     */
+    String EVENT_3000202 = "3000202";
+
+    /**
+     * 解锁弹窗-展示
+     * 触发入口ID(整数型), key-id:
+     * 1. 图片备份——101
+     * 2. 文件备份——102
+     * 3. 视频备份——103
+     * 4. 音频备份——104
+     * 5. 图片清除——105
+     */
+    String EVENT_3000300 = "3000300";
+
+    /**
+     * 解锁弹窗-免费解锁
+     * 出广告位
+     * 触发入口ID(整数型), key-id:
+     * 1. 图片备份——101
+     * 2. 文件备份——102
+     * 3. 视频备份——103
+     * 4. 音频备份——104
+     * 5. 图片清除——105
+     */
+    String EVENT_3000301 = "3000301";
+
+    /**
+     * 解锁弹窗-关闭
+     */
+    String EVENT_3000302 = "3000302";
+
+    /**
+     * 点击首页tab
+     */
+    String EVENT_3000400 = "3000400";
+
+    /**
+     * 首页-微信点击的功能
+     * weixin_id-整数型(微信功能ID):
+     * 1. 图片备份——101
+     * 2. 文件备份——102
+     * 3. 视频备份——103
+     * 4. 音频备份——104
+     * 5. 图片清除——105
+     * is_first_click_weixin-布尔值(是否首次微信点击的功能):
+     * 1. 是——101
+     * 2. 不是——102
+     */
+    String EVENT_3000401 = "3000401";
+
+    /**
+     * 首页-QQ点击的功能
+     * qq_id-整数型(QQ功能ID):
+     * 1. 图片备份——101
+     * 2. 文件备份——102
+     * 3. 视频备份——103
+     * 4. 音频备份——104
+     * 5. 图片清除——105
+     * is_first_click_qq-布尔值(是否首次QQ点击的功能):
+     * 1. 是——101
+     * 2. 不是——102
+     */
+    String EVENT_3000402 = "3000402";
+
+    /**
+     * 首页-首次点击的功能
+     * function_id-整数型(功能ID):
+     * 1. 微信-图片备份——101
+     * 2. 微信-文件备份——102
+     * 3. 微信-视频备份——103
+     * 4. 微信-音频备份——104
+     * 5. 微信-图片清除——105
+     * 6. QQ-图片备份——106
+     * 7. QQ-文件备份——107
+     * 8. QQ-视频备份——108
+     * 9. QQ-音频备份——109
+     * 10. QQ-图片清除——110
+     */
+    String EVENT_3000403 = "3000403";
+
+    /**
+     * 首页-切换数据专区tab
+     * zone_id-整数型(专区ID):
+     * 1. 微信——101
+     * 2. QQ——102
+     */
+    String EVENT_3000404 = "3000404";
+
+    /**
+     * 首页-点击免费解锁
+     */
+    String EVENT_3000405 = "3000405";
+
+    /**
+     * 图片备份-点击图片
+     */
+    String EVENT_3000500 = "3000500";
+
+    /**
+     * 图片备份-选中图片
+     */
+    String EVENT_3000501 = "3000501";
+
+    /**
+     * 图片预览页-展示
+     * 出广告位
+     */
+    String EVENT_3000502 = "3000502";
+
+    /**
+     * 图片预览页-返回
+     */
+    String EVENT_3000503 = "3000503";
+
+    /**
+     * 图片预览页-立即备份
+     */
+    String EVENT_3000504 = "3000504";
+
+    /**
+     * 文件备份-点击文件
+     */
+    String EVENT_3000600 = "3000600";
+
+    /**
+     * 视频备份-点击视频
+     */
+    String EVENT_3000700 = "3000700";
+
+    /**
+     * 视频预览页-展示
+     */
+    String EVENT_3000701 = "3000701";
+
+    /**
+     * 视频预览页-返回
+     */
+    String EVENT_3000702 = "3000702";
+
+    /**
+     * 音频备份-点击音频
+     */
+    String EVENT_3000800 = "3000800";
+
+    /**
+     * 音频预览页-展示
+     */
+    String EVENT_3000801 = "3000801";
+
+    /**
+     * 音频预览页-返回
+     */
+    String EVENT_3000802 = "3000802";
+
+    /**
+     * 音频预览页-立即备份
+     */
+    String EVENT_3000803 = "3000803";
+
+    /**
+     * 图片清除-点击图片
+     */
+    String EVENT_3000900 = "3000900";
+
+    /**
+     * 图片清除-点击立即清除
+     * 出广告位
+     */
+    String EVENT_3000901 = "3000901";
+
+    /**
+     * toast提示清除成功
+     * 出广告位
+     */
+    String EVENT_3000902 = "3000902";
+
+    /**
+     * 点击备份教程入口
+     * 出广告位
+     */
+    String EVENT_3001000 = "3001000";
+
+    /**
+     * 备份教程-我知道了
+     */
+    String EVENT_3001001 = "3001001";
+
+    /**
+     * 备份教程-切换教程
+     * zone_id-整数型(专区ID):
+     * 1. 微信——101
+     * 2. QQ——102
+     */
+    String EVENT_3001002 = "3001002";
+
+    /**
+     * 点击案例tab
+     * 出广告位
+     */
+    String EVENT_3010000 = "3010000";
+
+    /**
+     * 案例列表页-点击案例
+     * case_id-整数型(案例ID)
+     * is_first_click_case-布尔值(是否首次点击的案例):
+     */
+    String EVENT_3010100 = "3010100";
+
+    /**
+     * 案例详情页-展示
+     */
+    String EVENT_3010200 = "3010200";
+
+    /**
+     * 案例详情页-返回
+     */
+    String EVENT_3010201 = "3010201";
+
+    /**
+     * 点击我的tab
+     */
+    String EVENT_3020000 = "3020000";
+
+    /**
+     * 我的-点击关于我们
+     */
+    String EVENT_3020001 = "3020001";
+
+    /**
+     * 我的-点击意见反馈
+     */
+    String EVENT_3020002 = "3020002";
+
+    /**
+     * 意见反馈提交成功
+     */
+    String EVENT_3020100 = "3020100";
+
+    /**
+     * 关于我们-用户协议
+     */
+    String EVENT_3020200 = "3020200";
+
+    /**
+     * 关于我们-隐私协议
+     */
+    String EVENT_3020201 = "3020201";
+
+    /**
+     * 关于我们-个人信息收集清单
+     */
+    String EVENT_3020202 = "3020202";
+
+    /**
+     * 关于我们-第三方SDK共享清单
+     */
+    String EVENT_3020203 = "3020203";
+
+    /**
+     * 启动页-隐私弹窗点击同意并继续
+     */
+    String EVENT_3030000 = "3030000";
+
+    /**
+     * 启动页-通知栏权限弹窗点击开启
+     */
+    String EVENT_3030001 = "3030001";
 }

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

@@ -6,9 +6,10 @@ import android.view.View;
 import androidx.annotation.NonNull;
 import androidx.annotation.StringRes;
 
-import com.datarecovery.master.dialog.BaseDialog;
 import com.datarecovery.master.R;
+import com.datarecovery.master.data.consts.EventId;
 import com.datarecovery.master.databinding.DialogCommonSureBinding;
+import com.datarecovery.master.handler.EventHelper;
 
 @BaseDialog.FullScreen(height = false)
 public class CommonSureDialog extends BaseDialog<DialogCommonSureBinding> {
@@ -24,9 +25,11 @@ public class CommonSureDialog extends BaseDialog<DialogCommonSureBinding> {
                 onDialogClickListener.onClickSure();
             }
             dismiss();
+            EventHelper.report(EventId.EVENT_3000201);
         });
         binding.setOnClickCancel(v -> {
             dismiss();
+            EventHelper.report(EventId.EVENT_3000202);
         });
     }
 

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

@@ -5,23 +5,31 @@ import android.content.Context;
 import androidx.annotation.NonNull;
 import androidx.lifecycle.LiveData;
 
-import com.datarecovery.master.dialog.BaseDialog;
 import com.datarecovery.master.R;
+import com.datarecovery.master.data.consts.EventId;
 import com.datarecovery.master.databinding.DialogScanFileBinding;
+import com.datarecovery.master.handler.EventHelper;
+import com.datarecovery.master.module.homepage.FunctionBean;
+import com.datarecovery.master.utils.Maps;
 
 
 @BaseDialog.FullScreen(height = false)
 public class ScanFileDialog extends BaseDialog<DialogScanFileBinding> {
 
     private final LiveData<String> detectedLastFileName;
+    private final int function;
+    private final int eventId;
 
     private OnCancelListener onCancelListener;
 
-    public ScanFileDialog(@NonNull Context context, LiveData<String> detectedLastFileName) {
+    public ScanFileDialog(@NonNull Context context, LiveData<String> detectedLastFileName, int function) {
         super(context, R.style.Theme_Common_Dialog);
         this.detectedLastFileName = detectedLastFileName;
+        this.function = function;
+        this.eventId = getEventIdByFunction(function);
         setCancelable(false);
         binding.setCancelClick(v -> {
+            EventHelper.report(EventId.EVENT_3000001, Maps.asMap("id", eventId));
             if (onCancelListener != null) {
                 onCancelListener.onCancel();
             }
@@ -34,6 +42,27 @@ public class ScanFileDialog extends BaseDialog<DialogScanFileBinding> {
         this.onCancelListener = onCancelListener;
     }
 
+    private int getEventIdByFunction(int function) {
+        switch (function) {
+            case FunctionBean.IMG_RECOVERY:
+                return 101;
+            case FunctionBean.FILE_RECOVERY:
+                return 102;
+            case FunctionBean.VIDEO_RECOVERY:
+                return 103;
+            case FunctionBean.AUDIO_RECOVERY:
+                return 104;
+            case FunctionBean.IMG_CLEARING:
+                return 105;
+        }
+        return 0;
+    }
+
+    @Override
+    protected void onShow() {
+        super.onShow();
+        EventHelper.report(EventId.EVENT_3000000, Maps.asMap("id", eventId));
+    }
 
     public interface OnCancelListener {
         void onCancel();

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

@@ -5,23 +5,49 @@ import android.content.Context;
 import androidx.annotation.NonNull;
 
 import com.datarecovery.master.R;
+import com.datarecovery.master.data.consts.EventId;
 import com.datarecovery.master.databinding.DialogUnlockFunctionBinding;
+import com.datarecovery.master.handler.EventHelper;
+import com.datarecovery.master.module.homepage.FunctionBean;
+import com.datarecovery.master.utils.Maps;
 
 @BaseDialog.FullScreen
 public class UnlockFunctionDialog extends BaseDialog<DialogUnlockFunctionBinding> {
 
+    private final int eventId;
     private ActionHandler actionHandler;
 
-    public UnlockFunctionDialog(@NonNull Context context) {
+    public UnlockFunctionDialog(@NonNull Context context, int function) {
         super(context, R.style.Theme_Common_Dialog);
         setCancelable(false);
+        this.eventId = getEventIdByFunction(function);
         binding.setOnUnlockClickListener(v -> {
             if (actionHandler != null) {
                 actionHandler.onUnlock();
             }
             dismiss();
+            EventHelper.report(EventId.EVENT_3000301, Maps.asMap("id", eventId));
         });
-        binding.setOnCloseClickListener(v -> dismiss());
+        binding.setOnCloseClickListener(v -> {
+            dismiss();
+            EventHelper.report(EventId.EVENT_3000302, Maps.asMap("id", eventId));
+        });
+    }
+
+    private int getEventIdByFunction(int function) {
+        switch (function) {
+            case FunctionBean.IMG_RECOVERY:
+                return 101;
+            case FunctionBean.FILE_RECOVERY:
+                return 102;
+            case FunctionBean.VIDEO_RECOVERY:
+                return 103;
+            case FunctionBean.AUDIO_RECOVERY:
+                return 104;
+            case FunctionBean.IMG_CLEARING:
+                return 105;
+        }
+        return 0;
     }
 
     public UnlockFunctionDialog setActionHandler(ActionHandler actionHandler) {
@@ -29,6 +55,12 @@ public class UnlockFunctionDialog extends BaseDialog<DialogUnlockFunctionBinding
         return this;
     }
 
+    @Override
+    protected void onShow() {
+        super.onShow();
+        EventHelper.report(EventId.EVENT_3000300, Maps.asMap("id", eventId));
+    }
+
     public interface ActionHandler {
         void onUnlock();
     }

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

@@ -14,8 +14,10 @@ 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;
@@ -66,8 +68,14 @@ public class AboutActivity extends BaseActivity<ActivityAboutBinding> {
         binding.tvVersionCode.setText(SystemUtil.getVersionName(getBaseContext()));
         binding.toolBar.setNavigationOnClickListener(v -> onBackPressed());
         addTopStatusBarHeight(binding.toolBar);
-        binding.setUserAgreementClick(v -> BrowserActivity.start(this, Constants.USER_AGREEMENT));
-        binding.setPrivacyAgreementClick(v -> BrowserActivity.start(this, Constants.PRIVACY_POLICY));
+        binding.setUserAgreementClick(v -> {
+            BrowserActivity.start(this, Constants.USER_AGREEMENT);
+            EventHelper.report(EventId.EVENT_3020200);
+        });
+        binding.setPrivacyAgreementClick(v -> {
+            BrowserActivity.start(this, Constants.PRIVACY_POLICY);
+            EventHelper.report(EventId.EVENT_3020201);
+        });
         binding.vTrial.setOnClickListener(v -> {
             if (times == 0) {
                 if (subscribe != null && !subscribe.isDisposed()) {
@@ -82,8 +90,14 @@ public class AboutActivity extends BaseActivity<ActivityAboutBinding> {
                 times++;
             }
         });
-        binding.setInformationListClick(v -> BrowserActivity.start(this, Constants.USER_INFO_LIST));
-        binding.setSdkSharingListClick(v -> BrowserActivity.start(this, Constants.THREE_SDK_LIST));
+        binding.setInformationListClick(v -> {
+            BrowserActivity.start(this, Constants.USER_INFO_LIST);
+            EventHelper.report(EventId.EVENT_3020202);
+        });
+        binding.setSdkSharingListClick(v -> {
+            BrowserActivity.start(this, Constants.THREE_SDK_LIST);
+            EventHelper.report(EventId.EVENT_3020203);
+        });
         binding.setKipProtectionClick(v -> BrowserActivity.start(this, Constants.KID_PROTECTION));
 
         AtmobAdHelper.showNative(AdFuncId.NATIVE_MINE, binding.adContainer);

+ 26 - 2
app/src/main/java/com/datarecovery/master/module/audiorecover/AudioRecoverActivity.java

@@ -1,5 +1,7 @@
 package com.datarecovery.master.module.audiorecover;
 
+import static com.datarecovery.master.data.consts.EventId.EVENT_3000003;
+
 import android.annotation.SuppressLint;
 import android.app.Activity;
 import android.content.Context;
@@ -21,12 +23,15 @@ import com.atmob.common.ui.SizeUtil;
 import com.datarecovery.master.R;
 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.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.UnlockFunctionDialog;
+import com.datarecovery.master.handler.EventHelper;
+import com.datarecovery.master.module.homepage.FunctionBean;
 import com.datarecovery.master.module.preview.PreviewActivity;
 import com.datarecovery.master.sdk.ad.AtmobAdHelper;
 import com.datarecovery.master.sdk.ad.RewardVideoListenerAdapter;
@@ -34,6 +39,8 @@ 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.ToastUtil;
 import com.gyf.immersionbar.ImmersionBar;
 
 import dagger.hilt.android.AndroidEntryPoint;
@@ -84,6 +91,7 @@ public class AudioRecoverActivity extends BaseActivity<ActivityAudioRecoverBindi
 
             @Override
             public void onCancel() {
+                EventHelper.report(EVENT_3000003, Maps.asMap("id", 106));
                 finish();
             }
         });
@@ -107,6 +115,7 @@ public class AudioRecoverActivity extends BaseActivity<ActivityAudioRecoverBindi
 
             @Override
             public void onItemClick(FilesSearch.DocumentFile file) {
+                EventHelper.report(EventId.EVENT_3000800);
                 PreviewActivity.startDocumentPreView(AudioRecoverActivity.this, PreviewActivity.TYPE_AUDIO, file);
             }
         });
@@ -127,7 +136,7 @@ public class AudioRecoverActivity extends BaseActivity<ActivityAudioRecoverBindi
 
     private void showUnlockDialog() {
         if (unlockFunctionDialog == null) {
-            unlockFunctionDialog = new UnlockFunctionDialog(this)
+            unlockFunctionDialog = new UnlockFunctionDialog(this, FunctionBean.AUDIO_RECOVERY)
                     .setActionHandler(new UnlockFunctionDialog.ActionHandler() {
                         @Override
                         public void onUnlock() {
@@ -137,6 +146,12 @@ public class AudioRecoverActivity extends BaseActivity<ActivityAudioRecoverBindi
                                     super.onRewarded(token);
                                     audioRecoverViewModel.doExport();
                                 }
+
+                                @Override
+                                public void onFail(String s) {
+                                    super.onFail(s);
+                                    ToastUtil.show(R.string.recover_failed, ToastUtil.LENGTH_SHORT);
+                                }
                             });
                         }
                     });
@@ -230,12 +245,20 @@ public class AudioRecoverActivity extends BaseActivity<ActivityAudioRecoverBindi
             AtmobAdHelper.showInterstitial(AdFuncId.INTERSTITIAL_RESULT_BACK, null);
         }
         showBackDialog();
+
+        EventHelper.report(EventId.EVENT_3000002, Maps.asMap("id", 104));
+    }
+
+    @Override
+    public void finish() {
+        super.finish();
+        EventHelper.report(EventId.EVENT_3000002, Maps.asMap("id", 104));
     }
 
     public void showScanProgressDialog(Boolean show) {
         if (BoxingUtil.boxing(show)) {
             if (scanFileDialog == null) {
-                scanFileDialog = new ScanFileDialog(this, audioRecoverViewModel.getDetectedLastFileName());
+                scanFileDialog = new ScanFileDialog(this, audioRecoverViewModel.getDetectedLastFileName(), FunctionBean.AUDIO_RECOVERY);
                 scanFileDialog.setOnCancelListener(() -> audioRecoverViewModel.cancelScan());
             }
             scanFileDialog.show();
@@ -252,6 +275,7 @@ public class AudioRecoverActivity extends BaseActivity<ActivityAudioRecoverBindi
             backDialog.setDialogTitle(R.string.img_recovery_back_title)
                     .setDialogContent(R.string.img_recovery_back_content)
                     .setOnDialogClickListener(this::finish);
+            backDialog.setOnShowListener(dialog -> EventHelper.report(EventId.EVENT_3000200, Maps.asMap("id", 104)));
         }
         backDialog.show();
     }

+ 6 - 0
app/src/main/java/com/datarecovery/master/module/audiorecover/AudioRecoverViewModel.java

@@ -1,5 +1,7 @@
 package com.datarecovery.master.module.audiorecover;
 
+import static com.datarecovery.master.data.consts.EventId.EVENT_3000004;
+
 import androidx.lifecycle.LiveData;
 import androidx.lifecycle.MutableLiveData;
 import androidx.lifecycle.Transformations;
@@ -10,7 +12,9 @@ import com.atmob.common.runtime.ActivityUtil;
 import com.atmob.common.runtime.ContextUtil;
 import com.datarecovery.master.R;
 import com.datarecovery.master.data.consts.AdFuncId;
+import com.datarecovery.master.data.consts.EventId;
 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;
@@ -218,6 +222,7 @@ public class AudioRecoverViewModel extends BaseViewModel {
     }
 
     public void onCheckAllClick(boolean isCheck) {
+        EventHelper.report(EventId.EVENT_3000006);
         checkAll.setValue(isCheck);
         List<FilesSearch.DocumentFile> detectedList = getList(detectedVideoList);
         for (FilesSearch.DocumentFile videoFile : detectedList) {
@@ -281,6 +286,7 @@ public class AudioRecoverViewModel extends BaseViewModel {
                         checkAll.setValue(false);
                         ToastUtil.show(R.string.export_success, ToastUtil.LENGTH_SHORT);
                         AtmobAdHelper.showInterstitial(AdFuncId.INTERSTITIAL_RECOVER_SUCCESS, null);
+                        EventHelper.report(EVENT_3000004);
                     }
 
                     @Override

+ 26 - 3
app/src/main/java/com/datarecovery/master/module/backup_helper/BackupHelperActivity.java

@@ -10,7 +10,10 @@ import androidx.annotation.Nullable;
 import androidx.lifecycle.MutableLiveData;
 
 import com.atmob.app.lib.base.BaseActivity;
+import com.datarecovery.master.data.consts.EventId;
 import com.datarecovery.master.databinding.ActivityBackupHelperBinding;
+import com.datarecovery.master.handler.EventHelper;
+import com.datarecovery.master.utils.Maps;
 
 public class BackupHelperActivity extends BaseActivity<ActivityBackupHelperBinding> {
 
@@ -42,8 +45,28 @@ public class BackupHelperActivity extends BaseActivity<ActivityBackupHelperBindi
 
     private void initView() {
         addTopStatusBarHeight(binding.topSpace);
-        binding.setOnQQClickListener(v -> this.isWechatSelected.setValue(false));
-        binding.setOnWechatClickListener(v -> this.isWechatSelected.setValue(true));
-        binding.setOnBtnClickListener(v -> finish());
+        binding.setOnQQClickListener(v -> {
+            this.isWechatSelected.setValue(false);
+            EventHelper.report(EventId.EVENT_3001002, Maps.asMap("zone_id", 101));
+        });
+        binding.setOnWechatClickListener(v -> {
+            this.isWechatSelected.setValue(true);
+            EventHelper.report(EventId.EVENT_3001002, Maps.asMap("zone_id", 102));
+        });
+        binding.setOnBtnClickListener(v -> {
+            finish();
+            EventHelper.report(EventId.EVENT_3001001);
+        });
+    }
+
+    @Override
+    public void onBackPressed() {
+        finish();
+    }
+
+    @Override
+    public void finish() {
+        super.finish();
+        EventHelper.report(EventId.EVENT_3000003, Maps.asMap("id", 107));
     }
 }

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

@@ -7,11 +7,18 @@ import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
 import androidx.recyclerview.widget.LinearLayoutManager;
 
+import com.atmob.analytics.utils.Maps;
 import com.atmob.app.lib.base.BaseFragment;
+import com.atmob.common.data.KVUtils;
+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;
 
+import java.util.List;
+
 import dagger.hilt.android.AndroidEntryPoint;
 
 
@@ -21,6 +28,7 @@ public class ExampleFragment extends BaseFragment<FragmentExampleBinding> {
 
     private ExampleViewModel exampleViewModel;
     private ExampleAdapter exampleAdapter;
+    private boolean goToDetail;
 
     @Override
     public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
@@ -33,7 +41,20 @@ public class ExampleFragment extends BaseFragment<FragmentExampleBinding> {
         exampleAdapter = new ExampleAdapter(this);
         binding.ryExample.setLayoutManager(new LinearLayoutManager(getContext()));
         binding.ryExample.setAdapter(exampleAdapter);
-        exampleAdapter.setOnItemClickListener(itemBean -> BrowserActivity.start(getActivity(), itemBean.getLink()));
+        exampleAdapter.setOnItemClickListener(itemBean -> {
+            boolean isFirstClickCase = KVUtils.getDefault().getBoolean("is_first_click_case", true);
+            if (isFirstClickCase) {
+                KVUtils.getDefault().putBoolean("is_first_click_case", false);
+            }
+            List<ExampleBean> exampleBeans = exampleViewModel.getExampleList().getValue();
+            EventHelper.report(EventId.EVENT_3010100, Maps.of(
+                    "case_id", exampleBeans == null ? 0 : exampleBeans.indexOf(itemBean) + 1,
+                    "is_first_click_case", isFirstClickCase
+            ));
+            goToDetail = true;
+            BrowserActivity.start(getActivity(), itemBean.getLink());
+            EventHelper.report(EventId.EVENT_3010200);
+        });
     }
 
     private void initObserver() {
@@ -51,4 +72,13 @@ public class ExampleFragment extends BaseFragment<FragmentExampleBinding> {
         exampleViewModel = getViewModelProvider().get(ExampleViewModel.class);
         binding.setExampleViewModel(exampleViewModel);
     }
+
+    @Override
+    public void onResume() {
+        super.onResume();
+        if (goToDetail) {
+            goToDetail = false;
+            EventHelper.report(EventId.EVENT_3010201);
+        }
+    }
 }

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

@@ -6,6 +6,8 @@ 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.ToastUtil;
 
 import javax.inject.Inject;
@@ -43,6 +45,8 @@ public class UserFeedbackViewModel extends BaseViewModel {
         }
         ToastUtil.show(R.string.feed_back_success, ToastUtil.LENGTH_SHORT);
         finishEvent.call();
+
+        EventHelper.report(EventId.EVENT_3020100);
     }
 
 

+ 25 - 2
app/src/main/java/com/datarecovery/master/module/filerecover/FileRecoverActivity.java

@@ -1,5 +1,7 @@
 package com.datarecovery.master.module.filerecover;
 
+import static com.datarecovery.master.data.consts.EventId.EVENT_3000003;
+
 import android.app.Activity;
 import android.content.Context;
 import android.content.Intent;
@@ -14,17 +16,22 @@ import com.atmob.app.lib.base.BaseActivity;
 import com.datarecovery.master.R;
 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.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.UnlockFunctionDialog;
+import com.datarecovery.master.handler.EventHelper;
+import com.datarecovery.master.module.homepage.FunctionBean;
 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.ToastUtil;
 import com.google.android.material.tabs.TabLayout;
 import com.google.android.material.tabs.TabLayoutMediator;
 
@@ -72,6 +79,7 @@ public class FileRecoverActivity extends BaseActivity<ActivityFileRecoverBinding
 
             @Override
             public void onCancel() {
+                EventHelper.report(EVENT_3000003, Maps.asMap("id", 106));
                 finish();
             }
         });
@@ -87,13 +95,19 @@ public class FileRecoverActivity extends BaseActivity<ActivityFileRecoverBinding
 
     private void showUnlockDialog(Object o) {
         if (unlockFunctionDialog == null) {
-            unlockFunctionDialog = new UnlockFunctionDialog(this)
+            unlockFunctionDialog = new UnlockFunctionDialog(this, FunctionBean.FILE_RECOVERY)
                     .setActionHandler(() -> AtmobAdHelper.showVideo(AdFuncId.REWARD_RECOVER, new RewardVideoListenerAdapter() {
                         @Override
                         public void onRewarded(@androidx.annotation.NonNull String token) {
                             super.onRewarded(token);
                             fileRecoverViewModel.doExport();
                         }
+
+                        @Override
+                        public void onFail(String s) {
+                            super.onFail(s);
+                            ToastUtil.show(R.string.recover_failed, ToastUtil.LENGTH_SHORT);
+                        }
                     }));
         }
         unlockFunctionDialog.show();
@@ -146,7 +160,7 @@ public class FileRecoverActivity extends BaseActivity<ActivityFileRecoverBinding
     public void showScanProgressDialog(Boolean show) {
         if (BoxingUtil.boxing(show)) {
             if (scanProgressDialog == null) {
-                scanProgressDialog = new ScanFileDialog(this, fileRecoverViewModel.getDetectedLastFileName());
+                scanProgressDialog = new ScanFileDialog(this, fileRecoverViewModel.getDetectedLastFileName(), FunctionBean.FILE_RECOVERY);
                 scanProgressDialog.setOnCancelListener(() -> fileRecoverViewModel.cancelScan());
             }
             scanProgressDialog.show();
@@ -163,6 +177,14 @@ public class FileRecoverActivity extends BaseActivity<ActivityFileRecoverBinding
             AtmobAdHelper.showInterstitial(AdFuncId.INTERSTITIAL_RESULT_BACK, null);
         }
         showBackDialog();
+
+        EventHelper.report(EventId.EVENT_3000002, Maps.asMap("id", 102));
+    }
+
+    @Override
+    public void finish() {
+        super.finish();
+        EventHelper.report(EventId.EVENT_3000003, Maps.asMap("id", 103));
     }
 
     private void showBackDialog() {
@@ -171,6 +193,7 @@ public class FileRecoverActivity extends BaseActivity<ActivityFileRecoverBinding
             backDialog.setDialogTitle(R.string.img_recovery_back_title)
                     .setDialogContent(R.string.img_recovery_back_content)
                     .setOnDialogClickListener(this::finish);
+            backDialog.setOnShowListener(dialog -> EventHelper.report(EventId.EVENT_3000200, Maps.asMap("id", 102)));
         }
         backDialog.show();
     }

+ 6 - 0
app/src/main/java/com/datarecovery/master/module/filerecover/FileRecoverViewModel.java

@@ -1,5 +1,7 @@
 package com.datarecovery.master.module.filerecover;
 
+import static com.datarecovery.master.data.consts.EventId.EVENT_3000004;
+
 import androidx.lifecycle.LiveData;
 import androidx.lifecycle.MutableLiveData;
 import androidx.lifecycle.Transformations;
@@ -10,7 +12,9 @@ import com.atmob.common.runtime.ActivityUtil;
 import com.atmob.common.runtime.ContextUtil;
 import com.datarecovery.master.R;
 import com.datarecovery.master.data.consts.AdFuncId;
+import com.datarecovery.master.data.consts.EventId;
 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;
@@ -237,6 +241,7 @@ public class FileRecoverViewModel extends BaseViewModel {
     }
 
     public void onCheckAllClick(boolean isCheck) {
+        EventHelper.report(EventId.EVENT_3000006);
         int index = BoxingUtil.boxing(checkPosition.getValue());
         getCheckAll(index).setValue(isCheck);
         int id = tabTitle[index];
@@ -317,6 +322,7 @@ public class FileRecoverViewModel extends BaseViewModel {
                         ToastUtil.show(R.string.export_success, ToastUtil.LENGTH_SHORT);
                         getCheckAll(BoxingUtil.boxing(checkPosition.getValue())).setValue(false);
                         AtmobAdHelper.showInterstitial(AdFuncId.INTERSTITIAL_RECOVER_SUCCESS, null);
+                        EventHelper.report(EVENT_3000004);
                     }
 
                     @Override

+ 6 - 1
app/src/main/java/com/datarecovery/master/module/filerecover/fragment/FileRecoverFragment.java

@@ -11,7 +11,9 @@ import androidx.recyclerview.widget.LinearLayoutManager;
 
 import com.atmob.app.lib.base.BaseFragment;
 import com.datarecovery.master.R;
+import com.datarecovery.master.data.consts.EventId;
 import com.datarecovery.master.databinding.FragmentFileRecoverListBinding;
+import com.datarecovery.master.handler.EventHelper;
 import com.datarecovery.master.module.filerecover.FileRecoverViewModel;
 import com.datarecovery.master.utils.FilesSearch;
 import com.gyf.immersionbar.ImmersionBar;
@@ -52,7 +54,10 @@ public class FileRecoverFragment extends BaseFragment<FragmentFileRecoverListBin
 
     private void initView() {
         fileRecoverAdapter = new FileRecoverAdapter(this, recoverFragmentViewModel.getId());
-        fileRecoverAdapter.setOnItemClick(file -> fileRecoverViewModel.itemClick(file));
+        fileRecoverAdapter.setOnItemClick(file -> {
+            fileRecoverViewModel.itemClick(file);
+            EventHelper.report(EventId.EVENT_3000600);
+        });
         LinearLayoutManager linearLayoutManager = new LinearLayoutManager(getContext());
         binding.rvFileRecoverList.setLayoutManager(linearLayoutManager);
         binding.rvFileRecoverList.setAdapter(fileRecoverAdapter);

+ 119 - 0
app/src/main/java/com/datarecovery/master/module/homepage/HomePageViewModel.java

@@ -8,12 +8,15 @@ import androidx.lifecycle.MutableLiveData;
 
 import com.atmob.app.lib.base.BaseViewModel;
 import com.atmob.app.lib.livedata.SingleLiveEvent;
+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.AdFuncId;
+import com.datarecovery.master.data.consts.EventId;
 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;
@@ -22,6 +25,7 @@ import com.datarecovery.master.module.member.MemberType;
 import com.datarecovery.master.module.videorecover.VideoRecoverActivity;
 import com.datarecovery.master.sdk.ad.AtmobAdHelper;
 import com.datarecovery.master.sdk.ad.RewardVideoListenerAdapter;
+import com.datarecovery.master.utils.Maps;
 
 import java.util.ArrayList;
 import java.util.List;
@@ -125,19 +129,26 @@ public class HomePageViewModel extends BaseViewModel {
         isQQSelected.setValue(true);
 
         AtmobAdHelper.showInterstitial(AdFuncId.INTERSTITIAL_HOME_SWITCH, null);
+
+        EventHelper.report(EventId.EVENT_3000404, Maps.asMap("zone_id", 102));
     }
 
     public void onWeChatAreaClick() {
         isQQSelected.setValue(false);
 
         AtmobAdHelper.showInterstitial(AdFuncId.INTERSTITIAL_HOME_SWITCH, null);
+
+        EventHelper.report(EventId.EVENT_3000404, Maps.asMap("zone_id", 101));
     }
 
     public void onBannerClick() {
         ImageRecoverActivity.start(ActivityUtil.getTopActivity(), MemberType.APP_IMAGE_RECOVER);
+
+        EventHelper.report(EventId.EVENT_3000405);
     }
 
     public void onBackupHelperClick() {
+        EventHelper.report(EventId.EVENT_3001000);
         AtmobAdHelper.showVideo(AdFuncId.REWARD_BACKUP_TUTORIAL, new RewardVideoListenerAdapter() {
             @Override
             public void onRewarded(@NonNull String token) {
@@ -151,21 +162,129 @@ public class HomePageViewModel extends BaseViewModel {
         if (bean == null) {
             return;
         }
+        boolean isQQ = isQQSelected.getValue() != null && isQQSelected.getValue();
+        boolean isFirstByApp;
+        if (isQQ) {
+            boolean isFirstClickQq = KVUtils.getDefault().getBoolean("is_first_click_qq", true);
+            isFirstByApp = isFirstClickQq;
+            if (isFirstClickQq) {
+                KVUtils.getDefault().putBoolean("is_first_click_qq", false);
+            }
+        } else {
+            boolean isFirstClickWeChat = KVUtils.getDefault().getBoolean("is_first_click_wechat", true);
+            isFirstByApp = isFirstClickWeChat;
+            if (isFirstClickWeChat) {
+                KVUtils.getDefault().putBoolean("is_first_click_wechat", false);
+            }
+        }
+        boolean isFirst = KVUtils.getDefault().getBoolean("is_first_click_function", true);
+        if (isFirst) {
+            KVUtils.getDefault().putBoolean("is_first_click_function", false);
+        }
         switch (bean.getFunctionId()) {
             case FunctionBean.AUDIO_RECOVERY:
                 AudioRecoverActivity.start(ActivityUtil.getTopActivity());
+                EventHelper.report(EventId.EVENT_3000005, Maps.asMap("id", 104));
+                if (isQQ) {
+                    EventHelper.report(EventId.EVENT_3000402, com.atmob.analytics.utils.Maps.of(
+                            "qq_id", 104,
+                            "is_first_click_qq", isFirstByApp
+                    ));
+                    if (isFirst) {
+                        EventHelper.report(EventId.EVENT_3000403, Maps.asMap("function_id", 109));
+                    }
+                } else {
+                    EventHelper.report(EventId.EVENT_3000401, com.atmob.analytics.utils.Maps.of(
+                            "weixin_id", 104,
+                            "is_first_click_weixin", isFirstByApp
+                    ));
+                    if (isFirst) {
+                        EventHelper.report(EventId.EVENT_3000403, Maps.asMap("function_id", 104));
+                    }
+                }
                 break;
             case FunctionBean.FILE_RECOVERY:
                 FileRecoverActivity.start(ActivityUtil.getTopActivity());
+                EventHelper.report(EventId.EVENT_3000005, Maps.asMap("id", 102));
+                if (isQQ) {
+                    EventHelper.report(EventId.EVENT_3000402, com.atmob.analytics.utils.Maps.of(
+                            "qq_id", 102,
+                            "is_first_click_qq", isFirstByApp
+                    ));
+                    if (isFirst) {
+                        EventHelper.report(EventId.EVENT_3000403, Maps.asMap("function_id", 107));
+                    }
+                } else {
+                    EventHelper.report(EventId.EVENT_3000401, com.atmob.analytics.utils.Maps.of(
+                            "weixin_id", 102,
+                            "is_first_click_weixin", isFirstByApp
+                    ));
+                    if (isFirst) {
+                        EventHelper.report(EventId.EVENT_3000403, Maps.asMap("function_id", 102));
+                    }
+                }
                 break;
             case FunctionBean.IMG_CLEARING:
                 ImageRecoverActivity.start(ActivityUtil.getTopActivity(), MemberType.APP_IMAGE_CLEAN);
+                if (isQQ) {
+                    EventHelper.report(EventId.EVENT_3000402, com.atmob.analytics.utils.Maps.of(
+                            "qq_id", 105,
+                            "is_first_click_qq", isFirstByApp
+                    ));
+                    if (isFirst) {
+                        EventHelper.report(EventId.EVENT_3000403, Maps.asMap("function_id", 110));
+                    }
+                } else {
+                    EventHelper.report(EventId.EVENT_3000401, com.atmob.analytics.utils.Maps.of(
+                            "weixin_id", 105,
+                            "is_first_click_weixin", isFirstByApp
+                    ));
+                    if (isFirst) {
+                        EventHelper.report(EventId.EVENT_3000403, Maps.asMap("function_id", 105));
+                    }
+                }
                 break;
             case FunctionBean.VIDEO_RECOVERY:
                 VideoRecoverActivity.start(ActivityUtil.getTopActivity());
+                EventHelper.report(EventId.EVENT_3000005, Maps.asMap("id", 103));
+                if (isQQ) {
+                    EventHelper.report(EventId.EVENT_3000402, com.atmob.analytics.utils.Maps.of(
+                            "qq_id", 103,
+                            "is_first_click_qq", isFirstByApp
+                    ));
+                    if (isFirst) {
+                        EventHelper.report(EventId.EVENT_3000403, Maps.asMap("function_id", 108));
+                    }
+                } else {
+                    EventHelper.report(EventId.EVENT_3000401, com.atmob.analytics.utils.Maps.of(
+                            "weixin_id", 103,
+                            "is_first_click_weixin", isFirstByApp
+                    ));
+                    if (isFirst) {
+                        EventHelper.report(EventId.EVENT_3000403, Maps.asMap("function_id", 103));
+                    }
+                }
                 break;
             case FunctionBean.IMG_RECOVERY:
                 ImageRecoverActivity.start(ActivityUtil.getTopActivity(), MemberType.APP_IMAGE_RECOVER);
+                EventHelper.report(EventId.EVENT_3000005, Maps.asMap("id", 101));
+                if (isQQ) {
+                    EventHelper.report(EventId.EVENT_3000402, com.atmob.analytics.utils.Maps.of(
+                            "qq_id", 101,
+                            "is_first_click_qq", isFirstByApp
+                    ));
+                    if (isFirst) {
+                        EventHelper.report(EventId.EVENT_3000403, Maps.asMap("function_id", 106));
+                    }
+                } else {
+                    EventHelper.report(EventId.EVENT_3000401, com.atmob.analytics.utils.Maps.of(
+                            "weixin_id", 101,
+                            "is_first_click_weixin", isFirstByApp
+                    ));
+                    if (isFirst) {
+                        EventHelper.report(EventId.EVENT_3000403, Maps.asMap("function_id", 101));
+                    }
+                }
                 break;
         }
     }

+ 46 - 2
app/src/main/java/com/datarecovery/master/module/imgrecover/ImageRecoverActivity.java

@@ -1,5 +1,7 @@
 package com.datarecovery.master.module.imgrecover;
 
+import static com.datarecovery.master.data.consts.EventId.EVENT_3000003;
+
 import android.annotation.SuppressLint;
 import android.app.Activity;
 import android.app.PendingIntent;
@@ -22,12 +24,15 @@ import com.atmob.app.lib.base.BaseActivity;
 import com.datarecovery.master.R;
 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.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.UnlockFunctionDialog;
+import com.datarecovery.master.handler.EventHelper;
+import com.datarecovery.master.module.homepage.FunctionBean;
 import com.datarecovery.master.module.member.MemberType;
 import com.datarecovery.master.module.preview.PreviewActivity;
 import com.datarecovery.master.sdk.ad.AtmobAdHelper;
@@ -38,6 +43,8 @@ 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.ToastUtil;
 import com.google.android.material.tabs.TabLayout;
 import com.gyf.immersionbar.ImmersionBar;
 
@@ -96,6 +103,7 @@ public class ImageRecoverActivity extends BaseActivity<ActivityImageRecoverBindi
 
             @Override
             public void onCancel() {
+                EventHelper.report(EVENT_3000003, Maps.asMap("id", 106));
                 finish();
             }
         });
@@ -202,6 +210,11 @@ public class ImageRecoverActivity extends BaseActivity<ActivityImageRecoverBindi
             return;
         }
         imageRecoverViewModel.setItemCheck(imageFile);
+
+        if (Objects.equals(imageRecoverViewModel.getType(), MemberType.APP_IMAGE_CLEAN)) {
+        } else {
+            EventHelper.report(EventId.EVENT_3000501);
+        }
     }
 
     @Override
@@ -212,8 +225,12 @@ public class ImageRecoverActivity extends BaseActivity<ActivityImageRecoverBindi
 //        ToastUtil.show(imageFile.getPath(), ToastUtil.LENGTH_SHORT);
         if (Objects.equals(imageRecoverViewModel.getType(), MemberType.APP_IMAGE_CLEAN)) {
             imageRecoverViewModel.setItemCheck(imageFile);
+
+            EventHelper.report(EventId.EVENT_3000900);
         } else {
             imageRecoverViewModel.checkPreview(imageFile);
+
+            EventHelper.report(EventId.EVENT_3000500);
         }
 
     }
@@ -332,15 +349,22 @@ public class ImageRecoverActivity extends BaseActivity<ActivityImageRecoverBindi
 
     private void showUnlockDialog() {
         if (unlockFunctionDialog == null) {
-            unlockFunctionDialog = new UnlockFunctionDialog(this)
+            unlockFunctionDialog = new UnlockFunctionDialog(this, Objects.equals(imageRecoverViewModel.getType(), MemberType.APP_IMAGE_CLEAN) ? FunctionBean.IMG_CLEARING : FunctionBean.IMG_RECOVERY)
                     .setActionHandler(() -> {
                         if (Objects.equals(imageRecoverViewModel.getType(), MemberType.APP_IMAGE_CLEAN)) {
+                            EventHelper.report(EventId.EVENT_3000901);
                             AtmobAdHelper.showVideo(AdFuncId.REWARD_CLEAN, new RewardVideoListenerAdapter() {
                                 @Override
                                 public void onRewarded(@androidx.annotation.NonNull String token) {
                                     super.onRewarded(token);
                                     showClearDialog();
                                 }
+
+                                @Override
+                                public void onFail(String s) {
+                                    super.onFail(s);
+                                    ToastUtil.show(R.string.clean_failed, ToastUtil.LENGTH_SHORT);
+                                }
                             });
                         } else {
                             AtmobAdHelper.showVideo(AdFuncId.REWARD_RECOVER, new RewardVideoListenerAdapter() {
@@ -349,6 +373,12 @@ public class ImageRecoverActivity extends BaseActivity<ActivityImageRecoverBindi
                                     super.onRewarded(token);
                                     imageRecoverViewModel.exportImage();
                                 }
+
+                                @Override
+                                public void onFail(String s) {
+                                    super.onFail(s);
+                                    ToastUtil.show(R.string.recover_failed, ToastUtil.LENGTH_SHORT);
+                                }
                             });
                         }
                     });
@@ -395,6 +425,9 @@ public class ImageRecoverActivity extends BaseActivity<ActivityImageRecoverBindi
             backDialog.setDialogTitle(R.string.img_recovery_back_title)
                     .setDialogContent(R.string.img_recovery_back_content)
                     .setOnDialogClickListener(this::finish);
+            backDialog.setOnShowListener(dialog ->
+                    EventHelper.report(EventId.EVENT_3000200,
+                            Maps.asMap("id", Objects.equals(imageRecoverViewModel.getType(), MemberType.APP_IMAGE_CLEAN) ? 105 : 101)));
         }
         backDialog.show();
     }
@@ -407,7 +440,9 @@ public class ImageRecoverActivity extends BaseActivity<ActivityImageRecoverBindi
     public void showScanProgressDialog(Boolean show) {
         if (BoxingUtil.boxing(show)) {
             if (scanFileDialog == null) {
-                scanFileDialog = new ScanFileDialog(this, imageRecoverViewModel.getDetectedLastFileName());
+                scanFileDialog = new ScanFileDialog(this,
+                        imageRecoverViewModel.getDetectedLastFileName(),
+                        Objects.equals(imageRecoverViewModel.getType(), MemberType.APP_IMAGE_CLEAN) ? FunctionBean.IMG_CLEARING : FunctionBean.IMG_RECOVERY);
                 scanFileDialog.setOnCancelListener(() -> imageRecoverViewModel.cancelScan());
             }
             scanFileDialog.show();
@@ -438,6 +473,15 @@ public class ImageRecoverActivity extends BaseActivity<ActivityImageRecoverBindi
             AtmobAdHelper.showInterstitial(AdFuncId.INTERSTITIAL_RESULT_BACK, null);
         }
         showBackDialog();
+        EventHelper.report(EventId.EVENT_3000002,
+                Maps.asMap("id", Objects.equals(imageRecoverViewModel.getType(), MemberType.APP_IMAGE_CLEAN) ? 105 : 101));
+    }
+
+    @Override
+    public void finish() {
+        super.finish();
+        EventHelper.report(EVENT_3000003,
+                Maps.asMap("id", Objects.equals(imageRecoverViewModel.getType(), MemberType.APP_IMAGE_CLEAN) ? 105 : 101));
     }
 
     @Override

+ 8 - 0
app/src/main/java/com/datarecovery/master/module/imgrecover/ImageRecoverViewModel.java

@@ -1,5 +1,7 @@
 package com.datarecovery.master.module.imgrecover;
 
+import static com.datarecovery.master.data.consts.EventId.EVENT_3000004;
+
 import android.content.ContentResolver;
 import android.content.ContentUris;
 import android.content.Context;
@@ -21,6 +23,8 @@ import com.atmob.common.runtime.ActivityUtil;
 import com.atmob.common.runtime.ContextUtil;
 import com.datarecovery.master.R;
 import com.datarecovery.master.data.consts.AdFuncId;
+import com.datarecovery.master.data.consts.EventId;
+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;
@@ -246,6 +250,7 @@ public class ImageRecoverViewModel extends BaseViewModel {
     }
 
     public void onCheckAllClick(boolean isCheck) {
+        EventHelper.report(EventId.EVENT_3000006);
         checkAll.setValue(isCheck);
         setListCheck(detectedPhotoList, isCheck);
         setListCheck(detectedWxList, isCheck);
@@ -442,6 +447,8 @@ public class ImageRecoverViewModel extends BaseViewModel {
                             ToastUtil.show(R.string.delete_success, ToastUtil.LENGTH_SHORT);
                         }
                         AtmobAdHelper.showInterstitial(AdFuncId.INTERSTITIAL_CLEAN_SUCCESS, null);
+
+                        EventHelper.report(EventId.EVENT_3000902);
                     }
 
                     @Override
@@ -602,6 +609,7 @@ public class ImageRecoverViewModel extends BaseViewModel {
                         checkAll.setValue(false);
                         ToastUtil.show(R.string.export_success, ToastUtil.LENGTH_SHORT);
                         AtmobAdHelper.showInterstitial(AdFuncId.INTERSTITIAL_RECOVER_SUCCESS, null);
+                        EventHelper.report(EVENT_3000004);
                     }
 
                     @Override

+ 14 - 0
app/src/main/java/com/datarecovery/master/module/main/MainActivity.java

@@ -12,8 +12,10 @@ import androidx.fragment.app.Fragment;
 import com.atmob.app.lib.base.BaseActivity;
 import com.datarecovery.master.R;
 import com.datarecovery.master.data.consts.AdFuncId;
+import com.datarecovery.master.data.consts.EventId;
 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;
@@ -110,6 +112,8 @@ public class MainActivity extends BaseActivity<ActivityMainBinding> {
 
     private void initTabLayout() {
         binding.mainTabLayout.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
+            boolean isInitial = true;
+
             @Override
             public void onTabSelected(TabLayout.Tab tab) {
                 ItemMainTabLayoutBinding itemBinding = (ItemMainTabLayoutBinding) tab.getTag();
@@ -119,12 +123,22 @@ public class MainActivity extends BaseActivity<ActivityMainBinding> {
                 }
                 Class<? extends Fragment> pagerClass = mainPagerAdapter.getMainPagerItemByPosition(tab.getPosition()).getPagerClass();
                 if (pagerClass.equals(HomePageFragment.class)) {
+                    if (!isInitial) {
+                        EventHelper.report(EventId.EVENT_3000400);
+                    }
                 } else if (pagerClass.equals(ExampleFragment.class)) {
                     AtmobAdHelper.showInterstitial(AdFuncId.INTERSTITIAL_CASE, null);
+                    if (!isInitial) {
+                        EventHelper.report(EventId.EVENT_3010000);
+                    }
                 } else if (pagerClass.equals(OrderFragment.class)) {
                 } else if (pagerClass.equals(MineFragment.class)) {
                     AtmobAdHelper.showInterstitial(AdFuncId.INTERSTITIAL_MINE, null);
+                    if (!isInitial) {
+                        EventHelper.report(EventId.EVENT_3020000);
+                    }
                 }
+                isInitial = false;
             }
 
             @Override

+ 7 - 0
app/src/main/java/com/datarecovery/master/module/mine/MineViewModel.java

@@ -15,9 +15,11 @@ 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.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;
@@ -26,6 +28,7 @@ import com.datarecovery.master.module.login.LoginActivity;
 import com.datarecovery.master.module.member.MemberType;
 import com.datarecovery.master.sdk.wechat.WechatHelper;
 import com.datarecovery.master.utils.BoxingUtil;
+import com.datarecovery.master.utils.Maps;
 import com.datarecovery.master.utils.RxHttpHandler;
 import com.datarecovery.master.utils.ToastUtil;
 
@@ -142,6 +145,8 @@ public class MineViewModel extends BaseViewModel {
 
     public void onAboutClick() {
         AboutActivity.start(ActivityUtil.getTopActivity());
+
+        EventHelper.report(EventId.EVENT_3020001);
     }
 
     public void onExitClick() {
@@ -179,10 +184,12 @@ public class MineViewModel extends BaseViewModel {
 
     public void onFeedbackClick() {
         UserFeedbackActivity.start(ActivityUtil.getTopActivity());
+        EventHelper.report(EventId.EVENT_3020002);
     }
 
     public void onMemberClick() {
         ImageRecoverActivity.start(ActivityUtil.getTopActivity(), MemberType.APP_IMAGE_RECOVER);
+        EventHelper.report(EventId.EVENT_3000005, Maps.asMap("id", 105));
     }
 
     private void goCustomer(@NonNull CustomerUrlResponse customerResponse) {

+ 45 - 1
app/src/main/java/com/datarecovery/master/module/preview/PreviewActivity.java

@@ -19,9 +19,12 @@ import com.atmob.app.lib.base.BaseActivity;
 import com.atmob.common.ui.SizeUtil;
 import com.datarecovery.master.R;
 import com.datarecovery.master.data.consts.AdFuncId;
+import com.datarecovery.master.data.consts.EventId;
 import com.datarecovery.master.databinding.ActivityPreviewBinding;
 import com.datarecovery.master.dialog.CommonSureDialog;
 import com.datarecovery.master.dialog.UnlockFunctionDialog;
+import com.datarecovery.master.handler.EventHelper;
+import com.datarecovery.master.module.homepage.FunctionBean;
 import com.datarecovery.master.module.member.MemberType;
 import com.datarecovery.master.sdk.ad.AtmobAdHelper;
 import com.datarecovery.master.sdk.ad.RewardVideoListenerAdapter;
@@ -98,6 +101,18 @@ public class PreviewActivity extends BaseActivity<ActivityPreviewBinding> {
         initObserver();
 
         AtmobAdHelper.showInterstitial(AdFuncId.INTERSTITIAL_PREVIEW, null);
+
+        switch (previewViewModel.getType()) {
+            case TYPE_IMG:
+                EventHelper.report(EventId.EVENT_3000502);
+                break;
+            case TYPE_VIDEO:
+                EventHelper.report(EventId.EVENT_3000701);
+                break;
+            case TYPE_AUDIO:
+                EventHelper.report(EventId.EVENT_3000801);
+                break;
+        }
     }
 
     private void initObserver() {
@@ -125,7 +140,7 @@ public class PreviewActivity extends BaseActivity<ActivityPreviewBinding> {
 
     private void showUnlockDialog() {
         if (unlockFunctionDialog == null) {
-            unlockFunctionDialog = new UnlockFunctionDialog(this)
+            unlockFunctionDialog = new UnlockFunctionDialog(this, getFunctionByType(previewViewModel.getType()))
                     .setActionHandler(new UnlockFunctionDialog.ActionHandler() {
                         @Override
                         public void onUnlock() {
@@ -142,6 +157,18 @@ public class PreviewActivity extends BaseActivity<ActivityPreviewBinding> {
         unlockFunctionDialog.show();
     }
 
+    private int getFunctionByType(int type) {
+        switch (type) {
+            case TYPE_IMG:
+                return FunctionBean.IMG_RECOVERY;
+            case TYPE_VIDEO:
+                return FunctionBean.VIDEO_RECOVERY;
+            case TYPE_AUDIO:
+                return FunctionBean.AUDIO_RECOVERY;
+        }
+        return 0;
+    }
+
     private void showFreeStopDialog() {
         if (showFreeStopDialog == null) {
             showFreeStopDialog = new CommonSureDialog(this);
@@ -301,6 +328,23 @@ public class PreviewActivity extends BaseActivity<ActivityPreviewBinding> {
     }
 
     @Override
+    public void finish() {
+        super.finish();
+
+        switch (previewViewModel.getType()) {
+            case TYPE_IMG:
+                EventHelper.report(EventId.EVENT_3000503);
+                break;
+            case TYPE_VIDEO:
+                EventHelper.report(EventId.EVENT_3000702);
+                break;
+            case TYPE_AUDIO:
+                EventHelper.report(EventId.EVENT_3000802);
+                break;
+        }
+    }
+
+    @Override
     protected void onDestroy() {
         super.onDestroy();
         if (mediaPlayer != null) mediaPlayer.release();

+ 15 - 0
app/src/main/java/com/datarecovery/master/module/preview/PreviewViewModel.java

@@ -10,7 +10,9 @@ import com.atmob.app.lib.livedata.SingleLiveEvent;
 import com.atmob.common.runtime.ActivityUtil;
 import com.atmob.common.runtime.ContextUtil;
 import com.datarecovery.master.R;
+import com.datarecovery.master.data.consts.EventId;
 import com.datarecovery.master.data.repositories.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.bugly.BuglyHelper;
@@ -220,6 +222,19 @@ public class PreviewViewModel extends BaseViewModel {
 
     public void onExportClick() {
         showUnlockEvent.call();
+
+        switch (getType()) {
+            case PreviewActivity.TYPE_IMG:
+                EventHelper.report(EventId.EVENT_3000504);
+                break;
+            case PreviewActivity.TYPE_VIDEO:
+                EventHelper.report(EventId.EVENT_3000700);
+                break;
+            case PreviewActivity.TYPE_AUDIO:
+                EventHelper.report(EventId.EVENT_3000803);
+                break;
+        }
+
     }
 
     public void doExport() {

+ 4 - 0
app/src/main/java/com/datarecovery/master/module/splash/SplashActivity.java

@@ -12,8 +12,10 @@ 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.data.consts.EventId;
 import com.datarecovery.master.databinding.ActivitySplashBinding;
 import com.datarecovery.master.dialog.AgreementDialog;
+import com.datarecovery.master.handler.EventHelper;
 import com.datarecovery.master.module.main.MainActivity;
 import com.datarecovery.master.sdk.ad.AtmobAdHelper;
 import com.datarecovery.master.sdk.ad.SplashListenerAdapter;
@@ -57,6 +59,8 @@ public class SplashActivity extends BaseActivity<ActivitySplashBinding> {
                     binding.getRoot().post(() -> {
                         App.getInstance().firstPrivacyRelated();
                         nextStep();
+
+                        EventHelper.report(EventId.EVENT_3030000);
                     });
                 }
 

+ 25 - 2
app/src/main/java/com/datarecovery/master/module/videorecover/VideoRecoverActivity.java

@@ -1,5 +1,7 @@
 package com.datarecovery.master.module.videorecover;
 
+import static com.datarecovery.master.data.consts.EventId.EVENT_3000003;
+
 import android.app.Activity;
 import android.content.Context;
 import android.content.Intent;
@@ -14,11 +16,14 @@ import com.atmob.app.lib.base.BaseActivity;
 import com.datarecovery.master.R;
 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.databinding.ActivityVideoRecoverBinding;
 import com.datarecovery.master.dialog.CommonLoadingDialog;
 import com.datarecovery.master.dialog.CommonSureDialog;
 import com.datarecovery.master.dialog.ScanFileDialog;
 import com.datarecovery.master.dialog.UnlockFunctionDialog;
+import com.datarecovery.master.handler.EventHelper;
+import com.datarecovery.master.module.homepage.FunctionBean;
 import com.datarecovery.master.module.preview.PreviewActivity;
 import com.datarecovery.master.sdk.ad.AtmobAdHelper;
 import com.datarecovery.master.sdk.ad.RewardVideoListenerAdapter;
@@ -27,6 +32,8 @@ 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.ToastUtil;
 import com.gyf.immersionbar.ImmersionBar;
 
 import dagger.hilt.android.AndroidEntryPoint;
@@ -76,6 +83,7 @@ public class VideoRecoverActivity extends BaseActivity<ActivityVideoRecoverBindi
 
             @Override
             public void onCancel() {
+                EventHelper.report(EVENT_3000003, Maps.asMap("id", 106));
                 finish();
             }
         });
@@ -99,13 +107,19 @@ public class VideoRecoverActivity extends BaseActivity<ActivityVideoRecoverBindi
 
     private void showUnlockDialog() {
         if (unlockFunctionDialog == null) {
-            unlockFunctionDialog = new UnlockFunctionDialog(this)
+            unlockFunctionDialog = new UnlockFunctionDialog(this, FunctionBean.VIDEO_RECOVERY)
                     .setActionHandler(() -> AtmobAdHelper.showVideo(AdFuncId.REWARD_RECOVER, new RewardVideoListenerAdapter() {
                         @Override
                         public void onRewarded(@NonNull String token) {
                             super.onRewarded(token);
                             videoRecoverViewModel.doExport();
                         }
+
+                        @Override
+                        public void onFail(String s) {
+                            super.onFail(s);
+                            ToastUtil.show(R.string.recover_failed, ToastUtil.LENGTH_SHORT);
+                        }
                     }));
         }
         unlockFunctionDialog.show();
@@ -161,7 +175,7 @@ public class VideoRecoverActivity extends BaseActivity<ActivityVideoRecoverBindi
     public void showScanProgressDialog(Boolean show) {
         if (BoxingUtil.boxing(show)) {
             if (scanFileDialog == null) {
-                scanFileDialog = new ScanFileDialog(this, videoRecoverViewModel.getDetectedLastFileName());
+                scanFileDialog = new ScanFileDialog(this, videoRecoverViewModel.getDetectedLastFileName(), FunctionBean.VIDEO_RECOVERY);
                 scanFileDialog.setOnCancelListener(() -> videoRecoverViewModel.cancelScan());
             }
             scanFileDialog.show();
@@ -191,6 +205,14 @@ public class VideoRecoverActivity extends BaseActivity<ActivityVideoRecoverBindi
             AtmobAdHelper.showInterstitial(AdFuncId.INTERSTITIAL_RESULT_BACK, null);
         }
         showBackDialog();
+
+        EventHelper.report(EventId.EVENT_3000002, Maps.asMap("id", 103));
+    }
+
+    @Override
+    public void finish() {
+        super.finish();
+        EventHelper.report(EventId.EVENT_3000002, Maps.asMap("id", 103));
     }
 
     private void showBackDialog() {
@@ -199,6 +221,7 @@ public class VideoRecoverActivity extends BaseActivity<ActivityVideoRecoverBindi
             backDialog.setDialogTitle(R.string.img_recovery_back_title)
                     .setDialogContent(R.string.img_recovery_back_content)
                     .setOnDialogClickListener(this::finish);
+            backDialog.setOnShowListener(dialog -> EventHelper.report(EventId.EVENT_3000200, Maps.asMap("id", 103)));
         }
         backDialog.show();
     }

+ 6 - 0
app/src/main/java/com/datarecovery/master/module/videorecover/VideoRecoverViewModel.java

@@ -1,5 +1,7 @@
 package com.datarecovery.master.module.videorecover;
 
+import static com.datarecovery.master.data.consts.EventId.EVENT_3000004;
+
 import androidx.lifecycle.LiveData;
 import androidx.lifecycle.MutableLiveData;
 import androidx.lifecycle.Transformations;
@@ -11,7 +13,9 @@ import com.atmob.common.runtime.ActivityUtil;
 import com.atmob.common.runtime.ContextUtil;
 import com.datarecovery.master.R;
 import com.datarecovery.master.data.consts.AdFuncId;
+import com.datarecovery.master.data.consts.EventId;
 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;
@@ -179,6 +183,7 @@ public class VideoRecoverViewModel extends BaseViewModel {
     }
 
     public void onCheckAllClick(boolean isCheck) {
+        EventHelper.report(EventId.EVENT_3000006);
         checkAll.setValue(isCheck);
         for (FilesSearch.DocumentFile videoFile : videoList) {
             videoFile.setCheck(isCheck);
@@ -244,6 +249,7 @@ public class VideoRecoverViewModel extends BaseViewModel {
                         checkAll.setValue(false);
                         ToastUtil.show(R.string.export_success, ToastUtil.LENGTH_SHORT);
                         AtmobAdHelper.showInterstitial(AdFuncId.INTERSTITIAL_RECOVER_SUCCESS, null);
+                        EventHelper.report(EVENT_3000004);
                     }
 
                     @Override

+ 6 - 2
app/src/main/java/com/datarecovery/master/utils/FilePermissionHelper.java

@@ -53,11 +53,12 @@ public class FilePermissionHelper {
                                                     observer.onSuccess(sdkInt);
 
                                                     GalleryBackupManager.getInstance().onPermissionGranted();
+                                                    EventHelper.report(EventId.EVENT_3000101);
                                                 }
 
                                                 @Override
                                                 public void onPermissionDenied() {
-
+                                                    EventHelper.report(EventId.EVENT_3000102);
                                                 }
                                             });
                                         }
@@ -67,6 +68,7 @@ public class FilePermissionHelper {
                                             observer.onError(new CancelException());
                                         }
                                     });
+                            requestManageDialog.setOnShowListener(dialog -> EventHelper.report(EventId.EVENT_3000100));
                             requestManageDialog.show();
                         });
                     } else {
@@ -95,11 +97,12 @@ public class FilePermissionHelper {
                                                     observer.onSuccess(sdkInt);
                                                     //部分手机无法授权data目录,选择任意目录记录为通过,下次不再检查
                                                     KVUtils.getDefault().putBoolean(ANDROID_DATA_PERMISSION_SUCCESS, true);
+                                                    EventHelper.report(EventId.EVENT_3000101);
                                                 }
 
                                                 @Override
                                                 public void onPermissionDenied() {
-
+                                                    EventHelper.report(EventId.EVENT_3000102);
                                                 }
                                             });
                                         }
@@ -109,6 +112,7 @@ public class FilePermissionHelper {
                                             observer.onError(new CancelException());
                                         }
                                     });
+                            requestAndroidDataDialog.setOnShowListener(dialog -> EventHelper.report(EventId.EVENT_3000100));
                             requestAndroidDataDialog.show();
                         });
                     } else {

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

@@ -229,4 +229,6 @@
     <string name="ad_loading_tips">视频加载中</string>
     <string name="simulate_ad_tips">奖励发放中</string>
     <string name="ad_skip">跳过</string>
+    <string name="recover_failed">备份失败</string>
+    <string name="clean_failed">清除失败</string>
 </resources>