8 Commits

Author SHA1 Message Date
李太白
97538445e1 fix: 修复 HyperOS 3.0 状态栏小图标反色问题 (#248)
* fix: 修复 HyperOS 3.0 状态栏小图标反色问题

Signed-off-by: ghhccghk <2137610394@qq.com>

* style: optimizing code style

---------

Signed-off-by: ghhccghk <2137610394@qq.com>
Co-authored-by: fankesyooni <qzmmcn@163.com>
2025-09-08 22:22:54 +08:00
30fdbdbcb2 refactor: support monochrome app icon (round) 2025-09-06 22:48:11 +08:00
1675e28ca7 chore: bump dependencies 2025-09-06 22:48:01 +08:00
李太白
62a40b706d feat: 新增对HyperOS 3.0和Android 16的支持 (#244) 2025-09-06 18:28:39 +08:00
3e29a70969 chore: update target sdk to 36 2025-08-19 16:52:33 +08:00
3015eade97 chore: update jdk to 21 2025-08-19 16:52:18 +08:00
c172e1e229 chore: bump gradle to 8.14.3 2025-08-19 16:52:11 +08:00
25b7853313 chore: bump dependencies 2025-08-19 16:52:00 +08:00
11 changed files with 104 additions and 83 deletions

View File

@@ -37,10 +37,10 @@ jobs:
uses: jwlawson/actions-setup-cmake@v1 uses: jwlawson/actions-setup-cmake@v1
with: with:
cmake-version: '3.22.1' cmake-version: '3.22.1'
- name: Prepare Java 17 - name: Prepare Java 21
uses: actions/setup-java@v4 uses: actions/setup-java@v4
with: with:
java-version: 17 java-version: 21
java-package: jdk java-package: jdk
distribution: 'temurin' distribution: 'temurin'
cache: 'gradle' cache: 'gradle'

View File

@@ -27,10 +27,10 @@ jobs:
uses: jwlawson/actions-setup-cmake@v1 uses: jwlawson/actions-setup-cmake@v1
with: with:
cmake-version: '3.22.1' cmake-version: '3.22.1'
- name: Prepare Java 17 - name: Prepare Java 21
uses: actions/setup-java@v4 uses: actions/setup-java@v4
with: with:
java-version: 17 java-version: 21
java-package: jdk java-package: jdk
distribution: 'temurin' distribution: 'temurin'
cache: 'gradle' cache: 'gradle'

View File

@@ -38,14 +38,6 @@ android {
sourceCompatibility = JavaVersion.VERSION_17 sourceCompatibility = JavaVersion.VERSION_17
targetCompatibility = JavaVersion.VERSION_17 targetCompatibility = JavaVersion.VERSION_17
} }
kotlinOptions {
jvmTarget = "17"
freeCompilerArgs = listOf(
"-Xno-param-assertions",
"-Xno-call-assertions",
"-Xno-receiver-assertions"
)
}
buildFeatures { buildFeatures {
buildConfig = true buildConfig = true
viewBinding = true viewBinding = true

View File

@@ -20,10 +20,11 @@
* *
* This file is created by fankes on 2022/3/25. * This file is created by fankes on 2022/3/25.
*/ */
@file:Suppress("StaticFieldLeak", "ConstPropertyName") @file:Suppress("ConstPropertyName")
package com.fankes.miui.notify.hook.entity package com.fankes.miui.notify.hook.entity
import android.annotation.SuppressLint
import android.app.Notification import android.app.Notification
import android.app.NotificationManager import android.app.NotificationManager
import android.app.WallpaperManager import android.app.WallpaperManager
@@ -67,6 +68,7 @@ import com.fankes.miui.notify.utils.factory.isMIOS
import com.fankes.miui.notify.utils.factory.isNotSystemInDarkMode import com.fankes.miui.notify.utils.factory.isNotSystemInDarkMode
import com.fankes.miui.notify.utils.factory.isSystemInDarkMode import com.fankes.miui.notify.utils.factory.isSystemInDarkMode
import com.fankes.miui.notify.utils.factory.isUpperOfAndroidS import com.fankes.miui.notify.utils.factory.isUpperOfAndroidS
import com.fankes.miui.notify.utils.factory.miosVersionCode
import com.fankes.miui.notify.utils.factory.miuiIncrementalVersion import com.fankes.miui.notify.utils.factory.miuiIncrementalVersion
import com.fankes.miui.notify.utils.factory.round import com.fankes.miui.notify.utils.factory.round
import com.fankes.miui.notify.utils.factory.runInSafe import com.fankes.miui.notify.utils.factory.runInSafe
@@ -215,6 +217,7 @@ object SystemUIHooker : YukiBaseHooker() {
private var isUsingCachingMethod = false private var isUsingCachingMethod = false
/** 状态栏通知图标容器 */ /** 状态栏通知图标容器 */
@SuppressLint("StaticFieldLeak")
private var notificationIconContainer: ViewGroup? = null private var notificationIconContainer: ViewGroup? = null
/** 通知栏通知控制器 */ /** 通知栏通知控制器 */
@@ -659,8 +662,10 @@ object SystemUIHooker : YukiBaseHooker() {
/** 获取 [StatusBarNotification] 实例 */ /** 获取 [StatusBarNotification] 实例 */
val notifyInstance = asResolver().optional().firstFieldOrNull { name = "mNotification" }?.get<StatusBarNotification>() ?: return false val notifyInstance = asResolver().optional().firstFieldOrNull { name = "mNotification" }?.get<StatusBarNotification>() ?: return false
val appContext = context.createPackageContext(notifyInstance.nfPkgName, Context.CONTEXT_IGNORE_SECURITY)
/** 获取通知小图标 */ /** 获取通知小图标 */
val iconDrawable = notifyInstance.notification?.smallIcon?.loadDrawable(context) ?: return false val iconDrawable = notifyInstance.notification?.smallIcon?.loadDrawable(appContext) ?: return false
/** 判断是否不是灰度图标 */ /** 判断是否不是灰度图标 */
val isGrayscaleIcon = notifyInstance.isXmsf.not() && isGrayscaleIcon(context, iconDrawable) val isGrayscaleIcon = notifyInstance.isXmsf.not() && isGrayscaleIcon(context, iconDrawable)
@@ -693,6 +698,7 @@ object SystemUIHooker : YukiBaseHooker() {
* @param animColor 动画过渡颜色 * @param animColor 动画过渡颜色
*/ */
private fun updateStatusBarIconColor(iconView: ImageView, isDarkIconMode: Boolean = this.isDarkIconMode, animColor: Int? = null) { private fun updateStatusBarIconColor(iconView: ImageView, isDarkIconMode: Boolean = this.isDarkIconMode, animColor: Int? = null) {
if (miosVersionCode >= 3) return
if (iconView.isGrayscaleIcon()) { if (iconView.isGrayscaleIcon()) {
/** /**
* 防止图标不是纯黑的问题 * 防止图标不是纯黑的问题
@@ -947,12 +953,16 @@ object SystemUIHooker : YukiBaseHooker() {
parameters(Notification::class, Context::class) parameters(Notification::class, Context::class)
}?.hook()?.after { }?.hook()?.after {
val nf = args().first().cast<Notification>() val nf = args().first().cast<Notification>()
val appname = nf?.extras?.getString("miui.opPkg")
val context = args(index = 1).cast<Context>() val context = args(index = 1).cast<Context>()
val iconBitmap = nf?.smallIcon?.loadDrawable(context)?.toBitmap() if (appname != null) {
val appContext = context?.createPackageContext(appname, Context.CONTEXT_IGNORE_SECURITY)
val iconBitmap = nf.smallIcon?.loadDrawable(appContext)?.toBitmap()
result = if (context != null && iconBitmap != null && !iconBitmap.isRecycled) result = if (context != null && iconBitmap != null && !iconBitmap.isRecycled)
iconBitmap.toDrawable(context.resources) iconBitmap.toDrawable(context.resources)
else null else null
} }
}
/** /**
* 强制回写系统的状态栏图标样式为原生 * 强制回写系统的状态栏图标样式为原生
* 部分系统没有 "getSmallIcon" 这个方法 - 所以直接忽略 * 部分系统没有 "getSmallIcon" 这个方法 - 所以直接忽略
@@ -986,6 +996,7 @@ object SystemUIHooker : YukiBaseHooker() {
} }
} }
} }
if (miosVersionCode < 3) {
/** 焦点通知深色模式切换点 */ /** 焦点通知深色模式切换点 */
FocusedNotifPromptViewClass?.resolve()?.optional()?.apply { FocusedNotifPromptViewClass?.resolve()?.optional()?.apply {
firstMethodOrNull { firstMethodOrNull {
@@ -1040,6 +1051,7 @@ object SystemUIHooker : YukiBaseHooker() {
} }
}?.hook()?.after { hookTickerDarkIcon(isDark = false) } }?.hook()?.after { hookTickerDarkIcon(isDark = false) }
} }
}
/** 注入状态栏通知图标实例 */ /** 注入状态栏通知图标实例 */
StatusBarIconViewClass.resolve().optional().firstMethodOrNull { StatusBarIconViewClass.resolve().optional().firstMethodOrNull {
name = "updateIconColor" name = "updateIconColor"

View File

@@ -178,7 +178,7 @@ inline val isNotMIOS get() = !isMIOS
val isSupportMiSystemVersion val isSupportMiSystemVersion
get() = when { get() = when {
isMIOS -> when (miosVersion) { isMIOS -> when (miosVersion) {
"1.0", "1.1", "2.0" -> true "1.0", "1.1", "2.0" , "3.0"-> true
else -> false else -> false
} }
isMIUI -> when (miuiVersion) { isMIUI -> when (miuiVersion) {
@@ -200,6 +200,7 @@ inline val isNotSupportMiSystemVersion get() = !isSupportMiSystemVersion
*/ */
val androidVersionCodeName val androidVersionCodeName
get() = when (Build.VERSION.SDK_INT) { get() = when (Build.VERSION.SDK_INT) {
36 -> "W"
35 -> "V" 35 -> "V"
34 -> "U" 34 -> "U"
33 -> "T" 33 -> "T"

View File

@@ -2,4 +2,5 @@
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android"> <adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
<background android:drawable="@color/ic_launcher_background" /> <background android:drawable="@color/ic_launcher_background" />
<foreground android:drawable="@mipmap/ic_launcher_foreground" /> <foreground android:drawable="@mipmap/ic_launcher_foreground" />
<monochrome android:drawable="@mipmap/ic_launcher_foreground" />
</adaptive-icon> </adaptive-icon>

View File

@@ -1,5 +1,21 @@
import org.jetbrains.kotlin.gradle.dsl.JvmTarget
import org.jetbrains.kotlin.gradle.tasks.KotlinJvmCompile
plugins { plugins {
autowire(libs.plugins.android.application) apply false autowire(libs.plugins.android.application) apply false
autowire(libs.plugins.kotlin.android) apply false autowire(libs.plugins.kotlin.android) apply false
autowire(libs.plugins.kotlin.ksp) apply false autowire(libs.plugins.kotlin.ksp) apply false
} }
allprojects {
tasks.withType<KotlinJvmCompile>().configureEach {
compilerOptions {
jvmTarget = JvmTarget.JVM_17
freeCompilerArgs.addAll(
"-Xno-param-assertions",
"-Xno-call-assertions",
"-Xno-receiver-assertions"
)
}
}
}

View File

@@ -3,12 +3,11 @@ org.gradle.jvmargs=-Xmx2048m -Dfile.encoding=UTF-8
android.useAndroidX=true android.useAndroidX=true
android.nonTransitiveRClass=true android.nonTransitiveRClass=true
kotlin.code.style=official kotlin.code.style=official
kotlin.incremental.useClasspathSnapshot=true
# Project Configuration # Project Configuration
project.name=MIUINativeNotifyIcon project.name=MIUINativeNotifyIcon
project.android.compileSdk=35 project.android.compileSdk=36
project.android.minSdk=28 project.android.minSdk=28
project.android.targetSdk=35 project.android.targetSdk=36
project.app.packageName=com.fankes.miui.notify project.app.packageName=com.fankes.miui.notify
project.app.versionName="2.110" project.app.versionName="2.110"
project.app.versionCode=42 project.app.versionCode=42

View File

@@ -22,18 +22,18 @@ repositories:
plugins: plugins:
com.android.application: com.android.application:
alias: android-application alias: android-application
version: 8.9.3 version: 8.13.0
org.jetbrains.kotlin.android: org.jetbrains.kotlin.android:
alias: kotlin-android alias: kotlin-android
version: 2.1.10 version: 2.2.10
com.google.devtools.ksp: com.google.devtools.ksp:
alias: kotlin-ksp alias: kotlin-ksp
version: 2.1.10-1.0.31 version: 2.2.10-2.0.2
libraries: libraries:
com.fankes.projectpromote: com.fankes.projectpromote:
project-promote: project-promote:
version: 1.0.0 version: 1.0.1
repositories: repositories:
fankes-maven-releases fankes-maven-releases
de.robv.android.xposed: de.robv.android.xposed:
@@ -60,25 +60,25 @@ libraries:
version: 1.0.7 version: 1.0.7
com.squareup.okhttp3: com.squareup.okhttp3:
okhttp: okhttp:
version: 5.0.0-alpha.16 version: 5.1.0
androidx.core: androidx.core:
core-ktx: core-ktx:
version: 1.16.0 version: 1.17.0
androidx.appcompat: androidx.appcompat:
appcompat: appcompat:
version: 1.7.1 version: 1.7.1
com.google.android.material: com.google.android.material:
material: material:
version: 1.12.0 version: 1.13.0
androidx.constraintlayout: androidx.constraintlayout:
constraintlayout: constraintlayout:
version: 2.2.1 version: 2.2.1
androidx.test.ext: androidx.test.ext:
junit: junit:
version: 1.2.1 version: 1.3.0
androidx.test.espresso: androidx.test.espresso:
espresso-core: espresso-core:
version: 3.6.1 version: 3.7.0
junit: junit:
junit: junit:
version: 4.13.2 version: 4.13.2

View File

@@ -1,5 +1,5 @@
distributionBase=GRADLE_USER_HOME distributionBase=GRADLE_USER_HOME
distributionUrl=https\://services.gradle.org/distributions/gradle-8.13-bin.zip distributionUrl=https\://services.gradle.org/distributions/gradle-8.14.3-bin.zip
distributionPath=wrapper/dists distributionPath=wrapper/dists
zipStorePath=wrapper/dists zipStorePath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME zipStoreBase=GRADLE_USER_HOME

View File

@@ -7,7 +7,7 @@ pluginManagement {
} }
plugins { plugins {
id("com.highcapable.sweetdependency") version "1.0.4" id("com.highcapable.sweetdependency") version "1.0.4"
id("com.highcapable.sweetproperty") version "1.0.5" id("com.highcapable.sweetproperty") version "1.0.8"
} }
sweetProperty { sweetProperty {
global { global {