diff --git a/.idea/misc.xml b/.idea/misc.xml index c6b8d6c..2048392 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -12,6 +12,8 @@ + + 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 0480499..addb0d0 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 @@ -29,7 +29,6 @@ object HookConst { const val ENABLE_MODULE = "_enable_module" const val ENABLE_MODULE_LOG = "_enable_module_log" const val ENABLE_HIDE_ICON = "_hide_icon" - const val ENABLE_COLOR_ICON_HOOK = "_color_icon_hook" const val ENABLE_COLOR_ICON_COMPAT = "_color_icon_compat" const val ENABLE_NOTIFY_ICON_FIX = "_notify_icon_fix" const val ENABLE_NOTIFY_ICON_FIX_NOTIFY = "_notify_icon_fix_notify" diff --git a/app/src/main/java/com/fankes/miui/notify/hook/HookEntry.kt b/app/src/main/java/com/fankes/miui/notify/hook/HookEntry.kt index 37389ef..7f83005 100644 --- a/app/src/main/java/com/fankes/miui/notify/hook/HookEntry.kt +++ b/app/src/main/java/com/fankes/miui/notify/hook/HookEntry.kt @@ -28,6 +28,7 @@ import android.content.Intent import android.graphics.Bitmap import android.graphics.Color import android.graphics.Outline +import android.graphics.drawable.BitmapDrawable import android.graphics.drawable.Drawable import android.graphics.drawable.Icon import android.os.Build @@ -40,7 +41,6 @@ import androidx.core.graphics.drawable.toBitmap import com.fankes.miui.notify.application.MNNApplication.Companion.MODULE_PACKAGE_NAME import com.fankes.miui.notify.bean.IconDataBean import com.fankes.miui.notify.hook.HookConst.ENABLE_COLOR_ICON_COMPAT -import com.fankes.miui.notify.hook.HookConst.ENABLE_COLOR_ICON_HOOK import com.fankes.miui.notify.hook.HookConst.ENABLE_HOOK_STATUS_ICON_COUNT import com.fankes.miui.notify.hook.HookConst.ENABLE_MODULE import com.fankes.miui.notify.hook.HookConst.ENABLE_MODULE_LOG @@ -62,10 +62,7 @@ import com.highcapable.yukihookapi.hook.factory.* import com.highcapable.yukihookapi.hook.log.loggerD import com.highcapable.yukihookapi.hook.log.loggerW import com.highcapable.yukihookapi.hook.param.PackageParam -import com.highcapable.yukihookapi.hook.type.android.ContextClass -import com.highcapable.yukihookapi.hook.type.android.DrawableClass -import com.highcapable.yukihookapi.hook.type.android.ImageViewClass -import com.highcapable.yukihookapi.hook.type.android.IntentClass +import com.highcapable.yukihookapi.hook.type.android.* import com.highcapable.yukihookapi.hook.type.java.BooleanType import com.highcapable.yukihookapi.hook.type.java.IntType import com.highcapable.yukihookapi.hook.xposed.proxy.YukiHookXposedInitProxy @@ -82,9 +79,6 @@ class HookEntry : YukiHookXposedInitProxy { private const val NotificationHeaderViewWrapperInjectorClass = "$SYSTEMUI_PACKAGE_NAME.statusbar.notification.row.wrapper.NotificationHeaderViewWrapperInjector" - /** MIUI 大部分版本存在的类 */ - private const val MiuiClockClass = "$SYSTEMUI_PACKAGE_NAME.statusbar.views.MiuiClock" - /** 原生存在的类 */ private const val ContrastColorUtilClass = "com.android.internal.util.ContrastColorUtil" @@ -97,6 +91,12 @@ class HookEntry : YukiHookXposedInitProxy { /** 原生存在的类 */ private const val PluginManagerImplClass = "$SYSTEMUI_PACKAGE_NAME.shared.plugins.PluginManagerImpl" + /** 根据多个版本存在不同的包名相同的类 */ + private val MiuiClockClass = VariousClass( + "$SYSTEMUI_PACKAGE_NAME.statusbar.views.MiuiClock", + "$SYSTEMUI_PACKAGE_NAME.statusbar.policy.MiuiClock" + ) + /** 根据多个版本存在不同的包名相同的类 */ private val ExpandableNotificationRowClass = VariousClass( "$SYSTEMUI_PACKAGE_NAME.statusbar.notification.row.ExpandableNotificationRow", @@ -134,14 +134,19 @@ class HookEntry : YukiHookXposedInitProxy { /** 是否显示通知图标 - 跟随 Hook 保存 */ private var isShowNotificationIcons = true + /** 缓存的状态栏小图标实例 */ + private var statusBarIconViews = HashSet() + + /** 缓存的通知小图标包装纸实例 */ + private var notificationViewWrappers = HashSet() + /** * 是否启用忽略彩色图标和启用通知图标优化功能 * @param isHooking 是否判断启用通知功能 - 默认:是 * @return [Boolean] */ private fun PackageParam.isEnableHookColorNotifyIcon(isHooking: Boolean = true) = - prefs.getBoolean(ENABLE_COLOR_ICON_HOOK, default = true) && - prefs.getBoolean(ENABLE_NOTIFY_ICON_FIX, default = true) && + prefs.getBoolean(ENABLE_NOTIFY_ICON_FIX, default = true) && (if (isHooking) prefs.getBoolean(ENABLE_NOTIFY_ICON_FIX_NOTIFY, default = true) else true) /** @@ -286,6 +291,29 @@ class HookEntry : YukiHookXposedInitProxy { SystemUIApplicationClass.clazz.method { name = "getContext" }.ignoredError().get().invoke() } + /** 刷新状态栏小图标 */ + private fun PackageParam.refreshStatusBarIcons() = runInSafe { + StatusBarIconViewClass.clazz.field { name = "mNotification" }.also { result -> + statusBarIconViews.takeIf { it.isNotEmpty() }?.forEach { + /** 得到通知实例 */ + val nf = result.of(it) ?: return + /** 刷新状态栏图标 */ + compatStatusIcon(it.context, nf, nf.notification.smallIcon.loadDrawable(it.context)) { icon, _ -> + it.setImageDrawable(icon) + } + } + } + } + + /** 刷新通知小图标 */ + private fun PackageParam.refreshNotificationIcons() = runInSafe { + (if (hasHandleHeaderViews) + NotificationHeaderViewWrapperClass.clazz.method { name = "handleHeaderViews" } + else NotificationHeaderViewWrapperClass.clazz.method { name = "resolveHeaderViews" }).also { result -> + notificationViewWrappers.takeIf { it.isNotEmpty() }?.forEach { result.get(it).call() } + } + } + /** * 自动适配状态栏、通知栏自定义小图标 * @param isGrayscaleIcon 是否为灰度图标 @@ -294,17 +322,16 @@ class HookEntry : YukiHookXposedInitProxy { */ private fun PackageParam.compatCustomIcon(isGrayscaleIcon: Boolean, packageName: String): Pair { var customPair: Pair? = null - if (prefs.getBoolean(ENABLE_NOTIFY_ICON_FIX, default = true)) - run { - if (iconDatas.isNotEmpty()) - iconDatas.forEach { - if (packageName == it.packageName && isAppNotifyHookOf(it)) { - if (!isGrayscaleIcon || isAppNotifyHookAllOf(it)) - customPair = Pair(it.iconBitmap, it.iconColor) - return@run - } + if (prefs.getBoolean(ENABLE_NOTIFY_ICON_FIX, default = true)) run { + if (iconDatas.isNotEmpty()) + iconDatas.forEach { + if (packageName == it.packageName && isAppNotifyHookOf(it)) { + if (!isGrayscaleIcon || isAppNotifyHookAllOf(it)) + customPair = Pair(it.iconBitmap, it.iconColor) + return@run } - } + } + } return customPair ?: Pair(null, 0) } @@ -315,22 +342,20 @@ class HookEntry : YukiHookXposedInitProxy { * @param context 实例 * @param expandedNf 通知实例 * @param iconDrawable 小图标 [Drawable] - * @param it 回调小图标 - ([Bitmap] 小图标) + * @param it 回调小图标 - ([Drawable] 小图标,[Boolean] 是否替换) */ - private fun PackageParam.hookSmallIconOnSet( + private fun PackageParam.compatStatusIcon( context: Context, expandedNf: StatusBarNotification?, iconDrawable: Drawable?, - it: (Bitmap) -> Unit - ) = runInSafe(msg = "GetSmallIconOnSet") { + it: (Drawable, Boolean) -> Unit + ) = runInSafe(msg = "compatStatusIcon") { if (iconDrawable == null) return@runInSafe - /** 如果没开启修复 APP 的彩色图标 */ - if (!prefs.getBoolean(ENABLE_COLOR_ICON_HOOK, default = true)) return@runInSafe /** 获取通知对象 - 由于 MIUI 的版本迭代不规范性可能是空的 */ expandedNf?.also { notifyInstance -> /** 判断是 MIUI 样式就停止 Hook */ if (context.isMiuiNotifyStyle) { - it(notifyInstance.findAppIcon(context).toBitmap()) + it(notifyInstance.findAppIcon(context), true) return@runInSafe } /** 判断是否不是灰度图标 */ @@ -342,9 +367,11 @@ class HookEntry : YukiHookXposedInitProxy { printLogcat(tag = "StatusIcon", context, notifyInstance, isCustom = customIcon != null, !isNotGrayscaleIcon) when { /** 处理自定义通知图标优化 */ - customIcon != null -> it(customIcon) + customIcon != null -> it(BitmapDrawable(context.resources, customIcon), true) /** 若不是灰度图标自动处理为圆角 */ - isNotGrayscaleIcon -> it(notifyInstance.compatNotifyIcon(context, iconDrawable).toBitmap()) + isNotGrayscaleIcon -> it(notifyInstance.compatNotifyIcon(context, iconDrawable), true) + /** 否则返回原始小图标 */ + else -> it(notifyInstance.notification.smallIcon.loadDrawable(context), false) } } } @@ -356,18 +383,18 @@ class HookEntry : YukiHookXposedInitProxy { * @param context 实例 * @param expandedNf 通知实例 * @param iconImageView 通知图标实例 + * @param origColor 通知图标系统默认颜色 - Android >= 12 * @param isExpanded 通知是否展开 - 可做最小化通知处理 */ - private fun PackageParam.hookNotifyIconOnSet( + private fun PackageParam.compatNotifyIcon( context: Context, expandedNf: StatusBarNotification?, iconImageView: ImageView, + origColor: Int, isExpanded: Boolean - ) = runInSafe(msg = "AutoSetAppIconOnSet") { + ) = runInSafe(msg = "compatNotifyIcon") { /** 判断是 MIUI 样式就停止 Hook */ if (context.isMiuiNotifyStyle) return@runInSafe - /** 如果没开启修复 APP 的彩色图标 */ - if (!prefs.getBoolean(ENABLE_COLOR_ICON_HOOK, default = true)) return@runInSafe /** 获取通知对象 - 由于 MIUI 的版本迭代不规范性可能是空的 */ expandedNf?.let { notifyInstance -> @@ -410,26 +437,32 @@ class HookEntry : YukiHookXposedInitProxy { /** 打印日志 */ printLogcat(tag = "NotifyIcon", context, notifyInstance, isCustom = customIcon != null, isGrayscaleIcon) /** 处理自定义通知图标优化 */ - if (customIcon != null) - iconImageView.apply { - /** 设置自定义小图标 */ - setImageBitmap(customIcon) - /** 上色 */ - setColorFilter(if (isUpperOfAndroidS || customIconColor == 0) supportColor else customIconColor) - /** Android 12 设置图标外圈颜色 */ - if (isUpperOfAndroidS && customIconColor != 0) - background = DrawableBuilder().rounded().solidColor(customIconColor).build() - } - else { + if (customIcon != null) iconImageView.apply { + /** 设置不要裁切到边界 */ + clipToOutline = false + /** 设置自定义小图标 */ + setImageBitmap(customIcon) + /** 上色 */ + setColorFilter(if (isUpperOfAndroidS || customIconColor == 0) supportColor else customIconColor) + /** Android 12 设置图标外圈颜色 */ + if (isUpperOfAndroidS && customIconColor != 0) + background = DrawableBuilder().rounded().solidColor(customIconColor).build() + /** 设置原生的背景边距 */ + if (isUpperOfAndroidS) setPadding(4.dp(context), 4.dp(context), 4.dp(context), 4.dp(context)) + } else { /** 重新设置图标 - 防止系统更改它 */ iconImageView.setImageDrawable(iconDrawable) /** 判断如果是灰度图标就给他设置一个白色颜色遮罩 */ if (isGrayscaleIcon) iconImageView.apply { + /** 设置不要裁切到边界 */ + clipToOutline = false /** 设置图标着色 */ setColorFilter(supportColor) /** Android 12 设置图标外圈颜色 */ - if (isUpperOfAndroidS && hasIconColor) - background = DrawableBuilder().rounded().solidColor(iconColor).build() + if (isUpperOfAndroidS) background = + DrawableBuilder().rounded().solidColor(if (hasIconColor) iconColor else origColor).build() + /** 设置原生的背景边距 */ + if (isUpperOfAndroidS) setPadding(4.dp(context), 4.dp(context), 4.dp(context), 4.dp(context)) } else iconImageView.apply { /** 重新设置图标 */ setImageDrawable(notifyInstance.compatNotifyIcon(context, iconDrawable)) @@ -444,10 +477,14 @@ class HookEntry : YukiHookXposedInitProxy { ) } } - /** 清除原生的背景边距设置 */ - if (isUpperOfAndroidS) setPadding(0, 0, 0, 0) - /** 清除原生的主题色背景圆圈颜色 */ - if (isUpperOfAndroidS) background = null + if (isUpperOfAndroidS) { + /** 清除原生的背景边距 */ + setPadding(0, 0, 0, 0) + /** 清除原生的主题色背景圆圈颜色 */ + background = null + } + /** 清除遮罩颜色 */ + colorFilter = null } } } @@ -462,28 +499,26 @@ class HookEntry : YukiHookXposedInitProxy { * @return [Boolean] 是否忽略通知图标颜色 */ private fun PackageParam.hasIgnoreStatusBarIconColor(context: Context, expandedNf: StatusBarNotification?) = - if (!context.isMiuiNotifyStyle) - if (prefs.getBoolean(ENABLE_COLOR_ICON_HOOK, default = true)) safeOfFalse { - /** 获取通知对象 - 由于 MIUI 的版本迭代不规范性可能是空的 */ - expandedNf?.let { notifyInstance -> - /** 获取通知小图标 */ - val iconDrawable = notifyInstance.notification.smallIcon.loadDrawable(context) + if (!context.isMiuiNotifyStyle) safeOfFalse { + /** 获取通知对象 - 由于 MIUI 的版本迭代不规范性可能是空的 */ + expandedNf?.let { notifyInstance -> + /** 获取通知小图标 */ + val iconDrawable = notifyInstance.notification.smallIcon.loadDrawable(context) - /** 判断是否不是灰度图标 */ - val isNotGrayscaleIcon = notifyInstance.isXmsf || !isGrayscaleIcon(context, iconDrawable) + /** 判断是否不是灰度图标 */ + val isNotGrayscaleIcon = notifyInstance.isXmsf || !isGrayscaleIcon(context, iconDrawable) - /** 获取目标修复彩色图标的 APP */ - val isTargetFixApp = compatCustomIcon(!isNotGrayscaleIcon, notifyInstance.opPkgName).first != null - /** - * 只要不是灰度就返回彩色图标 - * 否则不对颜色进行反色处理防止一些系统图标出现异常 - */ - (if (isTargetFixApp) false else isNotGrayscaleIcon).also { - printLogcat(tag = "IconColor", context, expandedNf, isTargetFixApp, !isNotGrayscaleIcon) - } - } ?: true.also { printLogcat(tag = "IconColor", context, expandedNf = null, isCustom = false, isGrayscale = false) } - } else false.also { printLogcat(tag = "IconColor", context, expandedNf, isCustom = false, isGrayscale = true) } - else true.also { printLogcat(tag = "IconColor", context, expandedNf, isCustom = false, isGrayscale = false) } + /** 获取目标修复彩色图标的 APP */ + val isTargetFixApp = compatCustomIcon(!isNotGrayscaleIcon, notifyInstance.opPkgName).first != null + /** + * 只要不是灰度就返回彩色图标 + * 否则不对颜色进行反色处理防止一些系统图标出现异常 + */ + (if (isTargetFixApp) false else isNotGrayscaleIcon).also { + printLogcat(tag = "IconColor", context, expandedNf, isTargetFixApp, !isNotGrayscaleIcon) + } + } ?: true.also { printLogcat(tag = "IconColor", context, expandedNf = null, isCustom = false, isGrayscale = false) } + } else true.also { printLogcat(tag = "IconColor", context, expandedNf, isCustom = false, isGrayscale = false) } /** 缓存图标数据 */ private fun PackageParam.cachingIconDatas() { @@ -496,6 +531,14 @@ class HookEntry : YukiHookXposedInitProxy { } } + /** 刷新缓存数据 */ + private fun PackageParam.recachingPrefs() { + prefs.clearCache() + cachingIconDatas() + refreshStatusBarIcons() + refreshNotificationIcons() + } + override fun onInit() = configs { debugTag = "MIUINativeNotifyIcon" isDebug = false @@ -550,15 +593,15 @@ class HookEntry : YukiHookXposedInitProxy { (globalContext ?: firstArgs as Context).also { context -> val expandedNf = args[if (isUseLegacy) 1 else 0] as? StatusBarNotification? /** Hook 状态栏小图标 */ - hookSmallIconOnSet( + compatStatusIcon( context = context, expandedNf, (result as Icon).loadDrawable(context) - ) { icon -> result = Icon.createWithBitmap(icon) } - /** 刷新图标缓存 */ + ) { icon, isReplace -> if (isReplace) result = Icon.createWithBitmap(icon.toBitmap()) } + /** 刷新缓存 */ if (expandedNf?.compatOpPkgName == MODULE_PACKAGE_NAME && expandedNf.notification?.channelId == IconRuleManagerTool.NOTIFY_CHANNEL - ) cachingIconDatas() + ) recachingPrefs() } } } @@ -594,13 +637,29 @@ class HookEntry : YukiHookXposedInitProxy { } } } + /** 记录实例 */ + injectMember { + method { + name = "setNotification" + param(StatusBarNotificationClass) + }.remedys { + method { + name = "setNotification" + param(ExpandedNotificationClass.clazz) + } + } + afterHook { if (firstArgs != null) statusBarIconViews.add(instance()) } + } } NotificationIconContainerClass.hook { injectMember { method { name = "calculateIconTranslations" } afterHook { - /** 修复最新开发版状态栏图标只能显示一个的问题 */ - instance().layoutParams.width = 9999 + /** 修复部分开发版状态栏图标只能显示一个的问题 */ + when (miuiIncrementalVersion.lowercase()) { + "22.3.14", "22.3.15", "22.3.16", "v13.0.1.1.16.dev", "22.3.18" -> + instance().layoutParams.width = 9999 + } } } injectMember { @@ -637,6 +696,12 @@ class HookEntry : YukiHookXposedInitProxy { method { name = "handleHeaderViews" } else method { name = "resolveHeaderViews" } afterHook { + /** 获取通知图标系统默认颜色 */ + val origColor = + NotificationHeaderViewWrapperClass.clazz.method { name = "getOriginalIconColor" } + .ignoredError() + .get(instance).invoke() ?: 0 + /** 获取小图标 */ val iconImageView = NotificationHeaderViewWrapperClass.clazz @@ -674,13 +739,14 @@ class HookEntry : YukiHookXposedInitProxy { /** 非最小化优先级的通知全部设置为展开状态 */ if (importance != 1) isExpanded = true /** 执行 Hook */ - hookNotifyIconOnSet(iconImageView.context, expandedNf, iconImageView, isExpanded) - /** 刷新图标缓存 */ - if (expandedNf?.compatOpPkgName == MODULE_PACKAGE_NAME && - expandedNf.notification?.channelId == IconRuleManagerTool.NOTIFY_CHANNEL - ) cachingIconDatas() + compatNotifyIcon(iconImageView.context, expandedNf, iconImageView, origColor, isExpanded) } } + /** 记录实例 */ + injectMember { + constructor { param(ContextClass, ViewClass, ExpandableNotificationRowClass.clazz) } + afterHook { notificationViewWrappers.add(instance) } + } } /** 干掉下拉通知图标自动设置回 APP 图标的方法 */ NotificationHeaderViewWrapperInjectorClass.hook { diff --git a/app/src/main/java/com/fankes/miui/notify/ui/activity/ConfigureActivity.kt b/app/src/main/java/com/fankes/miui/notify/ui/activity/ConfigureActivity.kt index 95aa80e..ae02f1f 100644 --- a/app/src/main/java/com/fankes/miui/notify/ui/activity/ConfigureActivity.kt +++ b/app/src/main/java/com/fankes/miui/notify/ui/activity/ConfigureActivity.kt @@ -149,13 +149,13 @@ class ConfigureActivity : BaseActivity() { if (!btn.isPressed) return@setOnCheckedChangeListener putAppNotifyHookOf(it, b) holder.adpAppAllSwitch.isEnabled = b - SystemUITool.showNeedRestartSnake(context = this@ConfigureActivity) + SystemUITool.refreshSystemUI(context = this@ConfigureActivity) } holder.adpAppAllSwitch.isChecked = isAppNotifyHookAllOf(it) holder.adpAppAllSwitch.setOnCheckedChangeListener { btn, b -> if (!btn.isPressed) return@setOnCheckedChangeListener putAppNotifyHookAllOf(it, b) - SystemUITool.showNeedRestartSnake(context = this@ConfigureActivity) + SystemUITool.refreshSystemUI(context = this@ConfigureActivity) } } return cView!! @@ -182,14 +182,6 @@ class ConfigureActivity : BaseActivity() { mockLocalData() /** 更新数据 */ when { - intent?.getBooleanExtra("isShowNeedRestart", false) == true -> - showDialog { - title = "规则列表已同步至最新" - msg = "同步完成,部分通知图标可能需要重新启动系统界面才能生效。" - confirmButton(text = "重新启动") { SystemUITool.restartSystemUI(context) } - cancelButton() - noCancelable() - } intent?.getBooleanExtra("isNewAppSupport", false) == true -> showDialog { val appName = intent?.getStringExtra("appName") ?: "" @@ -209,7 +201,6 @@ class ConfigureActivity : BaseActivity() { } /** 清除数据 */ intent?.apply { - removeExtra("isShowNeedRestart") removeExtra("isNewAppSupport") removeExtra("isShowUpdDialog") } 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 0d3cb06..2c18ce2 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 @@ -36,7 +36,6 @@ import com.fankes.miui.notify.R import com.fankes.miui.notify.databinding.ActivityMainBinding import com.fankes.miui.notify.databinding.DiaStatusIconCountBinding import com.fankes.miui.notify.hook.HookConst.ENABLE_COLOR_ICON_COMPAT -import com.fankes.miui.notify.hook.HookConst.ENABLE_COLOR_ICON_HOOK import com.fankes.miui.notify.hook.HookConst.ENABLE_HIDE_ICON import com.fankes.miui.notify.hook.HookConst.ENABLE_HOOK_STATUS_ICON_COUNT import com.fankes.miui.notify.hook.HookConst.ENABLE_MODULE @@ -151,10 +150,7 @@ class MainActivity : BaseActivity() { var statusBarIconCount = modulePrefs.getInt(HOOK_STATUS_ICON_COUNT, default = 5) binding.colorIconHookItem.isVisible = modulePrefs.getBoolean(ENABLE_MODULE, default = true) binding.statusIconCountItem.isVisible = modulePrefs.getBoolean(ENABLE_MODULE, default = true) - binding.colorIconCompatSwitch.isVisible = modulePrefs.getBoolean(ENABLE_COLOR_ICON_HOOK, default = true) - binding.colorIconCompatText.isVisible = modulePrefs.getBoolean(ENABLE_COLOR_ICON_HOOK, default = true) - binding.notifyIconConfigItem.isVisible = modulePrefs.getBoolean(ENABLE_MODULE, default = true) && - modulePrefs.getBoolean(ENABLE_COLOR_ICON_HOOK, default = true) + binding.notifyIconConfigItem.isVisible = modulePrefs.getBoolean(ENABLE_MODULE, default = true) binding.notifyIconFixButton.isVisible = modulePrefs.getBoolean(ENABLE_NOTIFY_ICON_FIX, default = true) binding.notifyIconFixNotifyItem.isVisible = modulePrefs.getBoolean(ENABLE_NOTIFY_ICON_FIX, default = true) binding.statusIconCountSwitch.isChecked = modulePrefs.getBoolean(ENABLE_HOOK_STATUS_ICON_COUNT, default = true) @@ -162,7 +158,6 @@ class MainActivity : BaseActivity() { binding.moduleEnableSwitch.isChecked = modulePrefs.getBoolean(ENABLE_MODULE, default = true) binding.moduleEnableLogSwitch.isChecked = modulePrefs.getBoolean(ENABLE_MODULE_LOG) binding.hideIconInLauncherSwitch.isChecked = modulePrefs.getBoolean(ENABLE_HIDE_ICON) - binding.colorIconHookSwitch.isChecked = modulePrefs.getBoolean(ENABLE_COLOR_ICON_HOOK, default = true) binding.colorIconCompatSwitch.isChecked = modulePrefs.getBoolean(ENABLE_COLOR_ICON_COMPAT) binding.notifyIconFixSwitch.isChecked = modulePrefs.getBoolean(ENABLE_NOTIFY_ICON_FIX, default = true) binding.notifyIconFixNotifySwitch.isChecked = modulePrefs.getBoolean(ENABLE_NOTIFY_ICON_FIX_NOTIFY, default = true) @@ -173,7 +168,7 @@ class MainActivity : BaseActivity() { binding.moduleEnableLogSwitch.isVisible = b binding.colorIconHookItem.isVisible = b binding.statusIconCountItem.isVisible = b - binding.notifyIconConfigItem.isVisible = b && binding.colorIconHookSwitch.isChecked + binding.notifyIconConfigItem.isVisible = b SystemUITool.showNeedRestartSnake(context = this) } binding.moduleEnableLogSwitch.setOnCheckedChangeListener { btn, b -> @@ -196,30 +191,22 @@ class MainActivity : BaseActivity() { binding.statusIconCountChildItem.isVisible = b SystemUITool.showNeedRestartSnake(context = this) } - binding.colorIconHookSwitch.setOnCheckedChangeListener { btn, b -> - if (!btn.isPressed) return@setOnCheckedChangeListener - modulePrefs.putBoolean(ENABLE_COLOR_ICON_HOOK, b) - binding.notifyIconConfigItem.isVisible = b - binding.colorIconCompatSwitch.isVisible = b - binding.colorIconCompatText.isVisible = b - SystemUITool.showNeedRestartSnake(context = this) - } binding.colorIconCompatSwitch.setOnCheckedChangeListener { btn, b -> if (!btn.isPressed) return@setOnCheckedChangeListener modulePrefs.putBoolean(ENABLE_COLOR_ICON_COMPAT, b) - SystemUITool.showNeedRestartSnake(context = this) + SystemUITool.refreshSystemUI(context = this) } binding.notifyIconFixSwitch.setOnCheckedChangeListener { btn, b -> if (!btn.isPressed) return@setOnCheckedChangeListener modulePrefs.putBoolean(ENABLE_NOTIFY_ICON_FIX, b) binding.notifyIconFixButton.isVisible = b binding.notifyIconFixNotifyItem.isVisible = b - SystemUITool.showNeedRestartSnake(context = this) + SystemUITool.refreshSystemUI(context = this) } binding.notifyIconFixNotifySwitch.setOnCheckedChangeListener { btn, b -> if (!btn.isPressed) return@setOnCheckedChangeListener modulePrefs.putBoolean(ENABLE_NOTIFY_ICON_FIX_NOTIFY, b) - SystemUITool.showNeedRestartSnake(context = this) + SystemUITool.refreshSystemUI(context = this) } /** 通知图标优化名单按钮点击事件 */ binding.notifyIconFixButton.setOnClickListener { navigate() } 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 12c12c4..21c1a31 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 @@ -152,12 +152,18 @@ val miuiVersion */ val miuiVersionCode get() = safeOf(default = 0f) { miuiVersion.toFloat() } +/** + * 获取 MIUI 次版本号 + * @return [String] + */ +val miuiIncrementalVersion get() = findPropString(key = "ro.system.build.version.incremental").trim() + /** * 获取 MIUI 完全版本 * @return [String] */ val miuiFullVersion - get() = if (isMIUI) findPropString(key = "ro.system.build.version.incremental").let { + get() = if (isMIUI) miuiIncrementalVersion.let { if (it.lowercase().contains("a") || it.lowercase().contains("b") || it.lowercase().contains("c") || 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 df565e1..df1cac3 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 @@ -141,7 +141,7 @@ object IconRuleManagerTool { dataJson2 = jsonString.takeIf { params.isJsonArray(it) } ?: "[$jsonString]" ) ) - pushWithRefresh(context) + pushAndNotifyRefresh(context) it() } else -> context.snake(msg = "请输入有效内容") @@ -154,7 +154,7 @@ object IconRuleManagerTool { jsonString.isNotBlank() && params.isNotVaildJson(jsonString) -> context.snake(msg = "不是有效的 JSON 数据") jsonString.isNotBlank() -> { params.save(dataJson = jsonString.takeIf { params.isJsonArray(it) } ?: "[$jsonString]") - pushWithRefresh(context) + pushAndNotifyRefresh(context) it() } else -> context.snake(msg = "请输入有效内容") @@ -218,7 +218,7 @@ object IconRuleManagerTool { params.isCompareDifferent(it) -> { params.save(it) pushNotify(context, title = "同步完成", msg = "已更新通知图标优化名单,点击查看") - pushWithRefresh(context) + pushAndNotifyRefresh(context) it() } else -> (if (context is AppCompatActivity) context.snake(msg = "列表数据已是最新")) @@ -267,7 +267,7 @@ object IconRuleManagerTool { params.isCompareDifferent(content) -> { params.save(content) pushNotify(context, title = "同步完成", msg = "已更新通知图标优化名单,点击查看") - pushWithRefresh(context) + pushAndNotifyRefresh(context) it() } else -> (if (context is AppCompatActivity) context.snake(msg = "列表数据已是最新")) @@ -360,16 +360,35 @@ object IconRuleManagerTool { }) }.onFailure { it(false, "URL 无效") } + /** + * 刷新系统界面状态栏与通知图标 + * @param context 实例 + */ + fun refreshSystemUI(context: Context) { + if (context !is AppCompatActivity) return + context.showDialog { + title = "请稍后" + progressContent = "正在刷新系统界面改变" + /** 发送通知提醒宿主更新图标缓存 */ + pushNotify(appContext, title = "请稍后", msg = "正在等待系统界面响应", isAction = false) + /** 刷新成功后取消通知 */ + Handler().postDelayed({ + context.getSystemService()?.cancel(1) + cancel() + }, 500) + noCancelable() + } + } + /** * 推送通知图标更新通知 * @param context 实例 */ - private fun pushWithRefresh(context: Context) { + private fun pushAndNotifyRefresh(context: Context) { if (context !is AppCompatActivity) return SystemUITool.showNeedUpdateApplySnake(context) - pushNotify(appContext, title = "更新完成", msg = "部分通知图标需要重启系统界面生效", isAction = false) - /** 刷新成功后取消通知 */ - Handler().postDelayed({ context.getSystemService()?.cancel(1) }, 1500) + /** 刷新改变 */ + refreshSystemUI(context) } /** @@ -404,16 +423,14 @@ object IconRuleManagerTool { setContentText(msg) color = OS_COLOR.toInt() setAutoCancel(true) - setSmallIcon(R.drawable.ic_nf_icon_update) + setSmallIcon(if (isAction) R.drawable.ic_nf_icon_update else R.drawable.ic_nf_icon_refresh) setSound(null) setDefaults(NotificationCompat.DEFAULT_ALL) if (isAction) setContentIntent( PendingIntent.getActivity( context, msg.hashCode(), - Intent(context, ConfigureActivity::class.java).apply { - putExtra("isShowNeedRestart", true) - putExtra("isShowUpdDialog", false) - }, if (Build.VERSION.SDK_INT < 31) PendingIntent.FLAG_UPDATE_CURRENT else PendingIntent.FLAG_IMMUTABLE + Intent(context, ConfigureActivity::class.java).apply { putExtra("isShowUpdDialog", false) }, + if (Build.VERSION.SDK_INT < 31) PendingIntent.FLAG_UPDATE_CURRENT else PendingIntent.FLAG_IMMUTABLE ) ) }.build()) 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 3490159..d355100 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 @@ -51,6 +51,12 @@ object SystemUITool { cancelButton() } + /** + * 刷新系统界面状态栏与通知图标 + * @param context 实例 + */ + fun refreshSystemUI(context: Context) = IconRuleManagerTool.refreshSystemUI(context) + /** * 显示需要重启系统界面的 [Snackbar] * @param context 实例 @@ -68,6 +74,6 @@ object SystemUITool { if (isXposedModuleActive) if (isNotNoificationEnabled) context.snake(msg = "无通知权限,请重启系统界面使更改生效", actionText = "立即重启") { restartSystemUI(context) } - else context.snake(msg = "数据已更新,已推送的通知将在下次生效", actionText = "立即重启") { restartSystemUI(context) } + else context.snake(msg = "通知图标优化名单已完成同步") else context.snake(msg = "模块没有激活,更改不会生效") } \ 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 new file mode 100644 index 0000000..a75eeda --- /dev/null +++ b/app/src/main/res/drawable/ic_nf_icon_refresh.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable/ic_nf_icon_update.xml b/app/src/main/res/drawable/ic_nf_icon_update.xml index 684336c..3691ec4 100644 --- a/app/src/main/res/drawable/ic_nf_icon_update.xml +++ b/app/src/main/res/drawable/ic_nf_icon_update.xml @@ -1,5 +1,11 @@ - - + + + diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index 184b6fc..1382d4e 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -419,35 +419,15 @@ android:textSize="12sp" /> - - - -