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" /> + + + +