YDLavManager.kt 23.8 KB
Newer Older
洪国微 committed
1 2
package com.ydl.audioim

洪国微 committed
3
import android.annotation.SuppressLint
洪国微 committed
4
import android.content.Context
严久程 committed
5
import android.os.Handler
洪国微 committed
6
import android.text.TextUtils
严久程 committed
7
import com.alibaba.android.arouter.launcher.ARouter
8 9
import com.google.gson.Gson
import com.ydl.audioim.bean.AgoraInvitationBean
严久程 committed
10 11
import com.ydl.audioim.http.AudioApiRequestUtil
import com.ydl.audioim.http.command.ConnectExceptionCommand
严久程 committed
12
import com.ydl.audioim.router.AudioImIn
严久程 committed
13
import com.ydl.audioim.utils.AudioLogUtils
14
import com.ydl.audioim.utils.AudioLogUtils.Companion.writeAgoraLog
严久程 committed
15
import com.ydl.consultantim.ConsultantAudioHomeActivity
洪国微 committed
16 17
import com.ydl.ydl_av.messge_service.YDLRTMClient
import com.ydl.ydl_av.messge_service.bean.RTMMesssage
严久程 committed
18
import com.ydl.ydl_av.messge_service.callback.CallListener
严久程 committed
19
import com.ydl.ydl_av.messge_service.callback.CancelCallStatusListener
洪国微 committed
20 21 22
import com.ydl.ydl_av.messge_service.callback.InitListener
import com.ydl.ydl_av.messge_service.callback.LoginCallback
import com.ydl.ydl_av.messge_service.request.LoginParam
严久程 committed
23 24
import com.ydl.ydl_av.messge_service.response.CallLocalResponse
import com.ydl.ydl_av.messge_service.response.CallRemoteResponse
严久程 committed
25 26
import com.ydl.ydlcommon.modular.ModularServiceManager
import com.ydl.ydlcommon.utils.ActivityManager
27
import com.ydl.ydlcommon.utils.LogUtil
洪国微 committed
28
import com.ydl.ydlcommon.utils.log.LogHelper
严久程 committed
29
import com.yidianling.common.tools.ToastUtil
严久程 committed
30
import com.yidianling.im.api.bean.IMRegisterObserverCustomNotificationCallBack
31
import com.yidianling.im.api.bean.IMSendCustomNotificationResultCallBack
konghaorui committed
32 33
import com.yidianling.user.api.event.UserLoginEvent
import com.yidianling.user.api.event.UserLogoutEvent
严久程 committed
34
import com.yidianling.user.api.service.IUserService
konghaorui committed
35
import de.greenrobot.event.EventBus
严久程 committed
36 37
import io.agora.rtm.RtmStatusCode
import io.reactivex.Observable
洪国微 committed
38 39
import io.reactivex.android.schedulers.AndroidSchedulers
import io.reactivex.schedulers.Schedulers
YKai committed
40
import java.util.*
严久程 committed
41
import java.util.concurrent.TimeUnit
洪国微 committed
42 43 44 45 46 47 48 49

/**
 * @author harvie
 * @date 2019/9/27
 * 语音通话入口类
 */
class YDLavManager {

50
    companion object {
YKai committed
51
        const val FILE_NAME = "consult.log"
52

53 54
        //当前sdk的登录状态
        var sdkStatus = -1
洪国微 committed
55

56 57
        val instances: YDLavManager by lazy(mode = LazyThreadSafetyMode.SYNCHRONIZED) {
            YDLavManager()
洪国微 committed
58
        }
59
        const val AUDIO_NO_AUTH_ERROR_CODE = "97"//音频权限未通过错误码
60 61 62 63 64 65 66 67 68 69 70 71 72 73 74
    }


    fun init(context: Context, appId: String) {
        YDLRTMClient.instances.init(context, appId, listener)
        EventBus.getDefault().register(this)
        //设置回调
        setCallback()

        val uid = ModularServiceManager.provide(IUserService::class.java).getUserInfo()?.uid
        if (!TextUtils.isEmpty(uid) && !TextUtils.equals("0", uid)) {
            //不延时,可能会导致请求api报 network not unablibale
            Handler().postDelayed({
                login(uid)
            }, 300)
严久程 committed
75
        }
76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95
    }

    public fun onEvent(event: UserLoginEvent) {
        instances.login(event.uid)
    }

    public fun onEvent(event: UserLogoutEvent) {
        instances.logout()
    }

