瀏覽代碼

refactor(更新)
- 迁移LoadingEvent到data模块
- 优化数据库备份逻辑
- 调整启动时备份任务的调度时机

周文健 8 月之前
父節點
當前提交
581d0b096c
共有 21 個文件被更改,包括 102 次插入61 次删除
  1. 1 1
      app/src/main/java/com/grkj/iscs/features/login/activity/LoginActivity.kt
  2. 1 1
      app/src/main/java/com/grkj/iscs/features/login/dialog/LoginDialog.kt
  3. 1 1
      app/src/main/java/com/grkj/iscs/features/main/dialog/CheckFaceDialog.kt
  4. 1 1
      app/src/main/java/com/grkj/iscs/features/main/fragment/data_manage/BackupAndRestoreFragment.kt
  5. 1 1
      app/src/main/java/com/grkj/iscs/features/main/fragment/hardware_manage/SlotsManageFragment.kt
  6. 1 1
      app/src/main/java/com/grkj/iscs/features/main/viewmodel/MainViewModel.kt
  7. 1 1
      app/src/main/java/com/grkj/iscs/features/main/viewmodel/WorkflowViewModel.kt
  8. 1 1
      app/src/main/java/com/grkj/iscs/features/main/viewmodel/job_manage/JobExecuteViewModel.kt
  9. 2 2
      app/src/main/java/com/grkj/iscs/features/splash/activity/SplashActivity.kt
  10. 22 14
      data/src/main/java/com/grkj/data/database/BackupScheduler.kt
  11. 4 1
      data/src/main/java/com/grkj/data/database/DbReadyGate.kt
  12. 41 20
      data/src/main/java/com/grkj/data/database/RoomBackupWorker.kt
  13. 13 5
      data/src/main/java/com/grkj/data/utils/event/LoadingEvent.kt
  14. 4 4
      ui-base/src/main/java/com/grkj/ui_base/base/BaseActivity.kt
  15. 1 1
      ui-base/src/main/java/com/grkj/ui_base/base/BaseFragment.kt
  16. 1 1
      ui-base/src/main/java/com/grkj/ui_base/base/BaseViewModel.kt
  17. 1 1
      ui-base/src/main/java/com/grkj/ui_base/business/BleBusinessManager.kt
  18. 1 1
      ui-base/src/main/java/com/grkj/ui_base/business/ModbusBusinessManager.kt
  19. 2 1
      ui-base/src/main/java/com/grkj/ui_base/dialog/LoadingDialog.kt
  20. 1 1
      ui-base/src/main/java/com/grkj/ui_base/utils/ble/BleConnectionManager.kt
  21. 1 1
      ui-base/src/main/java/com/grkj/ui_base/utils/ble/BleReturnDispatcher.kt

+ 1 - 1
app/src/main/java/com/grkj/iscs/features/login/activity/LoginActivity.kt

@@ -40,7 +40,7 @@ import com.grkj.ui_base.base.BaseActivity
 import com.grkj.ui_base.skin.loadSkinIcon
 import com.grkj.ui_base.utils.CommonUtils
 import com.grkj.ui_base.utils.changeBgTint
-import com.grkj.ui_base.utils.event.LoadingEvent
+import com.grkj.data.utils.event.LoadingEvent
 import com.grkj.ui_base.utils.extension.getAppVersionName
 import com.grkj.ui_base.utils.extension.serialNo
 import com.grkj.ui_base.utils.fingerprint.FingerprintUtil

+ 1 - 1
app/src/main/java/com/grkj/iscs/features/login/dialog/LoginDialog.kt

@@ -12,7 +12,7 @@ import com.grkj.shared.utils.ArcSoftUtil.inDetecting
 import com.grkj.ui_base.config.ISCSConfig
 import com.grkj.ui_base.skin.loadSkinIcon
 import com.grkj.ui_base.utils.CommonUtils
-import com.grkj.ui_base.utils.event.LoadingEvent
+import com.grkj.data.utils.event.LoadingEvent
 import com.grkj.ui_base.utils.fingerprint.FingerprintUtil
 import com.kongzue.dialogx.dialogs.CustomDialog
 import com.kongzue.dialogx.dialogs.PopTip

+ 1 - 1
app/src/main/java/com/grkj/iscs/features/main/dialog/CheckFaceDialog.kt

