mirror of
https://github.com/fankes/MIUINativeNotifyIcon.git
synced 2025-09-07 03:05:51 +08:00
新增经典通知栏下也使用原生通知图标,不再限制经典样式取消激活模块,不支持 MIUI 12
This commit is contained in:
@@ -89,6 +89,10 @@ class SystemUIHooker : YukiBaseHooker() {
|
|||||||
/** 原生存在的类 */
|
/** 原生存在的类 */
|
||||||
private const val PluginManagerImplClass = "${SYSTEMUI_PACKAGE_NAME}.shared.plugins.PluginManagerImpl"
|
private const val PluginManagerImplClass = "${SYSTEMUI_PACKAGE_NAME}.shared.plugins.PluginManagerImpl"
|
||||||
|
|
||||||
|
/** MIUI 存在的类 - 旧版本没有 */
|
||||||
|
private const val MiuiNotificationViewWrapperClass =
|
||||||
|
"${SYSTEMUI_PACKAGE_NAME}.statusbar.notification.row.wrapper.MiuiNotificationViewWrapper"
|
||||||
|
|
||||||
/** 根据多个版本存在不同的包名相同的类 */
|
/** 根据多个版本存在不同的包名相同的类 */
|
||||||
private val MiuiClockClass = VariousClass(
|
private val MiuiClockClass = VariousClass(
|
||||||
"${SYSTEMUI_PACKAGE_NAME}.statusbar.views.MiuiClock",
|
"${SYSTEMUI_PACKAGE_NAME}.statusbar.views.MiuiClock",
|
||||||
@@ -141,6 +145,9 @@ class SystemUIHooker : YukiBaseHooker() {
|
|||||||
/** 缓存的通知小图标包装纸实例 */
|
/** 缓存的通知小图标包装纸实例 */
|
||||||
private var notificationViewWrappers = HashSet<Any>()
|
private var notificationViewWrappers = HashSet<Any>()
|
||||||
|
|
||||||
|
/** MIUI 样式下的缓存的通知小图标包装纸实例 */
|
||||||
|
private var miuiNotificationViewWrappers = HashSet<Any>()
|
||||||
|
|
||||||
/** 是否已经注册广播 */
|
/** 是否已经注册广播 */
|
||||||
private var isRegisterReceiver = false
|
private var isRegisterReceiver = false
|
||||||
|
|
||||||
@@ -238,6 +245,18 @@ class SystemUIHooker : YukiBaseHooker() {
|
|||||||
private val hasHandleHeaderViews
|
private val hasHandleHeaderViews
|
||||||
get() = safeOfFalse { NotificationHeaderViewWrapperClass.clazz.hasMethod { name = "handleHeaderViews" } }
|
get() = safeOfFalse { NotificationHeaderViewWrapperClass.clazz.hasMethod { name = "handleHeaderViews" } }
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取是否存在忽略图标色彩处理的方法
|
||||||
|
* @return [Boolean]
|
||||||
|
*/
|
||||||
|
private val hasIgnoreStatusBarIconColor
|
||||||
|
get() = safeOfFalse {
|
||||||
|
NotificationUtilClass.clazz.hasMethod {
|
||||||
|
name = "ignoreStatusBarIconColor"
|
||||||
|
param(ExpandedNotificationClass.clazz)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 获取当前通知栏的样式
|
* 获取当前通知栏的样式
|
||||||
*
|
*
|
||||||
@@ -342,8 +361,8 @@ class SystemUIHooker : YukiBaseHooker() {
|
|||||||
/** 得到通知实例 */
|
/** 得到通知实例 */
|
||||||
val nf = result.of<StatusBarNotification>(it) ?: return
|
val nf = result.of<StatusBarNotification>(it) ?: return
|
||||||
/** 刷新状态栏图标 */
|
/** 刷新状态栏图标 */
|
||||||
compatStatusIcon(it.context, nf, nf.notification.smallIcon.loadDrawable(it.context)) { icon, _ ->
|
compatStatusIcon(it.context, nf, nf.notification.smallIcon.loadDrawable(it.context)).also { pair ->
|
||||||
it.setImageDrawable(icon)
|
pair.first.let { e -> it.setImageDrawable(e) }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -356,6 +375,9 @@ class SystemUIHooker : YukiBaseHooker() {
|
|||||||
else NotificationHeaderViewWrapperClass.clazz.method { name = "resolveHeaderViews" }).also { result ->
|
else NotificationHeaderViewWrapperClass.clazz.method { name = "resolveHeaderViews" }).also { result ->
|
||||||
notificationViewWrappers.takeIf { it.isNotEmpty() }?.forEach { result.get(it).call() }
|
notificationViewWrappers.takeIf { it.isNotEmpty() }?.forEach { result.get(it).call() }
|
||||||
}
|
}
|
||||||
|
MiuiNotificationViewWrapperClass.clazz.method { name = "handleViews" }.ignoredError().also { result ->
|
||||||
|
miuiNotificationViewWrappers.takeIf { it.isNotEmpty() }?.forEach { result.get(it).call() }
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -385,22 +407,11 @@ class SystemUIHooker : YukiBaseHooker() {
|
|||||||
* @param context 实例
|
* @param context 实例
|
||||||
* @param expandedNf 通知实例
|
* @param expandedNf 通知实例
|
||||||
* @param iconDrawable 小图标 [Drawable]
|
* @param iconDrawable 小图标 [Drawable]
|
||||||
* @param it 回调小图标 - ([Drawable] 小图标,[Boolean] 是否替换)
|
* @return [Pair] 回调小图标 - ([Drawable] 小图标,[Boolean] 是否替换)
|
||||||
*/
|
*/
|
||||||
private fun compatStatusIcon(
|
private fun compatStatusIcon(context: Context, expandedNf: StatusBarNotification?, iconDrawable: Drawable?) =
|
||||||
context: Context,
|
expandedNf?.let { notifyInstance ->
|
||||||
expandedNf: StatusBarNotification?,
|
if (iconDrawable == null) return@let Pair(null, false)
|
||||||
iconDrawable: Drawable?,
|
|
||||||
it: (Drawable, Boolean) -> Unit
|
|
||||||
) = runInSafe(msg = "compatStatusIcon") {
|
|
||||||
if (iconDrawable == null) return@runInSafe
|
|
||||||
/** 获取通知对象 - 由于 MIUI 的版本迭代不规范性可能是空的 */
|
|
||||||
expandedNf?.also { notifyInstance ->
|
|
||||||
/** 判断是 MIUI 样式就停止 Hook */
|
|
||||||
if (context.isMiuiNotifyStyle) {
|
|
||||||
it(context.findAppIcon(notifyInstance.nfPkgName) ?: iconDrawable, true)
|
|
||||||
return@runInSafe
|
|
||||||
}
|
|
||||||
/** 判断是否不是灰度图标 */
|
/** 判断是否不是灰度图标 */
|
||||||
val isNotGrayscaleIcon = notifyInstance.isXmsf || isGrayscaleIcon(context, iconDrawable).not()
|
val isNotGrayscaleIcon = notifyInstance.isXmsf || isGrayscaleIcon(context, iconDrawable).not()
|
||||||
|
|
||||||
@@ -410,14 +421,13 @@ class SystemUIHooker : YukiBaseHooker() {
|
|||||||
printLogcat(tag = "StatusIcon", context, notifyInstance, isCustom = customIcon != null, isNotGrayscaleIcon.not())
|
printLogcat(tag = "StatusIcon", context, notifyInstance, isCustom = customIcon != null, isNotGrayscaleIcon.not())
|
||||||
when {
|
when {
|
||||||
/** 处理自定义通知图标优化 */
|
/** 处理自定义通知图标优化 */
|
||||||
customIcon != null -> it(BitmapDrawable(context.resources, customIcon), true)
|
customIcon != null -> Pair(BitmapDrawable(context.resources, customIcon), true)
|
||||||
/** 若不是灰度图标自动处理为圆角 */
|
/** 若不是灰度图标自动处理为圆角 */
|
||||||
isNotGrayscaleIcon -> it(notifyInstance.compatPushingIcon(context, iconDrawable).rounded(context), true)
|
isNotGrayscaleIcon -> Pair(notifyInstance.compatPushingIcon(context, iconDrawable).rounded(context), true)
|
||||||
/** 否则返回原始小图标 */
|
/** 否则返回原始小图标 */
|
||||||
else -> it(notifyInstance.notification.smallIcon.loadDrawable(context), false)
|
else -> Pair(notifyInstance.notification.smallIcon.loadDrawable(context), false)
|
||||||
}
|
}
|
||||||
}
|
} ?: Pair(null, false)
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Hook 通知栏小图标
|
* Hook 通知栏小图标
|
||||||
@@ -426,16 +436,16 @@ class SystemUIHooker : YukiBaseHooker() {
|
|||||||
* @param context 实例
|
* @param context 实例
|
||||||
* @param expandedNf 通知实例
|
* @param expandedNf 通知实例
|
||||||
* @param iconImageView 通知图标实例
|
* @param iconImageView 通知图标实例
|
||||||
* @param isExpanded 通知是否展开 - 可做最小化通知处理
|
* @param isExpanded 通知是否展开 - 可做最小化通知处理 - 默认:是
|
||||||
|
* @param isUseAndroid12Style 是否使用 Android 12 通知图标风格 - 默认跟随系统版本决定
|
||||||
*/
|
*/
|
||||||
private fun compatNotifyIcon(
|
private fun compatNotifyIcon(
|
||||||
context: Context,
|
context: Context,
|
||||||
expandedNf: StatusBarNotification?,
|
expandedNf: StatusBarNotification?,
|
||||||
iconImageView: ImageView,
|
iconImageView: ImageView,
|
||||||
isExpanded: Boolean
|
isExpanded: Boolean = true,
|
||||||
|
isUseAndroid12Style: Boolean = isUpperOfAndroidS,
|
||||||
) = runInSafe(msg = "compatNotifyIcon") {
|
) = runInSafe(msg = "compatNotifyIcon") {
|
||||||
/** 判断是 MIUI 样式就停止 Hook */
|
|
||||||
if (context.isMiuiNotifyStyle) return@runInSafe
|
|
||||||
/** 获取通知对象 - 由于 MIUI 的版本迭代不规范性可能是空的 */
|
/** 获取通知对象 - 由于 MIUI 的版本迭代不规范性可能是空的 */
|
||||||
expandedNf?.let { notifyInstance ->
|
expandedNf?.let { notifyInstance ->
|
||||||
|
|
||||||
@@ -454,7 +464,7 @@ class SystemUIHooker : YukiBaseHooker() {
|
|||||||
/** 通知图标适配颜色 */
|
/** 通知图标适配颜色 */
|
||||||
val supportColor = iconColor.let {
|
val supportColor = iconColor.let {
|
||||||
when {
|
when {
|
||||||
isUpperOfAndroidS -> newStyle
|
isUseAndroid12Style -> newStyle
|
||||||
it == 0 || isExpanded.not() -> oldStyle
|
it == 0 || isExpanded.not() -> oldStyle
|
||||||
else -> it
|
else -> it
|
||||||
}
|
}
|
||||||
@@ -473,8 +483,8 @@ class SystemUIHooker : YukiBaseHooker() {
|
|||||||
var customIconColor: Int
|
var customIconColor: Int
|
||||||
compatCustomIcon(isGrayscaleIcon, notifyInstance.nfPkgName).also {
|
compatCustomIcon(isGrayscaleIcon, notifyInstance.nfPkgName).also {
|
||||||
customIcon = it.first
|
customIcon = it.first
|
||||||
customIconColor = if (isUpperOfAndroidS || isExpanded)
|
customIconColor = if (isUseAndroid12Style || isExpanded)
|
||||||
(it.second.takeIf { e -> e != 0 } ?: context.systemAccentColor) else 0
|
(it.second.takeIf { e -> e != 0 } ?: (if (isUseAndroid12Style) context.systemAccentColor else 0)) else 0
|
||||||
}
|
}
|
||||||
/** 打印日志 */
|
/** 打印日志 */
|
||||||
printLogcat(tag = "NotifyIcon", context, notifyInstance, isCustom = customIcon != null, isGrayscaleIcon)
|
printLogcat(tag = "NotifyIcon", context, notifyInstance, isCustom = customIcon != null, isGrayscaleIcon)
|
||||||
@@ -485,12 +495,12 @@ class SystemUIHooker : YukiBaseHooker() {
|
|||||||
/** 设置自定义小图标 */
|
/** 设置自定义小图标 */
|
||||||
setImageBitmap(customIcon)
|
setImageBitmap(customIcon)
|
||||||
/** 上色 */
|
/** 上色 */
|
||||||
setColorFilter(if (isUpperOfAndroidS || customIconColor == 0) supportColor else customIconColor)
|
setColorFilter(if (isUseAndroid12Style || customIconColor == 0) supportColor else customIconColor)
|
||||||
/** Android 12 设置图标外圈颜色 */
|
/** Android 12 设置图标外圈颜色 */
|
||||||
if (isUpperOfAndroidS && customIconColor != 0)
|
if (isUseAndroid12Style && customIconColor != 0)
|
||||||
background = DrawableBuilder().rounded().solidColor(customIconColor).build()
|
background = DrawableBuilder().rounded().solidColor(customIconColor).build()
|
||||||
/** 设置原生的背景边距 */
|
/** 设置原生的背景边距 */
|
||||||
if (isUpperOfAndroidS) setPadding(4.dp(context), 4.dp(context), 4.dp(context), 4.dp(context))
|
if (isUseAndroid12Style) setPadding(4.dp(context), 4.dp(context), 4.dp(context), 4.dp(context))
|
||||||
} else {
|
} else {
|
||||||
/** 重新设置图标 - 防止系统更改它 */
|
/** 重新设置图标 - 防止系统更改它 */
|
||||||
iconImageView.setImageDrawable(iconDrawable)
|
iconImageView.setImageDrawable(iconDrawable)
|
||||||
@@ -501,10 +511,10 @@ class SystemUIHooker : YukiBaseHooker() {
|
|||||||
/** 设置图标着色 */
|
/** 设置图标着色 */
|
||||||
setColorFilter(supportColor)
|
setColorFilter(supportColor)
|
||||||
/** Android 12 设置图标外圈颜色 */
|
/** Android 12 设置图标外圈颜色 */
|
||||||
if (isUpperOfAndroidS) background =
|
if (isUseAndroid12Style) background =
|
||||||
DrawableBuilder().rounded().solidColor(if (hasIconColor) iconColor else context.systemAccentColor).build()
|
DrawableBuilder().rounded().solidColor(if (hasIconColor) iconColor else context.systemAccentColor).build()
|
||||||
/** 设置原生的背景边距 */
|
/** 设置原生的背景边距 */
|
||||||
if (isUpperOfAndroidS) setPadding(4.dp(context), 4.dp(context), 4.dp(context), 4.dp(context))
|
if (isUseAndroid12Style) setPadding(4.dp(context), 4.dp(context), 4.dp(context), 4.dp(context))
|
||||||
} else iconImageView.apply {
|
} else iconImageView.apply {
|
||||||
/** 重新设置图标 */
|
/** 重新设置图标 */
|
||||||
setImageDrawable(notifyInstance.compatPushingIcon(context, iconDrawable))
|
setImageDrawable(notifyInstance.compatPushingIcon(context, iconDrawable))
|
||||||
@@ -519,7 +529,7 @@ class SystemUIHooker : YukiBaseHooker() {
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (isUpperOfAndroidS) {
|
if (isUseAndroid12Style) {
|
||||||
/** 清除原生的背景边距 */
|
/** 清除原生的背景边距 */
|
||||||
setPadding(0, 0, 0, 0)
|
setPadding(0, 0, 0, 0)
|
||||||
/** 清除原生的主题色背景圆圈颜色 */
|
/** 清除原生的主题色背景圆圈颜色 */
|
||||||
@@ -540,27 +550,58 @@ class SystemUIHooker : YukiBaseHooker() {
|
|||||||
* @param expandedNf 状态栏实例
|
* @param expandedNf 状态栏实例
|
||||||
* @return [Boolean] 是否忽略通知图标颜色
|
* @return [Boolean] 是否忽略通知图标颜色
|
||||||
*/
|
*/
|
||||||
private fun hasIgnoreStatusBarIconColor(context: Context, expandedNf: StatusBarNotification?) =
|
private fun hasIgnoreStatusBarIconColor(context: Context, expandedNf: StatusBarNotification?) = safeOfFalse {
|
||||||
if (context.isMiuiNotifyStyle.not()) safeOfFalse {
|
/** 获取通知对象 - 由于 MIUI 的版本迭代不规范性可能是空的 */
|
||||||
/** 获取通知对象 - 由于 MIUI 的版本迭代不规范性可能是空的 */
|
expandedNf?.let { notifyInstance ->
|
||||||
expandedNf?.let { notifyInstance ->
|
/** 获取通知小图标 */
|
||||||
/** 获取通知小图标 */
|
val iconDrawable = notifyInstance.notification.smallIcon.loadDrawable(context)
|
||||||
val iconDrawable = notifyInstance.notification.smallIcon.loadDrawable(context)
|
|
||||||
|
|
||||||
/** 判断是否不是灰度图标 */
|
/** 判断是否不是灰度图标 */
|
||||||
val isNotGrayscaleIcon = notifyInstance.isXmsf || isGrayscaleIcon(context, iconDrawable).not()
|
val isNotGrayscaleIcon = notifyInstance.isXmsf || isGrayscaleIcon(context, iconDrawable).not()
|
||||||
|
|
||||||
/** 获取目标修复彩色图标的 APP */
|
/** 获取目标修复彩色图标的 APP */
|
||||||
val isTargetFixApp = compatCustomIcon(isNotGrayscaleIcon.not(), notifyInstance.nfPkgName).first != null
|
val isTargetFixApp = compatCustomIcon(isNotGrayscaleIcon.not(), notifyInstance.nfPkgName).first != null
|
||||||
/**
|
/**
|
||||||
* 只要不是灰度就返回彩色图标
|
* 只要不是灰度就返回彩色图标
|
||||||
* 否则不对颜色进行反色处理防止一些系统图标出现异常
|
* 否则不对颜色进行反色处理防止一些系统图标出现异常
|
||||||
*/
|
*/
|
||||||
(if (isTargetFixApp) false else isNotGrayscaleIcon).also {
|
(if (isTargetFixApp) false else isNotGrayscaleIcon).also {
|
||||||
printLogcat(tag = "IconColor", context, expandedNf, isTargetFixApp, isNotGrayscaleIcon.not())
|
printLogcat(tag = "IconColor", context, expandedNf, isTargetFixApp, isNotGrayscaleIcon.not())
|
||||||
}
|
}
|
||||||
} ?: true.also { printLogcat(tag = "IconColor", context, expandedNf = null, isCustom = false, isGrayscale = false) }
|
} ?: true.also { printLogcat(tag = "IconColor", context, expandedNf = null, isCustom = false, isGrayscale = false) }
|
||||||
} else true.also { printLogcat(tag = "IconColor", context, expandedNf, isCustom = false, isGrayscale = false) }
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 从 [NotificationViewWrapperClass] 中获取 [StatusBarNotification]
|
||||||
|
* @return [Pair] - ([Boolean] 通知是否展开,[StatusBarNotification] 通知实例)
|
||||||
|
*/
|
||||||
|
private fun Any.getSbnPair(): Pair<Boolean, StatusBarNotification?> {
|
||||||
|
/** 通知是否展开 */
|
||||||
|
var isExpanded = false
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 从父类中得到 mRow 变量 - [ExpandableNotificationRowClass]
|
||||||
|
* 获取其中的得到通知方法
|
||||||
|
*/
|
||||||
|
val expandedNf = ExpandableNotificationRowClass.clazz
|
||||||
|
.method { name = "getEntry" }
|
||||||
|
.get(NotificationViewWrapperClass.clazz.field {
|
||||||
|
name = "mRow"
|
||||||
|
}.get(this).self?.also {
|
||||||
|
isExpanded = ExpandableNotificationRowClass.clazz.method {
|
||||||
|
name = "isExpanded"
|
||||||
|
returnType = BooleanType
|
||||||
|
}.get(it).callBoolean()
|
||||||
|
}).call()?.let {
|
||||||
|
it.javaClass.method {
|
||||||
|
name = "getSbn"
|
||||||
|
}.get(it).invoke<StatusBarNotification>()
|
||||||
|
} ?: ExpandableNotificationRowClass.clazz
|
||||||
|
.method { name = "getStatusBarNotification" }
|
||||||
|
.get(NotificationViewWrapperClass.clazz.field { name = "mRow" }.get(this).self)
|
||||||
|
.invoke<StatusBarNotification>()
|
||||||
|
return Pair(isExpanded, expandedNf)
|
||||||
|
}
|
||||||
|
|
||||||
/** 缓存图标数据 */
|
/** 缓存图标数据 */
|
||||||
private fun cachingIconDatas() {
|
private fun cachingIconDatas() {
|
||||||
@@ -598,10 +639,10 @@ class SystemUIHooker : YukiBaseHooker() {
|
|||||||
param(ExpandedNotificationClass.clazz)
|
param(ExpandedNotificationClass.clazz)
|
||||||
}
|
}
|
||||||
/**
|
/**
|
||||||
* 为了防止 MIUI 自身的版本不同造成的各种 BUG
|
* MIUI 12 在非原生样式下 MIPUSH 的图标着色异常
|
||||||
* 判断是 MIUI 样式就停止 Hook
|
* 所以判断是 MIUI 样式就停止 Hook 状态栏图标
|
||||||
*/
|
*/
|
||||||
replaceAny { globalContext?.isMiuiNotifyStyle ?: isShowMiuiStyle }
|
replaceAny { hasIgnoreStatusBarIconColor.not() && isShowMiuiStyle }
|
||||||
}
|
}
|
||||||
/** 强制回写系统的状态栏图标样式为原生 */
|
/** 强制回写系统的状态栏图标样式为原生 */
|
||||||
injectMember {
|
injectMember {
|
||||||
@@ -627,7 +668,7 @@ class SystemUIHooker : YukiBaseHooker() {
|
|||||||
context = context,
|
context = context,
|
||||||
expandedNf,
|
expandedNf,
|
||||||
(result as Icon).loadDrawable(context)
|
(result as Icon).loadDrawable(context)
|
||||||
) { icon, isReplace -> if (isReplace) result = Icon.createWithBitmap(icon.toBitmap()) }
|
).also { pair -> if (pair.second) result = Icon.createWithBitmap(pair.first?.toBitmap()) }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -649,12 +690,7 @@ class SystemUIHooker : YukiBaseHooker() {
|
|||||||
* MIUI 12 进行单独判断
|
* MIUI 12 进行单独判断
|
||||||
*/
|
*/
|
||||||
field { name = "mCurrentSetColor" }.ofInt(instance).also { color ->
|
field { name = "mCurrentSetColor" }.ofInt(instance).also { color ->
|
||||||
if (safeOfFalse {
|
if (hasIgnoreStatusBarIconColor) {
|
||||||
NotificationUtilClass.clazz.hasMethod {
|
|
||||||
name = "ignoreStatusBarIconColor"
|
|
||||||
param(ExpandedNotificationClass.clazz)
|
|
||||||
}
|
|
||||||
}) {
|
|
||||||
alpha = if (color.isWhite) 0.95f else 0.8f
|
alpha = if (color.isWhite) 0.95f else 0.8f
|
||||||
setColorFilter(if (color.isWhite) color else Color.BLACK)
|
setColorFilter(if (color.isWhite) color else Color.BLACK)
|
||||||
} else setColorFilter(color)
|
} else setColorFilter(color)
|
||||||
@@ -732,39 +768,20 @@ class SystemUIHooker : YukiBaseHooker() {
|
|||||||
NotificationHeaderViewWrapperClass.clazz
|
NotificationHeaderViewWrapperClass.clazz
|
||||||
.field { name = "mIcon" }.of<ImageView>(instance) ?: return@afterHook
|
.field { name = "mIcon" }.of<ImageView>(instance) ?: return@afterHook
|
||||||
|
|
||||||
/** 通知是否展开 */
|
/** 获取 [StatusBarNotification] */
|
||||||
var isExpanded = false
|
val sbnPair = instance.getSbnPair()
|
||||||
|
|
||||||
/**
|
/** 通知是否展开 */
|
||||||
* 从父类中得到 mRow 变量 - [ExpandableNotificationRowClass]
|
var isExpanded = sbnPair.first
|
||||||
* 获取其中的得到通知方法
|
|
||||||
*/
|
|
||||||
val expandedNf = ExpandableNotificationRowClass.clazz
|
|
||||||
.method { name = "getEntry" }
|
|
||||||
.get(NotificationViewWrapperClass.clazz.field {
|
|
||||||
name = "mRow"
|
|
||||||
}.get(instance).self?.also {
|
|
||||||
isExpanded = ExpandableNotificationRowClass.clazz.method {
|
|
||||||
name = "isExpanded"
|
|
||||||
returnType = BooleanType
|
|
||||||
}.get(it).callBoolean()
|
|
||||||
}).call()?.let {
|
|
||||||
it.javaClass.method {
|
|
||||||
name = "getSbn"
|
|
||||||
}.get(it).invoke<StatusBarNotification>()
|
|
||||||
} ?: ExpandableNotificationRowClass.clazz
|
|
||||||
.method { name = "getStatusBarNotification" }
|
|
||||||
.get(NotificationViewWrapperClass.clazz.field { name = "mRow" }.get(instance).self)
|
|
||||||
.invoke<StatusBarNotification>()
|
|
||||||
|
|
||||||
/** 获取优先级 */
|
/** 获取优先级 */
|
||||||
val importance =
|
val importance =
|
||||||
(iconImageView.context.getSystemService(Context.NOTIFICATION_SERVICE) as? NotificationManager?)
|
(iconImageView.context.getSystemService(Context.NOTIFICATION_SERVICE) as? NotificationManager?)
|
||||||
?.getNotificationChannel(expandedNf?.notification?.channelId)?.importance ?: 0
|
?.getNotificationChannel(sbnPair.second?.notification?.channelId)?.importance ?: 0
|
||||||
/** 非最小化优先级的通知全部设置为展开状态 */
|
/** 非最小化优先级的通知全部设置为展开状态 */
|
||||||
if (importance != 1) isExpanded = true
|
if (importance != 1) isExpanded = true
|
||||||
/** 执行 Hook */
|
/** 执行 Hook */
|
||||||
compatNotifyIcon(iconImageView.context, expandedNf, iconImageView, isExpanded)
|
compatNotifyIcon(iconImageView.context, sbnPair.second, iconImageView, isExpanded)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
/** 记录实例 */
|
/** 记录实例 */
|
||||||
@@ -773,6 +790,22 @@ class SystemUIHooker : YukiBaseHooker() {
|
|||||||
afterHook { notificationViewWrappers.add(instance) }
|
afterHook { notificationViewWrappers.add(instance) }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
/** 修改 MIUI 风格通知栏的通知图标 */
|
||||||
|
MiuiNotificationViewWrapperClass.hook {
|
||||||
|
injectMember {
|
||||||
|
method { name = "handleAppIcon" }
|
||||||
|
replaceUnit {
|
||||||
|
field { name = "mAppIcon" }.of<ImageView>(instance)?.apply {
|
||||||
|
compatNotifyIcon(context, instance.getSbnPair().second, iconImageView = this, isUseAndroid12Style = true)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/** 记录实例 */
|
||||||
|
injectMember {
|
||||||
|
constructor { param(ContextClass, ViewClass, ExpandableNotificationRowClass.clazz) }
|
||||||
|
afterHook { miuiNotificationViewWrappers.add(instance) }
|
||||||
|
}
|
||||||
|
}.ignoredHookClassNotFoundFailure()
|
||||||
/** 干掉下拉通知图标自动设置回 APP 图标的方法 */
|
/** 干掉下拉通知图标自动设置回 APP 图标的方法 */
|
||||||
NotificationHeaderViewWrapperInjectorClass.hook {
|
NotificationHeaderViewWrapperInjectorClass.hook {
|
||||||
injectMember {
|
injectMember {
|
||||||
|
@@ -25,7 +25,6 @@
|
|||||||
package com.fankes.miui.notify.ui.activity
|
package com.fankes.miui.notify.ui.activity
|
||||||
|
|
||||||
import android.content.ComponentName
|
import android.content.ComponentName
|
||||||
import android.content.Intent
|
|
||||||
import android.content.pm.PackageManager
|
import android.content.pm.PackageManager
|
||||||
import androidx.core.view.isGone
|
import androidx.core.view.isGone
|
||||||
import androidx.core.view.isVisible
|
import androidx.core.view.isVisible
|
||||||
@@ -54,9 +53,6 @@ class MainActivity : BaseActivity<ActivityMainBinding>() {
|
|||||||
private const val pendingFlag = "[pending]"
|
private const val pendingFlag = "[pending]"
|
||||||
}
|
}
|
||||||
|
|
||||||
/** 警告对话框是否显示 */
|
|
||||||
private var isWarnDialogShowing = false
|
|
||||||
|
|
||||||
/** 模块是否可用 */
|
/** 模块是否可用 */
|
||||||
private var isModuleRegular = false
|
private var isModuleRegular = false
|
||||||
|
|
||||||
@@ -240,21 +236,19 @@ class MainActivity : BaseActivity<ActivityMainBinding>() {
|
|||||||
private fun refreshModuleStatus() {
|
private fun refreshModuleStatus() {
|
||||||
binding.mainLinStatus.setBackgroundResource(
|
binding.mainLinStatus.setBackgroundResource(
|
||||||
when {
|
when {
|
||||||
(isXposedModuleActive && isMiuiNotifyStyle) ||
|
isXposedModuleActive && (isModuleRegular.not() || isModuleValied.not()) -> R.drawable.bg_yellow_round
|
||||||
(isXposedModuleActive && (isModuleRegular.not() || isModuleValied.not())) -> R.drawable.bg_yellow_round
|
|
||||||
isXposedModuleActive -> R.drawable.bg_green_round
|
isXposedModuleActive -> R.drawable.bg_green_round
|
||||||
else -> R.drawable.bg_dark_round
|
else -> R.drawable.bg_dark_round
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
binding.mainImgStatus.setImageResource(
|
binding.mainImgStatus.setImageResource(
|
||||||
when {
|
when {
|
||||||
isXposedModuleActive && isMiuiNotifyStyle.not() -> R.mipmap.ic_success
|
isXposedModuleActive -> R.mipmap.ic_success
|
||||||
else -> R.mipmap.ic_warn
|
else -> R.mipmap.ic_warn
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
binding.mainTextStatus.text =
|
binding.mainTextStatus.text =
|
||||||
when {
|
when {
|
||||||
isXposedModuleActive && isMiuiNotifyStyle -> "模块已激活,但未在工作"
|
|
||||||
isXposedModuleActive && isModuleRegular.not() && modulePrefs.get(DataConst.ENABLE_MODULE).not() -> "模块已停用"
|
isXposedModuleActive && isModuleRegular.not() && modulePrefs.get(DataConst.ENABLE_MODULE).not() -> "模块已停用"
|
||||||
isXposedModuleActive && isModuleRegular.not() -> "模块已激活,请重启系统界面"
|
isXposedModuleActive && isModuleRegular.not() -> "模块已激活,请重启系统界面"
|
||||||
isXposedModuleActive && isModuleValied.not() -> "模块已更新,请重启系统界面"
|
isXposedModuleActive && isModuleValied.not() -> "模块已更新,请重启系统界面"
|
||||||
@@ -275,28 +269,5 @@ class MainActivity : BaseActivity<ActivityMainBinding>() {
|
|||||||
isModuleValied = isValied
|
isModuleValied = isValied
|
||||||
refreshModuleStatus()
|
refreshModuleStatus()
|
||||||
}
|
}
|
||||||
/** 经典样式启用后给出警告 */
|
|
||||||
if (isWarnDialogShowing.not() && isXposedModuleActive && isMiuiNotifyStyle)
|
|
||||||
showDialog {
|
|
||||||
isWarnDialogShowing = true
|
|
||||||
title = "经典通知栏样式已启用"
|
|
||||||
msg = "当你启用了经典通知栏样式后,为防止 MIUI 自身不规范 APP 图标被破坏,状态栏图标将不再做原生处理。\n\n" +
|
|
||||||
"若要使用原生样式,请前往 设置>通知管理>通知显示设置 中将样式设置为“原生样式”,新版本为 设置>通知与控制中心>通知显示设置。"
|
|
||||||
confirmButton(text = "去设置") {
|
|
||||||
runCatching {
|
|
||||||
startActivity(Intent().apply {
|
|
||||||
component = ComponentName(
|
|
||||||
"com.miui.notification",
|
|
||||||
"miui.notification.management.activity.NotificationDisplaySettingsActivity"
|
|
||||||
)
|
|
||||||
/** 防止顶栈一样重叠在自己的 APP 中 */
|
|
||||||
flags = Intent.FLAG_ACTIVITY_NEW_TASK
|
|
||||||
})
|
|
||||||
}.onFailure { toast(msg = "启动失败,请手动调整设置") }
|
|
||||||
isWarnDialogShowing = false
|
|
||||||
}
|
|
||||||
cancelButton { isWarnDialogShowing = false }
|
|
||||||
noCancelable()
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
@@ -27,6 +27,7 @@ package com.fankes.miui.notify.utils.factory
|
|||||||
import android.app.Activity
|
import android.app.Activity
|
||||||
import android.app.Notification
|
import android.app.Notification
|
||||||
import android.app.Service
|
import android.app.Service
|
||||||
|
import android.app.WallpaperManager
|
||||||
import android.content.ClipData
|
import android.content.ClipData
|
||||||
import android.content.ClipboardManager
|
import android.content.ClipboardManager
|
||||||
import android.content.Context
|
import android.content.Context
|
||||||
@@ -74,12 +75,6 @@ inline val isNotSystemInDarkMode get() = !isSystemInDarkMode
|
|||||||
*/
|
*/
|
||||||
val Context.isSystemInDarkMode get() = (resources.configuration.uiMode and Configuration.UI_MODE_NIGHT_MASK) == Configuration.UI_MODE_NIGHT_YES
|
val Context.isSystemInDarkMode get() = (resources.configuration.uiMode and Configuration.UI_MODE_NIGHT_MASK) == Configuration.UI_MODE_NIGHT_YES
|
||||||
|
|
||||||
/**
|
|
||||||
* 通知栏是否为 MIUI 样式
|
|
||||||
* @return [Boolean] 是否符合条件
|
|
||||||
*/
|
|
||||||
val Context.isMiuiNotifyStyle get() = safeOfFalse { Settings.System.getInt(contentResolver, "status_bar_notification_style") == 0 }
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 系统深色模式是否没开启
|
* 系统深色模式是否没开启
|
||||||
* @return [Boolean] 是否开启
|
* @return [Boolean] 是否开启
|
||||||
@@ -271,10 +266,19 @@ fun Number.dpFloat(context: Context) = toFloat() * context.resources.displayMetr
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* 获取系统主题色
|
* 获取系统主题色
|
||||||
* @return [Int] Android < 12 返回透明色
|
* @return [Int] Android < 12 返回 [wallpaperColor]
|
||||||
*/
|
*/
|
||||||
val Context.systemAccentColor
|
val Context.systemAccentColor
|
||||||
get() = safeOfNan { if (isUpperOfAndroidS) resources.getColor(android.R.color.system_accent1_600) else 0 }
|
get() = safeOf(wallpaperColor) { if (isUpperOfAndroidS) resources.getColor(android.R.color.system_accent1_600) else wallpaperColor }
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取系统壁纸颜色
|
||||||
|
* @return [Int] 无法获取时返回透明色
|
||||||
|
*/
|
||||||
|
val Context.wallpaperColor
|
||||||
|
get() = safeOfNan {
|
||||||
|
WallpaperManager.getInstance(this).getWallpaperColors(WallpaperManager.FLAG_SYSTEM)?.secondaryColor?.toArgb() ?: 0
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 是否为白色
|
* 是否为白色
|
||||||
|
Reference in New Issue
Block a user