package com.xscm.modulemain import android.app.Activity import android.content.Context import android.text.TextUtils import android.view.View import com.blankj.utilcode.util.ActivityUtils import com.blankj.utilcode.util.AppUtils import com.blankj.utilcode.util.CrashUtils import com.blankj.utilcode.util.LogUtils import com.blankj.utilcode.util.Utils import com.opensource.svgaplayer.utils.log.SVGALogger import com.scwang.smartrefresh.layout.SmartRefreshLayout import com.scwang.smartrefresh.layout.footer.ClassicsFooter import com.scwang.smartrefresh.layout.header.ClassicsHeader import com.xscm.modulemain.activity.room.activity.RoomActivity import com.xscm.modulemain.dialog.InviteDialog import com.xscm.modulemain.manager.RoomManager import com.xscm.modulemain.utils.TimerManager import com.xscm.modulemain.widget.WheatLayoutSingManager import com.xscm.moduleutil.base.CommonAppContext import com.xscm.moduleutil.bean.IndexRecommendRoom import com.xscm.moduleutil.bean.RoomMessageEvent import com.xscm.moduleutil.dialog.ConfirmDialog import com.xscm.moduleutil.http.BaseObserver import com.xscm.moduleutil.http.RetrofitClient import com.xscm.moduleutil.listener.MessageListenerSingleton import com.xscm.moduleutil.utils.CustomMsgCode import io.reactivex.disposables.Disposable import org.json.JSONObject import java.io.File import java.util.concurrent.TimeUnit open class Application : CommonAppContext() { var APP_CONTENT = "" var LOGUTILS_SAVE_PATH = "" var CRASHUTILS_SAVE_PATH = "" var isAgoraStop = false var inviteDialog: InviteDialog? = null var currDialogActivity: Activity? = null // 单例实例 companion object { @Volatile private lateinit var instance: Application // 全局获取 Application 实例 fun getInstance(): Application { return instance } // 获取 Application Context(避免内存泄漏) fun getContext(): Context { return instance.applicationContext } } override fun onCreate() { super.onCreate() // 应用内部存储 filesDir 目录的根路径 APP_CONTENT = File(filesDir, "APP_CONTENT").absolutePath // 内部存储下的日志目录 LOGUTILS_SAVE_PATH = File(filesDir, "APP_CONTENT/APP_LOG").absolutePath // 内部存储下的崩溃日志目录 CRASHUTILS_SAVE_PATH = File(filesDir, "APP_CONTENT/APP_CRASH").absolutePath // 初始化单例实例 instance = this // 初始化并预绘制视图 二卡八列 WheatLayoutSingManager.init(this) WheatLayoutSingManager.getInstance().setWheatData(null) // 默认情况下,SVGA 内部不会输出任何 log,所以需要手动设置为 true SVGALogger.setLogEnabled(false) initLogUtils() initCrashUtils() initSmartRefreshLayout() initImMsg() } private fun initImMsg() { MessageListenerSingleton.getInstance().setOnMsgTaskListener { event -> when (event.msgType) { CustomMsgCode.CODE_TASK_APPRENTICE_JOIN_ROOM -> { TimerManager.cancelTimer(CustomMsgCode.CODE_TASK_APPRENTICE_JOIN_ROOM_TIMER_ID) try { val json = JSONObject(event.text.text) if (!json.isNull("status")) { event.text.status = json.getString("status") } if (TextUtils.isEmpty(event.text.status)) return@setOnMsgTaskListener when (event.text.status) { "1" -> {//1:邀请 if (!json.isNull("room_id")) event.text.room_id = json.getString("room_id") if (event?.text?.room_id.isNullOrEmpty()) return@setOnMsgTaskListener customDialog( event.text.room_id, CustomMsgCode.CODE_TASK_APPRENTICE_JOIN_ROOM_MSG, 5, 1, event.text ) } "2" -> {//2:拒绝 customDialog( "", CustomMsgCode.CODE_TASK_APPRENTICE_JOIN_ROOM_MSG_REFUSE, 5, 3, null, "", "知道了" ) } } }catch (E: Exception){ LogUtils.e("Exception",E.message.toString()) } } } } } private fun customDialog( roomId: String, message: String, downCount: Int, status: Int = 1, event: RoomMessageEvent.T?, confirm: String = "同意", cancel: String = "拒绝", ) { // 创建并显示确认对话框 ConfirmDialog( ActivityUtils.getTopActivity(), "提示", message, confirm, cancel, { v: View? -> when (status) { 1 -> { if (!TextUtils.isEmpty(CommonAppContext.getInstance().playId) && roomId == CommonAppContext.getInstance().playId && ActivityUtils.getTopActivity() is RoomActivity ) { return@ConfirmDialog } if (ActivityUtils.getTopActivity() is RoomActivity) { (ActivityUtils.getTopActivity() as RoomActivity).refreshRoomInfo(roomId) return@ConfirmDialog } RoomManager.getInstance() .fetchRoomDataAndEnter(ActivityUtils.getTopActivity(), roomId, "", null) } } }, { v: View? -> when (status) { 1 -> { val text = RoomMessageEvent.T() val json = JSONObject() json.put("status", "2") json.put("room_id", roomId) text.text = json.toString() MessageListenerSingleton.getInstance().sendCustomC2CMessage( CustomMsgCode.CODE_TASK_APPRENTICE_JOIN_ROOM, event?.fromUserInfo?.user_id.toString(), text ) } } }, true, downCount ).show() } fun inviteApprenticeTaskTimer() { TimerManager.scheduleTimer( CustomMsgCode.CODE_TASK_APPRENTICE_JOIN_ROOM_TIMER_ID, 20, TimeUnit.SECONDS, onTimeUp = { customDialog( "", CustomMsgCode.CODE_TASK_APPRENTICE_JOIN_ROOM_MSG_REFUSE, 5, 3, null, "", "知道了" ) }) } fun bgToForeground() { AppUtils.registerAppStatusChangedListener(object : Utils.OnAppStatusChangedListener { override fun onForeground(activity: Activity?) {//应用切换到前台 if (!CommonAppContext.getInstance().isPlaying) { RetrofitClient.getInstance() .index_recommend_room(object : BaseObserver() { override fun onSubscribe(d: Disposable) { } override fun onNext(t: IndexRecommendRoom) { LogUtils.e(t) if (!t.room_id.isNullOrEmpty()) { showInviteDialog(activity, t) } } }) } } override fun onBackground(activity: Activity?) {//应用切换到后台 } }) } fun showInviteDialog(activity: Activity?, t: IndexRecommendRoom) { if (activity != null && activity == currDialogActivity && inviteDialog != null) { inviteDialog?.setData(t) return } inviteDialog?.dismiss() inviteDialog = null inviteDialog = activity?.let { InviteDialog(it, t) } inviteDialog?.setData(t) currDialogActivity = activity } private fun initLogUtils() { LogUtils.getConfig() .setLogSwitch(true) // 全局开关 .setLog2FileSwitch(true) // 必须设为 true! .setDir(LOGUTILS_SAVE_PATH) // 设置有效路径 .setFileFilter(LogUtils.V); // 允许所有级别 } private fun initCrashUtils() { CrashUtils.init(CRASHUTILS_SAVE_PATH, object : CrashUtils.OnCrashListener { override fun onCrash(crashInfo: CrashUtils.CrashInfo?) { LogUtils.e("crash", crashInfo.toString()) } }) } private fun initSmartRefreshLayout() { //设置全局的Header构建器 SmartRefreshLayout.setDefaultRefreshHeaderCreator { context, _ -> val header = ClassicsHeader(context) header.setDrawableSize(20f) // header.setFinishDuration(0) header.setTextSizeTitle(12f) header.setTextSizeTime(10f) header } //设置全局的Footer构建器 SmartRefreshLayout.setDefaultRefreshFooterCreator { context, _ -> val classicsFooter = ClassicsFooter(context) classicsFooter.setDrawableSize(20f) // classicsFooter.setFinishDuration(0) classicsFooter.setTextSizeTitle(12f) //指定为经典Footer,默认是 BallPulseFooter classicsFooter } } fun getAppContent(): String { return APP_CONTENT } }