    private fun setCallback() {
        YDLRTMClient.instances.setCallListener(object : CallListener {
            override fun onCallRecivedByPeer(response: CallLocalResponse?) {
                //返回给主叫:被叫已收到呼叫邀请
                LogUtil.e("[agora]${response?.calleeId}已收到呼叫邀请,频道号${response?.ChannelId}")

                val act = ActivityManager.getInstance().getTopTaskActivity()
                if (act is AudioHomeActivity) {
                    act.runOnUiThread {
                        act.playWaitingMusic()
YKai committed
96
                        act.writeAgoraLog("被叫已收到通话邀请")
97 98 99 100 101 102 103 104 105 106 107 108 109 110 111
                    }
                }
            }

            override fun onCallAccepted(response: CallLocalResponse?, msg: String?) {
                //返回给主叫
                LogUtil.e("[agora]${response?.calleeId}已接收呼叫邀请")

                //加入声网频道时机修改:主叫收到被叫接受邀请的回调后再加入声网频道
                val act = ActivityManager.getInstance().getTopTaskActivity()
                if (act is AudioHomeActivity) {
                    act.runOnUiThread {
                        act.joinChannel()
                    }
                }
严久程 committed
112
            }
113 114 115 116 117 118 119 120 121 122

            override fun onCallRefused(response: CallLocalResponse?, msg: String?) {
                //返回给主叫
                LogUtil.e("[agora]${response?.calleeId}已拒绝呼叫邀请")

                val act = ActivityManager.getInstance().getTopTaskActivity()
                if (act is AudioHomeActivity) {
                    act.runOnUiThread {
                        callEndStatusUpdate(response?.ChannelId!!, 2, "被叫拒绝")
                        ToastUtil.toastShort("对方已挂断")
YKai committed
123
                        act.writeAgoraLog("被叫(专家)拒绝了通话邀请")
124 125 126
                        //通话结束或挂断时,上传日志文件
                        act.uploadLog()
                        act.leaveChannel()
127
                        act.uploadExceptionStatus("对方已拒绝", 2)
128 129
                    }
                }
严久程 committed
130
            }
131 132 133 134 135 136 137

            override fun onCallCanceled(response: CallLocalResponse?) {
                //返回给主叫
                LogUtil.e("[agora]主叫已取消呼叫邀请")
                val act = ActivityManager.getInstance().getTopTaskActivity()
                if (act is AudioHomeActivity) {
                    act.runOnUiThread {
YKai committed
138
                        act.writeAgoraLog("主叫(用户)呼叫取消:超时或主动取消")
139
                        act.uploadExceptionStatus("已取消", 1)
140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160
                    }
                }
            }

            override fun onCallFailure(response: CallLocalResponse?, errorCode: Int) {
                //返回给主叫
                LogUtil.e("[agora]呼叫${response?.calleeId}用户失败:${response?.response}")
                val act = ActivityManager.getInstance().getTopTaskActivity()
                //专家离线或者30 秒后仍未收到专家响应,重新再邀请一次
                when (errorCode) {
                    //被叫不在线   呼叫邀请发出 30 秒后被叫仍未 ACK 响应呼叫邀请
                    RtmStatusCode.LocalInvitationError.LOCAL_INVITATION_ERR_PEER_OFFLINE, RtmStatusCode.LocalInvitationError.LOCAL_INVITATION_ERR_PEER_NO_RESPONSE -> {
                        if (act is AudioHomeActivity) {
                            act.runOnUiThread {
                                act.rtcCall()
                            }
                        }
                    }
                    RtmStatusCode.LocalInvitationError.LOCAL_INVITATION_ERR_INVITATION_EXPIRE -> { //呼叫邀请过期。被叫 ACK 响应呼叫邀请后 60 秒呼叫邀请未被取消、接受、拒绝,则呼叫邀请过期。
                        if (act is AudioHomeActivity) {
                            act.runOnUiThread {
YKai committed
161
                                sendCustomNotification(response?.calleeId!!, response?.ChannelId!!, "5")
162
                                callEndStatusUpdate(response.ChannelId!!, 2, "被叫超时未接听")
163
                                act.uploadExceptionStatus("对方未接听", 3)
严久程 committed
164 165 166
//                                //通话结束或挂断时,上传日志文件
//                                act.uploadLog()
//                                act.leaveChannel()
167 168 169
                            }
                        }
                    }
YKai committed
170 171 172 173 174 175
                }
                //呼叫失败日志输出
                if (act is AudioHomeActivity){
                    act.runOnUiThread{
                        act.writeAgoraLog("发送通话邀请失败:${errorCode}")
                        LogHelper.getInstance().uploadLog(false)
YKai committed
176
                    }
177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193
                }
            }

            override fun onRemoteInvitationReceived(response: CallRemoteResponse?) {
                //返回给被叫
                LogUtil.e("[agora]收到来自${response?.callerId}的呼叫邀请")
                receivedCall(response?.content, "来自RTM")
            }

            override fun onRemoteInvitationAccepted(response: CallRemoteResponse?) {
                //返回给被叫
                LogUtil.e("[agora]接受来自${response?.callerId}的呼叫成功")
            }

            override fun onRemoteInvitationRefused(response: CallRemoteResponse?) {
                //返回给被叫
                LogUtil.e("[agora]已拒绝来自${response?.callerId}的呼叫")
194 195 196 197
                val act = ActivityManager.getInstance().getTopTaskActivity()
                if (act is ConsultantAudioHomeActivity) {
                    act.uploadExceptionStatus("已拒绝", 2)
                }
198 199 200 201 202 203
            }

            override fun onRemoteInvitationCanceled(response: CallRemoteResponse?) {
                callEndStatusUpdate(response?.ChannelId!!, 1, "主叫取消呼叫")
                //返回给被叫
                LogUtil.e("[agora]主叫${response?.callerId}已取消呼叫邀请")
YKai committed
204
                writeAgoraLog("呼叫邀请被取消:主叫(专家)主动取消-------Time:${AudioLogUtils.format.format(Calendar.getInstance().time)}", FILE_NAME)
205 206 207 208 209 210

                val act = ActivityManager.getInstance().getTopTaskActivity()
                if (act is ConsultantAudioHomeActivity) {
                    act.uploadExceptionStatus("对方已取消", 1)
                }

211 212 213 214 215 216 217
                closePage()
            }

            override fun onRemoteInvitationFailure(response: CallRemoteResponse?, errorCode: Int) {
                //返回给被叫
                LogUtil.e("[agora]来自主叫${response?.callerId}的呼叫邀请进程失败:${response?.response}")
                if (errorCode == RtmStatusCode.RemoteInvitationError.REMOTE_INVITATION_ERR_INVITATION_EXPIRE) { //呼叫邀请过期
YKai committed
218
                    writeAgoraLog("呼叫邀请被取消:用户未接听-------Time:${AudioLogUtils.format.format(Calendar.getInstance().time)}", FILE_NAME)
219 220 221 222
                    val act = ActivityManager.getInstance().getTopTaskActivity()
                    if (act is ConsultantAudioHomeActivity) {
                        act.uploadExceptionStatus("未接听", 3)
                    }
223
                } else {
YKai committed
224
                    writeAgoraLog("呼叫邀请被取消:错误原因(${errorCode})-------Time:${AudioLogUtils.format.format(Calendar.getInstance().time)}", FILE_NAME)
225 226 227 228 229 230 231 232
                }
                callEndStatusUpdate(response?.ChannelId!!, 2, "超时未接听导致的取消呼叫")
                //关闭页面
                closePage()
            }

            override fun onOtherMsg(error: String?) {
                LogUtil.e("[agora]其它消息:${error}")
YKai committed
233
                if (error.equals("呼叫发送成功")){
234
                    writeAgoraLog("声网发送通话邀请成功-------Time:${AudioLogUtils.format.format(Calendar.getInstance().time)}", "confide.log",true)
YKai committed
235
                }else{
236
                    writeAgoraLog("声网发送通话邀请失败${error}-------Time:${AudioLogUtils.format.format(Calendar.getInstance().time)}", "confide.log",true)
YKai committed
237 238
                    LogHelper.getInstance().uploadLog(false)
                }
239 240 241 242
            }
        })

        AudioImIn.registerObserveCustomNotification(object :
严久程 committed
243 244 245 246 247 248
            IMRegisterObserverCustomNotificationCallBack {
            override fun onObserverCustomNotification(
                fromUid: String,
                toUid: String,
                content: String
            ) {
249 250 251 252 253 254
                LogUtil.e("[agora]收到云信的通知消息:$content")
                val agoraInvitationBean = Gson().fromJson(content, AgoraInvitationBean::class.java)

                //1发起呼叫 2接受呼叫  3取消呼叫  4拒绝呼叫邀请 5呼叫超时
                when (agoraInvitationBean.callType) {
                    "1" -> {
YKai committed
255
                        writeAgoraLog("1收到云信消息通知电话-------Time:${AudioLogUtils.format.format(Calendar.getInstance().time)}", FILE_NAME)
256 257 258
                        receivedCall(agoraInvitationBean.data, "来自云信")
                    }
                    "2" -> {
YKai committed
259
                        writeAgoraLog("对方接受了通话邀请,主叫开始加入频道:callType${agoraInvitationBean.callType}-------Time:${AudioLogUtils.format.format(Calendar.getInstance().time)}",
260 261
                            FILE_NAME
                        )
262 263 264 265 266 267 268 269
                        val act = ActivityManager.getInstance().getTopTaskActivity()
                        if (act is AudioHomeActivity) {
                            act.runOnUiThread {
                                act.joinChannel()
                            }
                        }
                    }
                    "3" -> {
YKai committed
270
                        writeAgoraLog("呼叫邀请被取消:主叫主动取消-------Time:${AudioLogUtils.format.format(Calendar.getInstance().time)}", FILE_NAME)
271 272 273
                        closePage()
                    }
                    "4" -> {
YKai committed
274
                        writeAgoraLog("被叫拒绝了通话邀请-------Time:${AudioLogUtils.format.format(Calendar.getInstance().time)}", FILE_NAME)
275 276 277 278 279 280 281 282 283 284 285
                        val act = ActivityManager.getInstance().getTopTaskActivity()
                        if (act is AudioHomeActivity) {
                            act.runOnUiThread {
                                ToastUtil.toastShort("对方已挂断")
                                //通话结束或挂断时,上传日志文件
                                act.uploadLog()
                                act.leaveChannel()
                            }
                        }
                    }
                    "5" -> {
YKai committed
286
                        writeAgoraLog("呼叫邀请被取消:呼叫邀请过期-------Time:${AudioLogUtils.format.format(Calendar.getInstance().time)}", FILE_NAME)
287 288 289
                        //关闭页面
                        closePage()
                    }
290
                    else -> {
YKai committed
291
                        writeAgoraLog("其它AgoraInvitationBean,${agoraInvitationBean.callType}-------Time:${AudioLogUtils.format.format(Calendar.getInstance().time)}", FILE_NAME)
292
                    }
293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313
                }
            }
        })
    }

