From cd8ceec765e0fe73f5aba458bd748d8079746482 Mon Sep 17 00:00:00 2001 From: Fankesyooni Date: Sat, 26 Feb 2022 22:57:11 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=8C=E5=85=A8=E4=BF=AE=E6=94=B9=20Hook=20?= =?UTF-8?q?=E6=96=B9=E6=A1=88=EF=BC=8C=E5=8A=A0=E5=85=A5=E6=96=B0=E7=9A=84?= =?UTF-8?q?=E6=97=A5=E5=BF=97=E6=89=93=E5=8D=B0=E6=96=B9=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .idea/misc.xml | 2 + app/build.gradle | 2 +- .../fankes/miui/notify/bean/IconDataBean.kt | 2 +- .../com/fankes/miui/notify/hook/HookEntry.kt | 309 ++++++++++-------- .../miui/notify/params/IconPackParams.kt | 6 +- .../com/fankes/miui/notify/ui/MainActivity.kt | 56 +++- app/src/main/res/drawable/bg_yellow_round.xml | 6 + app/src/main/res/layout/activity_main.xml | 2 +- 8 files changed, 231 insertions(+), 154 deletions(-) create mode 100755 app/src/main/res/drawable/bg_yellow_round.xml diff --git a/.idea/misc.xml b/.idea/misc.xml index 0bc73e6..8419a1a 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -6,6 +6,8 @@ + + diff --git a/app/build.gradle b/app/build.gradle index 7b1778a..b14cd99 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -30,7 +30,7 @@ android { buildTypes { release { - minifyEnabled true + minifyEnabled false signingConfig signingConfigs.debug proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' } diff --git a/app/src/main/java/com/fankes/miui/notify/bean/IconDataBean.kt b/app/src/main/java/com/fankes/miui/notify/bean/IconDataBean.kt index e35cf46..9a5a6e3 100644 --- a/app/src/main/java/com/fankes/miui/notify/bean/IconDataBean.kt +++ b/app/src/main/java/com/fankes/miui/notify/bean/IconDataBean.kt @@ -28,7 +28,7 @@ import java.io.Serializable /** * 通知栏小图标 bean - * @param appName APP 名称 - 仅限默认语言区域 + * @param appName APP 名称 * @param packageName 包名 * @param iconBitmap 图标位图 * @param iconColor 通知栏中显示的图标颜色 - 设置为 0 使用系统默认颜色 diff --git a/app/src/main/java/com/fankes/miui/notify/hook/HookEntry.kt b/app/src/main/java/com/fankes/miui/notify/hook/HookEntry.kt index a1a267b..d6c8143 100644 --- a/app/src/main/java/com/fankes/miui/notify/hook/HookEntry.kt +++ b/app/src/main/java/com/fankes/miui/notify/hook/HookEntry.kt @@ -70,20 +70,27 @@ class HookEntry : YukiHookXposedInitProxy { private const val NotificationHeaderViewWrapperInjectorClass = "$SYSTEMUI_PACKAGE_NAME.statusbar.notification.row.wrapper.NotificationHeaderViewWrapperInjector" - /** MIUI 新版本存在的类 */ - private const val NotificationHeaderViewWrapperClass = - "$SYSTEMUI_PACKAGE_NAME.statusbar.notification.NotificationHeaderViewWrapper" - - /** MIUI 新版本存在的类 */ - private const val NotificationViewWrapperClass = - "$SYSTEMUI_PACKAGE_NAME.statusbar.notification.NotificationViewWrapper" - - /** 未确定是否只有旧版本存在的类 */ - private const val ExpandableNotificationRowClass = "$SYSTEMUI_PACKAGE_NAME.statusbar.ExpandableNotificationRow" - /** 原生存在的类 */ private const val ContrastColorUtilClass = "com.android.internal.util.ContrastColorUtil" + /** 根据多个版本存在不同的包名相同的类 */ + private val ExpandableNotificationRowClass = VariousClass( + "$SYSTEMUI_PACKAGE_NAME.statusbar.notification.row.ExpandableNotificationRow", + "$SYSTEMUI_PACKAGE_NAME.statusbar.ExpandableNotificationRow" + ) + + /** 根据多个版本存在不同的包名相同的类 */ + private val NotificationViewWrapperClass = VariousClass( + "$SYSTEMUI_PACKAGE_NAME.statusbar.notification.row.wrapper.NotificationViewWrapper", + "$SYSTEMUI_PACKAGE_NAME.statusbar.notification.NotificationViewWrapper" + ) + + /** 根据多个版本存在不同的包名相同的类 */ + private val NotificationHeaderViewWrapperClass = VariousClass( + "$SYSTEMUI_PACKAGE_NAME.statusbar.notification.row.wrapper.NotificationHeaderViewWrapper", + "$SYSTEMUI_PACKAGE_NAME.statusbar.notification.NotificationHeaderViewWrapper" + ) + /** 根据多个版本存在不同的包名相同的类 */ private val NotificationUtilClass = VariousClass( "$SYSTEMUI_PACKAGE_NAME.statusbar.notification.NotificationUtil", @@ -132,8 +139,21 @@ class HookEntry : YukiHookXposedInitProxy { NotificationUtilClass.clazz.hasMethod(name = "ignoreStatusBarIconColor", ExpandedNotificationClass.clazz) } + /** + * 是否为旧版本 MIUI 方案 + * + * 拥有 “handleHeaderViews” 方法 + * @return [Boolean] + */ + private val PackageParam.hasHandleHeaderViews + get() = safeOfFalse { + NotificationHeaderViewWrapperClass.clazz.hasMethod(name = "handleHeaderViews") + } + /** * 获取当前通知栏的样式 + * + * - ❗新版本可能不存在这个方法 * @return [Boolean] */ private val PackageParam.isShowMiuiStyle @@ -141,15 +161,6 @@ class HookEntry : YukiHookXposedInitProxy { NotificationUtilClass.clazz.method { name = "showMiuiStyle" }.get().invoke() ?: false } - /** - * 获取 [ExpandedNotificationClass] 的应用名称 - * @param instance 通知实例 - * @return [String] - */ - private fun PackageParam.findAppName(instance: Any?) = safeOf(default = "") { - ExpandedNotificationClass.clazz.method { name = "getAppName" }.get(instance).invoke() ?: "" - } - /** * 适配通知栏、状态栏图标 * @@ -163,10 +174,51 @@ class HookEntry : YukiHookXposedInitProxy { private fun StatusBarNotification.compatNotifyIcon(context: Context, iconDrawable: Drawable) = safeOf(iconDrawable) { /** 给 MIPUSH 设置 APP 自己的图标 */ if (isXmsf && opPkgName.isNotBlank()) - context.packageManager.getPackageInfo(opPkgName, 0).applicationInfo.loadIcon(context.packageManager) + findAppIcon(context) else iconDrawable } + /** + * 获取推送通知的应用名称 + * @param context 实例 + * @return [String] + */ + private fun StatusBarNotification.findAppName(context: Context) = safeOf(default = "") { + context.packageManager.getPackageInfo(opPkgName, 0).applicationInfo.loadLabel(context.packageManager) + } + + /** + * 获取通知栏、状态栏 APP 图标 + * @param context 实例 + * @return [Drawable] 适配的图标 + */ + private fun StatusBarNotification.findAppIcon(context: Context) = safeOf(notification.smallIcon.loadDrawable(context)) { + context.packageManager.getPackageInfo(opPkgName, 0).applicationInfo.loadIcon(context.packageManager) + } + + /** + * 打印日志 + * @param tag 标识 + * @param context 实例 + * @param expandedNf 通知实例 + * @param isCustom 是否为通知优化生效图标 + * @param isGrayscale 是否为灰度图标 + */ + private fun PackageParam.printLogcat( + tag: String, + context: Context, + expandedNf: StatusBarNotification?, + isCustom: Boolean, + isGrayscale: Boolean + ) { + if (prefs.getBoolean(ENABLE_MODULE_LOG)) loggerD( + msg = "$tag --> [${expandedNf?.findAppName(context)}][${expandedNf?.opPkgName}] " + + "custom [$isCustom] " + + "grayscale [$isGrayscale] " + + "xmsf [${expandedNf?.isXmsf}]" + ) + } + /** * 获取推送通知的包名 * @@ -232,6 +284,11 @@ class HookEntry : YukiHookXposedInitProxy { if (!prefs.getBoolean(ENABLE_COLOR_ICON_HOOK, default = true)) return@safeRun /** 获取通知对象 - 由于 MIUI 的版本迭代不规范性可能是空的 */ expandedNf?.also { notifyInstance -> + /** 判断是 MIUI 样式就停止 Hook */ + if (context.isMiuiNotifyStyle) { + it(notifyInstance.findAppIcon(context).toBitmap()) + return@safeRun + } /** 判断是否不是灰度图标 */ val isNotGrayscaleIcon = notifyInstance.isXmsf || !isGrayscaleIcon(context, iconDrawable) @@ -241,10 +298,7 @@ class HookEntry : YukiHookXposedInitProxy { run { if (iconDatas.isNotEmpty()) iconDatas.forEach { - if ((notifyInstance.opPkgName == it.packageName || - findAppName(notifyInstance) == it.appName) && - isAppNotifyHookOf(it) - ) { + if (notifyInstance.opPkgName == it.packageName && isAppNotifyHookOf(it)) { if (isNotGrayscaleIcon || isAppNotifyHookAllOf(it)) customIcon = it.iconBitmap return@run @@ -252,8 +306,7 @@ class HookEntry : YukiHookXposedInitProxy { } } /** 打印日志 */ - if (prefs.getBoolean(ENABLE_MODULE_LOG)) - loggerD(msg = "Icon --> [${findAppName(notifyInstance)}][${notifyInstance.opPkgName}] custom [${customIcon != null}] grayscale [${!isNotGrayscaleIcon}] xmsf [${notifyInstance.isXmsf}]") + printLogcat(tag = "StatusIcon", context, notifyInstance, isCustom = customIcon != null, !isNotGrayscaleIcon) when { /** 处理自定义通知图标优化 */ customIcon != null -> it(customIcon!!) @@ -273,6 +326,8 @@ class HookEntry : YukiHookXposedInitProxy { */ private fun PackageParam.hookNotifyIconOnSet(context: Context, expandedNf: StatusBarNotification?, iconImageView: ImageView) = safeRun(msg = "AutoSetAppIconOnSet") { + /** 判断是 MIUI 样式就停止 Hook */ + if (context.isMiuiNotifyStyle) return@safeRun /** 如果没开启修复 APP 的彩色图标 */ if (!prefs.getBoolean(ENABLE_COLOR_ICON_HOOK, default = true)) return@safeRun /** 获取通知对象 - 由于 MIUI 的版本迭代不规范性可能是空的 */ @@ -316,10 +371,7 @@ class HookEntry : YukiHookXposedInitProxy { if (isNotifyIconFix) run { if (iconDatas.isNotEmpty()) iconDatas.forEach { - if ((notifyInstance.opPkgName == it.packageName || - findAppName(notifyInstance) == it.appName) && - isAppNotifyHookOf(it) - ) { + if (notifyInstance.opPkgName == it.packageName && isAppNotifyHookOf(it)) { if (!isGrayscaleIcon || isAppNotifyHookAllOf(it)) { customIcon = it.iconBitmap customIconColor = it.iconColor @@ -328,6 +380,8 @@ class HookEntry : YukiHookXposedInitProxy { } } } + /** 打印日志 */ + printLogcat(tag = "NotifyIcon", context, notifyInstance, isCustom = customIcon != null, isGrayscaleIcon) /** 处理自定义通知图标优化 */ if (customIcon != null) iconImageView.apply { @@ -381,39 +435,37 @@ class HookEntry : YukiHookXposedInitProxy { * @return [Boolean] 是否忽略通知图标颜色 */ private fun PackageParam.hookIgnoreStatusBarIconColor(context: Context, expandedNf: StatusBarNotification?) = - if (prefs.getBoolean(ENABLE_COLOR_ICON_HOOK, default = true)) safeOfFalse { - /** 获取通知对象 - 由于 MIUI 的版本迭代不规范性可能是空的 */ - expandedNf?.let { notifyInstance -> - /** 获取通知小图标 */ - val iconDrawable = - notifyInstance.notification.smallIcon.loadDrawable(context) + if (!context.isMiuiNotifyStyle) + if (prefs.getBoolean(ENABLE_COLOR_ICON_HOOK, default = true)) safeOfFalse { + /** 获取通知对象 - 由于 MIUI 的版本迭代不规范性可能是空的 */ + expandedNf?.let { notifyInstance -> + /** 获取通知小图标 */ + val iconDrawable = notifyInstance.notification.smallIcon.loadDrawable(context) - /** 判断是否不是灰度图标 */ - val isNotGrayscaleIcon = notifyInstance.isXmsf || !isGrayscaleIcon(context, iconDrawable) + /** 判断是否不是灰度图标 */ + val isNotGrayscaleIcon = notifyInstance.isXmsf || !isGrayscaleIcon(context, iconDrawable) - /** 获取目标修复彩色图标的 APP */ - var isTargetFixApp = false - /** 如果开启了自定义通知图标优化 */ - if (prefs.getBoolean(ENABLE_NOTIFY_ICON_FIX, default = true)) - run { - if (iconDatas.isNotEmpty()) - iconDatas.forEach { - if ((notifyInstance.opPkgName == it.packageName || - findAppName(notifyInstance) == it.appName) && - isAppNotifyHookOf(it) - ) { - if (isNotGrayscaleIcon || isAppNotifyHookAllOf(it)) isTargetFixApp = true - return@run + /** 获取目标修复彩色图标的 APP */ + var isTargetFixApp = false + /** 如果开启了自定义通知图标优化 */ + if (prefs.getBoolean(ENABLE_NOTIFY_ICON_FIX, default = true)) + run { + if (iconDatas.isNotEmpty()) + iconDatas.forEach { + if (notifyInstance.opPkgName == it.packageName && isAppNotifyHookOf(it)) { + if (isNotGrayscaleIcon || isAppNotifyHookAllOf(it)) isTargetFixApp = true + return@run + } } - } - } - /** - * 只要不是灰度就返回彩色图标 - * 否则不对颜色进行反色处理防止一些系统图标出现异常 - */ - if (isTargetFixApp) false else isNotGrayscaleIcon - } ?: true - } else false + } + /** + * 只要不是灰度就返回彩色图标 + * 否则不对颜色进行反色处理防止一些系统图标出现异常 + */ + if (isTargetFixApp) false else isNotGrayscaleIcon + } ?: true + } else false + else true override fun onHook() = encase { configs { @@ -443,10 +495,10 @@ class HookEntry : YukiHookXposedInitProxy { param(ExpandedNotificationClass.clazz) } /** - * 因为之前的 MIUI 版本的状态栏图标颜色会全部设置为白色的 - 找不到修复的地方就直接判断版本了 - * 对于之前没有通知图标色彩判断功能的版本判断是 MIUI 样式就停止 Hook + * 为了防止 MIUI 自身的版本不同造成的各种 BUG + * 判断是 MIUI 样式就停止 Hook */ - replaceAny { if (hasIgnoreStatusBarIconColor) false else isShowMiuiStyle } + replaceAny { globalContext?.isMiuiNotifyStyle ?: isShowMiuiStyle } } if (hasIgnoreStatusBarIconColor) injectMember { @@ -478,86 +530,71 @@ class HookEntry : YukiHookXposedInitProxy { }.onFind { isUseLegacy = true } } afterHook { - /** 对于之前没有通知图标色彩判断功能的版本判断是 MIUI 样式就停止 Hook */ - if (hasIgnoreStatusBarIconColor || !isShowMiuiStyle) - (globalContext ?: args[0] as Context).also { context -> - hookSmallIconOnSet( - context = context, - args[if (isUseLegacy) 1 else 0] as? StatusBarNotification?, - (result as Icon).loadDrawable(context) - ) { icon -> result = Icon.createWithBitmap(icon) } - } + (globalContext ?: args[0] as Context).also { context -> + hookSmallIconOnSet( + context = context, + args[if (isUseLegacy) 1 else 0] as? StatusBarNotification?, + (result as Icon).loadDrawable(context) + ) { icon -> result = Icon.createWithBitmap(icon) } + } } } } - if (NotificationHeaderViewWrapperInjectorClass.hasClass) - NotificationHeaderViewWrapperInjectorClass.hook { - /** 修复下拉通知图标自动设置回 APP 图标的方法 */ - injectMember { - var isUseLegacy = false + NotificationHeaderViewWrapperClass.hook { + /** 修复下拉通知图标自动设置回 APP 图标的方法 */ + injectMember { + if (hasHandleHeaderViews) + method { name = "handleHeaderViews" } + else method { name = "resolveHeaderViews" } + afterHook { + /** 获取小图标 */ + val iconImageView = + NotificationHeaderViewWrapperClass.clazz + .field { name = "mIcon" }.of(instance) ?: return@afterHook + + /** + * 从父类中得到 mRow 变量 - [ExpandableNotificationRowClass] + * 获取其中的得到通知方法 + */ + val expandedNf = ExpandableNotificationRowClass.clazz + .method { name = "getEntry" } + .get(NotificationViewWrapperClass.clazz.field { + name = "mRow" + }.get(instance).self).call()?.let { + it.javaClass.method { + name = "getSbn" + }.get(it).invoke() + } ?: ExpandableNotificationRowClass.clazz + .method { name = "getStatusBarNotification" } + .get(NotificationViewWrapperClass.clazz.field { name = "mRow" }.get(instance).self) + .invoke() + /** 执行 Hook */ + hookNotifyIconOnSet(iconImageView.context, expandedNf, iconImageView) + } + } + } + /** 干掉下拉通知图标自动设置回 APP 图标的方法 */ + NotificationHeaderViewWrapperInjectorClass.hook { + injectMember { + method { + name = "setAppIcon" + param(ContextClass, ImageViewClass, ExpandedNotificationClass.clazz) + }.remedys { method { name = "setAppIcon" - param(ContextClass, ImageViewClass, ExpandedNotificationClass.clazz) - }.remedys { - method { - name = "setAppIcon" - param(ImageViewClass, ExpandedNotificationClass.clazz) - }.onFind { isUseLegacy = true } - } - replaceUnit { - if (isUseLegacy) - hookNotifyIconOnSet( - context = globalContext ?: error("GlobalContext got null"), - args[1] as? StatusBarNotification?, - args[0] as ImageView - ) - else - hookNotifyIconOnSet( - context = args[0] as? Context ?: globalContext ?: error("GlobalContext got null"), - args[2] as? StatusBarNotification?, - args[1] as ImageView - ) - + param(ImageViewClass, ExpandedNotificationClass.clazz) } } - /** 干掉下拉通知图标自动设置回 APP 图标的方法 - Android 12 */ - if (isUpperOfAndroidS) - injectMember { - method { - name = "resetIconBgAndPaddings" - param(ImageViewClass, ExpandedNotificationClass.clazz) - } - intercept() - } - } - else - NotificationHeaderViewWrapperClass.hook { - /** 之前的版本解决方案 */ - injectMember { - method { name = "handleHeaderViews" } - afterHook { - /** 对于之前没有通知图标色彩判断功能的版本判断是 MIUI 样式就停止 Hook */ - if (!hasIgnoreStatusBarIconColor && isShowMiuiStyle) return@afterHook - - /** 获取小图标 */ - val iconImageView = - NotificationHeaderViewWrapperClass.clazz - .field { name = "mIcon" }.of(instance) ?: return@afterHook - - /** - * 从父类中得到 mRow 变量 - [ExpandableNotificationRowClass] - * 获取其中的得到通知方法 - */ - val expandedNf = - ExpandableNotificationRowClass.clazz - .method { name = "getStatusBarNotification" } - .get(NotificationViewWrapperClass.clazz.field { name = "mRow" }.get(instance).self) - .invoke() - /** 执行 Hook */ - hookNotifyIconOnSet(iconImageView.context, expandedNf, iconImageView) - } + intercept() + }.ignoredAllFailure() + injectMember { + method { + name = "resetIconBgAndPaddings" + param(ImageViewClass, ExpandedNotificationClass.clazz) } - } + intercept() + }.ignoredAllFailure() + } } } } diff --git a/app/src/main/java/com/fankes/miui/notify/params/IconPackParams.kt b/app/src/main/java/com/fankes/miui/notify/params/IconPackParams.kt index b17d97c..a2edde3 100644 --- a/app/src/main/java/com/fankes/miui/notify/params/IconPackParams.kt +++ b/app/src/main/java/com/fankes/miui/notify/params/IconPackParams.kt @@ -50,11 +50,7 @@ class IconPackParams(private val context: Context? = null, private val param: Pa /** * 获取图标数据 - * - * 通知栏小图标数组 - * - * 默认使用包名进行匹配 - 若失败则使用 APP 名称进行匹配 - * @return [Array] + * @return [Array] 通知栏小图标数组 */ val iconDatas get() = ArrayList().apply { diff --git a/app/src/main/java/com/fankes/miui/notify/ui/MainActivity.kt b/app/src/main/java/com/fankes/miui/notify/ui/MainActivity.kt index 6e6a293..7dc3367 100644 --- a/app/src/main/java/com/fankes/miui/notify/ui/MainActivity.kt +++ b/app/src/main/java/com/fankes/miui/notify/ui/MainActivity.kt @@ -93,11 +93,7 @@ class MainActivity : BaseActivity() { noCancelable() } /** 判断是否 Hook */ - YukiHookModuleStatus.isActive() -> { - findViewById(R.id.main_lin_status).setBackgroundResource(R.drawable.bg_green_round) - findViewById(R.id.main_img_status).setImageResource(R.mipmap.ic_success) - findViewById(R.id.main_text_status).text = "模块已激活" - } + YukiHookModuleStatus.isActive() -> {} else -> showDialog { title = "模块没有激活" @@ -208,16 +204,56 @@ class MainActivity : BaseActivity() { } } + /** 刷新模块状态 */ + private fun refreshModuleStatus() { + findViewById(R.id.main_lin_status).setBackgroundResource( + when { + YukiHookModuleStatus.isActive() && isMiuiNotifyStyle -> R.drawable.bg_yellow_round + YukiHookModuleStatus.isActive() -> R.drawable.bg_green_round + else -> R.drawable.bg_dark_round + } + ) + findViewById(R.id.main_img_status).setImageResource( + when { + YukiHookModuleStatus.isActive() && !isMiuiNotifyStyle -> R.mipmap.ic_success + else -> R.mipmap.ic_warn + } + ) + findViewById(R.id.main_text_status).text = + when { + YukiHookModuleStatus.isActive() && isMiuiNotifyStyle -> "模块已激活,但未在工作" + YukiHookModuleStatus.isActive() -> "模块已激活" + else -> "模块未激活" + } + } + override fun onResume() { super.onResume() - /** MIUI 12 的版本特殊 - 所以给出提示 */ - if (!isWarnDialogShowing && YukiHookModuleStatus.isActive() && miuiVersion == "12" && isMiuiNotifyStyle) + /** 刷新模块状态 */ + refreshModuleStatus() + /** 经典样式启用后给出警告 */ + if (!isWarnDialogShowing && YukiHookModuleStatus.isActive() && isMiuiNotifyStyle) showDialog { isWarnDialogShowing = true title = "经典通知栏样式已启用" - msg = "在 MIUI 12 中启用了经典通知栏样式后状态栏图标将不再做原生处理,模块停止工作," + - "这取决于系统设置,你应当在 设置>通知管理>通知显示设置 中将样式设置为“原生样式”。" - confirmButton(text = "我知道了") { isWarnDialogShowing = false } + 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() } } diff --git a/app/src/main/res/drawable/bg_yellow_round.xml b/app/src/main/res/drawable/bg_yellow_round.xml new file mode 100755 index 0000000..215bdc4 --- /dev/null +++ b/app/src/main/res/drawable/bg_yellow_round.xml @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index b419011..c9e8d83 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -76,7 +76,7 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginBottom="5dp" - android:text="模块未激活" + android:text="模块状态未知" android:textColor="@color/white" android:textSize="18sp" />