From 44e99cb3dab261ded518ab4df4bb4be9dbc703e0 Mon Sep 17 00:00:00 2001 From: Fankesyooni Date: Mon, 4 Apr 2022 14:45:56 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E7=BC=93=E5=AD=98=E5=9B=BE?= =?UTF-8?q?=E6=A0=87=E8=BF=87=E5=A4=A7=E9=80=A0=E6=88=90=E7=B3=BB=E7=BB=9F?= =?UTF-8?q?=E7=95=8C=E9=9D=A2=E5=81=9C=E6=AD=A2=E8=BF=90=E8=A1=8C=E7=9A=84?= =?UTF-8?q?=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../notify/hook/entity/SystemUIHooker.kt | 34 ++++++++++++++----- 1 file changed, 26 insertions(+), 8 deletions(-) diff --git a/app/src/main/java/com/fankes/coloros/notify/hook/entity/SystemUIHooker.kt b/app/src/main/java/com/fankes/coloros/notify/hook/entity/SystemUIHooker.kt index 916e3b2..7114ded 100644 --- a/app/src/main/java/com/fankes/coloros/notify/hook/entity/SystemUIHooker.kt +++ b/app/src/main/java/com/fankes/coloros/notify/hook/entity/SystemUIHooker.kt @@ -35,10 +35,14 @@ import android.graphics.drawable.Drawable import android.graphics.drawable.Icon import android.graphics.drawable.VectorDrawable import android.service.notification.StatusBarNotification +import android.util.ArrayMap +import android.util.ArraySet import android.view.View +import android.view.ViewGroup import android.view.ViewOutlineProvider import android.widget.ImageView import androidx.core.graphics.drawable.toBitmap +import androidx.core.view.children import com.fankes.coloros.notify.bean.IconDataBean import com.fankes.coloros.notify.const.Const import com.fankes.coloros.notify.data.DataConst @@ -97,6 +101,12 @@ class SystemUIHooker : YukiBaseHooker() { /** 原生存在的类 */ private const val PluginManagerImplClass = "$SYSTEMUI_PACKAGE_NAME.shared.plugins.PluginManagerImpl" + /** 根据多个版本存在不同的包名相同的类 */ + private val OplusNotificationIconAreaControllerClass = VariousClass( + "com.oplusos.systemui.statusbar.phone.OplusNotificationIconAreaController", + "com.coloros.systemui.statusbar.phone.ColorosNotificationIconAreaController" + ) + /** 根据多个版本存在不同的包名相同的类 */ private val SystemPromptControllerClass = VariousClass( "com.oplusos.systemui.statusbar.policy.SystemPromptController", @@ -153,16 +163,16 @@ class SystemUIHooker : YukiBaseHooker() { } /** 缓存的彩色 APP 图标 */ - private var appIcons = HashMap() + private var appIcons = ArrayMap() /** 缓存的通知优化图标数组 */ private var iconDatas = ArrayList() - /** 缓存的状态栏小图标实例 */ - private var statusBarIconViews = HashSet() + /** 状态栏通知图标容器 */ + private var notificationIconContainer: ViewGroup? = null /** 缓存的通知小图标包装纸实例 */ - private var notificationViewWrappers = HashSet() + private var notificationViewWrappers = ArraySet() /** 仅监听一次主题壁纸颜色变化 */ private var isWallpaperColorListenerSetUp = false @@ -290,7 +300,7 @@ class SystemUIHooker : YukiBaseHooker() { .get(RoundRectDrawableUtilClass.clazz.field { name = "Companion" }.get().self) /** 启动一个线程防止卡顿 */ Thread { - statusBarIconViews.takeIf { it.isNotEmpty() }?.forEach { + notificationIconContainer?.children?.forEach { runInSafe { /** 得到通知实例 */ val nf = nfField.get(it).cast() ?: return@Thread @@ -311,7 +321,7 @@ class SystemUIHooker : YukiBaseHooker() { /** 得到缩放大小 */ val sNfSize = sNfSizeField.get(it).int() /** 在主线程设置图标 */ - it.post { it.setImageDrawable(roundUtil.invoke(pair.first, sRadius, sNfSize, sNfSize, it.context)) } + it.post { (it as? ImageView?)?.setImageDrawable(roundUtil.invoke(pair.first, sRadius, sNfSize, sNfSize, it.context)) } } } } @@ -611,12 +621,20 @@ class SystemUIHooker : YukiBaseHooker() { registerWallpaperColorChanged(it) /** 注册广播 */ registerReceiver(it.context) - /** 缓存实例 */ - statusBarIconViews.add(it) } } } } + /** 注入状态栏通知图标容器实例 */ + OplusNotificationIconAreaControllerClass.hook { + injectMember { + method { + name = "updateIconsForLayout" + paramCount = 10 + } + afterHook { notificationIconContainer = args(index = 1).cast() } + } + } /** 替换通知图标和样式 */ NotificationHeaderViewWrapperClass.hook { injectMember {