Browse Source

增加引力引擎、友盟等sdk接入

zk 1 year ago
parent
commit
dcb7565f9d

+ 24 - 0
app/build.gradle

@@ -43,6 +43,12 @@ android {
 
             buildConfigField "boolean", "isLocalNetwork", "false"
             buildConfigField "String", "HOST", "\"$prod_host\""
+            buildConfigField "String", "WECHAT_APP_ID", "\"$wechat_app_id\""
+            buildConfigField "String", "WECHAT_KF_ID", "\"$wechat_kf_id\""
+            buildConfigField "String", "WEWORK_CROP_ID", "\"$wework_crop_id\""
+            buildConfigField "String", "GRAVITY_ACCESS_TOKEN", "\"$gravity_access_token\""
+            buildConfigField "String", "BUGLY_APP_ID", "\"$bugly_app_id\""
+            buildConfigField "String", "UMENG_APP_KEY", "\"$umeng_app_key\""
         }
 
         debug {
@@ -52,6 +58,12 @@ android {
 
             buildConfigField "boolean", "isLocalNetwork", "true"
             buildConfigField "String", "HOST", "\"$test_host\""
+            buildConfigField "String", "WECHAT_APP_ID", "\"$wechat_app_id\""
+            buildConfigField "String", "WECHAT_KF_ID", "\"$wechat_kf_id\""
+            buildConfigField "String", "WEWORK_CROP_ID", "\"$wework_crop_id\""
+            buildConfigField "String", "GRAVITY_ACCESS_TOKEN", "\"$gravity_access_token\""
+            buildConfigField "String", "BUGLY_APP_ID", "\"$bugly_app_id\""
+            buildConfigField "String", "UMENG_APP_KEY", "\"$umeng_app_key\""
         }
     }
     compileOptions {
@@ -148,4 +160,16 @@ dependencies {
 
     //PhotoView
     implementation 'com.github.chrisbanes:PhotoView:2.3.0'
+
+    //引力引擎
+    implementation "cn.gravity.android:GravityEngineSDK:4.6.3"
+
+    //Umeng
+    dependencies {
+        // 友盟基础组件库(所有友盟业务SDK都依赖基础组件库)
+        implementation 'com.umeng.umsdk:common:9.6.7'
+        implementation 'com.umeng.umsdk:asms:1.8.0'
+        implementation 'com.umeng.umsdk:apm:1.9.4'
+    }
+
 }

+ 14 - 0
app/src/main/AndroidManifest.xml

@@ -69,6 +69,20 @@
             android:name=".module.audiorecover.AudioRecoverActivity"
             android:screenOrientation="portrait" />
 
+
+        <activity
+            android:name=".module.wechat.WechatEntryActivity"
+            android:exported="true"
+            android:launchMode="singleTask"
+
+            android:screenOrientation="portrait"
+            android:taskAffinity="${applicationId}"
+            android:theme="@android:style/Theme.Translucent.NoTitleBar" />
+
+        <activity-alias
+            android:name="${applicationId}.wxapi.WXEntryActivity"
+            android:exported="true"
+            android:targetActivity=".module.wechat.WechatEntryActivity" />
     </application>
 
 </manifest>

+ 20 - 2
app/src/main/java/com/datarecovery/master/App.java

@@ -6,6 +6,8 @@ import com.atmob.app.lib.base.BaseApplication;
 import com.atmob.common.runtime.ProcessUtil;
 import com.atmob.user.AtmobUser;
 import com.datarecovery.master.data.consts.Constants;
+import com.datarecovery.master.sdk.gravity.GravityHelper;
+import com.datarecovery.master.sdk.umeng.UmengHelper;
 
 import dagger.hilt.android.HiltAndroidApp;
 
@@ -56,16 +58,32 @@ public class App extends BaseApplication {
 
     @Override
     protected void initCommon(boolean isMainProcess) {
-
+        if (isMainProcess) {
+            initBugly();
+            initUmeng();
+        }
     }
 
     @Override
     public void initAfterGrant(boolean isMainProcess) {
+        if (isMainProcess) {
+            GravityHelper.init(this);
+        }
+    }
+
+    private void initUmeng() {
+        UmengHelper.init(this);
+    }
 
+    private void initBugly() {
+//        BuglyHelper.init(this);
     }
 
-    public void initPrivacyRelated() {
+    public void firstPrivacyRelated() {
         AtmobUser.recordPolicyGrant(true);
+        UmengHelper.initAfterGrantedAgreement(getApplicationContext());
+        UmengHelper.submitPolicyGrantResult(getApplicationContext(), true);
+//        BuglyHelper.initAfterGrantedAgreement();
         initAfterGrant(ProcessUtil.isMainProcess(this));
     }
 }

+ 5 - 0
app/src/main/java/com/datarecovery/master/data/api/AtmobApi.java

@@ -2,9 +2,11 @@ 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.request.LoginRequest;
 import com.datarecovery.master.data.api.request.OrderPageRequest;
 import com.datarecovery.master.data.api.request.SendCodeRequest;
+import com.datarecovery.master.data.api.response.FuncAuthsResponse;
 import com.datarecovery.master.data.api.response.LoginResponse;
 import com.datarecovery.master.data.api.response.OrderPageResponse;
 
@@ -24,4 +26,7 @@ public interface AtmobApi {
     @POST("/project/recover/v1/order/page")
     Single<BaseResponse<OrderPageResponse>> orderPage(@Body OrderPageRequest request);
 
+    @POST("/project/recover/v1/func/auths")
+    Single<BaseResponse<FuncAuthsResponse>> funcAuths(@Body BaseRequest request);
+
 }

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

@@ -0,0 +1,20 @@
+package com.datarecovery.master.data.api.response;
+
+import com.google.gson.annotations.SerializedName;
+
+import java.util.List;
+
+public class FuncAuthsResponse {
+
+
+    @SerializedName("auths")
+    private List<?> auths;
+
+    public List<?> getAuths() {
+        return auths;
+    }
+
+    public void setAuths(List<?> auths) {
+        this.auths = auths;
+    }
+}

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

@@ -0,0 +1,55 @@
+package com.datarecovery.master.data.repositories;
+
+
+import com.atmob.app.lib.handler.RxHttpHandler;
+import com.datarecovery.master.data.api.AtmobApi;
+import com.datarecovery.master.data.api.request.BaseRequest;
+import com.datarecovery.master.data.api.response.FuncAuthsResponse;
+
+import javax.inject.Inject;
+import javax.inject.Singleton;
+
+import atmob.reactivex.rxjava3.annotations.NonNull;
+import atmob.reactivex.rxjava3.core.SingleObserver;
+import atmob.reactivex.rxjava3.disposables.Disposable;
+import atmob.rxjava.utils.RxJavaUtil;
+
+@Singleton
+public class DeviceFuncRepository {
+
+
+    private final AtmobApi atmobApi;
+
+    private boolean refreshFunAuthsFlag;
+
+    @Inject
+    public DeviceFuncRepository(AtmobApi atmobApi) {
+        this.atmobApi = atmobApi;
+    }
+
+
+    public void refreshFuncAuths() {
+        if (refreshFunAuthsFlag) {
+            return;
+        }
+        atmobApi.funcAuths(new BaseRequest())
+                .compose(RxHttpHandler.handle(true))
+                .compose(RxJavaUtil.SingleSchedule.io2Main())
+                .subscribe(new SingleObserver<FuncAuthsResponse>() {
+                    @Override
+                    public void onSubscribe(@NonNull Disposable d) {
+                        refreshFunAuthsFlag = true;
+                    }
+
+                    @Override
+                    public void onSuccess(@NonNull FuncAuthsResponse funcAuthsResponse) {
+                        refreshFunAuthsFlag = false;
+                    }
+
+                    @Override
+                    public void onError(@NonNull Throwable e) {
+                        refreshFunAuthsFlag = false;
+                    }
+                });
+    }
+}

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

@@ -56,7 +56,7 @@ public class SplashActivity extends BaseActivity<ActivitySplashBinding> {
                 @Override
                 public void onAgree() {
                     binding.getRoot().post(() -> {
-                        App.getInstance().initPrivacyRelated();
+                        App.getInstance().firstPrivacyRelated();
                         nextStep();
                     });
                 }

+ 51 - 0
app/src/main/java/com/datarecovery/master/module/wechat/WechatEntryActivity.java

@@ -0,0 +1,51 @@
+package com.datarecovery.master.module.wechat;
+
+import android.app.Activity;
+import android.content.Intent;
+import android.os.Bundle;
+
+import androidx.annotation.Nullable;
+
+import com.datarecovery.master.sdk.wechat.WechatHelper;
+import com.tencent.mm.opensdk.constants.ConstantsAPI;
+import com.tencent.mm.opensdk.modelbase.BaseReq;
+import com.tencent.mm.opensdk.modelbase.BaseResp;
+import com.tencent.mm.opensdk.openapi.IWXAPIEventHandler;
+
+public class WechatEntryActivity extends Activity implements IWXAPIEventHandler {
+
+    @Override
+    protected void onCreate(@Nullable Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        Intent intent = getIntent();
+        WechatHelper.handleIntent(intent, this);
+    }
+
+    @Override
+    protected void onNewIntent(Intent intent) {
+        super.onNewIntent(intent);
+        setIntent(intent);
+        WechatHelper.handleIntent(intent, this);
+    }
+
+    @Override
+    public void onReq(BaseReq baseReq) {
+        finish();
+    }
+
+    @Override
+    public void onResp(BaseResp baseResp) {
+        if (baseResp.getType() == ConstantsAPI.COMMAND_SENDMESSAGE_TO_WX) {
+            switch (baseResp.errCode) {
+                case BaseResp.ErrCode.ERR_OK:
+                    // 分享成功
+                    break;
+                default:
+                    // 用户取消分享
+                    // 分享失败
+                    break;
+            }
+        }
+        finish();
+    }
+}

+ 205 - 0
app/src/main/java/com/datarecovery/master/sdk/gravity/GravityHelper.java

@@ -0,0 +1,205 @@
+package com.datarecovery.master.sdk.gravity;
+
+import android.app.Application;
+import android.content.Context;
+import android.os.Handler;
+import android.os.Looper;
+import android.text.TextUtils;
+
+import androidx.annotation.NonNull;
+
+import com.atmob.common.logging.AtmobLog;
+import com.atmob.common.runtime.ContextUtil;
+import com.atmob.common.runtime.ProcessUtil;
+import com.atmob.user.AtmobUser;
+import com.datarecovery.master.BuildConfig;
+
+import org.json.JSONException;
+import org.json.JSONObject;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.concurrent.TimeUnit;
+
+import atmob.reactivex.rxjava3.core.Completable;
+import atmob.reactivex.rxjava3.core.CompletableObserver;
+import atmob.reactivex.rxjava3.disposables.Disposable;
+import atmob.rxjava.utils.RxJavaUtil;
+import cn.gravity.android.GEConfig;
+import cn.gravity.android.GravityEngineSDK;
+import cn.gravity.android.RegisterCallback;
+
+public class GravityHelper {
+    private static final String TAG = GravityHelper.class.getSimpleName();
+
+    private static final String accessToken = BuildConfig.GRAVITY_ACCESS_TOKEN;
+    private static Disposable registerDisposable;
+    private static GravityEngineSDK gravityEngineSDKInstance;
+    private static final Handler handler = new Handler(Looper.getMainLooper());
+    private static Boolean attributed;
+    private static final List<AttributionResultCallback> callbacks = new ArrayList<>(5);
+
+    public static void init(Application application) {
+        if (!ProcessUtil.isMainProcess(application)) {
+            return;
+        }
+        onPrivacyAgreed(application);
+    }
+
+    public static void onPrivacyAgreed(Context context) {
+        GEConfig config = GEConfig.getInstance(context, accessToken);
+        config.setMode(BuildConfig.DEBUG ? GEConfig.ModeEnum.DEBUG : GEConfig.ModeEnum.NORMAL);
+        gravityEngineSDKInstance = GravityEngineSDK.sharedInstance(config);
+        reportRegister();
+    }
+
+    private static boolean isAttribution(String adPlatform) {
+        return !TextUtils.isEmpty(adPlatform) && !"natural".equals(adPlatform);
+    }
+
+    public static void reportRegister() {
+        if (registerDisposable != null || gravityEngineSDKInstance == null) {
+            return;
+        }
+        Completable.create(emitter -> {
+                    try {
+                        gravityEngineSDKInstance.register(accessToken, AtmobUser.getAtmobChannel(),
+                                new RegisterCallback() {
+                                    @Override
+                                    public void onFailed(String errorMsg, JSONObject jsonObject) {
+                                        AtmobLog.d(TAG, "GravityEngine register onFailed jsonObject--" + jsonObject);
+                                        emitter.onError(new Exception(errorMsg));
+                                    }
+
+                                    @Override
+                                    public void onSuccess(JSONObject jsonObject1, JSONObject jsonObject2) {
+                                        AtmobLog.d(TAG, "GravityEngine register onSuccess jsonObject1--" + jsonObject1);
+                                        AtmobLog.d(TAG, "GravityEngine register onSuccess jsonObject2--" + jsonObject2);
+                                        parseGravityJson(jsonObject1);
+                                        emitter.onComplete();
+                                    }
+                                }, true);
+                    } catch (Exception e) {
+                        emitter.onError(e);
+                    }
+                })
+                .retryWhen(RxJavaUtil.retryWhen(null, 5, 1000, TimeUnit.MILLISECONDS))
+                .compose(RxJavaUtil.CompletableSchedule.ioOnly())
+                .subscribe(new CompletableObserver() {
+                    @Override
+                    public void onSubscribe(@NonNull Disposable d) {
+                        registerDisposable = d;
+                    }
+
+                    @Override
+                    public void onComplete() {
+                        AtmobLog.d(TAG, "GravityEngine register success");
+                    }
+
+                    @Override
+                    public void onError(@NonNull Throwable e) {
+                        AtmobLog.e(TAG, "GravityEngine register failed, " + e.getMessage());
+                        e.printStackTrace();
+                    }
+                });
+    }
+
+    private static void parseGravityJson(JSONObject jsonObject) {
+        if (jsonObject == null || jsonObject.isNull("click_company")) {
+            return;
+        }
+        try {
+            String click_company = jsonObject.getString("click_company");
+            onAttributionResult(isAttribution(click_company));
+        } catch (JSONException ignored) {
+
+        }
+    }
+
+
+    public static void reportPay(int payAmount, String order_no, String product, String payWay) {
+        if (gravityEngineSDKInstance != null)
+            gravityEngineSDKInstance.trackPayEvent(payAmount, "CNY", order_no, product, payWay);
+    }
+
+    public static void report(String eventId) {
+        report(eventId, null);
+    }
+
+    public static void report(String eventId, Map<String, Object> params) {
+        if (gravityEngineSDKInstance != null) {
+            JSONObject jsonObject = null;
+            if (params != null) {
+                jsonObject = new JSONObject(params);
+            }
+            gravityEngineSDKInstance.track(eventId, jsonObject);
+        }
+    }
+
+    public static void timeEvent(String eventId) {
+        if (gravityEngineSDKInstance != null) {
+            gravityEngineSDKInstance.timeEvent(eventId);
+        }
+    }
+
+    public static String getAccessToken() {
+        return accessToken;
+    }
+
+
+    private static void onAttributionResult(boolean result) {
+        synchronized (GravityHelper.class) {
+            attributed = result;
+            Iterator<AttributionResultCallback> iterator = callbacks.iterator();
+            while (iterator.hasNext()) {
+                AttributionResultCallback callback = iterator.next();
+                if (callback == null) {
+                    iterator.remove();
+                    continue;
+                }
+                handler.post(() -> callback.onResult(attributed));
+                iterator.remove();
+            }
+        }
+    }
+
+    public static void registerAttributionResultCallback(AttributionResultCallback callback) {
+        if (!ProcessUtil.isMainProcess(ContextUtil.getContext())) {
+            return;
+        }
+        if (callback == null) {
+            return;
+        }
+        if (attributed != null) {
+            callback.onResult(attributed);
+            return;
+        }
+        synchronized (GravityHelper.class) {
+            if (attributed != null) {
+                callback.onResult(attributed);
+                return;
+            }
+            callbacks.add(callback);
+        }
+    }
+
+    public static void unregisterAttributionResultCallback(AttributionResultCallback callback) {
+        if (!ProcessUtil.isMainProcess(ContextUtil.getContext())) {
+            return;
+        }
+        if (callback == null) {
+            return;
+        }
+        synchronized (GravityHelper.class) {
+            callbacks.remove(callback);
+        }
+    }
+
+
+    @FunctionalInterface
+    public interface AttributionResultCallback {
+        void onResult(boolean attributed);
+    }
+}

+ 86 - 0
app/src/main/java/com/datarecovery/master/sdk/umeng/UmengHelper.java

@@ -0,0 +1,86 @@
+package com.datarecovery.master.sdk.umeng;
+
+import android.app.Application;
+import android.content.Context;
+
+import androidx.annotation.NonNull;
+import androidx.lifecycle.Lifecycle;
+import androidx.lifecycle.LifecycleEventObserver;
+import androidx.lifecycle.ProcessLifecycleOwner;
+
+import com.atmob.user.AtmobUser;
+import com.datarecovery.master.BuildConfig;
+import com.umeng.analytics.MobclickAgent;
+import com.umeng.commonsdk.UMConfigure;
+
+import java.util.Map;
+
+public class UmengHelper {
+
+    private static final String UMENG_APP_KEY = BuildConfig.UMENG_APP_KEY;
+
+    private UmengHelper() {
+
+    }
+
+    public static void init(@NonNull Application application) {
+        if (BuildConfig.DEBUG) {
+            return;
+        }
+        final String channel = AtmobUser.getAtmobChannel();
+        UMConfigure.setLogEnabled(false);
+        UMConfigure.preInit(application, UMENG_APP_KEY, channel);
+        MobclickAgent.setPageCollectionMode(MobclickAgent.PageMode.AUTO);
+        if (AtmobUser.isPolicyGranted()) {
+            initAfterGrantedAgreement(application);
+        }
+        ProcessLifecycleOwner.get().getLifecycle().addObserver((LifecycleEventObserver) (source, event) -> {
+            if (event == Lifecycle.Event.ON_DESTROY) {
+                saveData(application);
+            }
+        });
+    }
+
+    public static void initAfterGrantedAgreement(@NonNull Context context) {
+        if (BuildConfig.DEBUG) {
+            return;
+        }
+        final String channel = AtmobUser.getAtmobChannel();
+        UMConfigure.init(context, UMENG_APP_KEY, channel, UMConfigure.DEVICE_TYPE_PHONE, null);//last param is PushSecretKey
+    }
+
+    /**
+     * 当程序退出时,用于保存统计数据
+     */
+    public static void saveData(Context context) {
+        MobclickAgent.onKillProcess(context.getApplicationContext());
+    }
+
+    /**
+     * 上报用户是否同意隐私政策
+     *
+     * @param granted 是否同意
+     */
+    public static void submitPolicyGrantResult(Context context, boolean granted) {
+        UMConfigure.submitPolicyGrantResult(context.getApplicationContext(), granted);
+    }
+
+    /**
+     * 事件上报
+     *
+     * @param eventId 事件id
+     */
+    public static void reportEvent(Context context, String eventId) {
+        MobclickAgent.onEvent(context, eventId);
+    }
+
+    /**
+     * 携带信息的事件上报
+     *
+     * @param eventId 事件id
+     * @param map     额外信息, object类型由第一次上报时的为准, 后续不能更改
+     */
+    public static void reportEvent(Context context, String eventId, Map<String, Object> map) {
+        MobclickAgent.onEventObject(context, eventId, map);
+    }
+}

+ 70 - 0
app/src/main/java/com/datarecovery/master/sdk/wechat/WechatHelper.java

@@ -0,0 +1,70 @@
+package com.datarecovery.master.sdk.wechat;
+
+import android.annotation.SuppressLint;
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
+
+import com.atmob.common.runtime.ContextUtil;
+import com.atmob.common.runtime.ProcessUtil;
+import com.datarecovery.master.BuildConfig;
+import com.datarecovery.master.R;
+import com.datarecovery.master.utils.ToastUtil;
+import com.tencent.mm.opensdk.constants.Build;
+import com.tencent.mm.opensdk.constants.ConstantsAPI;
+import com.tencent.mm.opensdk.modelbiz.WXOpenCustomerServiceChat;
+import com.tencent.mm.opensdk.openapi.IWXAPI;
+import com.tencent.mm.opensdk.openapi.IWXAPIEventHandler;
+import com.tencent.mm.opensdk.openapi.WXAPIFactory;
+
+public class WechatHelper {
+    private static final String APP_ID = BuildConfig.WECHAT_APP_ID;
+
+    private static final String CROP_ID = BuildConfig.WEWORK_CROP_ID;
+
+    private static final String CUSTOMER_SERVICE_URL = "https://work.weixin.qq.com/kfid/" + BuildConfig.WECHAT_KF_ID;
+
+    private static IWXAPI api;
+
+    static {
+        init(ContextUtil.getContext());
+    }
+
+    @SuppressLint("UnspecifiedRegisterReceiverFlag")
+    public static void init(Context context) {
+        if (!ProcessUtil.isMainProcess(context)) {
+            return;
+        }
+        api = WXAPIFactory.createWXAPI(context, APP_ID, true);
+        api.registerApp(APP_ID);
+        context.registerReceiver(new BroadcastReceiver() {
+            @Override
+            public void onReceive(Context context, Intent intent) {
+                api.registerApp(APP_ID);
+            }
+        }, new IntentFilter(ConstantsAPI.ACTION_REFRESH_WXAPP));
+    }
+
+    public static void handleIntent(Intent intent, IWXAPIEventHandler iwxapiEventHandler) {
+        if (api == null) {
+            throw new IllegalStateException("WechatHelper not init");
+        }
+        api.handleIntent(intent, iwxapiEventHandler);
+    }
+
+    public static void launchCustomerService() {
+        if (api == null) {
+            throw new IllegalStateException("WechatHelper not init");
+        }
+        if (api.getWXAppSupportAPI() >= Build.SUPPORT_OPEN_CUSTOMER_SERVICE_CHAT && api.isWXAppInstalled()) {
+            WXOpenCustomerServiceChat.Req req = new WXOpenCustomerServiceChat.Req();
+            req.corpId = CROP_ID;
+            req.url = CUSTOMER_SERVICE_URL;
+            api.sendReq(req);
+        } else {
+            ToastUtil.show(R.string.wechat_version_too_low_toast, ToastUtil.LENGTH_SHORT);
+        }
+    }
+
+}

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

@@ -136,4 +136,5 @@
     <string name="order_buy_time">购买时间</string>
     <string name="order_member_validity">会员时效</string>
     <string name="order_copy_link">复制教程链接</string>
+    <string name="wechat_version_too_low_toast">请先更新到最新版本微信</string>
 </resources>

+ 7 - 1
gradle.properties

@@ -22,4 +22,10 @@ android.nonTransitiveRClass=true
 android.enableJetifier=true
 android.injected.testOnly=false
 test_host=http://loc-api.v8dashen.com
-prod_host=http://loc-api.v8dashen.com
+prod_host=http://loc-api.v8dashen.com
+wechat_app_id=wx1b9dcf83a2e5b2db
+wework_crop_id=wwd9d1df4fd9e58143
+wechat_kf_id=kfcbcde769fbd749de0
+gravity_access_token=q5ljPyuEtIpixdlrwSf1orFqeuAGsbVi
+bugly_app_id=0764d6cc8d
+umeng_app_key=6597816395b14f599d10cd58