@@ -11,7 +11,7 @@ import com.grkj.ui_base.base.BaseViewModel
 import com.grkj.ui_base.config.ISCSConfig
 import com.grkj.ui_base.skin.loadSkinIcon
 import com.grkj.ui_base.utils.CommonUtils
-import com.grkj.ui_base.utils.event.LoadingEvent
+import com.grkj.data.utils.event.LoadingEvent
 import com.grkj.ui_base.utils.fingerprint.FingerprintUtil
 import com.kongzue.dialogx.dialogs.CustomDialog
 import com.kongzue.dialogx.dialogs.PopTip

+ 1 - 1
app/src/main/java/com/grkj/iscs/features/main/fragment/data_manage/BackupAndRestoreFragment.kt

@@ -23,7 +23,7 @@ import com.grkj.shared.utils.i18n.I18nManager
 import com.grkj.ui_base.base.BaseFragment
 import com.grkj.ui_base.dialog.TipDialog
 import com.grkj.ui_base.dialog.WheelTimePickerDialog
-import com.grkj.ui_base.utils.event.LoadingEvent
+import com.grkj.data.utils.event.LoadingEvent
 import com.sik.sikcore.extension.setDebouncedClickListener
 import dagger.hilt.android.AndroidEntryPoint
 

+ 1 - 1
app/src/main/java/com/grkj/iscs/features/main/fragment/hardware_manage/SlotsManageFragment.kt

@@ -31,7 +31,7 @@ import com.grkj.ui_base.base.BaseFragment
 import com.grkj.ui_base.config.ISCSConfig
 import com.grkj.ui_base.dialog.TipDialog
 import com.grkj.ui_base.utils.CommonUtils
-import com.grkj.ui_base.utils.event.LoadingEvent
+import com.grkj.data.utils.event.LoadingEvent
 import com.grkj.ui_base.utils.modbus.DockBean
 import com.grkj.ui_base.utils.modbus.ModBusController
 import com.sik.sikcore.extension.setDebouncedClickListener

+ 1 - 1
app/src/main/java/com/grkj/iscs/features/main/viewmodel/MainViewModel.kt

@@ -21,7 +21,7 @@ import com.grkj.ui_base.utils.ble.BleConst
 import com.grkj.ui_base.utils.ble.BleIndicateListener
 import com.grkj.ui_base.utils.ble.BleReturnDispatcher
 import com.grkj.ui_base.utils.ble.BleSendDispatcher
-import com.grkj.ui_base.utils.event.LoadingEvent
+import com.grkj.data.utils.event.LoadingEvent
 import com.grkj.ui_base.utils.modbus.DeviceConst
 import com.grkj.ui_base.utils.modbus.ModBusController
 import com.sik.sikcore.thread.ThreadUtils

+ 1 - 1
app/src/main/java/com/grkj/iscs/features/main/viewmodel/WorkflowViewModel.kt

@@ -15,7 +15,7 @@ import com.grkj.shared.config.AESConfig
 import com.grkj.ui_base.base.BaseViewModel
 import com.grkj.ui_base.dialog.TipDialog
 import com.grkj.ui_base.utils.CommonUtils
-import com.grkj.ui_base.utils.event.LoadingEvent
+import com.grkj.data.utils.event.LoadingEvent
 import com.sik.sikcore.data.BeanUtils
 import com.sik.sikcore.extension.file
 import com.sik.sikcore.zip.ZipListener

+ 1 - 1
app/src/main/java/com/grkj/iscs/features/main/viewmodel/job_manage/JobExecuteViewModel.kt

@@ -28,7 +28,7 @@ import com.grkj.ui_base.business.DataBusiness
 import com.grkj.ui_base.business.ModbusBusinessManager
 import com.grkj.ui_base.dialog.TipDialog
 import com.grkj.ui_base.utils.CommonUtils
-import com.grkj.ui_base.utils.event.LoadingEvent
+import com.grkj.data.utils.event.LoadingEvent
 import com.grkj.ui_base.utils.event.UiEvent
 import com.grkj.ui_base.utils.extension.tip
 import com.grkj.ui_base.utils.modbus.DeviceConst

+ 2 - 2
app/src/main/java/com/grkj/iscs/features/splash/activity/SplashActivity.kt

