Browse Source

增加七鱼客服sdk接入

zk 1 year ago
parent
commit
a037470ca3

+ 5 - 0
app/build.gradle

@@ -50,6 +50,7 @@ android {
             buildConfigField "String", "GRAVITY_ACCESS_TOKEN", "\"$gravity_access_token\""
             buildConfigField "String", "BUGLY_APP_ID", "\"$bugly_app_id\""
             buildConfigField "String", "UMENG_APP_KEY", "\"$umeng_app_key\""
+            buildConfigField "String", "QIYU_APP_KEY", "\"$qiyu_app_key\""
         }
 
         debug {
@@ -65,6 +66,7 @@ android {
             buildConfigField "String", "GRAVITY_ACCESS_TOKEN", "\"$gravity_access_token\""
             buildConfigField "String", "BUGLY_APP_ID", "\"$bugly_app_id\""
             buildConfigField "String", "UMENG_APP_KEY", "\"$umeng_app_key\""
+            buildConfigField "String", "QIYU_APP_KEY", "\"$qiyu_app_key\""
         }
     }
     compileOptions {
@@ -196,4 +198,7 @@ dependencies {
     //SVGA
     implementation 'com.github.svga:SVGAPlayer-Android:2.6.1'
 
+    //网易七鱼客服
+    implementation 'com.qiyukf.unicorn:unicorn:+'
+
 }

+ 7 - 0
app/proguard-rules.pro

@@ -139,4 +139,11 @@ public <methods>;
 -keepclassmembers class * extends android.webkit.WebChromeClient{
     public void openFileChooser(...);
 }
+#七鱼客服
+-dontwarn com.qiyukf.**
+-keep class com.qiyukf.** {*;}
+-dontwarn com.netease.**
+-keep class com.netease.** {*;}
+-dontwarn org.slf4j.**
+-keep class org.slf4j.** { *; }
 

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

@@ -8,6 +8,7 @@ import com.atmob.user.AtmobUser;
 import com.datarecovery.master.data.consts.Constants;
 import com.datarecovery.master.sdk.bugly.BuglyHelper;
 import com.datarecovery.master.sdk.gravity.GravityHelper;
+import com.datarecovery.master.sdk.qiyu.QiYuHelper;
 import com.datarecovery.master.sdk.umeng.UmengHelper;
 
 import dagger.hilt.android.HiltAndroidApp;
@@ -63,6 +64,7 @@ public class App extends BaseApplication {
             initBugly();
             initUmeng();
         }
+        QiYuHelper.init(this);
     }
 
     @Override

+ 2 - 1
app/src/main/java/com/datarecovery/master/data/api/response/CustomerUrlResponse.java

