From 9393a87c639860c6e33b27a89ee20a4ae03b3d28 Mon Sep 17 00:00:00 2001 From: Fankesyooni Date: Fri, 25 Mar 2022 23:47:20 +0800 Subject: [PATCH] Merge code --- .../com/fankes/miui/notify/const/Const.kt | 16 ++- .../com/fankes/miui/notify/hook/HookConst.kt | 2 +- .../miui/notify/hook/entity/SystemUIHooker.kt | 43 +++++-- .../miui/notify/ui/activity/MainActivity.kt | 43 +++---- .../notify/ui/activity/base/BaseActivity.kt | 9 ++ .../notify/utils/factory/FunctionFactory.kt | 10 +- .../notify/utils/tool/IconAdaptationTool.kt | 7 +- .../notify/utils/tool/IconRuleManagerTool.kt | 62 +++------- .../miui/notify/utils/tool/SystemUITool.kt | 110 +++++++++++++++--- .../main/res/drawable/ic_nf_icon_refresh.xml | 12 -- 10 files changed, 192 insertions(+), 122 deletions(-) delete mode 100644 app/src/main/res/drawable/ic_nf_icon_refresh.xml diff --git a/app/src/main/java/com/fankes/miui/notify/const/Const.kt b/app/src/main/java/com/fankes/miui/notify/const/Const.kt index 7d16b5c..03ae095 100644 --- a/app/src/main/java/com/fankes/miui/notify/const/Const.kt +++ b/app/src/main/java/com/fankes/miui/notify/const/Const.kt @@ -41,14 +41,20 @@ object Const { const val MODULE_VERSION_CODE = BuildConfig.VERSION_CODE /** 当前模块的版本校验 */ - const val MODULE_VERSION_VERIFY = "${MODULE_VERSION_NAME}_${MODULE_VERSION_CODE}_202103240401" + const val MODULE_VERSION_VERIFY = "${MODULE_VERSION_NAME}_${MODULE_VERSION_CODE}_202203252250" /** 当前模块的版本校验标签 */ const val MODULE_VERSION_VERIFY_TAG = "module_version_verify" - /** 发送通讯广播号标签 */ - const val ACTION_MODULE_CHECKING_RECEIVER = "mnn_checking_action" + /** 发送通讯广播号标签 - 模块激活状态 */ + const val ACTION_MODULE_CHECKING_RECEIVER = "mnn_module_checking_action" - /** 接收通讯广播号标签 */ - const val ACTION_MODULE_HANDLER_RECEIVER = "mnn_handler_action" + /** 接收通讯广播号标签 - 模块激活状态 */ + const val ACTION_MODULE_HANDLER_RECEIVER = "mnn_module_handler_action" + + /** 发送通讯广播号标签 - 通知系统界面刷新 */ + const val ACTION_REMIND_CHECKING_RECEIVER = "mnn_remind_checking_action" + + /** 接收通讯广播号标签 - 通知系统界面刷新 */ + const val ACTION_REMIND_HANDLER_RECEIVER = "mnn_remind_handler_action" } \ No newline at end of file diff --git a/app/src/main/java/com/fankes/miui/notify/hook/HookConst.kt b/app/src/main/java/com/fankes/miui/notify/hook/HookConst.kt index addb0d0..882368d 100644 --- a/app/src/main/java/com/fankes/miui/notify/hook/HookConst.kt +++ b/app/src/main/java/com/fankes/miui/notify/hook/HookConst.kt @@ -20,7 +20,7 @@ * * This file is Created by fankes on 2022/1/24. */ -@file:Suppress("DEPRECATION", "SetWorldReadable") +@file:Suppress("SetWorldReadable") package com.fankes.miui.notify.hook diff --git a/app/src/main/java/com/fankes/miui/notify/hook/entity/SystemUIHooker.kt b/app/src/main/java/com/fankes/miui/notify/hook/entity/SystemUIHooker.kt index 2727075..8cbd7fb 100644 --- a/app/src/main/java/com/fankes/miui/notify/hook/entity/SystemUIHooker.kt +++ b/app/src/main/java/com/fankes/miui/notify/hook/entity/SystemUIHooker.kt @@ -55,7 +55,6 @@ import com.fankes.miui.notify.utils.drawable.drawabletoolbox.DrawableBuilder import com.fankes.miui.notify.utils.factory.* import com.fankes.miui.notify.utils.tool.BitmapCompatTool import com.fankes.miui.notify.utils.tool.IconAdaptationTool -import com.fankes.miui.notify.utils.tool.IconRuleManagerTool import com.highcapable.yukihookapi.hook.bean.VariousClass import com.highcapable.yukihookapi.hook.entity.YukiBaseHooker import com.highcapable.yukihookapi.hook.factory.field @@ -160,18 +159,39 @@ class SystemUIHooker : YukiBaseHooker() { } /** 模块广播接收器 */ - private val moduleReceiver by lazy { + private val moduleCheckingReceiver by lazy { object : BroadcastReceiver() { override fun onReceive(context: Context?, intent: Intent?) { context?.sendBroadcast(Intent().apply { action = Const.ACTION_MODULE_HANDLER_RECEIVER - putExtra("isAction", true) - putExtra("isValied", intent?.getStringExtra(Const.MODULE_VERSION_VERIFY_TAG) == Const.MODULE_VERSION_VERIFY) + putExtra("isRegular", true) + putExtra("isValied", intent?.isValiedModule) }) } } } + /** 通知广播接收器 */ + private val remindCheckingReceiver by lazy { + object : BroadcastReceiver() { + override fun onReceive(context: Context?, intent: Intent?) = delayedRun(ms = 300) { + if (intent?.isValiedModule == true) + recachingPrefs(intent.getBooleanExtra("isRefreshCacheOnly", false)) + context?.sendBroadcast(Intent().apply { + action = Const.ACTION_REMIND_HANDLER_RECEIVER + putExtra("isGrasp", true) + putExtra("isValied", intent?.isValiedModule) + }) + } + } + } + + /** + * 判断模块和宿主版本是否一致 + * @return [Boolean] + */ + private val Intent.isValiedModule get() = getStringExtra(Const.MODULE_VERSION_VERIFY_TAG) == Const.MODULE_VERSION_VERIFY + /** * 注册广播接收器 * @param context 实例 @@ -179,7 +199,8 @@ class SystemUIHooker : YukiBaseHooker() { private fun registerReceiver(context: Context) { if (isRegisterReceiver) return context.registerReceiver(userPresentReceiver, IntentFilter().apply { addAction(Intent.ACTION_USER_PRESENT) }) - context.registerReceiver(moduleReceiver, IntentFilter().apply { addAction(Const.ACTION_MODULE_CHECKING_RECEIVER) }) + context.registerReceiver(moduleCheckingReceiver, IntentFilter().apply { addAction(Const.ACTION_MODULE_CHECKING_RECEIVER) }) + context.registerReceiver(remindCheckingReceiver, IntentFilter().apply { addAction(Const.ACTION_REMIND_CHECKING_RECEIVER) }) isRegisterReceiver = true } @@ -558,11 +579,15 @@ class SystemUIHooker : YukiBaseHooker() { } } - /** 刷新缓存数据 */ - private fun recachingPrefs() { + /** + * 刷新缓存数据 + * @param isRefreshCacheOnly 仅刷新缓存不刷新图标和通知改变 - 默认:否 + */ + private fun recachingPrefs(isRefreshCacheOnly: Boolean = false) { isUsingCachingMethod = true prefs.clearCache() cachingIconDatas() + if (isRefreshCacheOnly) return refreshStatusBarIcons() refreshNotificationIcons() } @@ -609,10 +634,6 @@ class SystemUIHooker : YukiBaseHooker() { expandedNf, (result as Icon).loadDrawable(context) ) { icon, isReplace -> if (isReplace) result = Icon.createWithBitmap(icon.toBitmap()) } - /** 刷新缓存 */ - if (expandedNf?.compatOpPkgName == Const.MODULE_PACKAGE_NAME && - expandedNf.notification?.channelId == IconRuleManagerTool.NOTIFY_CHANNEL - ) recachingPrefs() } } } diff --git a/app/src/main/java/com/fankes/miui/notify/ui/activity/MainActivity.kt b/app/src/main/java/com/fankes/miui/notify/ui/activity/MainActivity.kt index df4e477..fb03dde 100644 --- a/app/src/main/java/com/fankes/miui/notify/ui/activity/MainActivity.kt +++ b/app/src/main/java/com/fankes/miui/notify/ui/activity/MainActivity.kt @@ -24,7 +24,8 @@ package com.fankes.miui.notify.ui.activity -import android.content.* +import android.content.ComponentName +import android.content.Intent import android.content.pm.PackageManager import androidx.core.view.isGone import androidx.core.view.isVisible @@ -63,8 +64,8 @@ class MainActivity : BaseActivity() { /** 警告对话框是否显示 */ private var isWarnDialogShowing = false - /** 模块是否激活 */ - private var isModuleAction = false + /** 模块是否可用 */ + private var isModuleRegular = false /** 模块是否有效 */ private var isModuleValied = false @@ -201,7 +202,7 @@ class MainActivity : BaseActivity() { binding.notifyIconFixNotifySwitch.setOnCheckedChangeListener { btn, b -> if (!btn.isPressed) return@setOnCheckedChangeListener modulePrefs.putBoolean(ENABLE_NOTIFY_ICON_FIX_NOTIFY, b) - SystemUITool.refreshSystemUI(context = this) + SystemUITool.refreshSystemUI(context = this, isRefreshCacheOnly = true) } /** 通知图标优化名单按钮点击事件 */ binding.notifyIconFixButton.setOnClickListener { navigate() } @@ -241,8 +242,6 @@ class MainActivity : BaseActivity() { binding.linkWithFollowMe.setOnClickListener { openBrowser(url = "https://www.coolapk.com/u/876977", packageName = "com.coolapk.market") } - /** 注册广播检查模块激活状态 */ - registerReceiver(hostReceiver, IntentFilter().apply { addAction(Const.ACTION_MODULE_HANDLER_RECEIVER) }) } /** 刷新模块状态 */ @@ -250,7 +249,7 @@ class MainActivity : BaseActivity() { binding.mainLinStatus.setBackgroundResource( when { (isXposedModuleActive && isMiuiNotifyStyle) || - (isXposedModuleActive && (!isModuleAction || !isModuleValied)) -> R.drawable.bg_yellow_round + (isXposedModuleActive && (!isModuleRegular || !isModuleValied)) -> R.drawable.bg_yellow_round isXposedModuleActive -> R.drawable.bg_green_round else -> R.drawable.bg_dark_round } @@ -264,9 +263,9 @@ class MainActivity : BaseActivity() { binding.mainTextStatus.text = when { isXposedModuleActive && isMiuiNotifyStyle -> "模块已激活,但未在工作" - isXposedModuleActive && !isModuleAction && + isXposedModuleActive && !isModuleRegular && !modulePrefs.getBoolean(ENABLE_MODULE, default = true) -> "模块已停用" - isXposedModuleActive && !isModuleAction -> "模块已激活,请重启系统界面" + isXposedModuleActive && !isModuleRegular -> "模块已激活,请重启系统界面" isXposedModuleActive && !isModuleValied -> "模块已更新,请重启系统界面" isXposedModuleActive -> "模块已激活" else -> "模块未激活" @@ -280,10 +279,11 @@ class MainActivity : BaseActivity() { /** 刷新模块状态 */ refreshModuleStatus() /** 发送广播检查模块激活状态 */ - sendBroadcast(Intent().apply { - action = Const.ACTION_MODULE_CHECKING_RECEIVER - putExtra(Const.MODULE_VERSION_VERIFY_TAG, Const.MODULE_VERSION_VERIFY) - }) + SystemUITool.checkingActivated(context = this) { isRegular, isValied -> + isModuleRegular = isRegular + isModuleValied = isValied + refreshModuleStatus() + } /** 经典样式启用后给出警告 */ if (!isWarnDialogShowing && isXposedModuleActive && isMiuiNotifyStyle) showDialog { @@ -308,21 +308,4 @@ class MainActivity : BaseActivity() { noCancelable() } } - - override fun onDestroy() { - super.onDestroy() - /** 取消注册广播 */ - unregisterReceiver(hostReceiver) - } - - /** 宿主广播接收器 */ - private val hostReceiver by lazy { - object : BroadcastReceiver() { - override fun onReceive(context: Context?, intent: Intent?) { - isModuleAction = intent?.getBooleanExtra("isAction", false) ?: false - isModuleValied = intent?.getBooleanExtra("isValied", false) ?: false - refreshModuleStatus() - } - } - } } \ No newline at end of file diff --git a/app/src/main/java/com/fankes/miui/notify/ui/activity/base/BaseActivity.kt b/app/src/main/java/com/fankes/miui/notify/ui/activity/base/BaseActivity.kt index 0288fa8..31c8b31 100644 --- a/app/src/main/java/com/fankes/miui/notify/ui/activity/base/BaseActivity.kt +++ b/app/src/main/java/com/fankes/miui/notify/ui/activity/base/BaseActivity.kt @@ -29,6 +29,7 @@ import androidx.appcompat.app.AppCompatActivity import androidx.viewbinding.ViewBinding import com.fankes.miui.notify.R import com.fankes.miui.notify.utils.factory.isNotSystemInDarkMode +import com.fankes.miui.notify.utils.tool.SystemUITool import com.gyf.immersionbar.ktx.immersionBar import com.highcapable.yukihookapi.hook.factory.method import com.highcapable.yukihookapi.hook.type.android.LayoutInflaterClass @@ -61,10 +62,18 @@ abstract class BaseActivity : AppCompatActivity() { navigationBarDarkIcon(isNotSystemInDarkMode) fitsSystemWindows(true) } + /** 注册 */ + SystemUITool.register(context = this) /** 装载子类 */ onCreate() } /** 回调 [onCreate] 方法 */ abstract fun onCreate() + + override fun onDestroy() { + super.onDestroy() + /** 解除注册 */ + SystemUITool.unregister(context = this) + } } \ No newline at end of file diff --git a/app/src/main/java/com/fankes/miui/notify/utils/factory/FunctionFactory.kt b/app/src/main/java/com/fankes/miui/notify/utils/factory/FunctionFactory.kt index a3c282a..a85065c 100644 --- a/app/src/main/java/com/fankes/miui/notify/utils/factory/FunctionFactory.kt +++ b/app/src/main/java/com/fankes/miui/notify/utils/factory/FunctionFactory.kt @@ -38,6 +38,7 @@ import android.graphics.drawable.Drawable import android.net.ConnectivityManager import android.net.Uri import android.os.Build +import android.os.Handler import android.provider.Settings import android.util.Base64 import android.widget.Toast @@ -444,4 +445,11 @@ fun Context.copyToClipboard(content: String) = runInSafe { if (it != content) snake(msg = "复制失败") else snake(msg = "已复制") } } -} \ No newline at end of file +} + +/** + * 延迟执行 + * @param ms 毫秒 - 默认:150 + * @param it 方法体 + */ +fun Any?.delayedRun(ms: Long = 150, it: () -> Unit) = runInSafe { Handler().postDelayed({ it() }, ms) } \ No newline at end of file diff --git a/app/src/main/java/com/fankes/miui/notify/utils/tool/IconAdaptationTool.kt b/app/src/main/java/com/fankes/miui/notify/utils/tool/IconAdaptationTool.kt index 532089c..f25a22d 100644 --- a/app/src/main/java/com/fankes/miui/notify/utils/tool/IconAdaptationTool.kt +++ b/app/src/main/java/com/fankes/miui/notify/utils/tool/IconAdaptationTool.kt @@ -47,6 +47,9 @@ import com.fankes.miui.notify.utils.factory.runInSafe */ object IconAdaptationTool { + /** 推送通知的渠道名称 */ + private const val NOTIFY_CHANNEL = "notifyRuleSupportId" + /** * 使用的小图标 * @return [Bitmap] @@ -116,11 +119,11 @@ object IconAdaptationTool { context.getSystemService(NotificationManager::class.java)?.apply { createNotificationChannel( NotificationChannel( - IconRuleManagerTool.NOTIFY_CHANNEL, "通知图标优化适配", + NOTIFY_CHANNEL, "通知图标优化适配", NotificationManager.IMPORTANCE_DEFAULT ).apply { enableLights(false) } ) - notify(packageName.hashCode(), Notification.Builder(context, IconRuleManagerTool.NOTIFY_CHANNEL).apply { + notify(packageName.hashCode(), Notification.Builder(context, NOTIFY_CHANNEL).apply { setShowWhen(true) setContentTitle("您已安装 ${context.findAppName(packageName)}") setContentText("尚未适配此应用,点按打开在线规则。") diff --git a/app/src/main/java/com/fankes/miui/notify/utils/tool/IconRuleManagerTool.kt b/app/src/main/java/com/fankes/miui/notify/utils/tool/IconRuleManagerTool.kt index 70718cc..f905f33 100644 --- a/app/src/main/java/com/fankes/miui/notify/utils/tool/IconRuleManagerTool.kt +++ b/app/src/main/java/com/fankes/miui/notify/utils/tool/IconRuleManagerTool.kt @@ -20,7 +20,7 @@ * * This file is Created by fankes on 2022/2/25. */ -@file:Suppress("TrustAllX509TrustManager", "CustomX509TrustManager", "DEPRECATION", "IMPLICIT_CAST_TO_ANY") +@file:Suppress("TrustAllX509TrustManager", "CustomX509TrustManager", "IMPLICIT_CAST_TO_ANY") package com.fankes.miui.notify.utils.tool @@ -32,7 +32,6 @@ import android.content.Context import android.content.Intent import android.net.Uri import android.os.Build -import android.os.Handler import android.provider.Settings import androidx.appcompat.app.AppCompatActivity import androidx.core.app.NotificationCompat @@ -40,7 +39,6 @@ import androidx.core.content.getSystemService import androidx.core.view.isVisible import androidx.core.widget.doOnTextChanged import com.fankes.miui.notify.R -import com.fankes.miui.notify.application.MNNApplication.Companion.appContext import com.fankes.miui.notify.databinding.DiaSourceFromBinding import com.fankes.miui.notify.databinding.DiaSourceFromStringBinding import com.fankes.miui.notify.hook.HookConst.SOURCE_SYNC_WAY @@ -50,7 +48,9 @@ import com.fankes.miui.notify.hook.HookConst.TYPE_SOURCE_SYNC_WAY_2 import com.fankes.miui.notify.hook.HookConst.TYPE_SOURCE_SYNC_WAY_3 import com.fankes.miui.notify.params.IconPackParams import com.fankes.miui.notify.ui.activity.ConfigureActivity -import com.fankes.miui.notify.utils.factory.* +import com.fankes.miui.notify.utils.factory.safeOfNull +import com.fankes.miui.notify.utils.factory.showDialog +import com.fankes.miui.notify.utils.factory.snake import com.highcapable.yukihookapi.hook.factory.modulePrefs import com.highcapable.yukihookapi.hook.log.loggerD import okhttp3.* @@ -65,7 +65,7 @@ import javax.net.ssl.* object IconRuleManagerTool { /** 推送通知的渠道名称 */ - const val NOTIFY_CHANNEL = "notifyRuleUpdateId" + private const val NOTIFY_CHANNEL = "notifyRuleUpdateId" /** 当前规则的系统名称 */ private const val OS_TAG = "MIUI" @@ -139,7 +139,7 @@ object IconRuleManagerTool { dataJson2 = jsonString.takeIf { params.isJsonArray(it) } ?: "[$jsonString]" ) ) - pushAndNotifyRefresh(context) + notifyRefresh(context) it() } else -> context.snake(msg = "请输入有效内容") @@ -152,7 +152,7 @@ object IconRuleManagerTool { jsonString.isNotBlank() && params.isNotVaildJson(jsonString) -> context.snake(msg = "不是有效的 JSON 数据") jsonString.isNotBlank() -> { params.save(dataJson = jsonString.takeIf { params.isJsonArray(it) } ?: "[$jsonString]") - pushAndNotifyRefresh(context) + notifyRefresh(context) it() } else -> context.snake(msg = "请输入有效内容") @@ -216,7 +216,7 @@ object IconRuleManagerTool { params.isCompareDifferent(it) -> { params.save(it) pushNotify(context, title = "同步完成", msg = "已更新通知图标优化名单,点击查看") - pushAndNotifyRefresh(context) + notifyRefresh(context) it() } else -> (if (context is AppCompatActivity) context.snake(msg = "列表数据已是最新")) @@ -265,7 +265,7 @@ object IconRuleManagerTool { params.isCompareDifferent(content) -> { params.save(content) pushNotify(context, title = "同步完成", msg = "已更新通知图标优化名单,点击查看") - pushAndNotifyRefresh(context) + notifyRefresh(context) it() } else -> (if (context is AppCompatActivity) context.snake(msg = "列表数据已是最新")) @@ -358,44 +358,13 @@ object IconRuleManagerTool { }) }.onFailure { it(false, "URL 无效") } - /** - * 刷新系统界面状态栏与通知图标 - * @param context 实例 - */ - fun refreshSystemUI(context: Context) { - if (context !is AppCompatActivity) return - if (isNotNoificationEnabled) - context.showDialog { - title = "模块的通知权限已关闭" - msg = "请开启通知权限然后重启系统界面,否则无法动态刷新系统界面使更改生效。" - confirmButton { context.openNotifySetting() } - cancelButton() - noCancelable() - } - else - context.showDialog { - title = "请稍后" - progressContent = "正在刷新系统界面改变" - /** 发送通知提醒宿主更新图标缓存 */ - pushNotify(appContext, title = "请稍后", msg = "正在等待系统界面响应", isAction = false) - /** 刷新成功后取消通知 */ - Handler().postDelayed({ - context.getSystemService()?.cancel(1) - cancel() - }, 1000) - noCancelable() - } - } - /** * 推送通知图标更新通知 * @param context 实例 */ - private fun pushAndNotifyRefresh(context: Context) { + private fun notifyRefresh(context: Context) { if (context !is AppCompatActivity) return - SystemUITool.showNeedUpdateApplySnake(context) - /** 刷新改变 */ - refreshSystemUI(context) + SystemUITool.refreshSystemUI(context) { context.snake(msg = "通知图标优化名单已完成同步") } } /** @@ -414,9 +383,8 @@ object IconRuleManagerTool { * @param context 实例 - 类型为 [AppCompatActivity] 时将不会推送通知 * @param title 通知标题 * @param msg 通知消息 - * @param isAction 是否增加点击跳转事件 - 默认:是 */ - private fun pushNotify(context: Context, title: String, msg: String, isAction: Boolean = true) { + private fun pushNotify(context: Context, title: String, msg: String) { if (context !is AppCompatActivity) context.getSystemService()?.apply { createNotificationChannel( @@ -425,15 +393,15 @@ object IconRuleManagerTool { NotificationManager.IMPORTANCE_DEFAULT ) ) - notify(if (isAction) 0 else 1, NotificationCompat.Builder(context, NOTIFY_CHANNEL).apply { + notify(0, NotificationCompat.Builder(context, NOTIFY_CHANNEL).apply { setContentTitle(title) setContentText(msg) color = OS_COLOR.toInt() setAutoCancel(true) - setSmallIcon(if (isAction) R.drawable.ic_nf_icon_update else R.drawable.ic_nf_icon_refresh) + setSmallIcon(R.drawable.ic_nf_icon_update) setSound(null) setDefaults(NotificationCompat.DEFAULT_ALL) - if (isAction) setContentIntent( + setContentIntent( PendingIntent.getActivity( context, msg.hashCode(), Intent(context, ConfigureActivity::class.java).apply { putExtra("isShowUpdDialog", false) }, diff --git a/app/src/main/java/com/fankes/miui/notify/utils/tool/SystemUITool.kt b/app/src/main/java/com/fankes/miui/notify/utils/tool/SystemUITool.kt index 508fa33..e4160b8 100644 --- a/app/src/main/java/com/fankes/miui/notify/utils/tool/SystemUITool.kt +++ b/app/src/main/java/com/fankes/miui/notify/utils/tool/SystemUITool.kt @@ -22,11 +22,12 @@ */ package com.fankes.miui.notify.utils.tool +import android.content.BroadcastReceiver import android.content.Context -import com.fankes.miui.notify.utils.factory.execShellSu -import com.fankes.miui.notify.utils.factory.showDialog -import com.fankes.miui.notify.utils.factory.snake -import com.fankes.miui.notify.utils.factory.toast +import android.content.Intent +import android.content.IntentFilter +import com.fankes.miui.notify.const.Const +import com.fankes.miui.notify.utils.factory.* import com.google.android.material.snackbar.Snackbar import com.highcapable.yukihookapi.hook.factory.isXposedModuleActive @@ -35,6 +36,45 @@ import com.highcapable.yukihookapi.hook.factory.isXposedModuleActive */ object SystemUITool { + /** 宿主广播回调 */ + private var moduleHandlerCallback: ((Boolean, Boolean) -> Unit)? = null + + /** 通知广播回调 */ + private var remindHandlerCallback: ((Boolean, Boolean) -> Unit)? = null + + /** + * 注册广播 + * @param context 实例 + */ + fun register(context: Context) { + /** 注册广播检查模块激活状态 */ + context.registerReceiver(moduleHandlerReceiver, IntentFilter().apply { addAction(Const.ACTION_MODULE_HANDLER_RECEIVER) }) + /** 注册广播通知系统界面改变 */ + context.registerReceiver(remindHandlerReceiver, IntentFilter().apply { addAction(Const.ACTION_REMIND_HANDLER_RECEIVER) }) + } + + /** + * 取消注册广播 + * @param context 实例 + */ + fun unregister(context: Context) { + context.unregisterReceiver(moduleHandlerReceiver) + context.unregisterReceiver(remindHandlerReceiver) + } + + /** + * 检查模块是否激活 + * @param context 实例 + * @param it 成功后回调 - ([Boolean] 是否激活,[Boolean] 是否有效) + */ + fun checkingActivated(context: Context, it: (Boolean, Boolean) -> Unit) { + moduleHandlerCallback = it + context.sendBroadcast(Intent().apply { + action = Const.ACTION_MODULE_CHECKING_RECEIVER + putExtra(Const.MODULE_VERSION_VERIFY_TAG, Const.MODULE_VERSION_VERIFY) + }) + } + /** * 重启系统界面 * @param context 实例 @@ -58,10 +98,40 @@ object SystemUITool { /** * 刷新系统界面状态栏与通知图标 * @param context 实例 + * @param isRefreshCacheOnly 仅刷新缓存不刷新图标和通知改变 - 默认:否 + * @param it 成功后回调 */ - fun refreshSystemUI(context: Context) = + fun refreshSystemUI(context: Context, isRefreshCacheOnly: Boolean = false, it: () -> Unit = {}) = if (isXposedModuleActive) - IconRuleManagerTool.refreshSystemUI(context) + context.showDialog { + title = "请稍后" + progressContent = "正在等待系统界面刷新" + /** 是否等待成功 */ + var isWaited = false + /** 设置等待延迟 */ + delayedRun(ms = 5000) { + if (isWaited) return@delayedRun + remindHandlerCallback = null + cancel() + context.snake(msg = "预计响应超时,建议重启系统界面", actionText = "立即重启") { restartSystemUI(context) } + } + remindHandlerCallback = { isGrasp, isValied -> + remindHandlerCallback = null + cancel() + isWaited = true + when { + isGrasp && !isValied -> + context.snake(msg = "请重启系统界面以生效模块更新", actionText = "立即重启") { restartSystemUI(context) } + else -> it() + } + } + context.sendBroadcast(Intent().apply { + action = Const.ACTION_REMIND_CHECKING_RECEIVER + putExtra("isRefreshCacheOnly", isRefreshCacheOnly) + putExtra(Const.MODULE_VERSION_VERIFY_TAG, Const.MODULE_VERSION_VERIFY) + }) + noCancelable() + } else context.snake(msg = "模块没有激活,更改不会生效") /** @@ -73,11 +143,25 @@ object SystemUITool { context.snake(msg = "设置需要重启系统界面才能生效", actionText = "立即重启") { restartSystemUI(context) } else context.snake(msg = "模块没有激活,更改不会生效") - /** - * 显示更新数据后需要重启系统界面的 [Snackbar] - * @param context 实例 - */ - fun showNeedUpdateApplySnake(context: Context) = - if (isXposedModuleActive) context.snake(msg = "通知图标优化名单已完成同步") - else context.snake(msg = "模块没有激活,更改不会生效") + /** 宿主广播接收器 */ + private val moduleHandlerReceiver by lazy { + object : BroadcastReceiver() { + override fun onReceive(context: Context?, intent: Intent?) { + val isRegular = intent?.getBooleanExtra("isRegular", false) ?: false + val isValied = intent?.getBooleanExtra("isValied", false) ?: false + moduleHandlerCallback?.invoke(isRegular, isValied) + } + } + } + + /** 通知广播接收器 */ + private val remindHandlerReceiver by lazy { + object : BroadcastReceiver() { + override fun onReceive(context: Context?, intent: Intent?) { + val isGrasp = intent?.getBooleanExtra("isGrasp", false) ?: false + val isValied = intent?.getBooleanExtra("isValied", false) ?: false + remindHandlerCallback?.invoke(isGrasp, isValied) + } + } + } } \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_nf_icon_refresh.xml b/app/src/main/res/drawable/ic_nf_icon_refresh.xml deleted file mode 100644 index a75eeda..0000000 --- a/app/src/main/res/drawable/ic_nf_icon_refresh.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - -