diff --git a/app/src/main/java/com/fankes/miui/notify/data/DataConst.kt b/app/src/main/java/com/fankes/miui/notify/data/DataConst.kt index fed56a6..619aa13 100644 --- a/app/src/main/java/com/fankes/miui/notify/data/DataConst.kt +++ b/app/src/main/java/com/fankes/miui/notify/data/DataConst.kt @@ -32,6 +32,7 @@ object DataConst { val ENABLE_HIDE_ICON = PrefsData("_hide_icon", false) val ENABLE_COLOR_ICON_COMPAT = PrefsData("_color_icon_compat", false) val ENABLE_NOTIFY_ICON_FIX = PrefsData("_notify_icon_fix", true) + val ENABLE_NOTIFY_ICON_FORCE_APP_ICON = PrefsData("_notify_icon_force_app_icon", false) val ENABLE_NOTIFY_ICON_FIX_NOTIFY = PrefsData("_notify_icon_fix_notify", true) val ENABLE_HOOK_STATUS_ICON_COUNT = PrefsData("_enable_hook_status_icon_count", true) val ENABLE_NOTIFY_ICON_FIX_AUTO = PrefsData("_enable_notify_icon_fix_auto", true) 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 ac72bfe..610ddd3 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 @@ -400,6 +400,35 @@ object SystemUIHooker : YukiBaseHooker() { isExpanded: Boolean = true, isUseAndroid12Style: Boolean = isUpperOfAndroidS, ) = runInSafe(msg = "compatNotifyIcon") { + /** + * 设置默认通知图标 + * @param drawable 通知图标 + */ + fun setDefaultNotifyIcon(drawable: Drawable?) { + iconImageView.apply { + /** 重新设置图标 */ + setImageDrawable(drawable) + /** 设置裁切到边界 */ + clipToOutline = true + /** 设置一个圆角轮廓裁切 */ + outlineProvider = object : ViewOutlineProvider() { + override fun getOutline(view: View, out: Outline) { + out.setRoundRect( + 0, 0, + view.width, view.height, 5.dpFloat(context) + ) + } + } + if (isUseAndroid12Style) { + /** 清除原生的背景边距 */ + setPadding(0, 0, 0, 0) + /** 清除原生的主题色背景圆圈颜色 */ + background = null + } + /** 清除遮罩颜色 */ + colorFilter = null + } + } /** 获取通知对象 - 由于 MIUI 的版本迭代不规范性可能是空的 */ expandedNf?.let { notifyInstance -> @@ -443,62 +472,45 @@ object SystemUIHooker : YukiBaseHooker() { /** 打印日志 */ printLogcat(tag = "NotifyIcon", context, notifyInstance, isCustom = customIcon != null, isGrayscaleIcon) /** 处理自定义通知图标优化 */ - if (customIcon != null) iconImageView.apply { - /** 设置不要裁切到边界 */ - clipToOutline = false - /** 设置自定义小图标 */ - setImageBitmap(customIcon) - /** 上色 */ - setColorFilter(if (isUseAndroid12Style || customIconColor == 0) supportColor else customIconColor) - /** Android 12 设置图标外圈颜色 */ - if (isUseAndroid12Style && customIconColor != 0) - background = DrawableBuilder() - .rounded() - .solidColor(if (context.isSystemInDarkMode) customIconColor.brighter else customIconColor) - .build() - /** 设置原生的背景边距 */ - if (isUseAndroid12Style) setPadding(4.dp(context), 4.dp(context), 4.dp(context), 4.dp(context)) - } else { - /** 重新设置图标 - 防止系统更改它 */ - iconImageView.setImageDrawable(iconDrawable) - /** 判断如果是灰度图标就给他设置一个白色颜色遮罩 */ - if (isGrayscaleIcon) iconImageView.apply { + when { + prefs.get(DataConst.ENABLE_NOTIFY_ICON_FORCE_APP_ICON) && isEnableHookColorNotifyIcon(isHooking = false) -> + setDefaultNotifyIcon(context.findAppIcon(notifyInstance.compatOpPkgName)) + customIcon != null -> iconImageView.apply { /** 设置不要裁切到边界 */ clipToOutline = false - /** 设置图标着色 */ - setColorFilter(supportColor) + /** 设置自定义小图标 */ + setImageBitmap(customIcon) + /** 上色 */ + setColorFilter(if (isUseAndroid12Style || customIconColor == 0) supportColor else customIconColor) /** Android 12 设置图标外圈颜色 */ - (if (hasIconColor) iconColor else context.systemAccentColor).also { - if (isUseAndroid12Style) - background = DrawableBuilder() - .rounded() - .solidColor(if (context.isSystemInDarkMode) it.brighter else it) - .build() - } + if (isUseAndroid12Style && customIconColor != 0) + background = DrawableBuilder() + .rounded() + .solidColor(if (context.isSystemInDarkMode) customIconColor.brighter else customIconColor) + .build() /** 设置原生的背景边距 */ if (isUseAndroid12Style) setPadding(4.dp(context), 4.dp(context), 4.dp(context), 4.dp(context)) - } else iconImageView.apply { - /** 重新设置图标 */ - setImageDrawable(notifyInstance.compatPushingIcon(context, iconDrawable)) - /** 设置裁切到边界 */ - clipToOutline = true - /** 设置一个圆角轮廓裁切 */ - outlineProvider = object : ViewOutlineProvider() { - override fun getOutline(view: View, out: Outline) { - out.setRoundRect( - 0, 0, - view.width, view.height, 5.dpFloat(context) - ) + } + else -> { + /** 重新设置图标 - 防止系统更改它 */ + iconImageView.setImageDrawable(iconDrawable) + /** 判断如果是灰度图标就给他设置一个白色颜色遮罩 */ + if (isGrayscaleIcon) iconImageView.apply { + /** 设置不要裁切到边界 */ + clipToOutline = false + /** 设置图标着色 */ + setColorFilter(supportColor) + /** Android 12 设置图标外圈颜色 */ + (if (hasIconColor) iconColor else context.systemAccentColor).also { + if (isUseAndroid12Style) + background = DrawableBuilder() + .rounded() + .solidColor(if (context.isSystemInDarkMode) it.brighter else it) + .build() } - } - if (isUseAndroid12Style) { - /** 清除原生的背景边距 */ - setPadding(0, 0, 0, 0) - /** 清除原生的主题色背景圆圈颜色 */ - background = null - } - /** 清除遮罩颜色 */ - colorFilter = null + /** 设置原生的背景边距 */ + if (isUseAndroid12Style) setPadding(4.dp(context), 4.dp(context), 4.dp(context), 4.dp(context)) + } else setDefaultNotifyIcon(notifyInstance.compatPushingIcon(context, iconDrawable)) } } } 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 3375e18..57aa87e 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 @@ -143,6 +143,7 @@ class MainActivity : BaseActivity() { binding.statusIconCountItem.isVisible = modulePrefs.get(DataConst.ENABLE_MODULE) binding.notifyIconConfigItem.isVisible = modulePrefs.get(DataConst.ENABLE_MODULE) binding.notifyIconFixButton.isVisible = modulePrefs.get(DataConst.ENABLE_NOTIFY_ICON_FIX) + binding.notifyIconForceAppIconItem.isVisible = modulePrefs.get(DataConst.ENABLE_NOTIFY_ICON_FIX) binding.notifyIconFixNotifyItem.isVisible = modulePrefs.get(DataConst.ENABLE_NOTIFY_ICON_FIX) binding.notifyIconAutoSyncItem.isVisible = modulePrefs.get(DataConst.ENABLE_NOTIFY_ICON_FIX) binding.statusIconCountSwitch.isChecked = modulePrefs.get(DataConst.ENABLE_HOOK_STATUS_ICON_COUNT) @@ -153,6 +154,7 @@ class MainActivity : BaseActivity() { binding.hideIconInLauncherSwitch.isChecked = modulePrefs.get(DataConst.ENABLE_HIDE_ICON) binding.colorIconCompatSwitch.isChecked = modulePrefs.get(DataConst.ENABLE_COLOR_ICON_COMPAT) binding.notifyIconFixSwitch.isChecked = modulePrefs.get(DataConst.ENABLE_NOTIFY_ICON_FIX) + binding.notifyIconForceAppIconSwitch.isChecked = modulePrefs.get(DataConst.ENABLE_NOTIFY_ICON_FORCE_APP_ICON) binding.notifyIconFixNotifySwitch.isChecked = modulePrefs.get(DataConst.ENABLE_NOTIFY_ICON_FIX_NOTIFY) binding.notifyIconAutoSyncSwitch.isChecked = modulePrefs.get(DataConst.ENABLE_NOTIFY_ICON_FIX_AUTO) binding.statusIconCountText.text = statusBarIconCount.toString() @@ -195,10 +197,27 @@ class MainActivity : BaseActivity() { if (btn.isPressed.not()) return@setOnCheckedChangeListener modulePrefs.put(DataConst.ENABLE_NOTIFY_ICON_FIX, b) binding.notifyIconFixButton.isVisible = b + binding.notifyIconForceAppIconItem.isVisible = b binding.notifyIconFixNotifyItem.isVisible = b binding.notifyIconAutoSyncItem.isVisible = b SystemUITool.refreshSystemUI(context = this) } + binding.notifyIconForceAppIconSwitch.setOnCheckedChangeListener { btn, b -> + if (btn.isPressed.not()) return@setOnCheckedChangeListener + fun saveState() { + modulePrefs.put(DataConst.ENABLE_NOTIFY_ICON_FORCE_APP_ICON, b) + SystemUITool.refreshSystemUI(context = this) + } + if (b) showDialog { + title = "破坏性功能警告" + msg = "开启这个功能后,任何通知栏中的通知图标都会被强制替换为当前推送通知的 APP 的图标," + + "某些系统级别的 APP 通知图标可能会显示异常或发生图标丢失。\n\n" + + "此功能仅面向一些追求图标美观度的用户,我们不推荐开启这个功能,且发生任何 BUG 都不会去修复,仍然继续开启吗?" + confirmButton { saveState() } + cancelButton { btn.isChecked = btn.isChecked.not() } + noCancelable() + } else saveState() + } binding.notifyIconFixNotifySwitch.setOnCheckedChangeListener { btn, b -> if (btn.isPressed.not()) return@setOnCheckedChangeListener modulePrefs.put(DataConst.ENABLE_NOTIFY_ICON_FIX_NOTIFY, b) diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index 0267ed6..11ce51c 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -541,6 +541,34 @@ android:textColor="@color/colorTextDark" android:textSize="12sp" /> + + + + + + +