    fun rtcCall(listenerUid: String?, channelId: String?, sendDoctocrMsg: String?) {
        YDLRTMClient.instances.call(listenerUid, channelId, sendDoctocrMsg)

        sendCustomNotification(listenerUid!!, sendDoctocrMsg!!, "1")
    }

    fun acceptCall(toUid: String, channelId: String?, data: String) {
        YDLRTMClient.instances.acceptCall(channelId)
        sendCustomNotification(toUid, data, "2")
    }

    fun refuseCall(toUid: String, channelId: String?, data: String) {
        YDLRTMClient.instances.refuseCall(channelId)
        sendCustomNotification(toUid, data, "4")
    }

严久程 committed
314 315 316 317 318 319 320 321 322 323 324 325 326 327
    fun cancelCall(
        listenerUid: String,
        channelId: String,
        data: String,
        event: (msg: String?, code: Int) -> Unit
    ) {
        YDLRTMClient.instances.cancelCall(
            listenerUid,
            channelId,
            object : CancelCallStatusListener {
                override fun onFailure(errorMsg: String?, errorCode: Int) {
                    event(errorMsg, errorCode)
                    YDLRTMClient.instances.cancelCall(listenerUid, channelId, null)
                }
328

严久程 committed
329 330 331
                override fun onSuccess() {
                }
            })
332 333 334 335 336 337 338 339 340 341

        callEndStatusUpdate(channelId, 1, "主叫取消呼叫")
        sendCustomNotification(listenerUid, data, "3")
    }

