package com.xw.yunwei
|
|
import android.app.Activity
|
import android.app.Application
|
import android.app.NotificationChannel
|
import android.app.NotificationManager
|
import android.graphics.Color
|
import android.os.Bundle
|
import androidx.appcompat.app.AppCompatActivity
|
import androidx.fragment.app.Fragment
|
import androidx.fragment.app.FragmentManager
|
import androidx.lifecycle.MutableLiveData
|
import com.alibaba.sdk.android.push.CloudPushService
|
import com.alibaba.sdk.android.push.CommonCallback
|
import com.alibaba.sdk.android.push.noonesdk.PushInitConfig
|
import com.alibaba.sdk.android.push.noonesdk.PushServiceFactory
|
import com.amap.api.maps.MapsInitializer
|
import com.scwang.smart.refresh.layout.SmartRefreshLayout
|
import com.xw.common.custom.ClassicsFooter11
|
import com.xw.common.custom.ClassicsHeader11
|
import com.xw.common.utils.ActivityManager
|
import com.xw.common.utils.LogUtils
|
import com.xw.common.utils.LogUtils.useThreeLog
|
import com.xw.common.utils.MMKVManager
|
import com.xw.yunwei.di.networkModule
|
import com.xw.yunwei.model.AppPermissionModel
|
import kotlinx.coroutines.CompletableDeferred
|
import org.koin.android.ext.koin.androidContext
|
import org.koin.core.context.GlobalContext.startKoin
|
import com.tencent.bugly.crashreport.CrashReport
|
|
class MyApp : Application() {
|
|
companion object {
|
lateinit var myApp: MyApp
|
var pageShowNum = 0 // 可见页面数
|
|
// 用户权限
|
var permissions = MutableLiveData<List<AppPermissionModel>>()
|
|
/**
|
* 在权限列表中递归查找指定菜单名的对象
|
* @param menuName 要查找的菜单名
|
* @return 找到的 AppPermissionModel,找不到返回 null
|
*/
|
fun findPermissionByName(
|
menuName: String,
|
ps: List<AppPermissionModel>? = permissions.value
|
): AppPermissionModel? {
|
if (ps.isNullOrEmpty()) {
|
return null
|
}
|
|
for (permission in ps) {
|
// 检查当前节点
|
if (permission.menuName == menuName) {
|
return permission
|
}
|
// 递归检查子节点
|
val foundInChildren = findPermissionByName(menuName, permission.children)
|
if (foundInChildren != null) {
|
return foundInChildren
|
}
|
}
|
return null
|
}
|
}
|
|
override fun onCreate() {
|
super.onCreate()
|
myApp = this
|
CrashReport.initCrashReport(this, "1d59d50929", true) // bugly
|
|
initLog()
|
startKoin {
|
androidContext(this@MyApp)
|
modules(listOf(networkModule))
|
}
|
|
MMKVManager.getInstance().init(this)
|
initPush()
|
registerActivityLifecycleCallbacks()
|
|
// 高德隐私政策合规
|
MapsInitializer.updatePrivacyShow(this, true, true)
|
MapsInitializer.updatePrivacyAgree(this, true)
|
|
SmartRefreshLayout.setDefaultRefreshInitializer { _, layout ->
|
layout.setEnableAutoLoadMore(true)
|
layout.setEnableFooterFollowWhenNoMoreData(true)
|
layout.setEnableOverScrollBounce(false)
|
layout.setEnableOverScrollDrag(false)
|
}
|
SmartRefreshLayout.setDefaultRefreshHeaderCreator { context, _ ->
|
ClassicsHeader11(context).also {
|
it.setEnableLastTime(false)
|
}
|
}
|
SmartRefreshLayout.setDefaultRefreshFooterCreator { context, _ ->
|
ClassicsFooter11(context)
|
}
|
}
|
|
fun initLog() {
|
if (useThreeLog) {
|
com.blankj.utilcode.util.LogUtils.getConfig().let {
|
it.saveDays = 30
|
it.setFilePrefix("RT运维")
|
it.setConsoleSwitch(BuildConfig.DEBUG)
|
it.setLog2FileSwitch(true)
|
it.setSingleTagSwitch(true)
|
it.setLogHeadSwitch(false)
|
}
|
}
|
}
|
|
var currentShowActivity: CompletableDeferred<Activity>? = null // 用于储存当前可见页面
|
get() {
|
if (field == null) field = CompletableDeferred()
|
return field
|
}
|
|
// 用于获取结果的挂起函数
|
suspend fun getCurrentShowActivity(): Activity {
|
// CompletableDeferred 只能使用一次 所以使用完后置空
|
val result = currentShowActivity!!.await()
|
// currentShowActivity = null
|
return result
|
}
|
|
private fun registerActivityLifecycleCallbacks() {
|
registerActivityLifecycleCallbacks(object : ActivityLifecycleCallbacks {
|
override fun onActivityCreated(activity: Activity, savedInstanceState: Bundle?) {
|
ActivityManager.addActivity(activity)
|
LogUtils.i("zmc-pageA", "onActivityCreated: " + activity.javaClass.name)
|
if (activity is AppCompatActivity) {
|
activity.supportFragmentManager.registerFragmentLifecycleCallbacks(object :
|
FragmentManager.FragmentLifecycleCallbacks() {
|
override fun onFragmentCreated(
|
fm: FragmentManager,
|
f: Fragment,
|
savedInstanceState: Bundle?
|
) {
|
super.onFragmentCreated(fm, f, savedInstanceState)
|
LogUtils.i("zmc-pageF", "onFragmentCreated: " + f.javaClass.name)
|
}
|
|
override fun onFragmentDestroyed(fm: FragmentManager, f: Fragment) {
|
super.onFragmentDestroyed(fm, f)
|
LogUtils.e("zmc-pageF", "onFragmentDestroyed: " + f.javaClass.name)
|
}
|
}, true)
|
}
|
}
|
|
override fun onActivityStarted(activity: Activity) {
|
LogUtils.d("zmc-pageA", "onActivityStarted: " + activity.javaClass.name)
|
}
|
|
override fun onActivityResumed(activity: Activity) {
|
LogUtils.i("zmc-pageA", "onActivityResumed: " + activity.javaClass.name)
|
currentShowActivity!!.complete(activity)
|
pageShowNum++
|
}
|
|
override fun onActivityPaused(activity: Activity) {
|
LogUtils.e("zmc-pageA", "onActivityPaused: " + activity.javaClass.name)
|
pageShowNum--
|
currentShowActivity = null
|
}
|
|
override fun onActivityStopped(activity: Activity) {
|
LogUtils.e("zmc-pageA", "onActivityStopped: " + activity.javaClass.name)
|
}
|
|
override fun onActivitySaveInstanceState(activity: Activity, outState: Bundle) {
|
LogUtils.d("zmc-pageA", "onActivitySaveInstanceState: " + activity.javaClass.name)
|
}
|
|
override fun onActivityDestroyed(activity: Activity) {
|
LogUtils.e("zmc-pageA", "onActivityDestroyed: " + activity.javaClass.name)
|
ActivityManager.removeActivity(activity)
|
}
|
})
|
}
|
|
private fun initPush() {
|
val pushInitConfig = PushInitConfig.Builder()
|
.application(this)
|
.appKey(BuildConfig.PUSH_KEY)
|
.appSecret(BuildConfig.PUSH_SECRET)
|
.build()
|
|
PushServiceFactory.init(pushInitConfig)
|
|
// 此阶段初始化用于建立推送的长连接,可以根据业务需要和合规要求延迟执行。
|
val pushService = PushServiceFactory.getCloudPushService()
|
// 仅适用于Debug包,正式包不需要此行
|
pushService.setLogLevel(CloudPushService.LOG_DEBUG)
|
pushService.register(this, object : com.alibaba.sdk.android.push.CommonCallback {
|
override fun onSuccess(success: String) {
|
LogUtils.i("zmc-push", "初始化成功,设备ID: " + pushService.deviceId)
|
}
|
|
override fun onFailed(errorCode: String, errorMessage: String) {
|
LogUtils.e("zmc-push", "初始化失败,错误码: $errorCode, 信息: $errorMessage")
|
}
|
})
|
createNotificationChannel()
|
}
|
|
/**
|
* 在应用首次启动时创建通知渠道,确保推送通知能正常显示
|
*/
|
private fun createNotificationChannel() {
|
val notificationManager = getSystemService(NOTIFICATION_SERVICE) as NotificationManager
|
// 通知渠道的id。
|
val channelId =
|
"robotaxi_message" // 这个id值需要给后端开发和运维人员,推送的时候对应 AndroidNotificationChannel 参数。
|
// 用户可以看到的通知渠道的名字。
|
val name: CharSequence = this.getString(R.string.app_name)
|
// 用户可以看到的通知渠道的描述。
|
val description = "${this.getString(R.string.app_name)}通道消息"
|
val importance = NotificationManager.IMPORTANCE_HIGH
|
val channel = NotificationChannel(channelId, name, importance)
|
|
// 配置通知渠道的属性。
|
channel.description = description
|
// 设置通知出现时的闪灯(如果Android设备支持的话)。
|
channel.enableLights(true)
|
channel.lightColor = Color.RED
|
// 设置通知出现时的震动(如果Android设备支持的话)。
|
channel.enableVibration(true)
|
channel.vibrationPattern = longArrayOf(100, 200, 300, 400, 500, 400, 300, 200, 400)
|
// 自定义铃声 有需要在设置
|
// channel.setSound(
|
// Uri.parse("android.resource://${packageName}/${R.raw.push_hongbao}"),
|
// Notification.AUDIO_ATTRIBUTES_DEFAULT
|
// )
|
// 最后在notificationManager中创建该通知渠道。
|
notificationManager.createNotificationChannel(channel)
|
}
|
|
fun bindPushAccount(account: String) {
|
PushServiceFactory.getCloudPushService().bindAccount(account, object : CommonCallback {
|
override fun onSuccess(s: String?) {
|
LogUtils.i("zmc-push", "绑定账号成功 account = $account $s")
|
|
}
|
|
override fun onFailed(errorCode: String?, errorMsg: String?) {
|
LogUtils.i("zmc-push", "绑定账号成功 $errorCode $errorMsg")
|
}
|
})
|
}
|
|
fun unbindPushAccount() {
|
PushServiceFactory.getCloudPushService().unbindAccount(object : CommonCallback {
|
override fun onSuccess(s: String?) {
|
LogUtils.i("zmc-push", "解除绑定账号成功 $s")
|
}
|
|
override fun onFailed(errorCode: String?, errorMsg: String?) {
|
LogUtils.i("zmc-push", "解除绑定账号成功 $errorCode $errorMsg")
|
}
|
})
|
}
|
|
}
|