diff --git a/app/src/main/java/com/fankes/miui/notify/application/MNNApplication.kt b/app/src/main/java/com/fankes/miui/notify/application/MNNApplication.kt
index b21f371..8a08a3d 100644
--- a/app/src/main/java/com/fankes/miui/notify/application/MNNApplication.kt
+++ b/app/src/main/java/com/fankes/miui/notify/application/MNNApplication.kt
@@ -26,15 +26,11 @@ package com.fankes.miui.notify.application
import android.app.Application
import androidx.appcompat.app.AppCompatDelegate
-import com.fankes.miui.notify.BuildConfig
class MNNApplication : Application() {
companion object {
- /** 当前模块的包名 */
- const val MODULE_PACKAGE_NAME = BuildConfig.APPLICATION_ID
-
/** 全局静态实例 */
private var context: MNNApplication? = null
diff --git a/app/src/main/java/com/fankes/miui/notify/const/Const.kt b/app/src/main/java/com/fankes/miui/notify/const/Const.kt
new file mode 100644
index 0000000..7843a3f
--- /dev/null
+++ b/app/src/main/java/com/fankes/miui/notify/const/Const.kt
@@ -0,0 +1,54 @@
+/*
+ * MIUINativeNotifyIcon - Fix the native notification bar icon function abandoned by the MIUI development team.
+ * Copyright (C) 2019-2022 Fankes Studio(qzmmcn@163.com)
+ * https://github.com/fankes/MIUINativeNotifyIcon
+ *
+ * This software is non-free but opensource software: you can redistribute it
+ * and/or modify it under the terms of the GNU Affero General Public License
+ * as published by the Free Software Foundation; either
+ * version 3 of the License, or any later version.
+ *
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * and eula along with this software. If not, see
+ *
+ *
+ * This file is Created by fankes on 2022/3/24.
+ */
+@file:Suppress("MemberVisibilityCanBePrivate")
+
+package com.fankes.miui.notify.const
+
+import com.fankes.miui.notify.BuildConfig
+
+/**
+ * 存储一些静态编译后的值
+ */
+object Const {
+
+ /** 当前模块的包名 */
+ const val MODULE_PACKAGE_NAME = BuildConfig.APPLICATION_ID
+
+ /** 当前模块的版本名称 */
+ const val MODULE_VERSION_NAME = BuildConfig.VERSION_NAME
+
+ /** 当前模块的版本号 */
+ const val MODULE_VERSION_CODE = BuildConfig.VERSION_CODE
+
+ /** 当前模块的版本校验 */
+ const val MODULE_VERSION_VERIFY = "${MODULE_VERSION_NAME}_${MODULE_VERSION_CODE}_202103240401"
+
+ /** 当前模块的版本校验标签 */
+ const val MODULE_VERSION_VERIFY_TAG = "module_version_verify"
+
+ /** 发送通讯广播号标签 */
+ const val MODULE_CHECKING_RECEIVER = "mnn_checking_action"
+
+ /** 接收通讯广播号标签 */
+ const val MODULE_HANDLER_RECEIVER = "mnn_handler_action"
+}
\ No newline at end of file
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 fb51186..315b63c 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
@@ -23,8 +23,10 @@
package com.fankes.miui.notify.hook
import android.app.NotificationManager
+import android.content.BroadcastReceiver
import android.content.Context
import android.content.Intent
+import android.content.IntentFilter
import android.graphics.Bitmap
import android.graphics.Color
import android.graphics.Outline
@@ -38,8 +40,8 @@ import android.view.ViewGroup
import android.view.ViewOutlineProvider
import android.widget.ImageView
import androidx.core.graphics.drawable.toBitmap
-import com.fankes.miui.notify.application.MNNApplication.Companion.MODULE_PACKAGE_NAME
import com.fankes.miui.notify.bean.IconDataBean
+import com.fankes.miui.notify.const.Const
import com.fankes.miui.notify.hook.HookConst.ENABLE_COLOR_ICON_COMPAT
import com.fankes.miui.notify.hook.HookConst.ENABLE_HOOK_STATUS_ICON_COUNT
import com.fankes.miui.notify.hook.HookConst.ENABLE_MODULE
@@ -140,6 +142,32 @@ class HookEntry : YukiHookXposedInitProxy {
/** 缓存的通知小图标包装纸实例 */
private var notificationViewWrappers = HashSet()
+ /** 是否已经注册广播 */
+ private var isRegisterModuleReceiver = false
+
+ /** 模块广播接收器 */
+ private val moduleReceiver by lazy {
+ object : BroadcastReceiver() {
+ override fun onReceive(context: Context?, intent: Intent?) {
+ context?.sendBroadcast(Intent().apply {
+ action = Const.MODULE_HANDLER_RECEIVER
+ putExtra("isAction", true)
+ putExtra("isValied", intent?.getStringExtra(Const.MODULE_VERSION_VERIFY_TAG) == Const.MODULE_VERSION_VERIFY)
+ })
+ }
+ }
+ }
+
+ /**
+ * 注册模块广播接收器
+ * @param context 实例
+ */
+ private fun registerModuleReceiver(context: Context) {
+ if (isRegisterModuleReceiver) return
+ context.registerReceiver(moduleReceiver, IntentFilter().apply { addAction(Const.MODULE_CHECKING_RECEIVER) })
+ isRegisterModuleReceiver = true
+ }
+
/**
* 是否启用通知图标优化功能
* @param isHooking 是否判断启用通知功能 - 默认:是
@@ -605,7 +633,7 @@ class HookEntry : YukiHookXposedInitProxy {
(result as Icon).loadDrawable(context)
) { icon, isReplace -> if (isReplace) result = Icon.createWithBitmap(icon.toBitmap()) }
/** 刷新缓存 */
- if (expandedNf?.compatOpPkgName == MODULE_PACKAGE_NAME &&
+ if (expandedNf?.compatOpPkgName == Const.MODULE_PACKAGE_NAME &&
expandedNf.notification?.channelId == IconRuleManagerTool.NOTIFY_CHANNEL
) recachingPrefs()
}
@@ -654,7 +682,12 @@ class HookEntry : YukiHookXposedInitProxy {
param(ExpandedNotificationClass.clazz)
}
}
- afterHook { if (firstArgs != null) statusBarIconViews.add(instance()) }
+ afterHook {
+ if (firstArgs != null) instance().also {
+ registerModuleReceiver(it.context)
+ statusBarIconViews.add(it)
+ }
+ }
}
}
NotificationIconContainerClass.hook {
diff --git a/app/src/main/java/com/fankes/miui/notify/ui/activity/MainActivity.kt b/app/src/main/java/com/fankes/miui/notify/ui/activity/MainActivity.kt
index e777b47..df4eb08 100644
--- a/app/src/main/java/com/fankes/miui/notify/ui/activity/MainActivity.kt
+++ b/app/src/main/java/com/fankes/miui/notify/ui/activity/MainActivity.kt
@@ -24,13 +24,12 @@
package com.fankes.miui.notify.ui.activity
-import android.content.ComponentName
-import android.content.Intent
+import android.content.*
import android.content.pm.PackageManager
import androidx.core.view.isGone
import androidx.core.view.isVisible
-import com.fankes.miui.notify.BuildConfig
import com.fankes.miui.notify.R
+import com.fankes.miui.notify.const.Const
import com.fankes.miui.notify.databinding.ActivityMainBinding
import com.fankes.miui.notify.databinding.DiaStatusIconCountBinding
import com.fankes.miui.notify.hook.HookConst.ENABLE_COLOR_ICON_COMPAT
@@ -48,13 +47,14 @@ import com.fankes.miui.notify.utils.tool.GithubReleaseTool
import com.fankes.miui.notify.utils.tool.SystemUITool
import com.highcapable.yukihookapi.hook.factory.isXposedModuleActive
import com.highcapable.yukihookapi.hook.factory.modulePrefs
+import com.highcapable.yukihookapi.hook.xposed.YukiHookModuleStatus
class MainActivity : BaseActivity() {
companion object {
/** 模块版本 */
- private const val moduleVersion = BuildConfig.VERSION_NAME
+ private const val moduleVersion = Const.MODULE_VERSION_NAME
/** 预发布的版本标识 */
private const val pendingFlag = "[pending]"
@@ -63,6 +63,12 @@ class MainActivity : BaseActivity() {
/** 警告对话框是否显示 */
private var isWarnDialogShowing = false
+ /** 模块是否激活 */
+ private var isModuleAction = false
+
+ /** 模块是否有效 */
+ private var isModuleValied = false
+
override fun onCreate() {
/** 设置文本 */
binding.mainTextVersion.text = "模块版本:$moduleVersion $pendingFlag"
@@ -235,13 +241,16 @@ class MainActivity : BaseActivity() {
binding.linkWithFollowMe.setOnClickListener {
openBrowser(url = "https://www.coolapk.com/u/876977", packageName = "com.coolapk.market")
}
+ /** 注册广播检查模块激活状态 */
+ registerReceiver(hostReceiver, IntentFilter().apply { addAction(Const.MODULE_HANDLER_RECEIVER) })
}
/** 刷新模块状态 */
private fun refreshModuleStatus() {
binding.mainLinStatus.setBackgroundResource(
when {
- isXposedModuleActive && isMiuiNotifyStyle -> R.drawable.bg_yellow_round
+ (isXposedModuleActive && isMiuiNotifyStyle) ||
+ (isXposedModuleActive && (!isModuleAction || !isModuleValied)) -> R.drawable.bg_yellow_round
isXposedModuleActive -> R.drawable.bg_green_round
else -> R.drawable.bg_dark_round
}
@@ -255,15 +264,26 @@ class MainActivity : BaseActivity() {
binding.mainTextStatus.text =
when {
isXposedModuleActive && isMiuiNotifyStyle -> "模块已激活,但未在工作"
+ isXposedModuleActive && !isModuleAction &&
+ !modulePrefs.getBoolean(ENABLE_MODULE, default = true) -> "模块已停用"
+ isXposedModuleActive && !isModuleAction -> "模块已激活,请重启系统界面"
+ isXposedModuleActive && !isModuleValied -> "模块已更新,请重启系统界面"
isXposedModuleActive -> "模块已激活"
else -> "模块未激活"
}
+ binding.mainTextApiWay.isVisible = isXposedModuleActive
+ binding.mainTextApiWay.text = "Activate by ${YukiHookModuleStatus.executorName} API ${YukiHookModuleStatus.executorVersion}"
}
override fun onResume() {
super.onResume()
/** 刷新模块状态 */
refreshModuleStatus()
+ /** 发送广播检查模块激活状态 */
+ sendBroadcast(Intent().apply {
+ action = Const.MODULE_CHECKING_RECEIVER
+ putExtra(Const.MODULE_VERSION_VERIFY_TAG, Const.MODULE_VERSION_VERIFY)
+ })
/** 经典样式启用后给出警告 */
if (!isWarnDialogShowing && isXposedModuleActive && isMiuiNotifyStyle)
showDialog {
@@ -288,4 +308,21 @@ class MainActivity : BaseActivity() {
noCancelable()
}
}
+
+ override fun onDestroy() {
+ super.onDestroy()
+ /** 取消注册广播 */
+ unregisterReceiver(hostReceiver)
+ }
+
+ /** 宿主广播接收器 */
+ private val hostReceiver by lazy {
+ object : BroadcastReceiver() {
+ override fun onReceive(context: Context?, intent: Intent?) {
+ isModuleAction = intent?.getBooleanExtra("isAction", false) ?: false
+ isModuleValied = intent?.getBooleanExtra("isValied", false) ?: false
+ refreshModuleStatus()
+ }
+ }
+ }
}
\ No newline at end of file
diff --git a/app/src/main/java/com/fankes/miui/notify/utils/tool/IconAdaptationTool.kt b/app/src/main/java/com/fankes/miui/notify/utils/tool/IconAdaptationTool.kt
index 04c297d..4b38ca7 100644
--- a/app/src/main/java/com/fankes/miui/notify/utils/tool/IconAdaptationTool.kt
+++ b/app/src/main/java/com/fankes/miui/notify/utils/tool/IconAdaptationTool.kt
@@ -32,7 +32,7 @@ import android.content.Intent
import android.graphics.Bitmap
import android.graphics.drawable.Icon
import android.os.Build
-import com.fankes.miui.notify.application.MNNApplication.Companion.MODULE_PACKAGE_NAME
+import com.fankes.miui.notify.const.Const
import com.fankes.miui.notify.hook.HookEntry
import com.fankes.miui.notify.utils.factory.bitmap
import com.fankes.miui.notify.utils.factory.findAppIcon
@@ -132,8 +132,8 @@ object IconAdaptationTool {
context, packageName.hashCode(),
Intent().apply {
component = ComponentName(
- MODULE_PACKAGE_NAME,
- "$MODULE_PACKAGE_NAME.ui.activity.ConfigureActivity"
+ Const.MODULE_PACKAGE_NAME,
+ "${Const.MODULE_PACKAGE_NAME}.ui.activity.ConfigureActivity"
)
flags = Intent.FLAG_ACTIVITY_NEW_TASK
}.apply {
diff --git a/app/src/main/java/com/fankes/miui/notify/utils/tool/SystemUITool.kt b/app/src/main/java/com/fankes/miui/notify/utils/tool/SystemUITool.kt
index 64c69ad..508fa33 100644
--- a/app/src/main/java/com/fankes/miui/notify/utils/tool/SystemUITool.kt
+++ b/app/src/main/java/com/fankes/miui/notify/utils/tool/SystemUITool.kt
@@ -59,7 +59,10 @@ object SystemUITool {
* 刷新系统界面状态栏与通知图标
* @param context 实例
*/
- fun refreshSystemUI(context: Context) = IconRuleManagerTool.refreshSystemUI(context)
+ fun refreshSystemUI(context: Context) =
+ if (isXposedModuleActive)
+ IconRuleManagerTool.refreshSystemUI(context)
+ else context.snake(msg = "模块没有激活,更改不会生效")
/**
* 显示需要重启系统界面的 [Snackbar]
diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml
index 632017c..0dbd200 100644
--- a/app/src/main/res/layout/activity_main.xml
+++ b/app/src/main/res/layout/activity_main.xml
@@ -87,6 +87,8 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginBottom="5dp"
+ android:ellipsize="end"
+ android:singleLine="true"
android:text="模块状态未知"
android:textColor="@color/white"
android:textSize="18sp" />
@@ -137,6 +139,19 @@
android:text="系统版本:%1"
android:textColor="@color/white"
android:textSize="13sp" />
+
+