@@ -15,11 +15,12 @@ public class CustomerUrlResponse {
     @SerializedName("method")
     private int method;
 
-    @IntDef({CustomerMethod.METHOD_ALI, CustomerMethod.METHOD_WX})
+    @IntDef({CustomerMethod.METHOD_ALI, CustomerMethod.METHOD_WX, CustomerMethod.METHOD_QIYU})
     @Retention(RetentionPolicy.SOURCE)
     public @interface CustomerMethod {
         int METHOD_ALI = 1;
         int METHOD_WX = 2;
+        int METHOD_QIYU = 3;
     }
 
     @CustomerMethod

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

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

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

@@ -24,10 +24,12 @@ import com.datarecovery.master.module.member.MemberType;
 import com.datarecovery.master.module.mine.MineFragment;
 import com.datarecovery.master.module.order.OrderFragment;
 import com.datarecovery.master.module.videorecover.VideoRecoverActivity;
+import com.datarecovery.master.sdk.qiyu.QiYuHelper;
 import com.datarecovery.master.utils.Maps;
 import com.datarecovery.master.utils.ToastUtil;
 import com.google.android.material.tabs.TabLayout;
 import com.google.android.material.tabs.TabLayoutMediator;
+import com.qiyukf.unicorn.api.Unicorn;
 
 import dagger.hilt.android.AndroidEntryPoint;
 
@@ -93,6 +95,7 @@ public class MainActivity extends BaseActivity<ActivityMainBinding> {
         super.onCreate(savedInstanceState);
         initView();
         initObserver();
+        QiYuHelper.initSdk();
     }
 
     private void initObserver() {

+ 8 - 1
app/src/main/java/com/datarecovery/master/module/mine/MineViewModel.java

@@ -25,9 +25,11 @@ import com.datarecovery.master.module.login.LoginActivity;
 import com.datarecovery.master.module.member.MemberActivity;
 import com.datarecovery.master.module.member.MemberType;
 import com.datarecovery.master.module.wxrecover.WeChatRecoverActivity;
+import com.datarecovery.master.sdk.qiyu.QiYuHelper;
 import com.datarecovery.master.sdk.wechat.WechatHelper;
 import com.datarecovery.master.utils.BoxingUtil;
 import com.datarecovery.master.utils.ToastUtil;
+import com.qiyukf.unicorn.api.Unicorn;
 
 import javax.inject.Inject;
 
@@ -137,6 +139,7 @@ public class MineViewModel extends BaseViewModel {
     }
 
     public void onAccountLogout() {
+        QiYuHelper.logout();
         accountRepository.logout();
     }
 
@@ -161,11 +164,15 @@ public class MineViewModel extends BaseViewModel {
 
     public void onCustomerServiceClick() {
         EventHelper.report(EventId.hf1001108);
-        refreshCustomerUrl();
+        QiYuHelper.openServiceActivity(ContextUtil.getContext());
+//        refreshCustomerUrl();
     }
 
     private void goCustomer(@NonNull CustomerUrlResponse customerResponse) {
         switch (customerResponse.getMethod()) {
+            case CustomerUrlResponse.CustomerMethod.METHOD_QIYU:
+                Unicorn.openServiceActivity(ContextUtil.getContext(), "客服", null);
+                break;
             case CustomerUrlResponse.CustomerMethod.METHOD_ALI:
                 CustomerServiceActivity.start(ActivityUtil.getTopActivity(), customerResponse.getCustomerUrl());
                 break;

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

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

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

@@ -0,0 +1,121 @@
+package com.datarecovery.master.sdk.qiyu;
+
+import android.app.Application;
+import android.content.Context;
+import android.text.TextUtils;
+
+import com.atmob.common.data.KVUtils;
+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 com.datarecovery.master.R;
+import com.datarecovery.master.data.repositories.AccountRepository;
+import com.qiyukf.nimlib.sdk.RequestCallback;
+import com.qiyukf.nimlib.sdk.StatusBarNotificationConfig;
+import com.qiyukf.unicorn.api.Unicorn;
+import com.qiyukf.unicorn.api.YSFOptions;
+import com.qiyukf.unicorn.api.YSFUserInfo;
+
+import java.util.UUID;
+
+public class QiYuHelper {
+
+
+    private static final String ysfAppId = BuildConfig.QIYU_APP_KEY;
+    private static final String VISITOR_KEY = "visitor_key";
+
+    public static void init(Application application) {
+        Unicorn.config(application, ysfAppId, options(), new GlideImageLoader(application));
+    }
+
+    public static void initSdk() {
+        Unicorn.initSdk();
+        if (TextUtils.isEmpty(AccountRepository.token)) {
+            setVisitorInfo();
+        }
+    }
+
+
+    private static void setVisitorInfo() {
+        YSFUserInfo userInfo = new YSFUserInfo();
+        String userId;
+        if (TextUtils.isEmpty(userId = KVUtils.getDefault().getString(VISITOR_KEY, null))) {
+            userId = UUID.randomUUID().toString();
+            KVUtils.getDefault().putString(VISITOR_KEY, userId);
+        }
+        userInfo.userId = userId;
+        String appName = ContextUtil.getContext().getString(R.string.app_name) + "-访客";
+        // CRM 扩展字段
+        userInfo.data = "[\n" +
+                "    {\"key\":\"real_name\", \"value\":\"" + appName + "\"},\n" +
+                "]";
+        Unicorn.setUserInfo(userInfo, new RequestCallback<Void>() {
+            @Override
+            public void onSuccess(Void aVoid) {
+                AtmobLog.d("zk", "set visitor info success");
+            }
+
+            @Override
+            public void onFailed(int errorCode) {
+                AtmobLog.d("zk", "set visitor info failed, errorCode: " + errorCode);
+            }
+
+            @Override
+            public void onException(Throwable throwable) {
+                AtmobLog.d("zk", "set visitor info exception: " + throwable.getMessage());
+            }
+        });
+    }
+
+
+    private static YSFOptions options() {
+        YSFOptions options = new YSFOptions();
+        options.statusBarNotificationConfig = new StatusBarNotificationConfig();
+        return options;
+    }
+
+    public static void logout() {
+        Unicorn.logout();
+    }
+
+    public static void openServiceActivity(Context context) {
+        Unicorn.openServiceActivity(context, "客服", null);
+    }
+
+    public static void setUserInfo(String phone, String token) {
+        YSFUserInfo userInfo = new YSFUserInfo();
+        // App 的用户 ID
+        String userId;
+        if (TextUtils.isEmpty(userId = KVUtils.getDefault().getString(VISITOR_KEY, null))) {
+            userId = UUID.randomUUID().toString();
+            KVUtils.getDefault().putString(VISITOR_KEY, userId);
+        }
+        userInfo.userId = userId;
+        // 当且仅当开发者在管理后台开启了 authToken 校验功能时,该字段才有效
+        userInfo.authToken = token;
+        String appName = ContextUtil.getContext().getString(R.string.app_name) + "-" + phone;
+        // CRM 扩展字段
+        userInfo.data = "[\n" +
+                "    {\"key\":\"real_name\", \"value\":\"" + appName + "\"},\n" +
+                "    {\"key\":\"mobile_phone\", \"hidden\":false, \"value\":\"" + phone + "\"},\n" +
+                "]";
+        Unicorn.setUserInfo(userInfo, new RequestCallback<Void>() {
+            @Override
+            public void onSuccess(Void aVoid) {
+                AtmobLog.d("zk", "set visitor info success");
+            }
+
+            @Override
+            public void onFailed(int errorCode) {
+                AtmobLog.d("zk", "set visitor info failed, errorCode: " + errorCode);
+            }
+
+            @Override
+            public void onException(Throwable throwable) {
+                AtmobLog.d("zk", "set visitor info exception: " + throwable.getMessage());
+            }
+        });
+    }
+}

+ 2 - 1
gradle.properties

@@ -28,4 +28,5 @@ wework_crop_id=wwda29771d597510a9
 wechat_kf_id=kfcb5b96d3fb25aca03
 gravity_access_token=q5ljPyuEtIpixdlrwSf1orFqeuAGsbVi
 bugly_app_id=0a6e00ae03
-umeng_app_key=6597816395b14f599d10cd58
+umeng_app_key=6597816395b14f599d10cd58
+qiyu_app_key=09ea6e0a6d006e25462906fbf6758c99