    private fun sendCustomNotification(toUid: String, data: String, callType: String) {
        val infoBean = AgoraInvitationBean()
        infoBean.data = data
        infoBean.callType = callType

342 343 344 345
        Handler().postDelayed({
            AudioImIn.sendCustomNotification(toUid, Gson().toJson(infoBean),
                object : IMSendCustomNotificationResultCallBack {
                    override fun onException(throwable: Throwable) {
YKai committed
346 347
//                        writeAgoraLog("云信发送通话邀请异常${throwable.message}-------Time:${AudioLogUtils.format.format(Calendar.getInstance().time)}", "confide.log", true)
//                        LogHelper.getInstance().uploadLog(false)
348 349 350
                    }

                    override fun onFailed(code: Int) {
YKai committed
351 352
//                        writeAgoraLog("云信发送通话邀请失败${code}-------Time:${AudioLogUtils.format.format(Calendar.getInstance().time)}", "confide.log", true)
//                        LogHelper.getInstance().uploadLog(false)
353 354 355
                    }

                    override fun onSuccess() {
356
                        writeAgoraLog("云信发送通话邀请成功-------Time:${AudioLogUtils.format.format(Calendar.getInstance().time)}", "confide.log", true)
357 358 359
                    }
                })
        }, 300)
360 361 362 363 364

    }

