package com.grkj.iscs import android.app.AlarmManager import android.app.Application import android.app.PendingIntent import android.content.Context import android.content.Intent import android.content.res.Configuration import android.util.TypedValue import ch.qos.logback.classic.Level import com.drake.statelayout.StateConfig import com.grkj.data.data.EventConstants import com.grkj.data.database.DbReadyGate import com.grkj.data.database.ISCSDatabase import com.grkj.data.di.LogicManager import com.grkj.iscs.common.GlobalManager import com.grkj.iscs.features.splash.activity.SplashActivity import com.grkj.ui_base.service.CheckKeyInfoTask import com.grkj.shared.model.EventBean import com.grkj.shared.utils.ArcSoftUtil import com.grkj.shared.utils.i18n.I18nManager import com.grkj.shared.utils.i18n.LanguageCatalog import com.grkj.shared.utils.i18n.LanguageStore import com.grkj.shared.utils.i18n.source.AssetsCsvSource import com.grkj.shared.utils.i18n.source.FileCsvSource import com.grkj.ui_base.business.ModbusBusinessManager import com.grkj.ui_base.config.ISCSConfig import com.grkj.ui_base.utils.ble.BleUtil import com.grkj.ui_base.utils.modbus.ModBusController import com.kongzue.dialogx.DialogX import com.scwang.smart.refresh.footer.ClassicsFooter import com.scwang.smart.refresh.header.ClassicsHeader import com.scwang.smart.refresh.layout.SmartRefreshLayout import com.sik.cronjob.managers.CronJobScanner import com.sik.sikcore.SIKCore import com.sik.sikcore.crash.GlobalCrashCatch import com.sik.sikcore.extension.toJson import com.sik.sikcore.log.LogUtils import com.sik.sikcore.thread.ThreadUtils import dagger.hilt.android.HiltAndroidApp import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch import me.jessyan.autosize.AutoSizeConfig import org.greenrobot.eventbus.EventBus import org.greenrobot.eventbus.Subscribe import org.greenrobot.eventbus.ThreadMode import org.slf4j.Logger import org.slf4j.LoggerFactory import java.util.Locale /** * 启动入口 */ @HiltAndroidApp class ISCSApplication : Application() { private val logger: Logger = LoggerFactory.getLogger(ISCSApplication::class.java) /** * 程序创建 */ override fun onCreate() { super.onCreate() DialogX.init(this) SIKCore.init(this) //todo 模拟器不支持 ArcSoftUtil.checkActiveStatus(this) ArcSoftUtil.initEngine(this) if (!EventBus.getDefault().isRegistered(this)) { EventBus.getDefault().register(this) } GlobalCrashCatch.instance.init(this).setGlobalCrashHandlerListener { logger.error("异常发生", it) true } if (ISCSConfig.DEBUG) { LogUtils.setGlobalLogLevel(Level.DEBUG) } System.loadLibrary("sqlcipher") // 新库必须手动加载 I18nManager.init( defaultLocale = LanguageStore.resolveEffectiveLocale(this), initialSources = arrayOf( com.grkj.shared.utils.i18n.source.AssetsCsvSource(this, "i18n", mergedMode = false), com.grkj.shared.utils.i18n.source.FileCsvSource(this, "i18n", mergedMode = false) ), eagerLoad = true ) // 建议:可提前刷新一下目录(不强制) LanguageCatalog.refresh(this) // 若“跟随系统”,监听系统语言变化 LanguageStore.registerSystemLocaleObserver(this) if (ISCSConfig.isInit) { BleUtil.instance?.initBle(this) } AutoSizeConfig.getInstance().isCustomFragment = true StateConfig.emptyLayout = com.grkj.ui_base.R.layout.layout_empty ThreadUtils.runOnIO { DbReadyGate.await() ModbusBusinessManager.registerMainListener() LogicManager.init(this@ISCSApplication) } } @Subscribe(threadMode = ThreadMode.MAIN) open fun onEvent(event: EventBean<*>) { when (event.code) { EventConstants.EVENT_START_MODBUS -> { ThreadUtils.runOnIO { ModBusController.interruptReadTrashBinStatus(false) ModBusController.start() logger.info("Application 连接完成,开始初始化") ModBusController.initDevicesStatus() } } EventConstants.EVENT_RESTART_APP -> { scheduleRestart(this) } EventConstants.EVENT_START_MODBUS_COMPLETE -> { if (ISCSConfig.isInit) { val jobList = CronJobScanner.scanJobs(CheckKeyInfoTask()) logger.info("扫描任务结果:${jobList.toJson()},开始注册") GlobalManager.cronJobManager.registerJobs(jobList) } } } } /** * 计划重启 */ private fun scheduleRestart(context: Context) { val restartIntent = Intent(context, SplashActivity::class.java).apply { addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP or Intent.FLAG_ACTIVITY_NEW_TASK) } val pi = PendingIntent.getActivity( context, 0, restartIntent, PendingIntent.FLAG_CANCEL_CURRENT or PendingIntent.FLAG_IMMUTABLE ) val am = context.getSystemService(Context.ALARM_SERVICE) as AlarmManager am.setExact( AlarmManager.RTC, System.currentTimeMillis() + 2000, pi ) Runtime.getRuntime().exit(0) } override fun onTerminate() { if (EventBus.getDefault().isRegistered(this)) { EventBus.getDefault().unregister(this) } super.onTerminate() } //static 代码段可以防止内存泄露 init { //设置全局的Header构建器 SmartRefreshLayout.setDefaultRefreshHeaderCreator { context, layout -> ClassicsHeader(context).apply { if (resources.configuration.orientation == Configuration.ORIENTATION_LANDSCAPE) { setTextSizeTime(TypedValue.COMPLEX_UNIT_SP, 18 * 1.7f) setTextSizeTitle(TypedValue.COMPLEX_UNIT_SP, 18 * 1.7f) } else { setTextSizeTime(TypedValue.COMPLEX_UNIT_SP, 18 * 1.2f) setTextSizeTitle(TypedValue.COMPLEX_UNIT_SP, 18 * 1.2f) } } //.setTimeFormat(new DynamicTimeFormat("更新于 %s"));//指定为经典Header,默认是 贝塞尔雷达Header } //设置全局的Footer构建器 SmartRefreshLayout.setDefaultRefreshFooterCreator { context, p1 -> //指定为经典Footer,默认是 BallPulseFooter ClassicsFooter(context).apply { if (resources.configuration.orientation == Configuration.ORIENTATION_LANDSCAPE) { setTextSizeTitle(TypedValue.COMPLEX_UNIT_SP, 18 * 1.7f) setDrawableSize(20f * 1.7f) } else { setTextSizeTitle(TypedValue.COMPLEX_UNIT_SP, 18 * 1.2f) setDrawableSize(20f * 1.2f) } } } } }