@@ -38,7 +38,6 @@ class SplashActivity : BaseActivity<ActivitySplashBinding>() {
 
     override fun initView() {
         // 应用启动时按已存配置安排下一次(默认=每天 00:00)
-        BackupScheduler.applySaved(this)
         GlobalManager.cronJobManager.bindService()
         initConfig()
         PermissionUtils.checkAndRequestPermissions(Constants.needPermission) {
@@ -70,6 +69,7 @@ class SplashActivity : BaseActivity<ActivitySplashBinding>() {
             }
         }
         lifecycleScope.launch {
+            BackupScheduler.applySaved(this@SplashActivity)
             DbReadyGate.await()
             StartModbusEvent.sendStartModbusEvent()
             viewModel.checkSysMenuAndRole().observe(this@SplashActivity) {
@@ -85,7 +85,7 @@ class SplashActivity : BaseActivity<ActivitySplashBinding>() {
         }
     }
 
-    fun initConfig(){
+    fun initConfig() {
         val dialogXTextInfo = TextInfo()
         val dialogXTitleTextInfo = TextInfo().apply {
             setBold(true)

+ 22 - 14
data/src/main/java/com/grkj/data/database/BackupScheduler.kt

@@ -39,7 +39,6 @@ object BackupScheduler {
      * - 首次迁移:顺便把旧的 PeriodicWork 取消
      */
     fun applySaved(ctx: Context) {
-        // 迁移:停旧任务,避免双份
         WorkManager.getInstance(ctx).cancelUniqueWork(OLD_PERIODIC)
 
         val cfg = SimpleBackupPrefs.get(ctx)
@@ -47,7 +46,8 @@ object BackupScheduler {
             WorkManager.getInstance(ctx).cancelUniqueWork(UNIQUE_RECURRING)
             return
         }
-        scheduleNext(ctx, cfg)
+        // 开机/应用启动:不立刻执行今天已错过的时间点,避免撞库
+        scheduleNext(ctx, cfg, allowImmediateToday = false)
     }
 
     /** 立即备份(按钮用) */
@@ -67,7 +67,8 @@ object BackupScheduler {
     fun scheduleNextFromPrefsSync(ctx: Context) {
         val cfg = SimpleBackupPrefs.get(ctx)
         if (cfg.enabled && cfg.daysMask != 0) {
-            scheduleNext(ctx, cfg)
+            // 正常链路下一次:也无需“立刻今天”
+            scheduleNext(ctx, cfg, allowImmediateToday = false)
         } else {
             WorkManager.getInstance(ctx).cancelUniqueWork(UNIQUE_RECURRING)
         }
@@ -75,10 +76,14 @@ object BackupScheduler {
 
     // ---------- 内部实现 ----------
 
-    private fun scheduleNext(ctx: Context, cfg: SimpleBackupConfig) {
-        val delayMs = nextDelayMillis(cfg).coerceAtLeast(0L)
-        val data = workDataOf(RoomBackupWorker.KEY_KEEP_COUNT to cfg.keep)
+    private fun scheduleNext(ctx: Context, cfg: SimpleBackupConfig, allowImmediateToday: Boolean) {
+        val delayMs = nextDelayMillis(cfg, allowImmediateToday)
+        if (delayMs < 0L) {
+            WorkManager.getInstance(ctx).cancelUniqueWork(UNIQUE_RECURRING)
+            return
+        }
 
+        val data = workDataOf(RoomBackupWorker.KEY_KEEP_COUNT to cfg.keep)
         val req = OneTimeWorkRequestBuilder<RoomBackupWorker>()
             .setInitialDelay(delayMs, TimeUnit.MILLISECONDS)
             .setInputData(data)
@@ -88,7 +93,7 @@ object BackupScheduler {
 
         WorkManager.getInstance(ctx).enqueueUniqueWork(
             UNIQUE_RECURRING,
-            ExistingWorkPolicy.REPLACE,  // 每次保存都覆盖下一次
+            ExistingWorkPolicy.REPLACE,
             req
         )
     }
@@ -98,7 +103,8 @@ object BackupScheduler {
      * - 掩码位:Mon=bit0 ... Sun=bit6
      * - Calendar.DAY_OF_WEEK:Sun=1, Mon=2, ... Sat=7
      */
-    private fun nextDelayMillis(cfg: SimpleBackupConfig): Long {
+    // 允许调用方决定:今天已过点是否立刻执行(开机时传 false)
+    private fun nextDelayMillis(cfg: SimpleBackupConfig, allowImmediateToday: Boolean): Long {
         val now = Calendar.getInstance()
         val nowMs = now.timeInMillis
 
@@ -126,18 +132,20 @@ object BackupScheduler {
             if (!selected) continue
 
             val diff = cand.timeInMillis - nowMs
-            // 今天是选中日,但已过目标时刻 => 立即执行
-            if (i == 0 && diff <= 0L) return 0L
+            // 今天是选中日,但已过目标时刻
+            if (i == 0 && diff <= 0L) {
+                if (allowImmediateToday) return 0L   // 允许“立即执行”
+                else continue                        // 跳过今天,找下一个被选中的日子
+            }
 
-            // 未来选中日的目标时刻
             if (diff > 0L) return diff
         }
-
-        // 兜底:没有任何选中日(或者异常)=> 立即执行
-        return 0L
+        // 兜底:无可用日 -> 不执行
+        return -1L
     }
 
 
+
     /** 省电约束:电量不低再跑 */
     private fun defaultConstraints() = Constraints.Builder()
         .setRequiresBatteryNotLow(true)

+ 4 - 1
data/src/main/java/com/grkj/data/database/DbReadyGate.kt

@@ -3,7 +3,10 @@ package com.grkj.data.database
 import kotlinx.coroutines.CompletableDeferred
 
 object DbReadyGate {
-    private val ready = CompletableDeferred<Unit>()
+    private var ready = CompletableDeferred<Unit>()
     fun open() { if (!ready.isCompleted) ready.complete(Unit) }
+
+    fun reset() { ready = CompletableDeferred() } // 手动重置
+
     suspend fun await() = ready.await()
 }

+ 41 - 20
data/src/main/java/com/grkj/data/database/RoomBackupWorker.kt

@@ -3,31 +3,39 @@ package com.grkj.data.database
 import android.content.Context
 import android.os.Build
 import android.os.Environment
+import androidx.work.CoroutineWorker
 import androidx.work.Data
-import androidx.work.Worker
 import androidx.work.WorkerParameters
 import com.grkj.data.utils.event.BackupCompleteEvent
+import com.grkj.data.utils.event.LoadingEvent
 import com.grkj.shared.config.AESConfig
+import com.grkj.shared.utils.i18n.I18nManager
 import com.sik.sikcore.date.TimeUtils
-import net.zetetic.database.sqlcipher.SQLiteDatabase as CipherDB
+import kotlinx.coroutines.withTimeoutOrNull
 import java.io.File
 import java.io.FileInputStream
 import java.io.FileOutputStream
+import net.zetetic.database.sqlcipher.SQLiteDatabase as CipherDB
 
 /**
  * 备份 Worker:把当前 SQLCipher 库导出为**单文件加密备份**
  * - 备份文件落在 /sdcard/ISCS/backup/backup_yyyyMMdd_HHmmss.db
  * - 输入参数:KEEP_COUNT(保留份数,默认10)
  */
-class RoomBackupWorker(ctx: Context, params: WorkerParameters) : Worker(ctx, params) {
+class RoomBackupWorker(ctx: Context, params: WorkerParameters) : CoroutineWorker(ctx, params) {
 
-    override fun doWork(): Result {
+    override suspend fun doWork(): Result {
         return try {
+            withTimeoutOrNull(60_000) {
+                DbReadyGate.await()
+            } ?: return Result.retry()
             // 0) 权限兜底(UI 层最好先确保授权)
             if (!canWritePublicDir(applicationContext)) {
-                return Result.failure(Data.Builder().putString("reason", "NO_WRITE_PERMISSION").build())
+                return Result.failure(
+                    Data.Builder().putString("reason", "NO_WRITE_PERMISSION").build()
+                )
             }
-
+            LoadingEvent.sendLoadingEvent(I18nManager.t("data_in_backup"), isCanCancel = false)
             // 1) 与 Room 协作:先 checkpoint,再关闭连接,释放文件锁
             runCatching { ISCSDatabase.checkpointAndCloseForMaintenance() }
 
@@ -46,7 +54,7 @@ class RoomBackupWorker(ctx: Context, params: WorkerParameters) : Worker(ctx, par
             val pass = AESConfig.defaultConfig.key()
 
 //            exportCipherToCipherWithLockRetry(srcDb, tmp, pass)
-            coldCopyCipherDb(srcDb,tmp)
+            coldCopyCipherDb(srcDb, tmp)
             check(verifyCanOpen(tmp, pass)) { "备份校验失败:临时备份无法打开" }
 
             copyOverwrite(tmp, finalOut)
@@ -61,12 +69,14 @@ class RoomBackupWorker(ctx: Context, params: WorkerParameters) : Worker(ctx, par
 
             BackupScheduler.scheduleNextFromPrefsSync(applicationContext)
             BackupCompleteEvent.sendBackupCompleteEvent(true)
+            LoadingEvent.sendLoadingEvent()
             Result.success()
         } catch (t: Throwable) {
             t.printStackTrace()
             // 失败也尽量恢复 Room
             runCatching { ISCSDatabase.warmReopen() }
             BackupCompleteEvent.sendBackupCompleteEvent(false)
+            DbReadyGate.open()
             Result.retry()
         }
     }
@@ -79,11 +89,16 @@ class RoomBackupWorker(ctx: Context, params: WorkerParameters) : Worker(ctx, par
         // 1) 再保险:把 WAL 合并并截断
         runCatching {
             val pass = AESConfig.defaultConfig.key()
-            net.zetetic.database.sqlcipher.SQLiteDatabase
-                .openOrCreateDatabase(src, pass, null, null, null).use { db ->
-                    db.rawExecSQL("PRAGMA busy_timeout=10000")
-                    runCatching { db.rawQuery("PRAGMA wal_checkpoint(TRUNCATE)", null).use { } }
-                }
+            net.zetetic.database.sqlcipher.SQLiteDatabase.openOrCreateDatabase(
+                src,
+                pass,
+                null,
+                null,
+                null
+            ).use { db ->
+                db.rawExecSQL("PRAGMA busy_timeout=10000")
+                runCatching { db.rawQuery("PRAGMA wal_checkpoint(TRUNCATE)", null).use { } }
+            }
         }
 
         // 2) 删除可能残留的 wal/shm(只是清洁,安全边界依靠“关闭连接”)
@@ -95,7 +110,8 @@ class RoomBackupWorker(ctx: Context, params: WorkerParameters) : Worker(ctx, par
         dst.parentFile?.mkdirs()
         FileInputStream(src).channel.use { inCh ->
             FileOutputStream(dst).channel.use { outCh ->
-                var pos = 0L; val size = inCh.size()
+                var pos = 0L;
+                val size = inCh.size()
                 while (pos < size) pos += inCh.transferTo(pos, size - pos, outCh)
                 outCh.force(true) // fsync
             }
@@ -155,11 +171,17 @@ class RoomBackupWorker(ctx: Context, params: WorkerParameters) : Worker(ctx, par
     private inline fun <T> retry(times: Int, sleepMs: Long, block: () -> T): T {
         var last: Throwable? = null
         repeat(times) { i ->
-            try { return block() } catch (t: Throwable) {
+            try {
+                return block()
+            } catch (t: Throwable) {
                 last = t
-                val locked = (t is LockedRetry) || t.message?.contains("database is locked", true) == true
+                val locked =
+                    (t is LockedRetry) || t.message?.contains("database is locked", true) == true
                 if (locked) {
-                    try { Thread.sleep(sleepMs * (i + 1)) } catch (_: InterruptedException) {}
+                    try {
+                        Thread.sleep(sleepMs * (i + 1))
+                    } catch (_: InterruptedException) {
+                    }
                 } else {
                     throw t
                 }
@@ -177,7 +199,8 @@ class RoomBackupWorker(ctx: Context, params: WorkerParameters) : Worker(ctx, par
         dst.parentFile?.mkdirs()
         FileInputStream(src).channel.use { inCh ->
             FileOutputStream(dst).channel.use { outCh ->
-                var pos = 0L; val size = inCh.size()
+                var pos = 0L;
+                val size = inCh.size()
                 while (pos < size) pos += inCh.transferTo(pos, size - pos, outCh)
                 outCh.force(true)
             }
@@ -188,9 +211,7 @@ class RoomBackupWorker(ctx: Context, params: WorkerParameters) : Worker(ctx, par
 
     private fun cleanupOld(dir: File, keep: Int) {
         dir.listFiles { f -> f.isFile && f.name.startsWith("backup_") && f.name.endsWith(".db") }
-            ?.sortedByDescending { it.lastModified() }
-            ?.drop(keep)
-            ?.forEach { it.delete() }
+            ?.sortedByDescending { it.lastModified() }?.drop(keep)?.forEach { it.delete() }
     }
 
     companion object {

+ 13 - 5
ui-base/src/main/java/com/grkj/ui_base/utils/event/LoadingEvent.kt → data/src/main/java/com/grkj/data/utils/event/LoadingEvent.kt

@@ -1,22 +1,30 @@
-package com.grkj.ui_base.utils.event
+package com.grkj.data.utils.event
 
-import com.grkj.shared.model.EventBean
 import com.grkj.data.data.EventConstants
+import com.grkj.shared.model.EventBean
 import com.grkj.shared.utils.event.EventHelper
 
 /**
  * 加载事件
  */
-class LoadingEvent(val msg: String? = null, val isShow: Boolean = false) {
+class LoadingEvent(
+    val msg: String? = null,
+    val isShow: Boolean = false,
+    val isCanCancel: Boolean = true
+) {
     companion object {
         /**
          * 发送加载通知
          */
         @JvmStatic
-        fun sendLoadingEvent(msg: String? = null, isShow: Boolean = !msg.isNullOrEmpty()) {
+        fun sendLoadingEvent(
+            msg: String? = null,
+            isShow: Boolean = !msg.isNullOrEmpty(),
+            isCanCancel: Boolean = true
+        ) {
             val loadingEventBean = EventBean<LoadingEvent>(
                 EventConstants.EVENT_LOADING_CODE,
-                LoadingEvent(msg, isShow)
+                LoadingEvent(msg, isShow, isCanCancel)
             )
             EventHelper.sendEvent(loadingEventBean)
         }

+ 4 - 4
ui-base/src/main/java/com/grkj/ui_base/base/BaseActivity.kt

@@ -18,7 +18,7 @@ import com.grkj.shared.utils.KeyboardUtils
 import com.grkj.ui_base.config.ISCSConfig
 import com.grkj.ui_base.dialog.LoadingDialog
 import com.grkj.ui_base.utils.event.JumpViewEvent
-import com.grkj.ui_base.utils.event.LoadingEvent
+import com.grkj.data.utils.event.LoadingEvent
 import com.grkj.ui_base.utils.extension.checkPermissions
 import com.grkj.ui_base.utils.extension.tip
 import com.grkj.ui_base.widget.CustomNavBar
@@ -126,7 +126,7 @@ abstract class BaseActivity<V : ViewDataBinding> : AppCompatActivity(), CustomAd
             EventConstants.EVENT_LOADING_CODE -> {
                 (event.data as LoadingEvent).apply {
                     if (isShow) {
-                        showLoading(msg)
+                        showLoading(msg, isCanCancel)
                     } else {
                         hideLoading()
                     }
@@ -155,8 +155,8 @@ abstract class BaseActivity<V : ViewDataBinding> : AppCompatActivity(), CustomAd
     }
 
     /** 显示加载框,子类实现 */
-    protected fun showLoading(msg: String?) {
-        LoadingDialog.show(msg)
+    protected fun showLoading(msg: String?, canCancel: Boolean = true) {
+        LoadingDialog.show(msg, canCancel)
     }
 
     /** 隐藏加载框,子类实现 */

+ 1 - 1
ui-base/src/main/java/com/grkj/ui_base/base/BaseFragment.kt

@@ -19,7 +19,7 @@ import com.grkj.shared.model.EventBean
 import com.grkj.shared.utils.KeyboardUtils
 import com.grkj.ui_base.config.ISCSConfig
 import com.grkj.ui_base.utils.CommonUtils
-import com.grkj.ui_base.utils.event.LoadingEvent
+import com.grkj.data.utils.event.LoadingEvent
 import com.grkj.ui_base.utils.extension.tip
 import com.kongzue.dialogx.dialogs.PopTip
 import kotlinx.coroutines.launch

+ 1 - 1
ui-base/src/main/java/com/grkj/ui_base/base/BaseViewModel.kt

@@ -6,7 +6,7 @@ import androidx.lifecycle.liveData
 import androidx.lifecycle.viewModelScope
 import com.grkj.data.enums.LoginResultEnum
 import com.grkj.data.logic.IUserLogic
-import com.grkj.ui_base.utils.event.LoadingEvent
+import com.grkj.data.utils.event.LoadingEvent
 import com.grkj.ui_base.utils.event.UiEvent
 import com.grkj.ui_base.utils.extension.tip
 import com.kongzue.dialogx.dialogs.PopTip

+ 1 - 1
ui-base/src/main/java/com/grkj/ui_base/business/BleBusinessManager.kt

@@ -32,7 +32,7 @@ import com.grkj.ui_base.utils.ble.BleSendDispatcher
 import com.grkj.ui_base.utils.ble.CustomBleWriteCallback
 import com.grkj.ui_base.utils.event.CurrentModeEvent
 import com.grkj.ui_base.utils.event.DeviceExceptionEvent
-import com.grkj.ui_base.utils.event.LoadingEvent
+import com.grkj.data.utils.event.LoadingEvent
 import com.grkj.ui_base.utils.event.TicketFinishedEvent
 import com.grkj.ui_base.utils.event.UpdateTicketProgressEvent
 import com.grkj.ui_base.utils.extension.serialNo

+ 1 - 1
ui-base/src/main/java/com/grkj/ui_base/business/ModbusBusinessManager.kt

@@ -13,7 +13,7 @@ import com.grkj.ui_base.utils.Executor
 import com.grkj.ui_base.utils.SPUtils
 import com.grkj.ui_base.utils.ble.BleConnectionManager
 import com.grkj.ui_base.utils.event.DeviceTakeUpdateEvent
-import com.grkj.ui_base.utils.event.LoadingEvent
+import com.grkj.data.utils.event.LoadingEvent
 import com.grkj.ui_base.utils.event.UpdateTicketProgressEvent
 import com.grkj.shared.utils.extension.removeLeadingZeros
 import com.grkj.ui_base.utils.extension.serialNo

+ 2 - 1
ui-base/src/main/java/com/grkj/ui_base/dialog/LoadingDialog.kt

@@ -35,13 +35,14 @@ class LoadingDialog : OnBindView<CustomDialog>(R.layout.common_dialog_loading_pr
         private var loadingDialog: CustomDialog? = null
 
         @JvmStatic
-        fun show(msg: String? = null) {
+        fun show(msg: String? = null,canCancel: Boolean = true) {
             ThreadUtils.runOnMain {
                 loadingDialog?.dismiss()
                 loadingDialog = CustomDialog.build().apply {
                     setCustomView(LoadingDialog().apply {
                         setMessage(msg)
                     })
+                    setCancelable(canCancel)
                     setAlign(CustomDialog.ALIGN.CENTER)
                     setEnterAnimDuration(0)
                     setExitAnimDuration(0)

+ 1 - 1
ui-base/src/main/java/com/grkj/ui_base/utils/ble/BleConnectionManager.kt

@@ -11,7 +11,7 @@ import com.grkj.shared.utils.extension.toHexStrings
 import com.grkj.ui_base.R
 import com.grkj.ui_base.config.ISCSConfig
 import com.grkj.ui_base.utils.CommonUtils
-import com.grkj.ui_base.utils.event.LoadingEvent
+import com.grkj.data.utils.event.LoadingEvent
 import com.grkj.ui_base.utils.modbus.ModBusController
 import com.huyuhui.fastble.BleManager
 import com.huyuhui.fastble.data.BleDevice

+ 1 - 1
ui-base/src/main/java/com/grkj/ui_base/utils/ble/BleReturnDispatcher.kt

@@ -1,7 +1,7 @@
 package com.grkj.ui_base.utils.ble
 
 import com.grkj.ui_base.utils.CommonUtils
-import com.grkj.ui_base.utils.event.LoadingEvent
+import com.grkj.data.utils.event.LoadingEvent
 import com.sik.sikcore.thread.ThreadUtils
 
 object BleReturnDispatcher : BleQueueDispatcher() {