    fun login(userId: String?) {
        login(userId) { _, _ ->
严久程 committed
365
        }
366
    }
洪国微 committed
367

368 369 370 371 372 373
    @SuppressLint("CheckResult")
    fun login(userId: String?, event: (isSuccess: Boolean, msg: String?) -> Unit) {
        if (TextUtils.isEmpty(userId) || userId ?: "0" <= "0") {
            //如果uid为空或小于等于0 ,则不进行登录,因为uid为0也会登录成功,会导致后面uid正确时无法登录
            LogUtil.e("[agora]login-uid:$userId")
            return
严久程 committed
374
        }
375 376 377
        //登录实时消息
        //获取token
        AudioApiRequestUtil.getAgoraToken().subscribeOn(Schedulers.io())
严久程 committed
378 379 380 381 382 383
            .observeOn(AndroidSchedulers.mainThread()).subscribe({
                if ("200".equals(it.code)) {
                    LogUtil.e("[agora]登录av的login-uid:$userId")
                    YDLRTMClient.instances.login(
                        LoginParam(userId, it.data.token),
                        object : LoginCallback {
384 385 386
                            override fun onSuccess() {
                                //登陆成功,发起呼叫
                                LogUtil.e("[agora]实时消息登录成功")
387
                                writeAgoraLog("声网rtm登录成功,uid:$userId-------Time:${AudioLogUtils.format.format(Calendar.getInstance().time)}", "confide.log", true)
388 389 390 391 392
                                event(true, "")
                            }

                            override fun onFailure(msg: String?) {
                                LogUtil.e("[agora]实时消息登录失败:$msg")
393
                                writeAgoraLog("声网rtm登录失败:$msg-------Time:${AudioLogUtils.format.format(Calendar.getInstance().time)}", "confide.log", true)
394 395 396
                                event(false, msg)
                            }
                        })
严久程 committed
397 398
                } else {
                    LogUtil.e("声网token获取失败uid:" + userId + " error:" + it.msg)
399
                    LogHelper.getInstance().writeLogSync("声网token获取失败uid:" + userId + " error:" + it.msg)
严久程 committed
400 401 402 403
                }
            }, {
                LogUtil.e("声网token获取异常uid:" + userId + " error:" + it.message)
            })
404
    }
严久程 committed
405

406 407 408 409 410 411 412 413
    /**
     * 收到邀请
     */
    @SuppressLint("CheckResult")
    fun receivedCall(content: String?, from: String = "") {
        if (!TextUtils.isEmpty(content)) {
            //如果已经接听了用户电话 再有电话进来 是不能接听的
            if (!activityIsExists(ConsultantAudioHomeActivity::class.java) && !activityIsExists(
严久程 committed
414 415 416
                    AudioHomeActivity::class.java
                )
            ) {
417 418
                //延时启动通话界面,防止刚打开就被main遮挡
                Observable.timer(1000, TimeUnit.MILLISECONDS).subscribeOn(Schedulers.io())
严久程 committed
419 420
                    .observeOn(AndroidSchedulers.mainThread()).subscribe {
                        LogUtil.e("[agora]启动通话界面")
YKai committed
421 422
                        writeAgoraLog("收到主叫方通话邀请($from)-------Time:${AudioLogUtils.format.format(Calendar.getInstance().time)}", FILE_NAME, false)
                        LogHelper.getInstance().uploadLog(false)
严久程 committed
423 424 425 426
                        //邀请加入频道消息,跳转通话界面
                        ARouter.getInstance().build("/av/ConsultantAudioHomeActivity")
                            .withString("param", content).navigation()
                    }
427 428
            } else {
                LogUtil.d("[agora]收到声网邀请,但界面实例已存在")
YKai committed
429 430
                writeAgoraLog("收到主叫方通话邀请,但界面实例已存在($from)-------Time:${AudioLogUtils.format.format(Calendar.getInstance().time)}", FILE_NAME, false)
                LogHelper.getInstance().uploadLog(false)
431 432 433
            }
        } else {
            LogUtil.d("[agora]收到声网邀请,但response==null")
YKai committed
434 435
            writeAgoraLog("收到主叫方通话邀请,但response==null($from)-------Time:${AudioLogUtils.format.format(Calendar.getInstance().time)}", FILE_NAME, false)
            LogHelper.getInstance().uploadLog(false)
436
        }
严久程 committed
437
    }
438 439 440 441 442 443 444 445

