package com.yidianling.im.helper; import android.annotation.SuppressLint; import android.content.Context; import android.support.v7.app.AppCompatActivity; import android.text.TextUtils; import android.view.View; import com.ydl.webview.H5Params; import com.ydl.webview.NewH5Activity; import com.ydl.ydlcommon.data.http.BaseResponse; import com.ydl.ydlcommon.data.http.UpLoadLogUtils; import com.ydl.ydlcommon.ui.LoadingDialogFragment; import com.ydl.ydlcommon.utils.NetworkParamsUtils; import com.ydl.ydlcommon.utils.UserInfoCache; import com.ydl.ydlcommon.utils.remind.HttpErrorUtils; import com.ydl.ydlcommon.view.dialog.CommonDialog; import com.yidianling.common.tools.LogUtil; import com.yidianling.common.tools.ToastUtil; import com.yidianling.im.R; import com.yidianling.im.api.bean.IMExpertBuild; import com.yidianling.im.bean.DoctorAssistantRespDtoBean; import com.yidianling.im.bean.GetExpert; import com.yidianling.im.bridge.P2PCustomActionHandlerImpl; import com.yidianling.im.config.constants.ImConstants; import com.yidianling.im.http.ImRetrofitApi; import com.yidianling.im.router.ImIn; import com.yidianling.im.session.SessionHelper; import com.yidianling.uikit.business.session.helper.ChatStatusCacheHelper; import io.reactivex.android.schedulers.AndroidSchedulers; import io.reactivex.disposables.Disposable; import io.reactivex.schedulers.Schedulers; import retrofit2.HttpException; //import com.ydl.ydlcommon.dialog.CommonDialog; /** * Created by Jim on 2017/12/13 0013. * 聊天接口封装 */ public class IMUtil { public static final int FLAG_SAVE = 0x001; public static final int FLAG_USE_UM = 0x002; public interface ExpertDataFetchListener { void onDataFetched(BaseResponse<IMExpertBuild> datas); } public static void startChat(AppCompatActivity context, String toUid, int flag, int canTalk, ExpertDataFetchListener listener) { startChat(context, toUid, flag, canTalk, listener, 0, false); } /** * 客服专用 */ public static void startKefuChat(AppCompatActivity context, String toUid, int flag, int canTalk, ExpertDataFetchListener listener) { SessionHelper.startP2PSession(context, -1, "14", null, new P2PCustomActionHandlerImpl("14", "客服小壹", "14")); } /** * @param context * @param toUid * @param flag * @param canTalk * @param listener * @param isFromQingShu 用于判断是否从倾诉流程跳转私聊:1:是 其他:不是 从倾述流程跳转私聊,需要发送自定义消息 * @param isFromMessageList 用于判断是否来自于聊天列表点击进入 true 是 false,不是 */ @SuppressLint("CheckResult") public static void startChat(AppCompatActivity context, String toUid, int flag, int canTalk, ExpertDataFetchListener listener, int isFromQingShu, boolean isFromMessageList) { if (!ImIn.INSTANCE.isLogin(context, true)) { return; } boolean isSaveUserInfo = (flag & FLAG_SAVE) != 0; boolean isUseUm = (flag & FLAG_USE_UM) != 0; LogUtil.d("isSaveUserInfo: " + isSaveUserInfo + " isUseUm: " + isUseUm); LoadingDialogFragment dialog = LoadingDialogFragment.Companion.newInstance(null); if (context.getSupportFragmentManager() != null && !context.isDestroyed()) { dialog.show(context.getSupportFragmentManager(), null); } GetExpert cmd = new GetExpert(Integer.parseInt(toUid), canTalk); ImRetrofitApi.Companion.getImJavaApi().getUserType(toUid) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(res -> { if (res.code == 200 && res.data != null) { if (res.data.getChatEvent()) {//和助理私聊需要打开常用语弹窗 ChatStatusCacheHelper.setStatusCache("chatEvent", res.data.getChatEvent()); } if (res.data.getCollectEvent()) {//和助理私聊需要打开信息采集弹窗 ChatStatusCacheHelper.setStatusCache("collectEvent", res.data.getCollectEvent()); } if (TextUtils.equals(res.data.getUserType(), "2")) {//专家 if (isFromMessageList) { startExpertChat(context, toUid, dialog, listener, isUseUm, isSaveUserInfo, isFromQingShu); return; } //在uid用户类型确定为专家的情况下,根据uid调用接口判断是进入专家私聊还是助理私聊 ImRetrofitApi.Companion.getImJavaApi().getChatUid((toUid)) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(resp -> { DoctorAssistantRespDtoBean bean = resp.data; ImRetrofitApi.Companion.getImJavaApi().getUserType(bean.chatUid) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(userTypeResp -> { if (userTypeResp.code == 200 && userTypeResp.data != null) { if (userTypeResp.data.getChatEvent()) {//和助理私聊需要打开常用语弹窗 ChatStatusCacheHelper.setStatusCache("chatEvent", userTypeResp.data.getChatEvent()); } if (userTypeResp.data.getCollectEvent()) {//和助理私聊需要打开信息采集弹窗 ChatStatusCacheHelper.setStatusCache("collectEvent", userTypeResp.data.getCollectEvent()); } if (TextUtils.equals(userTypeResp.data.getUserType(), "2")) {//专家 java 接口 //接口返回值是专家,java接口 startExpertChat(context, bean.chatUid, dialog, listener, isUseUm, isSaveUserInfo, isFromQingShu); } else { //非专家 php接口 GetExpert cmd1 = new GetExpert(Integer.parseInt(bean.chatUid), canTalk); startAssistantChat(context, bean.chatUid, cmd1, dialog, listener, isUseUm, isSaveUserInfo, isFromQingShu); } } else { if (dialog.isVisible()) { dialog.dismissAllowingStateLoss(); } ToastUtil.toastShort(userTypeResp.msg); } }, throwable -> { if (dialog.isVisible()) { dialog.dismissAllowingStateLoss(); } HttpErrorUtils.Companion.handleError(context, throwable); }); }, t -> { HttpErrorUtils.Companion.handleError(context, t); }); } else { startAssistantChat(context, toUid, cmd, dialog, listener, isUseUm, isSaveUserInfo, isFromQingShu); } } else { if (dialog.isVisible()) { dialog.dismissAllowingStateLoss(); } ToastUtil.toastShort(res.msg); } }, throwable -> { if (dialog.isVisible()) { dialog.dismissAllowingStateLoss(); } HttpErrorUtils.Companion.handleError(context, throwable); }); } /** * 专家私聊 */ public static void startExpertChat(AppCompatActivity context, String toUid, LoadingDialogFragment dialog, ExpertDataFetchListener listener, boolean isUseUm, boolean isSaveUserInfo, int isFromQingShu) { Disposable disposable = ImRetrofitApi.Companion.getImJavaApi().getPersonalChat(toUid) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(resp -> { if (null != dialog && dialog.isVisible()) { dialog.dismissAllowingStateLoss(); } if (listener != null) { listener.onDataFetched(resp); return; } if (resp.code == 200) { IMExpertBuild expert = resp.data; if (isSaveUserInfo) { UserInfoCache.getInstance().saveYDLUser(expert.shareData.toUid, expert.shareData.doctorName, expert.shareData.cover); } P2PCustomActionHandlerImpl P2PCustomActionHandlerImpl = new P2PCustomActionHandlerImpl(toUid, expert); P2PCustomActionHandlerImpl.isFromQingShu = isFromQingShu; SessionHelper.startP2PSession(context, expert.shareData.user_type, toUid, null, P2PCustomActionHandlerImpl); } else { UpLoadLogUtils.INSTANCE.upLoadLog("consult/get-expert", resp.code, resp.msg); if (resp.code == ImConstants.HTTP_CODE_UNLOGIN) { context.startActivity(ImIn.INSTANCE.loginWayIntent(context)); ToastUtil.toastShort(resp.msg); } else if (resp.code == ImConstants.SILENCED_CODE) { //禁言 showSilencedDialog(context, resp.data.tips, resp.data.url); } else { ToastUtil.toastShort(resp.msg); } } }, throwable -> { if (null != dialog && dialog.isVisible()) { dialog.dismissAllowingStateLoss(); } HttpErrorUtils.Companion.handleError(context, throwable); if (throwable instanceof HttpException) { UpLoadLogUtils.INSTANCE.upLoadLog("consult/get-expert", ((HttpException) throwable).code(), throwable.getMessage()); } }); } /** * 助理私聊 */ public static void startAssistantChat(AppCompatActivity context, String toUid, GetExpert cmd, LoadingDialogFragment dialog, ExpertDataFetchListener listener , boolean isUseUm, boolean isSaveUserInfo, int isFromQingShu) { Disposable disposable = ImRetrofitApi.Companion.getImRetrofitApi().getExpert(NetworkParamsUtils.getMaps(cmd)).subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(resp -> { if (null != dialog && dialog.isVisible()) { dialog.dismissAllowingStateLoss(); } if (listener != null) { listener.onDataFetched(resp); return; } if (resp.code == 0) { IMExpertBuild expert = resp.data; if (isSaveUserInfo) { UserInfoCache.getInstance().saveYDLUser(expert.shareData.toUid, expert.shareData.doctorName, expert.shareData.cover); } P2PCustomActionHandlerImpl p2PCustomActionHandlerImpl = new P2PCustomActionHandlerImpl(toUid, expert); p2PCustomActionHandlerImpl.isFromQingShu = isFromQingShu; SessionHelper.startP2PSession(context, expert.shareData.user_type, toUid, null, p2PCustomActionHandlerImpl); } else { UpLoadLogUtils.INSTANCE.upLoadLog("consult/get-expert", resp.code, resp.msg); if (resp.code == ImConstants.HTTP_CODE_UNLOGIN) { context.startActivity(ImIn.INSTANCE.loginWayIntent(context)); ToastUtil.toastShort(resp.msg); } else if (resp.code == ImConstants.SILENCED_CODE) { //禁言 showSilencedDialog(context, resp.data.tips, resp.data.url); } else { ToastUtil.toastShort(resp.msg); } } }, throwable -> { if (null != dialog && dialog.isVisible()) { dialog.dismissAllowingStateLoss(); } HttpErrorUtils.Companion.handleError(context, throwable); if (throwable instanceof HttpException) { UpLoadLogUtils.INSTANCE.upLoadLog("consult/get-expert", ((HttpException) throwable).code(), throwable.getMessage()); } }); } public static void showSilencedDialog(Context context, String tips, String url) { CommonDialog.create(context) .setMessage(tips) .setLeftOnclick(context.getString(R.string.im_details), new View.OnClickListener() { @Override public void onClick(View v) { String realUrl = TextUtils.isEmpty(url) ? ImConstants.HELP_URL : url; H5Params params = new H5Params(realUrl, ""); NewH5Activity.start(context, params); } }) .setRightClick(context.getString(R.string.im_approval), null) .show(); } }