From d2ff1fe3ec421e2867dd1a300b90ddac20ce6db3 Mon Sep 17 00:00:00 2001 From: Fankesyooni Date: Mon, 4 Apr 2022 23:12:58 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=20ColorOS=2011=20Android=201?= =?UTF-8?q?1=20=E4=B8=8A=E7=9A=84=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 | 24 +++++++++++++++---- 1 file changed, 20 insertions(+), 4 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 7114ded..a9fcd62 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 @@ -104,13 +104,14 @@ class SystemUIHooker : YukiBaseHooker() { /** 根据多个版本存在不同的包名相同的类 */ private val OplusNotificationIconAreaControllerClass = VariousClass( "com.oplusos.systemui.statusbar.phone.OplusNotificationIconAreaController", - "com.coloros.systemui.statusbar.phone.ColorosNotificationIconAreaController" + "com.oplusos.systemui.statusbar.policy.OplusNotificationIconAreaController", + "com.coloros.systemui.statusbar.policy.ColorNotificationIconAreaController" ) /** 根据多个版本存在不同的包名相同的类 */ private val SystemPromptControllerClass = VariousClass( "com.oplusos.systemui.statusbar.policy.SystemPromptController", - "com.coloros.systemui.statusbar.policy.SystemPromptController" + "com.coloros.systemui.statusbar.policy.ColorSystemPromptController" ) /** 根据多个版本存在不同的包名相同的类 */ @@ -171,6 +172,9 @@ class SystemUIHooker : YukiBaseHooker() { /** 状态栏通知图标容器 */ private var notificationIconContainer: ViewGroup? = null + /** 状态栏通知图标数组 */ + private var notificationIconInstances = ArrayList() + /** 缓存的通知小图标包装纸实例 */ private var notificationViewWrappers = ArraySet() @@ -300,7 +304,7 @@ class SystemUIHooker : YukiBaseHooker() { .get(RoundRectDrawableUtilClass.clazz.field { name = "Companion" }.get().self) /** 启动一个线程防止卡顿 */ Thread { - notificationIconContainer?.children?.forEach { + (notificationIconContainer?.children?.toList() ?: notificationIconInstances.takeIf { it.isNotEmpty() })?.forEach { runInSafe { /** 得到通知实例 */ val nf = nfField.get(it).cast() ?: return@Thread @@ -628,11 +632,23 @@ class SystemUIHooker : YukiBaseHooker() { /** 注入状态栏通知图标容器实例 */ OplusNotificationIconAreaControllerClass.hook { injectMember { + var isOldWay = false method { name = "updateIconsForLayout" paramCount = 10 + }.remedys { + method { + name = "updateIconsForLayout" + paramCount = 1 + }.onFind { isOldWay = true } + } + afterHook { + if (isOldWay) { + notificationIconInstances.clear() + field { name = "mLastToShow" }.get(instance).list() + .takeIf { it.isNotEmpty() }?.forEach { notificationIconInstances.add(it) } + } else notificationIconContainer = args(index = 1).cast() } - afterHook { notificationIconContainer = args(index = 1).cast() } } } /** 替换通知图标和样式 */