diff --git a/.idea/misc.xml b/.idea/misc.xml
index 31799fa..0bc73e6 100644
--- a/.idea/misc.xml
+++ b/.idea/misc.xml
@@ -10,7 +10,7 @@
-
+
diff --git a/app/build.gradle b/app/build.gradle
index d9c61df..c42fff7 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -30,7 +30,7 @@ android {
buildTypes {
release {
- minifyEnabled false
+ minifyEnabled true
signingConfig signingConfigs.debug
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
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 151676c..2247c51 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
@@ -30,6 +30,7 @@ object HookConst {
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 SYSTEMUI_PACKAGE_NAME = "com.android.systemui"
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 aaf7963..476e11c 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
@@ -34,6 +34,7 @@ import android.view.View
import android.view.ViewOutlineProvider
import android.widget.ImageView
import androidx.core.graphics.drawable.toBitmap
+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_MODULE
import com.fankes.miui.notify.hook.HookConst.ENABLE_MODULE_LOG
@@ -51,6 +52,7 @@ 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.java.IntType
import com.highcapable.yukihookapi.hook.xposed.proxy.YukiHookXposedInitProxy
@@ -78,6 +80,9 @@ class HookEntry : YukiHookXposedInitProxy {
/** 未确定是否只有旧版本存在的类 */
private const val ExpandableNotificationRowClass = "$SYSTEMUI_PACKAGE_NAME.statusbar.ExpandableNotificationRow"
+ /** 原生存在的类 */
+ private const val ContrastColorUtilClass = "com.android.internal.util.ContrastColorUtil"
+
/** 根据多个版本存在不同的包名相同的类 */
private val NotificationUtilClass = VariousClass(
"$SYSTEMUI_PACKAGE_NAME.statusbar.notification.NotificationUtil",
@@ -94,11 +99,23 @@ class HookEntry : YukiHookXposedInitProxy {
/**
* - 这个是修复彩色图标的关键核心代码判断
*
- * 判断是否为灰度图标 - [isXmsf] 直接标记为非灰度图标防止 💩 MIUI 乱改
+ * 判断是否为灰度图标 - 反射执行系统方法
+ * @param context 实例
* @param drawable 要判断的图标
* @return [Boolean]
*/
- private fun StatusBarNotification.isGrayscaleIcon(drawable: Drawable) = !isXmsf && BitmapCompatTool.isGrayscaleDrawable(drawable)
+ private fun PackageParam.isGrayscaleIcon(context: Context, drawable: Drawable) =
+ if (!prefs.getBoolean(ENABLE_COLOR_ICON_COMPAT)) safeOfFalse {
+ ContrastColorUtilClass.clazz.let {
+ it.method {
+ name = "isGrayscaleIcon"
+ param(DrawableClass)
+ }.get(it.method {
+ name = "getInstance"
+ param(ContextClass)
+ }.get().invoke(context)).invoke(drawable) ?: false
+ }
+ } else BitmapCompatTool.isGrayscaleDrawable(drawable)
/**
* 是否为新版本 MIUI 方案
@@ -212,7 +229,7 @@ class HookEntry : YukiHookXposedInitProxy {
/** 获取通知对象 - 由于 MIUI 的版本迭代不规范性可能是空的 */
expandedNf?.also { notifyInstance ->
/** 判断是否不是灰度图标 */
- val isNotGrayscaleIcon = !notifyInstance.isGrayscaleIcon(iconDrawable)
+ val isNotGrayscaleIcon = notifyInstance.isXmsf || !isGrayscaleIcon(context, iconDrawable)
/** 目标彩色通知 APP 图标 */
var customIcon: Bitmap? = null
@@ -283,7 +300,7 @@ class HookEntry : YukiHookXposedInitProxy {
val iconDrawable = notifyInstance.notification.smallIcon.loadDrawable(context)
/** 判断图标风格 */
- val isGrayscaleIcon = notifyInstance.isGrayscaleIcon(iconDrawable)
+ val isGrayscaleIcon = !notifyInstance.isXmsf && isGrayscaleIcon(context, iconDrawable)
/** 自定义默认小图标 */
var customIcon: Bitmap? = null
@@ -366,7 +383,7 @@ class HookEntry : YukiHookXposedInitProxy {
notifyInstance.notification.smallIcon.loadDrawable(context)
/** 判断是否不是灰度图标 */
- val isNotGrayscaleIcon = !notifyInstance.isGrayscaleIcon(iconDrawable)
+ val isNotGrayscaleIcon = notifyInstance.isXmsf || !isGrayscaleIcon(context, iconDrawable)
/** 获取目标修复彩色图标的 APP */
var isTargetFixApp = false
diff --git a/app/src/main/java/com/fankes/miui/notify/ui/MainActivity.kt b/app/src/main/java/com/fankes/miui/notify/ui/MainActivity.kt
index 360dd99..6e6a293 100644
--- a/app/src/main/java/com/fankes/miui/notify/ui/MainActivity.kt
+++ b/app/src/main/java/com/fankes/miui/notify/ui/MainActivity.kt
@@ -37,6 +37,7 @@ import androidx.constraintlayout.utils.widget.ImageFilterView
import androidx.core.view.isVisible
import com.fankes.miui.notify.BuildConfig
import com.fankes.miui.notify.R
+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_MODULE
@@ -115,10 +116,14 @@ class MainActivity : BaseActivity() {
val notifyIconConfigItem = findViewById(R.id.config_item_notify)
val hideIconInLauncherSwitch = findViewById(R.id.hide_icon_in_launcher_switch)
val colorIconHookSwitch = findViewById(R.id.color_icon_fix_switch)
+ val colorIconCompatSwitch = findViewById(R.id.color_icon_compat_switch)
+ val colorIconCompatText = findViewById(R.id.color_icon_compat_text)
val notifyIconFixSwitch = findViewById(R.id.notify_icon_fix_switch)
val notifyIconFixButton = findViewById(R.id.config_notify_app_button)
/** 获取 Sp 存储的信息 */
colorIconHookItem.isVisible = modulePrefs.getBoolean(ENABLE_MODULE, default = true)
+ colorIconCompatSwitch.isVisible = modulePrefs.getBoolean(ENABLE_COLOR_ICON_HOOK, default = true)
+ colorIconCompatText.isVisible = modulePrefs.getBoolean(ENABLE_COLOR_ICON_HOOK, default = true)
notifyIconConfigItem.isVisible = modulePrefs.getBoolean(ENABLE_MODULE, default = true) &&
modulePrefs.getBoolean(ENABLE_COLOR_ICON_HOOK, default = true)
moduleEnableLogSwitch.isVisible = modulePrefs.getBoolean(ENABLE_MODULE, default = true)
@@ -127,6 +132,7 @@ class MainActivity : BaseActivity() {
moduleEnableLogSwitch.isChecked = modulePrefs.getBoolean(ENABLE_MODULE_LOG, default = false)
hideIconInLauncherSwitch.isChecked = modulePrefs.getBoolean(ENABLE_HIDE_ICON)
colorIconHookSwitch.isChecked = modulePrefs.getBoolean(ENABLE_COLOR_ICON_HOOK, default = true)
+ colorIconCompatSwitch.isChecked = modulePrefs.getBoolean(ENABLE_COLOR_ICON_COMPAT)
notifyIconFixSwitch.isChecked = modulePrefs.getBoolean(ENABLE_NOTIFY_ICON_FIX, default = true)
moduleEnableSwitch.setOnCheckedChangeListener { btn, b ->
if (!btn.isPressed) return@setOnCheckedChangeListener
@@ -154,6 +160,13 @@ class MainActivity : BaseActivity() {
if (!btn.isPressed) return@setOnCheckedChangeListener
modulePrefs.putBoolean(ENABLE_COLOR_ICON_HOOK, b)
notifyIconConfigItem.isVisible = b
+ colorIconCompatSwitch.isVisible = b
+ colorIconCompatText.isVisible = b
+ SystemUITool.showNeedRestartSnake(context = this)
+ }
+ colorIconCompatSwitch.setOnCheckedChangeListener { btn, b ->
+ if (!btn.isPressed) return@setOnCheckedChangeListener
+ modulePrefs.putBoolean(ENABLE_COLOR_ICON_COMPAT, b)
SystemUITool.showNeedRestartSnake(context = this)
}
notifyIconFixSwitch.setOnCheckedChangeListener { btn, b ->
diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml
index e383432..77ab1e8 100644
--- a/app/src/main/res/layout/activity_main.xml
+++ b/app/src/main/res/layout/activity_main.xml
@@ -220,6 +220,26 @@
android:text="此选项默认开启,开启后将自动对 APP 通知图标进行判断,保持高版本 API 的 APP 不规范的彩色图标不被着色为白、黑色块并对图标进行圆角优化,关闭后将按照 Android API 规范对 APP 通知进行图标着色,可能会出现着色为黑白、色块情况。"
android:textColor="@color/colorTextDark"
android:textSize="12sp" />
+
+
+
+