diff --git a/app/build.gradle b/app/build.gradle index 8ddd64597..858b92d12 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -246,6 +246,8 @@ dependencies { implementation "io.github.tencent:vap:2.0.24" implementation 'com.github.mmin18:realtimeblurview:1.2.1' + + implementation 'com.qiyukf.unicorn:unicorn:8.2.0' } repositories { diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro index ab93c57d5..af572000c 100644 --- a/app/proguard-rules.pro +++ b/app/proguard-rules.pro @@ -453,5 +453,10 @@ -keep class android.support.v8.renderscript.** { *; } -keep class androidx.renderscript.** { *; } --keep class com.yinyou.plugin.**{*;} +-keep class com.nnbc123.plugin.ui.**{*;} + +-dontwarn com.qiyukf.** +-keep class com.qiyukf.** {*;} +-dontwarn org.slf4j.** +-keep class org.slf4j.** { *; } diff --git a/app/src/main/java/com/nnbc123/app/MainActivity.java b/app/src/main/java/com/nnbc123/app/MainActivity.java index d8b2f2425..5bbc47d09 100644 --- a/app/src/main/java/com/nnbc123/app/MainActivity.java +++ b/app/src/main/java/com/nnbc123/app/MainActivity.java @@ -63,6 +63,7 @@ import com.nnbc123.app.main.helper.NoticationsUiHelper; import com.nnbc123.app.miniworld.activity.MiniWorldGuestPageActivity; import com.nnbc123.app.module.Extras; import com.nnbc123.app.module_hall.secretcode.PwdCodeMgr; +import com.nnbc123.app.qiyukefu.CustomerServerHelper; import com.nnbc123.app.quick_pass.QuickPassLoginAct; import com.nnbc123.app.service.DaemonService; import com.nnbc123.app.ui.im.ImInitHelper; @@ -510,6 +511,7 @@ public class MainActivity extends BaseMvpActivity getMvpPresenter().exitRoom(); QuickPassLoginAct.start(MainActivity.this); PmDialogShowMrg.get().onLogout(); + CustomerServerHelper.logout(); } public void onNeedLogin() { @@ -681,6 +683,8 @@ public class MainActivity extends BaseMvpActivity checkShowAnchorCardView(); onTabClick(mCurrentTabType); + + CustomerServerHelper.onLoginInfoUpdate(UserUtils.getUserInfo()); } diff --git a/app/src/main/java/com/nnbc123/app/application/XChatApplication.java b/app/src/main/java/com/nnbc123/app/application/XChatApplication.java index 0e29e1963..0599711f6 100644 --- a/app/src/main/java/com/nnbc123/app/application/XChatApplication.java +++ b/app/src/main/java/com/nnbc123/app/application/XChatApplication.java @@ -47,9 +47,12 @@ import com.netease.nimlib.sdk.msg.MessageNotifierCustomization; import com.netease.nimlib.sdk.msg.constant.MsgTypeEnum; import com.netease.nimlib.sdk.msg.model.IMMessage; import com.netease.nimlib.sdk.util.NIMUtil; +import com.nnbc123.app.qiyukefu.CustomerServerHelper; +import com.nnbc123.app.qiyukefu.GlideImageLoader; import com.opensource.svgaplayer.SVGAParser; import com.orhanobut.logger.AndroidLogAdapter; import com.orhanobut.logger.Logger; +import com.qiyukf.unicorn.api.Unicorn; import com.scwang.smartrefresh.header.MaterialHeader; import com.scwang.smartrefresh.layout.SmartRefreshLayout; import com.scwang.smartrefresh.layout.footer.ClassicsFooter; @@ -240,7 +243,6 @@ public class XChatApplication extends Application { }); ToastUtils.init(application); - if (inMainProcess(context)) { HeytapPushManager.init(context, true); @@ -301,6 +303,9 @@ public class XChatApplication extends Application { // 集成测试 UMConfigure.setLogEnabled(BuildConfig.DEBUG); } + else { + CustomerServerHelper.init(instance,null); + } LogUtils.d("init time = " + (System.currentTimeMillis() - startTime) + "ms"); diff --git a/app/src/main/java/com/nnbc123/app/home/fragment/MeFragment.kt b/app/src/main/java/com/nnbc123/app/home/fragment/MeFragment.kt index dca3eef13..e5dd5d029 100644 --- a/app/src/main/java/com/nnbc123/app/home/fragment/MeFragment.kt +++ b/app/src/main/java/com/nnbc123/app/home/fragment/MeFragment.kt @@ -28,6 +28,7 @@ import com.nnbc123.app.home.activity.VisitorListActivity import com.nnbc123.app.home.adapter.MeCenterAdapter import com.nnbc123.app.home.helper.BannerHelper import com.nnbc123.app.home.helper.OpenRoomHelper +import com.nnbc123.app.qiyukefu.CustomerServerHelper import com.nnbc123.app.skill.activity.SkillHomeActivity import com.nnbc123.app.skill.activity.SkillHomeActivity.Companion.start import com.nnbc123.app.treasure_box.widget.GoldBoxHelper @@ -391,8 +392,8 @@ class MeFragment : BaseFragment(), View.OnClickListener { mContext, UriProvider.getTutuRealNamePage() ) - R.id.tv_me_service->{ - + R.id.tv_me_service -> { + CustomerServerHelper.contactCustomerServer(mContext) } else -> {} } diff --git a/app/src/main/java/com/nnbc123/app/qiyukefu/CustomerItemInfo.java b/app/src/main/java/com/nnbc123/app/qiyukefu/CustomerItemInfo.java new file mode 100644 index 000000000..f5f73ff64 --- /dev/null +++ b/app/src/main/java/com/nnbc123/app/qiyukefu/CustomerItemInfo.java @@ -0,0 +1,48 @@ +package com.nnbc123.app.qiyukefu; + +import androidx.annotation.Keep; + +/** + * @author jack + * @Description @link YSFUserInfo + * @Date 2019/3/18 + */ +@Keep +public class CustomerItemInfo { + private String key;//数据项的名称,用于区别不同的数据。 + private int index;//用于排序,显示数据时数据项按index值升序排列;不设定index的数据项将排在后面;index相同或未设定的数据项将按照其在 JSON 中出现的顺序排列。 + private String label;//该项数据显示的名称。 + private String value;//该数据显示的值,类型不做限定,根据实际需要进行设定。 + private String href;//超链接地址。若指定该值,则该项数据将显示为超链接样式,点击后跳转到其值所指定的 URL 地址。 + private boolean hidden;//是否隐藏该item。目前仅对mobile和email有效。 + + + public CustomerItemInfo(String key) { + this.key = key; + } + + public CustomerItemInfo setIndex(int index) { + this.index = index; + return this; + } + + public CustomerItemInfo setLabel(String label) { + this.label = label; + return this; + } + + public CustomerItemInfo setValue(String value) { + this.value = value; + return this; + } + + public CustomerItemInfo setHref(String href) { + this.href = href; + return this; + } + + public CustomerItemInfo setHidden(boolean hidden) { + this.hidden = hidden; + return this; + } +} diff --git a/app/src/main/java/com/nnbc123/app/qiyukefu/CustomerServerHelper.java b/app/src/main/java/com/nnbc123/app/qiyukefu/CustomerServerHelper.java new file mode 100644 index 000000000..575f7afd1 --- /dev/null +++ b/app/src/main/java/com/nnbc123/app/qiyukefu/CustomerServerHelper.java @@ -0,0 +1,125 @@ +package com.nnbc123.app.qiyukefu; + +import android.content.Context; + +import androidx.annotation.Nullable; + +import com.google.gson.Gson; +import com.nnbc123.app.application.XChatApplication; +import com.nnbc123.core.auth.AuthModel; +import com.nnbc123.core.user.bean.UserInfo; +import com.nnbc123.library.utils.SingleToastUtil; +import com.nnbc123.xchat_android_constants.XChatConstants; +import com.qiyukf.unicorn.api.ConsultSource; +import com.qiyukf.unicorn.api.UICustomization; +import com.qiyukf.unicorn.api.Unicorn; +import com.qiyukf.unicorn.api.YSFOptions; +import com.qiyukf.unicorn.api.YSFUserInfo; +import com.qiyukf.unicorn.api.customization.input.ActionPanelOptions; +import com.qiyukf.unicorn.api.customization.input.InputPanelOptions; + +import java.util.ArrayList; +import java.util.List; + +/** + * @author jack + * @Description + * @Date 2019/3/18 + */ +public class CustomerServerHelper { + + public final static String AVATAR_URL = "https://image.zhongjialx.com/new_kficon.png"; + private final static String TITLE = "官方客服"; + private static boolean isInit = false; + + private CustomerServerHelper() { + + } + + public static void onLoginInfoUpdate(@Nullable UserInfo userInfo) { + if (!isInit) + init(XChatApplication.instance(), userInfo); + + if (userInfo != null) { + YSFUserInfo ysfUserInfo = new YSFUserInfo(); + ysfUserInfo.userId = AuthModel.get().getCurrentUid() + ""; + ysfUserInfo.authToken = null; + List userData = new ArrayList<>(); + userData.add(new CustomerItemInfo("real_name").setValue(userInfo.getNick())); + userData.add(new CustomerItemInfo("mobile_phone").setValue(userInfo.getPhone())); + userData.add(new CustomerItemInfo("email").setValue("")); + userData.add(new CustomerItemInfo("avatar").setValue(userInfo.getAvatar())); + userData.add(new CustomerItemInfo("nick") + .setLabel("用户昵称:") + .setValue(userInfo.getNick()) + .setIndex(0)); + + userData.add(new CustomerItemInfo("gender") + .setLabel("性别:") + .setValue(userInfo.getGender() == 1 ? "男" : "女") + .setIndex(1)); + + userData.add(new CustomerItemInfo("erbanNo") + .setLabel("音萌号:") + .setValue(userInfo.getErbanNo() + "") + .setIndex(2)); + + userData.add(new CustomerItemInfo("phone") + .setLabel("手机号:") + .setValue(userInfo.getPhone()) + .setIndex(3)); + + userData.add(new CustomerItemInfo("newUser") + .setLabel("是否新用户:") + .setValue(userInfo.isNewUser() ? "是" : "否") + .setIndex(4)); + + ysfUserInfo.data = new Gson().toJson(userData); + + Unicorn.setUserInfo(ysfUserInfo); + } + } + + public static void init(Context context, @Nullable UserInfo userInfo) { + if (isInit) { + return; + } + isInit = true; + YSFOptions options = new YSFOptions(); + options.inputPanelOptions = new InputPanelOptions(); + options.inputPanelOptions.showActionPanel = true; + options.inputPanelOptions.actionPanelOptions = new ActionPanelOptions(); + options.uiCustomization = new UICustomization(); + if (userInfo != null) { + options.uiCustomization.rightAvatar = userInfo.getAvatar(); + } + options.uiCustomization.titleBarStyle = 0; + options.uiCustomization.leftAvatar = AVATAR_URL; + options.uiCustomization.hideKeyboardOnEnterConsult = true; + options.uiCustomization.titleCenter = true; + + // appKey 可以在七鱼管理系统->设置->App 接入 页面找到 + Unicorn.init(context, XChatConstants.QI_YU_KF_KEY, options, new GlideImageLoader(context)); + Unicorn.initSdk(); + } + + public static void contactCustomerServer(Context context) { + if (!isInit) { + return; + } + + if (!AuthModel.get().isImLogin()) { + SingleToastUtil.showToast("数据加载中,请稍后!"); + return; + } + + ConsultSource source = new ConsultSource(null, TITLE, null); + Unicorn.openServiceActivity(context, TITLE, source); + } + + public static void logout() { + Unicorn.logout(); + isInit = false; + } + +} diff --git a/app/src/main/java/com/nnbc123/app/qiyukefu/GlideImageLoader.java b/app/src/main/java/com/nnbc123/app/qiyukefu/GlideImageLoader.java new file mode 100644 index 000000000..dd104c50e --- /dev/null +++ b/app/src/main/java/com/nnbc123/app/qiyukefu/GlideImageLoader.java @@ -0,0 +1,59 @@ +package com.nnbc123.app.qiyukefu; + +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; + +public class GlideImageLoader implements UnicornImageLoader { + private final Context context; + + public GlideImageLoader(Context context) { + this.context = context.getApplicationContext(); + } + + @Override + public Bitmap loadImageSync(String uri, int width, int height) { + return null; + } + + @Override + public void loadImage(String uri, int width, int height, final ImageLoaderListener listener) { + if (width <= 0 || height <= 0) { + width = height = Integer.MIN_VALUE; + } + + Glide.with(context).asBitmap().load(uri).into(new CustomTarget(width, height) { + + @Override + public void onLoadStarted(@Nullable Drawable placeholder) { + + } + + @Override + public void onLoadFailed(@Nullable Drawable errorDrawable) { + + } + + @Override + public void onResourceReady(@NonNull Bitmap resource, @Nullable Transition transition) { + if (listener != null) { + listener.onLoadComplete(resource); + } + } + + @Override + public void onLoadCleared(@Nullable Drawable placeholder) { + + } + }); + } +} \ No newline at end of file diff --git a/app/src/main/res/drawable-xhdpi/bg_login_top.png b/app/src/main/res/drawable-xhdpi/bg_login_top.png index 3e497d463..7fa3612df 100644 Binary files a/app/src/main/res/drawable-xhdpi/bg_login_top.png and b/app/src/main/res/drawable-xhdpi/bg_login_top.png differ diff --git a/app/src/main/res/drawable/bg_common_edit.xml b/app/src/main/res/drawable/bg_common_edit.xml index b78356832..3c6eb8cc2 100644 --- a/app/src/main/res/drawable/bg_common_edit.xml +++ b/app/src/main/res/drawable/bg_common_edit.xml @@ -2,9 +2,7 @@ - + diff --git a/core/src/diff_src_erban/java/com/nnbc123/xchat_android_constants/XChatConstants.java b/core/src/diff_src_erban/java/com/nnbc123/xchat_android_constants/XChatConstants.java index 039cb0cc8..3bbe8b349 100644 --- a/core/src/diff_src_erban/java/com/nnbc123/xchat_android_constants/XChatConstants.java +++ b/core/src/diff_src_erban/java/com/nnbc123/xchat_android_constants/XChatConstants.java @@ -235,6 +235,7 @@ public class XChatConstants { public static final String CHAT_ROOM_ANTI_SPAM_CONFIG_ID = BuildConfig.DEBUG ? "d6ee07a01d458ac212962a01f13d1996" : "d6ee07a01d458ac212962a01f13d1996"; public static final int KICK_OUT_ROOM_LIMIT_ENTER_TIME = 5 * 60 * 1000; + public static final String QI_YU_KF_KEY = "b6b7ca22f8ce319dea3a7456dc211fec"; public static int SELECT_ANIM_DURATION = 2500;