diff --git a/app/src/main/java/com/fankes/miui/notify/data/ConfigData.kt b/app/src/main/java/com/fankes/miui/notify/data/ConfigData.kt index 8e54494..753aade 100644 --- a/app/src/main/java/com/fankes/miui/notify/data/ConfigData.kt +++ b/app/src/main/java/com/fankes/miui/notify/data/ConfigData.kt @@ -66,6 +66,9 @@ object ConfigData { /** 启用通知图标优化 */ val ENABLE_NOTIFY_ICON_FIX = PrefsData("_notify_icon_fix", true) + /** 使用占位符修补未适配的通知图标 */ + val ENABLE_NOTIFY_ICON_FIX_PLACEHOLDER = PrefsData("_notify_icon_fix_placeholder", false) + /** 提醒未适配通知图标的新安装应用 */ val ENABLE_NOTIFY_ICON_FIX_NOTIFY = PrefsData("_notify_icon_fix_notify", true) @@ -274,6 +277,16 @@ object ConfigData { putBoolean(ENABLE_NOTIFY_ICON_FIX, value) } + /** + * 是否使用占位符修补未适配的通知图标 + * @return [Boolean] + */ + var isEnableNotifyIconFixPlaceholder + get() = getBoolean(ENABLE_NOTIFY_ICON_FIX_PLACEHOLDER) + set(value) { + putBoolean(ENABLE_NOTIFY_ICON_FIX_PLACEHOLDER, value) + } + /** * 是否提醒未适配通知图标的新安装应用 * @return [Boolean] 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 a8659ab..53f892d 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 @@ -46,6 +46,7 @@ import androidx.core.graphics.drawable.toBitmap import androidx.core.graphics.drawable.toDrawable import androidx.core.view.children import androidx.core.view.isVisible +import com.fankes.miui.notify.R import com.fankes.miui.notify.bean.IconDataBean import com.fankes.miui.notify.const.PackageName import com.fankes.miui.notify.data.ConfigData @@ -346,20 +347,24 @@ object SystemUIHooker : YukiBaseHooker() { * @param context 实例 * @param isGrayscaleIcon 是否为灰度图标 * @param packageName APP 包名 - * @return [Pair] - ([Drawable] 小图标,[Int] 颜色) + * @return [Triple] - ([Drawable] 小图标,[Int] 颜色,[Boolean] 是否为占位符图标) */ - private fun compatCustomIcon(context: Context, isGrayscaleIcon: Boolean, packageName: String): Pair { - var customPair: Pair? = null + private fun compatCustomIcon(context: Context, isGrayscaleIcon: Boolean, packageName: String): Triple { + /** 防止模块资源注入失败重新注入 */ + context.injectModuleAppResources() + var customPair: Triple? = null if (ConfigData.isEnableNotifyIconFix) run { iconDatas.takeIf { it.isNotEmpty() }?.forEach { if (packageName == it.packageName && isAppNotifyHookOf(it)) { if (isGrayscaleIcon.not() || isAppNotifyHookAllOf(it)) - customPair = Pair(it.iconBitmap.toDrawable(context.resources), it.iconColor) + customPair = Triple(it.iconBitmap.toDrawable(context.resources), it.iconColor, false) return@run } } + if (isGrayscaleIcon.not() && ConfigData.isEnableNotifyIconFixPlaceholder) + customPair = Triple(context.resources.drawableOf(R.drawable.ic_unsupported), 0, true) } - return customPair ?: Pair(null, 0) + return customPair ?: Triple(null, 0, false) } /** @@ -375,17 +380,17 @@ object SystemUIHooker : YukiBaseHooker() { expandedNf?.let { notifyInstance -> if (iconDrawable == null) return@let Pair(null, false) /** 判断是否不是灰度图标 */ - val isNotGrayscaleIcon = notifyInstance.isXmsf || isGrayscaleIcon(context, iconDrawable, notifyInstance).not() + val isGrayscaleIcon = notifyInstance.isXmsf.not() && isGrayscaleIcon(context, iconDrawable, notifyInstance) /** 目标彩色通知 APP 图标 */ - val customIcon = compatCustomIcon(context, isNotGrayscaleIcon.not(), notifyInstance.nfPkgName).first + val customIcon = compatCustomIcon(context, isGrayscaleIcon, notifyInstance.nfPkgName).first /** 打印日志 */ - printLogcat(tag = "StatusIcon", context, notifyInstance, isCustom = customIcon != null, isNotGrayscaleIcon.not()) + printLogcat(tag = "StatusIcon", context, notifyInstance, isCustom = customIcon != null, isGrayscaleIcon) when { /** 处理自定义通知图标优化 */ customIcon != null -> Pair(customIcon, true) /** 若不是灰度图标自动处理为圆角 */ - isNotGrayscaleIcon -> Pair(notifyInstance.compatPushingIcon(context, iconDrawable).rounded(context), true) + isGrayscaleIcon.not() -> Pair(notifyInstance.compatPushingIcon(context, iconDrawable).rounded(context), true) /** 否则返回原始小图标 */ else -> Pair(notifyInstance.notification.smallIcon.loadDrawable(context), false) } @@ -469,11 +474,13 @@ object SystemUIHooker : YukiBaseHooker() { val isGrayscaleIcon = notifyInstance.isXmsf.not() && isGrayscaleIcon(context, iconDrawable, notifyInstance) /** 自定义默认小图标 */ - var customIcon: Drawable? + var customIcon: Drawable? = null /** 自定义默认小图标颜色 */ - var customIconColor: Int + var customIconColor = 0 compatCustomIcon(context, isGrayscaleIcon, notifyInstance.nfPkgName).also { + /** 不处理占位符图标 */ + if (it.third) return@also customIcon = it.first customIconColor = if (isUseMaterial3Style || isExpanded) (it.second.takeIf { e -> e != 0 } ?: (if (isUseMaterial3Style) context.systemAccentColor else 0)) else 0 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 7268d1c..f0ced49 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 @@ -227,6 +227,7 @@ class MainActivity : BaseActivity() { binding.notifyIconFixSwitch.bind(ConfigData.ENABLE_NOTIFY_ICON_FIX) { onInitialize { binding.notifyIconFixButton.isVisible = it + binding.notifyIconFixPlaceholderItem.isVisible = it binding.notifyIconFixNotifyItem.isVisible = it binding.notifyIconAutoSyncItem.isVisible = it } @@ -235,6 +236,26 @@ class MainActivity : BaseActivity() { SystemUITool.refreshSystemUI(context = this@MainActivity) } } + binding.notifyIconFixPlaceholderSwitch.bind(ConfigData.ENABLE_NOTIFY_ICON_FIX_PLACEHOLDER) { + isAutoApplyChanges = false + onChanged { + /** 应用更改并刷新系统界面 */ + fun applyChangesAndRefresh() { + applyChanges() + SystemUITool.refreshSystemUI(context = this@MainActivity) + } + if (it) showDialog { + title = "注意" + msg = "开启这个功能后,当发现未适配的彩色通知图标时," + + "状态栏中显示的通知图标将会使用预置的占位符图标进行修补," + + "通知栏中显示的通知图标保持原始图标不变。\n\n" + + "此功能的作用仅为临时修复破坏规范的通知图标,仍然继续开启吗?" + confirmButton { applyChangesAndRefresh() } + cancelButton { cancelChanges() } + noCancelable() + } else applyChangesAndRefresh() + } + } binding.notifyIconFixNotifySwitch.bind(ConfigData.ENABLE_NOTIFY_ICON_FIX_NOTIFY) { onChanged { SystemUITool.refreshSystemUI(context = this@MainActivity, isRefreshCacheOnly = true) } } diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index 4c8de30..2016f99 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -979,6 +979,34 @@ android:textColor="@color/colorTextDark" android:textSize="12sp" /> + + + + + + +