diff --git a/app/src/main/java/com/fankes/coloros/notify/application/CNNApplication.kt b/app/src/main/java/com/fankes/coloros/notify/application/CNNApplication.kt index cdcba15..fcd2a64 100644 --- a/app/src/main/java/com/fankes/coloros/notify/application/CNNApplication.kt +++ b/app/src/main/java/com/fankes/coloros/notify/application/CNNApplication.kt @@ -27,12 +27,16 @@ package com.fankes.coloros.notify.application import android.app.Application import android.content.Context import androidx.appcompat.app.AppCompatDelegate +import com.fankes.coloros.notify.BuildConfig import me.weishu.reflection.Reflection class CNNApplication : Application() { companion object { + /** 当前模块的包名 */ + const val MODULE_PACKAGE_NAME = BuildConfig.APPLICATION_ID + /** 全局静态实例 */ private var context: CNNApplication? = null diff --git a/app/src/main/java/com/fankes/coloros/notify/hook/HookEntry.kt b/app/src/main/java/com/fankes/coloros/notify/hook/HookEntry.kt index af1c7b3..0a722d6 100644 --- a/app/src/main/java/com/fankes/coloros/notify/hook/HookEntry.kt +++ b/app/src/main/java/com/fankes/coloros/notify/hook/HookEntry.kt @@ -32,6 +32,7 @@ import android.graphics.drawable.VectorDrawable import android.service.notification.StatusBarNotification import android.widget.ImageView import androidx.core.graphics.drawable.toBitmap +import com.fankes.coloros.notify.application.CNNApplication.Companion.MODULE_PACKAGE_NAME import com.fankes.coloros.notify.bean.IconDataBean import com.fankes.coloros.notify.hook.HookConst.ENABLE_ANDROID12_STYLE import com.fankes.coloros.notify.hook.HookConst.ENABLE_MODULE @@ -48,6 +49,7 @@ import com.fankes.coloros.notify.param.IconPackParams import com.fankes.coloros.notify.utils.drawable.drawabletoolbox.DrawableBuilder import com.fankes.coloros.notify.utils.factory.* import com.fankes.coloros.notify.utils.tool.IconAdaptationTool +import com.fankes.coloros.notify.utils.tool.IconRuleManagerTool import com.highcapable.yukihookapi.annotation.xposed.InjectYukiHookWithXposed import com.highcapable.yukihookapi.hook.bean.VariousClass import com.highcapable.yukihookapi.hook.factory.configs @@ -278,6 +280,11 @@ class HookEntry : YukiHookXposedInitProxy { } } + /** 缓存图标数据 */ + private fun PackageParam.cachingIconDatas() { + iconDatas = IconPackParams(param = this).iconDatas + } + override fun onInit() = configs { debugTag = "ColorOSNotify" isDebug = false @@ -293,7 +300,7 @@ class HookEntry : YukiHookXposedInitProxy { /** 开始 Hook */ else -> { /** 缓存图标数据 */ - iconDatas = IconPackParams(param = this).iconDatas + cachingIconDatas() /** 移除开发者警告通知 */ SystemPromptControllerClass.hook { injectMember { @@ -365,7 +372,12 @@ class HookEntry : YukiHookXposedInitProxy { packageName = nf.packageName, drawable = iconDrawable ) - ) + ).apply { + /** 刷新图标缓存 */ + if (nf.packageName == MODULE_PACKAGE_NAME && + nf.notification.channelId == IconRuleManagerTool.NOTIFY_CHANNEL + ) cachingIconDatas() + } ) } } @@ -398,6 +410,10 @@ class HookEntry : YukiHookXposedInitProxy { iconView = this ) } + /** 刷新图标缓存 */ + if (context.packageName == MODULE_PACKAGE_NAME && + nf.channelId == IconRuleManagerTool.NOTIFY_CHANNEL + ) cachingIconDatas() } } } diff --git a/app/src/main/java/com/fankes/coloros/notify/ui/activity/ConfigureActivity.kt b/app/src/main/java/com/fankes/coloros/notify/ui/activity/ConfigureActivity.kt index b740bbd..a91a9c6 100644 --- a/app/src/main/java/com/fankes/coloros/notify/ui/activity/ConfigureActivity.kt +++ b/app/src/main/java/com/fankes/coloros/notify/ui/activity/ConfigureActivity.kt @@ -182,6 +182,14 @@ class ConfigureActivity : BaseActivity() { mockLocalData() /** 更新数据 */ when { + intent?.getBooleanExtra("isShowNeedRestart", false) == true -> + showDialog { + title = "规则列表已同步至最新" + msg = "同步完成,部分通知图标可能需要重新启动系统界面才能生效。" + confirmButton(text = "重新启动") { SystemUITool.restartSystemUI(context) } + cancelButton() + noCancelable() + } intent?.getBooleanExtra("isNewAppSupport", false) == true -> showDialog { val appName = intent?.getStringExtra("appName") ?: "" @@ -190,6 +198,7 @@ class ConfigureActivity : BaseActivity() { msg = "你已安装 $appName($pkgName)\n\n" + "此应用未在通知优化名单中发现适配数据,若此应用发送的通知为彩色图标," + "可随时点击本页面下方的“贡献通知图标优化名单”按钮提交贡献或请求适配。\n\n" + + "若你已知晓此应用会遵守原生通知图标规范,可忽略此提示。\n\n" + "你可以现在立即同步适配列表,以获取最新的适配数据。" confirmButton(text = "同步列表") { onStartRefresh() } cancelButton(text = "复制名称+包名") { copyToClipboard(content = "$appName($pkgName)") } @@ -200,6 +209,7 @@ class ConfigureActivity : BaseActivity() { } /** 清除数据 */ intent?.apply { + removeExtra("isShowNeedRestart") removeExtra("isNewAppSupport") removeExtra("isShowUpdDialog") } @@ -210,7 +220,6 @@ class ConfigureActivity : BaseActivity() { IconRuleManagerTool.syncByHand(context = this) { filterText = "" mockLocalData() - SystemUITool.showNeedUpdateApplySnake(context = this) } /** 装载或刷新本地数据 */ diff --git a/app/src/main/java/com/fankes/coloros/notify/utils/tool/GithubReleaseTool.kt b/app/src/main/java/com/fankes/coloros/notify/utils/tool/GithubReleaseTool.kt index 529b309..9f798ca 100644 --- a/app/src/main/java/com/fankes/coloros/notify/utils/tool/GithubReleaseTool.kt +++ b/app/src/main/java/com/fankes/coloros/notify/utils/tool/GithubReleaseTool.kt @@ -36,10 +36,10 @@ import java.io.Serializable object GithubReleaseTool { /** 仓库作者 */ - private const val repoAuthor = "fankes" + private const val REPO_AUTHOR = "fankes" /** 仓库名称 */ - private const val repoName = "ColorOSNotifyIcon" + private const val REPO_NAME = "ColorOSNotifyIcon" /** * 获取最新版本信息 @@ -50,7 +50,7 @@ object GithubReleaseTool { fun checkingForUpdate(context: Context, version: String, it: (String, () -> Unit) -> Unit) = checkingInternetConnect(context) { OkHttpClient().newBuilder().build().newCall( Request.Builder() - .url("https://api.github.com/repos/$repoAuthor/$repoName/releases/latest") + .url("https://api.github.com/repos/$REPO_AUTHOR/$REPO_NAME/releases/latest") .get() .build() ).enqueue(object : Callback { diff --git a/app/src/main/java/com/fankes/coloros/notify/utils/tool/IconAdaptationTool.kt b/app/src/main/java/com/fankes/coloros/notify/utils/tool/IconAdaptationTool.kt index 7f79099..060f8cd 100644 --- a/app/src/main/java/com/fankes/coloros/notify/utils/tool/IconAdaptationTool.kt +++ b/app/src/main/java/com/fankes/coloros/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.coloros.notify.BuildConfig +import com.fankes.coloros.notify.application.CNNApplication.Companion.MODULE_PACKAGE_NAME import com.fankes.coloros.notify.hook.HookEntry import com.fankes.coloros.notify.utils.factory.bitmap import com.fankes.coloros.notify.utils.factory.findAppIcon @@ -46,9 +46,6 @@ import com.fankes.coloros.notify.utils.factory.runInSafe */ object IconAdaptationTool { - /** 当前模块的包名 */ - private const val PACKAGE_NAME = BuildConfig.APPLICATION_ID - /** * 使用的小图标 * @return [Bitmap] @@ -103,8 +100,8 @@ object IconAdaptationTool { context, packageName.hashCode(), Intent().apply { component = ComponentName( - PACKAGE_NAME, - "$PACKAGE_NAME.ui.activity.ConfigureActivity" + MODULE_PACKAGE_NAME, + "$MODULE_PACKAGE_NAME.ui.activity.ConfigureActivity" ) flags = Intent.FLAG_ACTIVITY_NEW_TASK }.apply { diff --git a/app/src/main/java/com/fankes/coloros/notify/utils/tool/IconRuleManagerTool.kt b/app/src/main/java/com/fankes/coloros/notify/utils/tool/IconRuleManagerTool.kt index 1ce91f4..1e8d426 100644 --- a/app/src/main/java/com/fankes/coloros/notify/utils/tool/IconRuleManagerTool.kt +++ b/app/src/main/java/com/fankes/coloros/notify/utils/tool/IconRuleManagerTool.kt @@ -32,6 +32,7 @@ import android.content.Context import android.content.Intent import android.net.Uri import android.os.Build +import android.os.Handler import android.provider.Settings import androidx.appcompat.app.AppCompatActivity import androidx.core.app.NotificationCompat @@ -39,6 +40,7 @@ import androidx.core.content.getSystemService import androidx.core.view.isVisible import androidx.core.widget.doOnTextChanged import com.fankes.coloros.notify.R +import com.fankes.coloros.notify.application.CNNApplication.Companion.appContext import com.fankes.coloros.notify.databinding.DiaSourceFromBinding import com.fankes.coloros.notify.databinding.DiaSourceFromStringBinding import com.fankes.coloros.notify.hook.HookConst.SOURCE_SYNC_WAY @@ -64,6 +66,9 @@ import javax.net.ssl.* */ object IconRuleManagerTool { + /** 推送通知的渠道名称 */ + const val NOTIFY_CHANNEL = "notifyRuleUpdateId" + /** 当前规则的系统名称 */ private const val OS_TAG = "ColorOS" @@ -138,6 +143,7 @@ object IconRuleManagerTool { dataJson2 = jsonString.takeIf { params.isJsonArray(it) } ?: "[$jsonString]" ) ) + pushWithRefresh(context) it() } else -> context.snake(msg = "请输入有效内容") @@ -150,6 +156,7 @@ object IconRuleManagerTool { jsonString.isNotBlank() && params.isNotVaildJson(jsonString) -> context.snake(msg = "不是有效的 JSON 数据") jsonString.isNotBlank() -> { params.save(dataJson = jsonString.takeIf { params.isJsonArray(it) } ?: "[$jsonString]") + pushWithRefresh(context) it() } else -> context.snake(msg = "请输入有效内容") @@ -208,6 +215,7 @@ object IconRuleManagerTool { params.isCompareDifferent(it) -> { params.save(it) pushNotify(context, title = "同步完成", msg = "已更新通知图标优化名单,点击查看") + pushWithRefresh(context) it() } else -> (if (context is AppCompatActivity) context.snake(msg = "列表数据已是最新")) @@ -256,6 +264,7 @@ object IconRuleManagerTool { params.isCompareDifferent(content) -> { params.save(content) pushNotify(context, title = "同步完成", msg = "已更新通知图标优化名单,点击查看") + pushWithRefresh(context) it() } else -> (if (context is AppCompatActivity) context.snake(msg = "列表数据已是最新")) @@ -348,6 +357,18 @@ object IconRuleManagerTool { }) }.onFailure { it(false, "URL 无效") } + /** + * 推送通知图标更新通知 + * @param context 实例 + */ + private fun pushWithRefresh(context: Context) { + if (context !is AppCompatActivity) return + SystemUITool.showNeedUpdateApplySnake(context) + pushNotify(appContext, title = "更新完成", msg = "部分通知图标需要重启系统界面生效", isAction = false) + /** 刷新成功后取消通知 */ + Handler().postDelayed({ context.getSystemService()?.cancel(1) }, 1500) + } + /** * 根据实例类型决定推送通知还是弹出提示 * @param title 标题 - 仅对通知生效 @@ -364,17 +385,18 @@ object IconRuleManagerTool { * @param context 实例 - 类型为 [AppCompatActivity] 时将不会推送通知 * @param title 通知标题 * @param msg 通知消息 + * @param isAction 是否增加点击跳转事件 - 默认:是 */ - private fun pushNotify(context: Context, title: String, msg: String) { + private fun pushNotify(context: Context, title: String, msg: String, isAction: Boolean = true) { if (context !is AppCompatActivity) context.getSystemService()?.apply { createNotificationChannel( NotificationChannel( - "notifyRuleUpdateId", "通知图标优化规则", + NOTIFY_CHANNEL, "通知图标优化规则", NotificationManager.IMPORTANCE_DEFAULT ) ) - notify(0, NotificationCompat.Builder(context, "notifyRuleUpdateId").apply { + notify(if (isAction) 0 else 1, NotificationCompat.Builder(context, NOTIFY_CHANNEL).apply { setContentTitle(title) setContentText(msg) color = OS_COLOR.toInt() @@ -382,11 +404,13 @@ object IconRuleManagerTool { setSmallIcon(R.drawable.ic_nf_icon_update) setSound(null) setDefaults(NotificationCompat.DEFAULT_ALL) - setContentIntent( + if (isAction) setContentIntent( PendingIntent.getActivity( - context, 1, - Intent(context, ConfigureActivity::class.java).apply { putExtra("isShowUpdDialog", false) }, - if (Build.VERSION.SDK_INT < 31) PendingIntent.FLAG_UPDATE_CURRENT else PendingIntent.FLAG_IMMUTABLE + context, msg.hashCode(), + Intent(context, ConfigureActivity::class.java).apply { + putExtra("isShowNeedRestart", true) + putExtra("isShowUpdDialog", false) + }, if (Build.VERSION.SDK_INT < 31) PendingIntent.FLAG_UPDATE_CURRENT else PendingIntent.FLAG_IMMUTABLE ) ) }.build()) diff --git a/app/src/main/java/com/fankes/coloros/notify/utils/tool/SystemUITool.kt b/app/src/main/java/com/fankes/coloros/notify/utils/tool/SystemUITool.kt index 909020e..ce6e0f7 100644 --- a/app/src/main/java/com/fankes/coloros/notify/utils/tool/SystemUITool.kt +++ b/app/src/main/java/com/fankes/coloros/notify/utils/tool/SystemUITool.kt @@ -23,10 +23,7 @@ package com.fankes.coloros.notify.utils.tool import android.content.Context -import com.fankes.coloros.notify.utils.factory.execShellSu -import com.fankes.coloros.notify.utils.factory.showDialog -import com.fankes.coloros.notify.utils.factory.snake -import com.fankes.coloros.notify.utils.factory.toast +import com.fankes.coloros.notify.utils.factory.* import com.google.android.material.snackbar.Snackbar import com.highcapable.yukihookapi.hook.factory.isXposedModuleActive @@ -68,6 +65,8 @@ object SystemUITool { */ fun showNeedUpdateApplySnake(context: Context) = if (isXposedModuleActive) - context.snake(msg = "数据已更新,请重启系统界面使更改生效", actionText = "立即重启") { restartSystemUI(context) } + if (isNotNoificationEnabled) + context.snake(msg = "无通知权限,请重启系统界面使更改生效", actionText = "立即重启") { restartSystemUI(context) } + else context.snake(msg = "数据已更新,已推送的通知将在下次生效", actionText = "立即重启") { restartSystemUI(context) } else context.snake(msg = "模块没有激活,更改不会生效") } \ No newline at end of file