    private fun activityIsExists(cls: Class<*>): Boolean {
        for (activity in ActivityManager.getInstance().getActivitys()) {
            if (activity.javaClass == cls) {
                return true
            }
        }
        return false
严久程 committed
446
    }
447 448 449 450 451 452 453 454 455 456 457

    /**
     * 关闭通话界面
     */
    fun closePage() {
        var act = ActivityManager.getInstance().getTopTaskActivity()
        if (act is ConsultantAudioHomeActivity) {
            //未接通时,收到呼叫进程失败关闭页面,已接通无需关闭
            if (act.status == ConsultantAudioHomeActivity.STATUS_NOT_ANSWERED) {
                act.close(ConsultantAudioHomeActivity.RESULT_USER_CANCEL, "")
            }
严久程 committed
458 459 460
        }
    }

461 462 463 464 465 466 467 468 469 470 471 472 473 474 475
    /**
     * 退出登录
     */
    fun logout() {
        EventBus.getDefault().unregister(this)
        YDLRTMClient.instances.logout(object : LoginCallback {
            override fun onSuccess() {
                //退出登陆成功
                LogUtil.d("[agora]实时消息退出成功")
            }

            override fun onFailure(msg: String?) {
                LogUtil.d("[agora]实时消息退出失败:$msg")
            }
        })
洪国微 committed
476
    }
477 478 479 480 481 482

    /**
     * RTM登录异常,上传错误日志 msg
     * 声网出现异常,上传错误日志 connectException
     */
    @SuppressLint("CheckResult")
严久程 committed
483 484 485 486
    fun uploadException(
        connectException: ConnectExceptionCommand,
        callback: UploadExceptionCallback?
    ) {
487
        AudioApiRequestUtil.connectException(connectException).subscribeOn(Schedulers.io())
严久程 committed
488 489 490 491 492
            .observeOn(AndroidSchedulers.mainThread()).subscribe({
                callback?.onSuccess()
            }, {
                LogUtil.e("agora", "声网上传异常与错误日志接口调用失败:" + it.message)
            })
严久程 committed
493
    }
494 495 496 497 498 499

    /**
     * 上传异常错误回调
     */
    interface UploadExceptionCallback {
        fun onSuccess()
500 501
    }

502 503 504 505

    @SuppressLint("CheckResult")
    fun callEndStatusUpdate(channelId: String, endStatus: Int, msg: String) {
        AudioApiRequestUtil.callEndStatusUpdate(channelId, endStatus, msg)
严久程 committed
506 507 508 509 510 511
            .subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe({
            }, {
                LogUtil.d("callEndStatusUpdate error: ${it.message}")
            })
严久程 committed
512
    }
洪国微 committed
513

514 515 516 517 518 519 520
    /**
     * 实时消息全局监听
     */
    private val listener = object : InitListener {

        override fun onTokenExpired() {
            LogUtil.e("[agora]onTokenExpired")
521 522 523
            instances.login(
                ModularServiceManager.provide(IUserService::class.java).getUserInfo()?.uid
            )
524 525 526 527 528 529 530 531
        }

        override fun onMessageReceived(message: RTMMesssage, userId: Int) {
            LogUtil.i("[agora]onMessageReceived:${message.text} -->uid:$userId")
        }

        override fun onConnectionStateChanged(state: Int, reason: Int) {
            sdkStatus = state
532
            writeAgoraLog("声网rtm登录状态:${state}-------Time:${AudioLogUtils.format.format(Calendar.getInstance().time)}", "confide.log", true)
533 534
            LogUtil.i("[agora]onConnectionStateChanged:state:${state} -->reason:$reason")
        }
洪国微 committed
535 536
    }
}