From e7ff1b2b2ddac8075c219387387fd9dcd64e1f09 Mon Sep 17 00:00:00 2001 From: Fankesyooni Date: Wed, 23 Mar 2022 14:58:57 +0800 Subject: [PATCH] =?UTF-8?q?=E9=80=82=E9=85=8D=E7=B3=BB=E7=BB=9F=E5=A3=81?= =?UTF-8?q?=E7=BA=B8=E4=B8=BB=E9=A2=98=E8=89=B2=E7=9D=80=E8=89=B2=E9=80=9A?= =?UTF-8?q?=E7=9F=A5=E5=9B=BE=E6=A0=87=EF=BC=8C=E5=8A=A0=E5=85=A5=E9=80=9A?= =?UTF-8?q?=E7=9F=A5=E5=9B=BE=E6=A0=87=E5=8A=A8=E6=80=81=E5=88=B7=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../fankes/coloros/notify/hook/HookEntry.kt | 72 +++++++++++++++++-- .../notify/utils/factory/FunctionFactory.kt | 13 ++++ app/src/main/res/layout/activity_main.xml | 4 +- 3 files changed, 82 insertions(+), 7 deletions(-) diff --git a/app/src/main/java/com/fankes/coloros/notify/hook/HookEntry.kt b/app/src/main/java/com/fankes/coloros/notify/hook/HookEntry.kt index 1fb70fb..ecd32d2 100644 --- a/app/src/main/java/com/fankes/coloros/notify/hook/HookEntry.kt +++ b/app/src/main/java/com/fankes/coloros/notify/hook/HookEntry.kt @@ -22,15 +22,19 @@ */ package com.fankes.coloros.notify.hook +import android.app.WallpaperManager import android.content.Context import android.content.Intent import android.graphics.Bitmap import android.graphics.Color +import android.graphics.Outline import android.graphics.drawable.BitmapDrawable import android.graphics.drawable.Drawable import android.graphics.drawable.Icon import android.graphics.drawable.VectorDrawable import android.service.notification.StatusBarNotification +import android.view.View +import android.view.ViewOutlineProvider import android.widget.ImageView import androidx.core.graphics.drawable.toBitmap import com.fankes.coloros.notify.application.CNNApplication.Companion.MODULE_PACKAGE_NAME @@ -150,6 +154,9 @@ class HookEntry : YukiHookXposedInitProxy { /** 缓存的通知小图标包装纸实例 */ private var notificationViewWrappers = HashSet() + /** 仅监听一次主题壁纸颜色变化 */ + private var isWallpaperColorListenerSetUp = false + /** * 是否启用通知图标优化功能 * @param isHooking 是否判断启用通知功能 - 默认:是 @@ -181,6 +188,18 @@ class HookEntry : YukiHookXposedInitProxy { ) } + /** + * 注册主题壁纸改变颜色监听 + * + * - 仅限在 Android 12 上注册 + * @param view 实例 + */ + private fun PackageParam.registerWallpaperColorChanged(view: View) = runInSafe { + if (isUpperOfAndroidS && !isWallpaperColorListenerSetUp) + WallpaperManager.getInstance(view.context).addOnColorsChangedListener({ _, _ -> refreshNotificationIcons() }, view.handler) + isWallpaperColorListenerSetUp = true + } + /** 刷新状态栏小图标 */ private fun PackageParam.refreshStatusBarIcons() = runInSafe { val unknown = StatusBarIconViewClass.clazz.field { name = "mIcon" } @@ -210,7 +229,9 @@ class HookEntry : YukiHookXposedInitProxy { /** 刷新通知小图标 */ private fun PackageParam.refreshNotificationIcons() = runInSafe { - // TODO + NotificationHeaderViewWrapperClass.clazz.method { name = "resolveHeaderViews" }.also { result -> + notificationViewWrappers.takeIf { it.isNotEmpty() }?.forEach { result.get(it).call() } + } } /** @@ -291,7 +312,10 @@ class HookEntry : YukiHookXposedInitProxy { compatCustomIcon(isGrayscaleIcon, packageName).also { customPair -> when { customPair.first != null || isGrayscaleIcon -> iconView.apply { + /** 重新设置图标 */ setImageBitmap(customPair.first ?: drawable.toBitmap()) + /** 设置不要裁切到边界 */ + clipToOutline = false /** 是否开启 Android 12 风格 */ val isA12Style = prefs.getBoolean(ENABLE_ANDROID12_STYLE, isUpperOfAndroidS) @@ -301,14 +325,15 @@ class HookEntry : YukiHookXposedInitProxy { /** 新版风格 */ val newStyle = (if (context.isSystemInDarkMode) 0xffdcdcdc else Color.WHITE).toInt() - /** 优化风格 */ - val fixStyle = (if (context.isSystemInDarkMode) 0xff707173 else oldStyle).toInt() + /** 原生着色 */ + val a12Style = if (isUpperOfAndroidS) context.wallpaperColor else + (if (context.isSystemInDarkMode) 0xff707173 else oldStyle).toInt() /** 旧版图标着色 */ val oldApplyColor = customPair.second.takeIf { it != 0 } ?: iconColor.takeIf { it != 0 } ?: oldStyle /** 新版图标着色 */ - val newApplyColor = customPair.second.takeIf { it != 0 } ?: iconColor.takeIf { it != 0 } ?: fixStyle + val newApplyColor = customPair.second.takeIf { it != 0 } ?: iconColor.takeIf { it != 0 } ?: a12Style /** 判断风格并开始 Hook */ if (isA12Style) { background = DrawableBuilder().rounded().solidColor(newApplyColor).build() @@ -321,8 +346,24 @@ class HookEntry : YukiHookXposedInitProxy { } } else -> iconView.apply { + /** 重新设置图标 */ + setImageDrawable(drawable) + /** 设置裁切到边界 */ + clipToOutline = true + /** 设置一个圆角轮廓裁切 */ + outlineProvider = object : ViewOutlineProvider() { + override fun getOutline(view: View, out: Outline) { + out.setRoundRect( + 0, 0, + view.width, view.height, 3.dpFloat(context) + ) + } + } + /** 清除图标间距 */ setPadding(0, 0, 0, 0) + /** 清除背景 */ background = null + /** 清除着色 */ colorFilter = null } } @@ -454,7 +495,23 @@ class HookEntry : YukiHookXposedInitProxy { name = "setNotification" param(StatusBarNotificationClass) } - afterHook { if (firstArgs != null) statusBarIconViews.add(instance()) } + afterHook { + if (firstArgs != null) instance().also { + registerWallpaperColorChanged(it) + statusBarIconViews.add(it) + } + } + } + injectMember { + method { + name = "onConfigurationChanged" + param(ConfigurationClass) + } + intercept() + } + injectMember { + method { name = "updateIconScaleForSystemIcons" } + intercept() } } /** 替换通知图标和样式 */ @@ -486,6 +543,11 @@ class HookEntry : YukiHookXposedInitProxy { } } } + /** 记录实例 */ + injectMember { + constructor { param(ContextClass, ViewClass, ExpandableNotificationRowClass.clazz) } + afterHook { notificationViewWrappers.add(instance) } + } } /** 发送适配新的 APP 图标通知 */ PluginManagerImplClass.hook { diff --git a/app/src/main/java/com/fankes/coloros/notify/utils/factory/FunctionFactory.kt b/app/src/main/java/com/fankes/coloros/notify/utils/factory/FunctionFactory.kt index bf6b1d6..f7f94cf 100644 --- a/app/src/main/java/com/fankes/coloros/notify/utils/factory/FunctionFactory.kt +++ b/app/src/main/java/com/fankes/coloros/notify/utils/factory/FunctionFactory.kt @@ -25,6 +25,8 @@ package com.fankes.coloros.notify.utils.factory import android.app.Activity +import android.app.WallpaperManager +import android.app.WallpaperManager.FLAG_SYSTEM import android.content.ClipData import android.content.ClipboardManager import android.content.Context @@ -214,6 +216,17 @@ fun Number.dp(context: Context) = dpFloat(context).toInt() */ fun Number.dpFloat(context: Context) = toFloat() * context.resources.displayMetrics.density +/** + * 获取系统壁纸颜色 + * + * 由于 ColorOS 阉割了 [android.R.color.system_accent1_600] 这里取系统壁纸颜色做补偿 + * @return [Int] 无法获取时返回透明色 + */ +val Context.wallpaperColor + get() = safeOfNan { + WallpaperManager.getInstance(this).getWallpaperColors(FLAG_SYSTEM)?.secondaryColor?.toArgb() ?: 0 + } + /** * 是否为白色 * @return [Boolean] diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index 4b1f2da..369f78b 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -484,7 +484,7 @@ android:layout_height="wrap_content" android:layout_marginLeft="5dp" android:layout_marginRight="5dp" - android:layout_marginBottom="5dp" + android:layout_marginBottom="10dp" android:alpha="0.6" android:lineSpacingExtra="6dp" android:text="此选项默认开启,开启后将对优化名单内的 APP 通知小图标使用单色调进行修复,特别是通过系统级别推送的通知,它们始终是 APP 默认图标(彩色的 APP 图标),修复后使得它们的图标看起来更加符合 Android 原生的统一规范。" @@ -502,7 +502,7 @@