Files
yusheng-android/MainModule/src/main/java/com/xscm/modulemain/Application.kt

367 lines
13 KiB
Kotlin
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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.login.activity.ImproveInfoActivity
import com.xscm.modulemain.activity.room.activity.RoomActivity
import com.xscm.modulemain.dialog.InviteDialog
import com.xscm.modulemain.dialog.SignInDialog
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.bean.TasksSignStatus
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.lang.ref.WeakReference
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
// 改为弱引用持有Activity
private var mCurDialogActivityRef: WeakReference<Activity>? = null
fun setCurDialogActivity(activity: Activity?) {
mCurDialogActivityRef = WeakReference(activity)
}
fun getCurDialogActivity(): Activity? {
if (mCurDialogActivityRef != null) {
return mCurDialogActivityRef!!.get()
}
return null
}
// 单例实例
companion object {
@Volatile
private lateinit var instance: Application
var isKeepScreenOn = false
// 全局获取 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
configureLeakCanary()
// 默认情况下SVGA 内部不会输出任何 log所以需要手动设置为 true
SVGALogger.setLogEnabled(false)
initLogUtils()
initCrashUtils()
initSmartRefreshLayout()
initImMsg()
}
fun userSignIn(){
if (isKeepScreenOn)
return
TimerManager.scheduleTimer(CustomMsgCode.CODE_USER_SIGN_IN,60,TimeUnit.SECONDS, onTimeUp = {
RetrofitClient.getInstance().tasksSignStatus(object : BaseObserver<TasksSignStatus>() {
override fun onSubscribe(d: Disposable) {
}
override fun onNext(t: TasksSignStatus) {
if (t.status == 1) {
} else {
var activity:Activity? = null
if (ActivityUtils.getTopActivity() != null){
activity = ActivityUtils.getTopActivity()
}
if (activity == null)
return
if (!activity.isFinishing && !activity.isDestroyed) {
val signInDialog = SignInDialog(activity)
signInDialog.setOnCloseListener {
null
}
signInDialog.show()
}
TimerManager.cancelTimer(CustomMsgCode.CODE_USER_SIGN_IN)
}
}
})
})
}
/**
* 自定义 LeakCanary 配置(解决误报、优化检测规则)
*/
private fun configureLeakCanary() {
// LeakCanary.config = LeakCanary.config.copy(
// retainedVisibleThreshold = 3, // 对象被观察几次GC未被回收才认为泄漏 (默认5)
// )
}
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 && activity !is ImproveInfoActivity ) {
RetrofitClient.getInstance()
.index_recommend_room(object : BaseObserver<IndexRecommendRoom>() {
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 (isKeepScreenOn)
return
if (activity != null && activity == getCurDialogActivity() && inviteDialog != null && activity !is ImproveInfoActivity) {
inviteDialog?.setData(t)
return
}
inviteDialog?.dismiss()
inviteDialog = null
inviteDialog = activity?.let { InviteDialog(it, t) }
inviteDialog?.setData(t)
setCurDialogActivity(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
}
fun getAppLogPath(): String {
return LOGUTILS_SAVE_PATH
}
fun getAppCrashPath(): String {
return CRASHUTILS_SAVE_PATH
}
}