From e651e39b1d5b5322a6e288d03d08f611f580d065 Mon Sep 17 00:00:00 2001 From: Fankesyooni Date: Mon, 31 Jan 2022 01:11:16 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E9=80=9A=E7=9F=A5=E5=9B=BE?= =?UTF-8?q?=E6=A0=87=E4=BC=98=E5=8C=96=E5=90=8D=E5=8D=95=E5=8A=9F=E8=83=BD?= =?UTF-8?q?=E5=B9=B6=E4=BC=98=E5=8C=96=E4=BB=A3=E7=A0=81=E5=92=8C=E7=9B=B8?= =?UTF-8?q?=E5=85=B3=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../fankes/miui/notify/bean/IconDataBean.kt | 5 +- .../com/fankes/miui/notify/hook/HookMain.kt | 57 +++++++++++-------- .../com/fankes/miui/notify/hook/HookMedium.kt | 9 +-- .../miui/notify/ui/ConfigureActivity.kt | 4 +- .../com/fankes/miui/notify/utils/Utils.kt | 6 ++ 5 files changed, 49 insertions(+), 32 deletions(-) diff --git a/app/src/main/java/com/fankes/miui/notify/bean/IconDataBean.kt b/app/src/main/java/com/fankes/miui/notify/bean/IconDataBean.kt index aae8fe9..252a035 100644 --- a/app/src/main/java/com/fankes/miui/notify/bean/IconDataBean.kt +++ b/app/src/main/java/com/fankes/miui/notify/bean/IconDataBean.kt @@ -21,6 +21,7 @@ package com.fankes.miui.notify.bean import android.graphics.Bitmap +import com.fankes.miui.notify.utils.base64 import java.io.Serializable /** @@ -35,4 +36,6 @@ data class IconDataBean( var packageName: String, var iconBitmap: Bitmap, var contributorName: String -) : Serializable \ No newline at end of file +) : Serializable { + override fun toString() = ("$appName$packageName").base64 +} \ No newline at end of file diff --git a/app/src/main/java/com/fankes/miui/notify/hook/HookMain.kt b/app/src/main/java/com/fankes/miui/notify/hook/HookMain.kt index 8ec179c..bd1ca0f 100644 --- a/app/src/main/java/com/fankes/miui/notify/hook/HookMain.kt +++ b/app/src/main/java/com/fankes/miui/notify/hook/HookMain.kt @@ -180,7 +180,7 @@ class HookMain : IXposedHookLoadPackage { IconPackParams.iconDatas.forEach { if ((notifyInstance.opPkgName == it.packageName || findAppName(notifyInstance) == it.appName) && - HookMedium.isAppNotifyHookOf(it.packageName) + HookMedium.isAppNotifyHookOf(it) ) { customIcon = Icon.createWithBitmap(it.iconBitmap) return@run @@ -210,6 +210,9 @@ class HookMain : IXposedHookLoadPackage { runWithoutError(error = "AutoSetAppIconOnSet") { /** 获取通知对象 - 由于 MIUI 的版本迭代不规范性可能是空的 */ (param.args?.get(if (isNew) 2 else 1) as? StatusBarNotification?)?.let { notifyInstance -> + /** 是否 Hook 彩色通知图标 */ + val isHookColorIcon = HookMedium.getBoolean(HookMedium.ENABLE_COLOR_ICON_HOOK, default = true) + /** 获取 [Context] */ val context = if (isNew) param.args[0] as Context else globalContext @@ -227,12 +230,12 @@ class HookMain : IXposedHookLoadPackage { /** 自定义默认小图标 */ var customIcon: Bitmap? = null - if (HookMedium.getBoolean(HookMedium.ENABLE_COLOR_ICON_HOOK, default = true)) + if (isHookColorIcon) run { IconPackParams.iconDatas.forEach { if ((notifyInstance.opPkgName == it.packageName || findAppName(notifyInstance) == it.appName) && - HookMedium.isAppNotifyHookOf(it.packageName) + HookMedium.isAppNotifyHookOf(it) ) { customIcon = it.iconBitmap return@run @@ -250,29 +253,33 @@ class HookMain : IXposedHookLoadPackage { else { /** 重新设置图标 - 防止系统更改它 */ iconImageView.setImageDrawable(iconDrawable) - /** 判断如果是灰度图标就给他设置一个白色颜色遮罩 */ - if (isGrayscaleIcon(context, iconDrawable)) - iconImageView.setColorFilter(if (isUpperOfAndroidS) newStyle else oldStyle) - else - iconImageView.apply { - clipToOutline = true - /** 设置一个圆角轮廓裁切 */ - outlineProvider = object : ViewOutlineProvider() { - override fun getOutline(view: View, out: Outline) { - out.setRoundRect( - 0, - 0, - view.width, - view.height, - 5.dp(context) - ) + /*判断是否开启 Hook 彩色图标*/ + if (isHookColorIcon) { + /** 判断如果是灰度图标就给他设置一个白色颜色遮罩 */ + if (isGrayscaleIcon(context, iconDrawable)) + iconImageView.setColorFilter(if (isUpperOfAndroidS) newStyle else oldStyle) + else + iconImageView.apply { + clipToOutline = true + /** 设置一个圆角轮廓裁切 */ + outlineProvider = object : ViewOutlineProvider() { + override fun getOutline(view: View, out: Outline) { + out.setRoundRect( + 0, + 0, + view.width, + view.height, + 5.dp(context) + ) + } } + /** 清除原生的背景边距设置 */ + if (isUpperOfAndroidS) setPadding(0, 0, 0, 0) + /** 清除原生的主题色背景圆圈颜色 */ + if (isUpperOfAndroidS) setBackgroundDrawable(null) } - /** 清除原生的背景边距设置 */ - if (isUpperOfAndroidS) setPadding(0, 0, 0, 0) - /** 清除原生的主题色背景圆圈颜色 */ - if (isUpperOfAndroidS) setBackgroundDrawable(null) - } + /** 否则一律设置灰度图标 */ + } else iconImageView.setColorFilter(if (isUpperOfAndroidS) newStyle else oldStyle) } } } @@ -329,7 +336,7 @@ class HookMain : IXposedHookLoadPackage { IconPackParams.iconDatas.forEach { if ((notifyInstance.opPkgName == it.packageName || lpparam.findAppName(notifyInstance) == it.appName) && - HookMedium.isAppNotifyHookOf(it.packageName) + HookMedium.isAppNotifyHookOf(it) ) { isTargetApp = true return@run diff --git a/app/src/main/java/com/fankes/miui/notify/hook/HookMedium.kt b/app/src/main/java/com/fankes/miui/notify/hook/HookMedium.kt index 3d0342f..3dab3ab 100644 --- a/app/src/main/java/com/fankes/miui/notify/hook/HookMedium.kt +++ b/app/src/main/java/com/fankes/miui/notify/hook/HookMedium.kt @@ -29,6 +29,7 @@ import android.widget.Toast import androidx.annotation.Keep import com.fankes.miui.notify.application.MNNApplication.Companion.appContext import com.fankes.miui.notify.application.MNNApplication.Companion.isMineStarted +import com.fankes.miui.notify.bean.IconDataBean import com.fankes.miui.notify.utils.FileUtils import com.fankes.miui.notify.utils.XPrefUtils import java.io.File @@ -56,16 +57,16 @@ object HookMedium { /** * 获取此 APP 的通知图标是否被 Hook - * @param packageName 包名 + * @param bean 图标 bean */ - fun isAppNotifyHookOf(packageName: String) = getBoolean(key = "${packageName}_icon", default = true) + fun isAppNotifyHookOf(bean: IconDataBean) = getBoolean(key = bean.toString(), default = true) /** * 设置 Hook 此 APP 的通知图标 - * @param packageName 包名 + * @param bean 图标 bean * @param isHook 是否 Hook */ - fun putAppNotifyHookOf(packageName: String, isHook: Boolean) = putBoolean(key = "${packageName}_icon", bool = isHook) + fun putAppNotifyHookOf(bean: IconDataBean, isHook: Boolean) = putBoolean(key = bean.toString(), bool = isHook) /** * 获取保存的值 diff --git a/app/src/main/java/com/fankes/miui/notify/ui/ConfigureActivity.kt b/app/src/main/java/com/fankes/miui/notify/ui/ConfigureActivity.kt index b9bec43..20f7391 100644 --- a/app/src/main/java/com/fankes/miui/notify/ui/ConfigureActivity.kt +++ b/app/src/main/java/com/fankes/miui/notify/ui/ConfigureActivity.kt @@ -74,10 +74,10 @@ class ConfigureActivity : BaseActivity() { holder.appName.text = it.appName holder.pkgName.text = it.packageName holder.cbrName.text = "贡献者:" + it.contributorName - holder.switch.isChecked = HookMedium.isAppNotifyHookOf(it.packageName) + holder.switch.isChecked = HookMedium.isAppNotifyHookOf(it) holder.switch.setOnCheckedChangeListener { btn, b -> if (!btn.isPressed) return@setOnCheckedChangeListener - HookMedium.putAppNotifyHookOf(it.packageName, b) + HookMedium.putAppNotifyHookOf(it, b) } } return cView!! diff --git a/app/src/main/java/com/fankes/miui/notify/utils/Utils.kt b/app/src/main/java/com/fankes/miui/notify/utils/Utils.kt index aa43520..4caecae 100644 --- a/app/src/main/java/com/fankes/miui/notify/utils/Utils.kt +++ b/app/src/main/java/com/fankes/miui/notify/utils/Utils.kt @@ -165,6 +165,12 @@ val Number.dp get() = (toFloat() * appContext.resources.displayMetrics.density). */ fun Number.dp(context: Context) = toFloat() * context.resources.displayMetrics.density +/** + * Base64 加密 + * @return [String] + */ +val String.base64: String get() = Base64.encodeToString(toByteArray(), Base64.DEFAULT) + /** * Base64 解密为字节流 * @return [ByteArray]