From 29b14a811e95220e4ef6be6bf11d27fd58d8b4f9 Mon Sep 17 00:00:00 2001 From: fankesyooni Date: Wed, 25 Jun 2025 23:22:49 +0800 Subject: [PATCH] refactor: migrate and update to YukiHookAPI 1.3.0 --- app/build.gradle.kts | 2 + .../notify/hook/entity/FrameworkHooker.kt | 12 +- .../notify/hook/entity/SystemUIHooker.kt | 345 ++++++++---------- .../notify/ui/activity/base/BaseActivity.kt | 17 +- .../utils/factory/BaseAdapterFactory.kt | 2 + .../utils/factory/DialogBuilderFactory.kt | 2 +- .../notify/utils/factory/FunctionFactory.kt | 7 +- app/src/main/res/layout/activity_main.xml | 29 ++ app/src/main/res/mipmap-xxhdpi/ic_kavaref.png | Bin 0 -> 17389 bytes .../sweet-dependency-config.yaml | 15 +- 10 files changed, 223 insertions(+), 208 deletions(-) create mode 100644 app/src/main/res/mipmap-xxhdpi/ic_kavaref.png diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 659527e..31da98b 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -81,6 +81,8 @@ dependencies { compileOnly(de.robv.android.xposed.api) implementation(com.highcapable.yukihookapi.api) ksp(com.highcapable.yukihookapi.ksp.xposed) + implementation(com.highcapable.kavaref.kavaref.core) + implementation(com.highcapable.kavaref.kavaref.extension) implementation(com.fankes.projectpromote.project.promote) implementation(com.github.topjohnwu.libsu.core) implementation(com.github.duanhong169.drawabletoolbox) diff --git a/app/src/main/java/com/fankes/coloros/notify/hook/entity/FrameworkHooker.kt b/app/src/main/java/com/fankes/coloros/notify/hook/entity/FrameworkHooker.kt index 38847a8..3753a3c 100644 --- a/app/src/main/java/com/fankes/coloros/notify/hook/entity/FrameworkHooker.kt +++ b/app/src/main/java/com/fankes/coloros/notify/hook/entity/FrameworkHooker.kt @@ -22,11 +22,9 @@ */ package com.fankes.coloros.notify.hook.entity +import android.app.Notification +import com.highcapable.kavaref.KavaRef.Companion.resolve import com.highcapable.yukihookapi.hook.entity.YukiBaseHooker -import com.highcapable.yukihookapi.hook.factory.method -import com.highcapable.yukihookapi.hook.type.android.NotificationClass -import com.highcapable.yukihookapi.hook.type.java.BooleanType -import com.highcapable.yukihookapi.hook.type.java.StringClass /** * 系统框架核心 Hook 类 @@ -38,9 +36,9 @@ object FrameworkHooker : YukiBaseHooker() { override fun onHook() { /** 拦截 ColorOS 覆盖应用通知图标 */ - OplusNotificationFixHelperClass?.method { + OplusNotificationFixHelperClass?.resolve()?.optional()?.firstMethodOrNull { name = "fixSmallIcon" - param(NotificationClass, StringClass, StringClass, BooleanType) - }?.ignored()?.hook()?.intercept() + parameters(Notification::class, String::class, String::class, Boolean::class) + }?.hook()?.intercept() } } \ No newline at end of file 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 2fdd209..6974a9c 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 @@ -68,26 +68,12 @@ import com.fankes.coloros.notify.utils.tool.ActivationPromptTool import com.fankes.coloros.notify.utils.tool.BitmapCompatTool import com.fankes.coloros.notify.utils.tool.IconAdaptationTool import com.fankes.coloros.notify.utils.tool.SystemUITool -import com.highcapable.yukihookapi.hook.bean.VariousClass +import com.highcapable.kavaref.KavaRef.Companion.resolve +import com.highcapable.kavaref.condition.type.VagueType +import com.highcapable.kavaref.extension.VariousClass import com.highcapable.yukihookapi.hook.entity.YukiBaseHooker -import com.highcapable.yukihookapi.hook.factory.constructor -import com.highcapable.yukihookapi.hook.factory.current -import com.highcapable.yukihookapi.hook.factory.field -import com.highcapable.yukihookapi.hook.factory.hasMethod import com.highcapable.yukihookapi.hook.factory.injectModuleAppResources -import com.highcapable.yukihookapi.hook.factory.method import com.highcapable.yukihookapi.hook.log.YLog -import com.highcapable.yukihookapi.hook.type.android.ContextClass -import com.highcapable.yukihookapi.hook.type.android.DrawableClass -import com.highcapable.yukihookapi.hook.type.android.IconClass -import com.highcapable.yukihookapi.hook.type.android.ImageViewClass -import com.highcapable.yukihookapi.hook.type.android.NotificationClass -import com.highcapable.yukihookapi.hook.type.android.StatusBarNotificationClass -import com.highcapable.yukihookapi.hook.type.defined.VagueType -import com.highcapable.yukihookapi.hook.type.java.BooleanType -import com.highcapable.yukihookapi.hook.type.java.FloatType -import com.highcapable.yukihookapi.hook.type.java.IntType -import com.highcapable.yukihookapi.hook.type.java.LongType import top.defaults.drawabletoolbox.DrawableBuilder /** @@ -135,8 +121,7 @@ object SystemUIHooker : YukiBaseHooker() { private val OplusContrastColorUtilClass by lazyClassOrNull("com.oplusos.util.OplusContrastColorUtil") /** ColorOS 存在的类 - 旧版本不存在 */ - private val OplusNotificationBackgroundViewClass by lazyClassOrNull( - "com.oplusos.systemui.statusbar.notification.row.OplusNotificationBackgroundView") + private val OplusNotificationBackgroundViewClass by lazyClassOrNull("com.oplusos.systemui.statusbar.notification.row.OplusNotificationBackgroundView") /** ColorOS 存在的类 - 旧版本不存在 */ private val OplusMediaControlPanelClass by lazyClassOrNull("com.oplusos.systemui.media.OplusMediaControlPanel") @@ -284,10 +269,11 @@ object SystemUIHooker : YukiBaseHooker() { * @return [Boolean] */ private val isOldNotificationBackground - get() = NotificationBackgroundViewClass?.hasMethod { - name = "drawCustom" - paramCount = 2 - } ?: false + get() = NotificationBackgroundViewClass?.resolve()?.optional(silent = true) + ?.firstMethodOrNull { + name = "drawCustom" + parameterCount = 2 + } != null /** * 打印日志 @@ -327,28 +313,25 @@ object SystemUIHooker : YukiBaseHooker() { /** 刷新状态栏小图标 */ private fun refreshStatusBarIcons() = runInSafe { - val nfField = StatusBarIconViewClass.field { name = "mNotification" } - val sRadiusField = StatusBarIconViewClass.field { + val nfField = StatusBarIconViewClass.resolve().optional().firstFieldOrNull { name = "mNotification" } + val sRadiusField = StatusBarIconViewClass.resolve().optional(silent = true).firstFieldOrNull { name = "sIconRadiusFraction" - }.remedys { - StatusBarIconControllerClass.field { name = "sIconRadiusFraction" } - } - val sNfSizeField = StatusBarIconViewClass.field { + } ?: StatusBarIconControllerClass.resolve().optional(silent = true).firstFieldOrNull { name = "sIconRadiusFraction" } + val sNfSizeField = StatusBarIconViewClass.resolve().optional(silent = true).firstFieldOrNull { name = "sNotificationRoundIconSize" - }.remedys { - StatusBarIconControllerClass.field { name = "sNotificationRoundIconSize" } - } - val roundUtil = RoundRectDrawableUtil_CompanionClass.method { + } ?: StatusBarIconControllerClass.resolve().optional(silent = true).firstFieldOrNull { name = "sNotificationRoundIconSize" } + val roundUtil = RoundRectDrawableUtil_CompanionClass.resolve().optional(silent = true).firstMethodOrNull { name = "getRoundRectDrawable" - param(DrawableClass, FloatType, IntType, IntType, ContextClass) - }.onNoSuchMethod { YLog.error("Your system not support \"getRoundRectDrawable\"!", it) } - .get(RoundRectDrawableUtilClass.field { name = "Companion" }.get().any()) + parameters(Drawable::class, Float::class, Int::class, Int::class, Context::class) + }.apply { + if (this == null) YLog.error("Your system not support \"getRoundRectDrawable\"!") + }?.of(RoundRectDrawableUtilClass.resolve().optional().firstFieldOrNull { name = "Companion" }?.get()) /** 启动一个线程防止卡顿 */ Thread { (notificationIconContainer?.children?.toList() ?: notificationIconInstances.takeIf { it.isNotEmpty() })?.forEach { runInSafe { /** 得到通知实例 */ - val nf = nfField.get(it).cast() ?: return@Thread + val nf = nfField?.of(it)?.get() ?: return@Thread /** 得到原始通知图标 */ val iconDrawable = nf.notification.smallIcon.loadDrawable(it.context) @@ -362,12 +345,16 @@ object SystemUIHooker : YukiBaseHooker() { drawable = iconDrawable ).also { pair -> /** 得到图标圆角 */ - val sRadius = sRadiusField.get(it).float() + val sRadius = sRadiusField?.of(it)?.get() /** 得到缩放大小 */ - val sNfSize = sNfSizeField.get(it).int() + val sNfSize = sNfSizeField?.of(it)?.get() + /** 在主线程设置图标 */ - it.post { (it as? ImageView?)?.setImageDrawable(roundUtil.invoke(pair.first, sRadius, sNfSize, sNfSize, it.context)) } + it.post { + val drawable = roundUtil?.invokeQuietly(pair.first, sRadius, sNfSize, sNfSize, it.context) + (it as? ImageView?)?.setImageDrawable(drawable) + } } } } @@ -376,10 +363,10 @@ object SystemUIHooker : YukiBaseHooker() { /** 刷新通知小图标 */ private fun refreshNotificationIcons() = runInSafe { - notificationPresenter?.current()?.method { + notificationPresenter?.resolve()?.optional()?.firstMethodOrNull { name = "updateNotificationsOnDensityOrFontScaleChanged" - emptyParam() - }?.call() + emptyParameters() + }?.invoke() modifyNotifyPanelAlpha(notificationPlayerView, isTint = true) } @@ -393,15 +380,19 @@ object SystemUIHooker : YukiBaseHooker() { */ private fun isGrayscaleIcon(context: Context, drawable: Drawable) = if (ConfigData.isEnableColorIconCompat.not()) safeOfFalse { - ContrastColorUtilClass.let { - it.method { - name = "isGrayscaleIcon" - param(DrawableClass) - }.get(it.method { - name = "getInstance" - param(ContextClass) - }.get().invoke(context)).boolean(drawable) - } + ContrastColorUtilClass.resolve() + .optional(silent = true) + .let { + it.firstMethodOrNull { + name = "isGrayscaleIcon" + parameters(Drawable::class) + }?.of( + it.firstMethodOrNull { + name = "getInstance" + parameters(Context::class) + }?.invoke(context) + )?.invokeQuietly(drawable) == true + } } else BitmapCompatTool.isGrayscaleDrawable(drawable) /** @@ -430,7 +421,11 @@ object SystemUIHooker : YukiBaseHooker() { context.injectModuleAppResources() var customPair: Triple? = null val statSysAdbIcon = runCatching { - context.resources.drawableOf("com.android.internal.R\$drawable".toClass().field { name = "stat_sys_adb" }.get().int()) + val resId = "com.android.internal.R\$drawable".toClass() + .resolve() + .firstField { name = "stat_sys_adb" } + .get() ?: error("Resource not found") + context.resources.drawableOf(resId) }.getOrNull() ?: context.resources.drawableOf(R.drawable.ic_unsupported) when { /** 替换系统图标为 Android 默认 */ @@ -681,61 +676,66 @@ object SystemUIHooker : YukiBaseHooker() { /** 缓存图标数据 */ cachingIconDatas() /** 移除开发者警告通知 */ - SystemPromptControllerClass.method { + SystemPromptControllerClass.resolve().optional().firstMethodOrNull { name = "updateDeveloperMode" - }.hook().before { + }?.hook()?.before { /** 是否移除 */ if (ConfigData.isEnableRemoveDevNotify) resultNull() } /** 移除充电完成通知 */ - OplusPowerNotificationWarningsClass.method { + OplusPowerNotificationWarningsClass.resolve().optional().firstMethodOrNull { name = "showChargeErrorDialog" - param(IntType) - }.hook().before { + parameters(Int::class) + }?.hook()?.before { /** 是否移除 */ if (args().first().int() == 7 && ConfigData.isEnableRemoveChangeCompleteNotify) resultNull() } /** 移除免打扰通知 */ - DndAlertHelperClass.method { - name { it.lowercase() == "sendnotificationwithendtime" } - param(LongType) - }.remedys { - method { - name = "operateNotification" - param(LongType, IntType, BooleanType) + DndAlertHelperClass.resolve().optional(silent = true).apply { + firstMethodOrNull { + name { it.lowercase() == "sendnotificationwithendtime" } + parameters(Long::class) + }?.hook()?.before { + /** 是否移除 */ + if (ConfigData.isEnableRemoveDndAlertNotify) resultNull() + } + firstMethodOrNull { + name = "operateNotification" + parameters(Long::class, Int::class, Boolean::class) + }?.hook()?.before { + /** 是否移除 */ + if (ConfigData.isEnableRemoveDndAlertNotify) resultNull() } - }.hook().before { - /** 是否移除 */ - if (ConfigData.isEnableRemoveDndAlertNotify) resultNull() } - /** 拦截ColorOS使用应用图标判断 */ - OplusNotificationSmallIconUtilClass?.method { + /** 拦截 ColorOS 使用应用图标判断 */ + OplusNotificationSmallIconUtilClass?.resolve()?.optional()?.firstMethodOrNull { name = "useAppIconForSmallIcon" - param(NotificationClass) + parameters(Notification::class) }?.hook()?.before { resultFalse() } /** 修复并替换 ColorOS 以及原生灰度图标色彩判断 */ - NotificationUtilsClass.apply { - method { + NotificationUtilsClass.resolve().optional(silent = true).apply { + firstMethodOrNull { name = "isGrayscale" - param(ImageViewClass, ContrastColorUtilClass) - }.hook().replaceAny { args().first().cast()?.let { isGrayscaleIcon(it.context, it.drawable) } ?: callOriginal() } - method { + parameters(ImageView::class, ContrastColorUtilClass) + }?.hook()?.replaceAny { args().first().cast()?.let { isGrayscaleIcon(it.context, it.drawable) } ?: callOriginal() } + firstMethodOrNull { name = "isGrayscaleOplus" - param(ImageViewClass, OplusContrastColorUtilClass ?: VagueType) - }.ignored().hook().replaceAny { args().first().cast()?.let { isGrayscaleIcon(it.context, it.drawable) } ?: callOriginal() } + parameters(ImageView::class, OplusContrastColorUtilClass ?: VagueType) + }?.hook()?.replaceAny { args().first().cast()?.let { isGrayscaleIcon(it.context, it.drawable) } ?: callOriginal() } } /** 替换状态栏图标 */ - IconManagerClass.method { + IconManagerClass.resolve().optional().firstMethodOrNull { name = "getIconDescriptor" - param(NotificationEntryClass, BooleanType) - }.hook().after { - IconBuilderClass.field { name = "context" } - .get(IconManagerClass.field { name = "iconBuilder" }.get(instance).cast()).cast()?.also { context -> - NotificationEntryClass.method { + parameters(NotificationEntryClass, Boolean::class) + }?.hook()?.after { + IconBuilderClass.resolve().optional().firstFieldOrNull { name = "context" } + ?.of(IconManagerClass.resolve().optional().firstFieldOrNull { name = "iconBuilder" }?.of(instance)?.get()) + ?.getQuietly()?.also { context -> + NotificationEntryClass.resolve().optional().firstMethodOrNull { name = "getSbn" - }.get(args().first().any()).invoke()?.also { nf -> + }?.of(args().first().any())?.invokeQuietly()?.also { nf -> nf.notification.smallIcon.loadDrawable(context)?.also { iconDrawable -> compatStatusIcon( context = context, @@ -747,171 +747,148 @@ object SystemUIHooker : YukiBaseHooker() { packageName = nf.packageName, drawable = iconDrawable ).also { pair -> - if (pair.second) StatusBarIconClass.field { + if (pair.second) StatusBarIconClass.resolve().optional().firstFieldOrNull { name = "icon" - type = IconClass - }.get(result).set(Icon.createWithBitmap(pair.first.toBitmap())) + type = Icon::class + }?.of(result)?.set(Icon.createWithBitmap(pair.first.toBitmap())) } } } } } /** 得到状态栏图标实例 */ - StatusBarIconViewClass.method { + StatusBarIconViewClass.resolve().optional().firstMethodOrNull { name = "setNotification" - param(StatusBarNotificationClass) - }.hook().after { + parameters(StatusBarNotification::class) + }?.hook()?.after { /** 注册壁纸颜色监听 */ if (args().first().any() != null) instance().also { registerWallpaperColorChanged(it) } } /** 注入通知控制器实例 */ - StatusBarNotificationPresenterClass.constructor().hookAll().after { notificationPresenter = instance } + StatusBarNotificationPresenterClass.resolve().optional().constructor {}.hookAll().after { notificationPresenter = instance } /** 注入状态栏通知图标容器实例 */ - OplusNotificationIconAreaControllerClass.apply { + OplusNotificationIconAreaControllerClass.resolve().optional().apply { var way = 0 - method { + (firstMethodOrNull { name = "updateIconsForLayout" - paramCount = 10 - }.remedys { + parameterCount = 10 + } ?: firstMethodOrNull { /** ColorOS 14 */ - method { + name = "updateIconsForLayout" + parameterCount = 5 + } ?: firstMethodOrNull { + name = "updateIconsForLayout" + parameterCount = 1 + }?.apply { way = 1 } + ?: firstMethodOrNull { name = "updateIconsForLayout" - paramCount = 5 - } - method { - name = "updateIconsForLayout" - paramCount = 1 - }.onFind { way = 1 } - method { - name = "updateStatusBarIcons" - }.onFind { way = 2 } - }.hook().after { + }?.apply { way = 2 })?.hook()?.after { when (way) { - 2 -> notificationIconContainer = OplusNotificationIconAreaControllerClass.method { name = "getNotificationIcons" }.get(instance).invoke() + 2 -> notificationIconContainer = OplusNotificationIconAreaControllerClass.resolve().optional() + .firstMethodOrNull { name = "getNotificationIcons" } + ?.of(instance)?.invoke() 1 -> { notificationIconInstances.clear() - field { name = "mLastToShow" }.get(instance).list() - .takeIf { it.isNotEmpty() }?.forEach { notificationIconInstances.add(it) } + firstFieldOrNull { name = "mLastToShow" }?.of(instance)?.get>() + ?.takeIf { it.isNotEmpty() }?.forEach { notificationIconInstances.add(it) } } else -> notificationIconContainer = args(index = 1).cast() } } } - /** 注入状态栏通知图标容器实例 */ - if (LegacyNotificationIconAreaControllerImpl != null) { - /** ColorOS 15.0.1 */ - LegacyNotificationIconAreaControllerImpl?.apply { - method { + (LegacyNotificationIconAreaControllerImpl ?: NotificationIconAreaControllerClass) + .resolve().optional().apply { + firstMethodOrNull { name = "updateIconsForLayout" - paramCount = 8 - }.hook().after { + parameterCount = 8 + }?.hook()?.after { notificationIconContainer = args(index = 1).cast() } } - } else { - /** ColorOS 15 */ - NotificationIconAreaControllerClass.apply { - method { - name = "updateIconsForLayout" - paramCount = 8 - }.hook().after { - notificationIconContainer = args(index = 1).cast() - } - } - } - /** 替换通知面板背景 - 新版本 */ - if (isOldNotificationBackground.not()) - OplusNotificationBackgroundViewClass?.apply { - method { - name = "drawRegionBlur" - paramCount = 2 - }.remedys { - method { - name = "draw" - paramCount = 2 - } - }.hook().before { modifyNotifyPanelAlpha(instance(), args().last().cast()) } - method { - name = "draw" - paramCount = 2 - superClass(isOnlySuperClass = true) - }.hook().before { modifyNotifyPanelAlpha(instance(), args().last().cast()) } + if (!isOldNotificationBackground) + OplusNotificationBackgroundViewClass?.resolve()?.optional()?.apply { + firstMethodOrNull { + name { it == "drawRegionBlur" || it == "draw" } + parameterCount = 2 + superclass() + }?.hook()?.before { modifyNotifyPanelAlpha(instance(), args().last().cast()) } } /** 替换通知面板背景 - 旧版本 */ if (isOldNotificationBackground) - NotificationBackgroundViewClass?.apply { - method { + NotificationBackgroundViewClass?.resolve()?.optional(silent = true)?.apply { + firstMethodOrNull { name = "draw" - paramCount = 2 - }.hook().before { modifyNotifyPanelAlpha(instance(), args().last().cast()) } - method { + parameterCount = 2 + }?.hook()?.before { modifyNotifyPanelAlpha(instance(), args().last().cast()) } + firstMethodOrNull { name = "drawCustom" - paramCount = 2 - }.ignored().hook().before { modifyNotifyPanelAlpha(instance(), args().last().cast()) } + parameterCount = 2 + }?.hook()?.before { modifyNotifyPanelAlpha(instance(), args().last().cast()) } } /** 替换通知面板背景 - 避免折叠展开通知二次修改通知面板背景 */ - ExpandableNotificationRowClass.apply { - method { + ExpandableNotificationRowClass.resolve().optional().apply { + firstMethodOrNull { name = "updateBackgroundForGroupState" - emptyParam() - }.hook().before { - if (ConfigData.isEnableNotifyPanelAlpha) field { name = "mShowGroupBackgroundWhenExpanded" }.get(instance).setTrue() + emptyParameters() + }?.hook()?.before { + if (ConfigData.isEnableNotifyPanelAlpha) + firstFieldOrNull { name = "mShowGroupBackgroundWhenExpanded" }?.of(instance)?.set(true) } } /** 替换媒体通知面板背景 - 设置媒体通知自动展开 */ - OplusMediaControlPanelClass?.apply { - method { + OplusMediaControlPanelClass?.resolve()?.optional()?.apply { + firstMethodOrNull { name = "bind" - paramCount = 2 - }.hook().after { + parameterCount = 2 + }?.hook()?.after { /** 得到当前实例 */ - val holder = OplusMediaControlPanelClass?.field { + val holder = OplusMediaControlPanelClass?.resolve()?.optional()?.firstFieldOrNull { name = "mViewHolder" - superClass(isOnlySuperClass = true) - }?.get(instance)?.any() + superclass() + }?.of(instance)?.get() /** 记录媒体通知 [View] */ - notificationPlayerView = PlayerViewHolderClass?.method { + notificationPlayerView = PlayerViewHolderClass?.resolve()?.optional()?.firstMethodOrNull { name = "getPlayer" - emptyParam() - }?.get(holder)?.invoke() + emptyParameters() + }?.of(holder)?.invokeQuietly() /** 设置背景着色 */ modifyNotifyPanelAlpha(notificationPlayerView, isTint = true) /** 当前是否正在播放 */ - val isPlaying = MediaDataClass?.method { + val isPlaying = MediaDataClass?.resolve()?.optional()?.firstMethodOrNull { name = "isPlaying" - emptyParam() - }?.get(args().first().any())?.boolean() ?: false + emptyParameters() + }?.of(args().first().any())?.invokeQuietly() ?: false /** 当前通知是否展开 */ - val isExpanded = OplusMediaViewControllerClass?.method { + val isExpanded = OplusMediaViewControllerClass?.resolve()?.optional()?.firstMethodOrNull { name = "getExpanded" - emptyParam() - }?.get(field { name = "mOplusMediaViewController" }.get(instance).any())?.boolean() ?: false + emptyParameters() + }?.of(firstFieldOrNull { name = "mOplusMediaViewController" }?.of(instance)?.get())?.invokeQuietly() ?: false /** 符合条件后执行 */ if (ConfigData.isEnableNotifyMediaPanelAutoExp.not() || isExpanded || isPlaying.not()) return@after /** 模拟手动展开通知 */ - BasePlayViewHolderClass?.method { + BasePlayViewHolderClass?.resolve()?.optional()?.firstMethodOrNull { name = "getExpandButton" - emptyParam() - }?.get(holder)?.invoke()?.performClick() + emptyParameters() + }?.of(holder)?.invokeQuietly()?.performClick() } } /** 替换通知图标和样式 */ - NotificationHeaderViewWrapperClass.apply { + NotificationHeaderViewWrapperClass.resolve().optional().apply { method { name { it == "resolveHeaderViews" || it == "onContentUpdated" } }.hookAll().after { - field { name = "mIcon" }.get(instance).cast()?.apply { - ExpandableNotificationRowClass - .method { name = "getEntry" } - .get(NotificationViewWrapperClass.field { + firstFieldOrNull { name = "mIcon" }?.of(instance)?.get()?.apply { + ExpandableNotificationRowClass.resolve().optional() + .firstMethodOrNull { name = "getEntry" } + ?.of(NotificationViewWrapperClass.resolve().optional().firstFieldOrNull { name = "mRow" - }.get(instance).any()).call()?.let { - it.javaClass.method { + }?.of(instance)?.get())?.invokeQuietly()?.let { + it.resolve().optional().firstMethodOrNull { name = "getSbn" - }.get(it).invoke() + }?.invoke() }.also { nf -> nf?.notification?.also { it.smallIcon.loadDrawable(context)?.also { iconDrawable -> diff --git a/app/src/main/java/com/fankes/coloros/notify/ui/activity/base/BaseActivity.kt b/app/src/main/java/com/fankes/coloros/notify/ui/activity/base/BaseActivity.kt index 88088bb..17a904b 100644 --- a/app/src/main/java/com/fankes/coloros/notify/ui/activity/base/BaseActivity.kt +++ b/app/src/main/java/com/fankes/coloros/notify/ui/activity/base/BaseActivity.kt @@ -20,21 +20,20 @@ * * This file is created by fankes on 2022/1/30. */ -@file:Suppress("DEPRECATION") - package com.fankes.coloros.notify.ui.activity.base import android.os.Build import android.os.Bundle +import android.view.LayoutInflater import androidx.appcompat.app.AppCompatActivity import androidx.core.content.res.ResourcesCompat import androidx.core.view.WindowCompat import androidx.viewbinding.ViewBinding import com.fankes.coloros.notify.R import com.fankes.coloros.notify.utils.factory.isNotSystemInDarkMode -import com.highcapable.yukihookapi.hook.factory.current -import com.highcapable.yukihookapi.hook.factory.method -import com.highcapable.yukihookapi.hook.type.android.LayoutInflaterClass +import com.highcapable.kavaref.KavaRef.Companion.resolve +import com.highcapable.kavaref.extension.genericSuperclassTypeArguments +import com.highcapable.kavaref.extension.toClassOrNull abstract class BaseActivity : AppCompatActivity() { @@ -50,10 +49,11 @@ abstract class BaseActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) isMainThreadRunning = true - binding = current().generic()?.argument()?.method { + val bindingClass = javaClass.genericSuperclassTypeArguments().firstOrNull()?.toClassOrNull() + binding = bindingClass?.resolve()?.optional()?.firstMethodOrNull { name = "inflate" - param(LayoutInflaterClass) - }?.get()?.invoke(layoutInflater) ?: error("binding failed") + parameters(LayoutInflater::class) + }?.invoke(layoutInflater) ?: error("binding failed") if (Build.VERSION.SDK_INT >= 35) binding.root.fitsSystemWindows = true setContentView(binding.root) /** 隐藏系统的标题栏 */ @@ -63,6 +63,7 @@ abstract class BaseActivity : AppCompatActivity() { isAppearanceLightStatusBars = isNotSystemInDarkMode isAppearanceLightNavigationBars = isNotSystemInDarkMode } + @Suppress("DEPRECATION") ResourcesCompat.getColor(resources, R.color.colorThemeBackground, null).also { window?.statusBarColor = it window?.navigationBarColor = it diff --git a/app/src/main/java/com/fankes/coloros/notify/utils/factory/BaseAdapterFactory.kt b/app/src/main/java/com/fankes/coloros/notify/utils/factory/BaseAdapterFactory.kt index 954d6c0..a3358c6 100644 --- a/app/src/main/java/com/fankes/coloros/notify/utils/factory/BaseAdapterFactory.kt +++ b/app/src/main/java/com/fankes/coloros/notify/utils/factory/BaseAdapterFactory.kt @@ -20,6 +20,8 @@ * * This file is created by fankes on 2022/6/3. */ +@file:Suppress("DEPRECATION") + package com.fankes.coloros.notify.utils.factory import android.content.Context diff --git a/app/src/main/java/com/fankes/coloros/notify/utils/factory/DialogBuilderFactory.kt b/app/src/main/java/com/fankes/coloros/notify/utils/factory/DialogBuilderFactory.kt index 6f7a95e..8d07dfc 100644 --- a/app/src/main/java/com/fankes/coloros/notify/utils/factory/DialogBuilderFactory.kt +++ b/app/src/main/java/com/fankes/coloros/notify/utils/factory/DialogBuilderFactory.kt @@ -20,7 +20,7 @@ * * This file is created by fankes on 2022/1/7. */ -@file:Suppress("unused") +@file:Suppress("unused", "DEPRECATION") package com.fankes.coloros.notify.utils.factory 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 e75ba98..0a2cd8d 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 @@ -20,7 +20,7 @@ * * This file is created by fankes on 2022/1/7. */ -@file:Suppress("unused", "ObsoleteSdkInt") +@file:Suppress("unused", "ObsoleteSdkInt", "DEPRECATION") package com.fankes.coloros.notify.utils.factory @@ -56,6 +56,7 @@ import androidx.core.app.NotificationManagerCompat import androidx.core.content.getSystemService import androidx.core.content.pm.PackageInfoCompat import androidx.core.content.res.ResourcesCompat +import androidx.core.net.toUri import com.fankes.coloros.notify.wrapper.BuildConfigWrapper import com.google.android.material.snackbar.Snackbar import com.highcapable.yukihookapi.hook.factory.field @@ -133,7 +134,7 @@ inline val isNotColorOS get() = !isColorOS val isRealmeUI get() = safeOfFalse { val query = appContext.contentResolver.query( - Uri.parse("content://com.oplus.customize.coreapp.configmanager.configprovider.AppFeatureProvider") + "content://com.oplus.customize.coreapp.configmanager.configprovider.AppFeatureProvider".toUri() .buildUpon() .appendPath("app_feature") .build(), null, "featurename=?", arrayOf("com.android.launcher.device_rm"), null @@ -485,7 +486,7 @@ fun Context.openBrowser(url: String, packageName: String = "") = runCatching { startActivity(Intent().apply { if (packageName.isNotBlank()) setPackage(packageName) action = Intent.ACTION_VIEW - data = Uri.parse(url) + data = url.toUri() /** 防止顶栈一样重叠在自己的 APP 中 */ flags = Intent.FLAG_ACTIVITY_NEW_TASK }) diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index 462ad32..79af922 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -1306,6 +1306,35 @@ android:textColor="@color/colorTextGray" android:textSize="11sp" /> + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/mipmap-xxhdpi/ic_kavaref.png b/app/src/main/res/mipmap-xxhdpi/ic_kavaref.png new file mode 100644 index 0000000000000000000000000000000000000000..1fd561699dd11d7d2f5e437fa936c010193f0528 GIT binary patch literal 17389 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 R2!L#Yl%A+RE_!Gl{C@>F9i0FG literal 0 HcmV?d00001 diff --git a/gradle/sweet-dependency/sweet-dependency-config.yaml b/gradle/sweet-dependency/sweet-dependency-config.yaml index 6cd8caf..6f19b26 100644 --- a/gradle/sweet-dependency/sweet-dependency-config.yaml +++ b/gradle/sweet-dependency/sweet-dependency-config.yaml @@ -22,7 +22,7 @@ repositories: plugins: com.android.application: alias: android-application - version: 8.9.0 + version: 8.9.3 org.jetbrains.kotlin.android: alias: kotlin-android version: 2.1.10 @@ -43,9 +43,14 @@ libraries: rovo89-xposed-api com.highcapable.yukihookapi: api: - version: 1.2.1 + version: 1.3.0 ksp-xposed: version-ref: ::api + com.highcapable.kavaref: + kavaref-core: + version: 1.0.0 + kavaref-extension: + version: 1.0.0 com.github.topjohnwu.libsu: core: version: 5.2.2 @@ -55,13 +60,13 @@ libraries: version: 1.0.7 com.squareup.okhttp3: okhttp: - version: 5.0.0-alpha.14 + version: 5.0.0-alpha.16 androidx.core: core-ktx: - version: 1.15.0 + version: 1.16.0 androidx.appcompat: appcompat: - version: 1.7.0 + version: 1.7.1 com.google.android.material: material: version: 1.12.0