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 9227378..79db5eb 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 @@ -47,13 +47,15 @@ data class IconDataBean( ) : Serializable { fun toEnabledName() = ("$appName$packageName").base64 + "_enable" fun toEnabledAllName() = ("$appName$packageName").base64 + "_enable_all" - override fun toString() = "{\n" + - " \"appName\": \"$appName\",\n" + - " \"packageName\": \"$packageName\",\n" + - " \"iconBitmap\": \"${iconBitmap.base64}\",\n" + - " \"iconColor\": \"#${Integer.toHexString(iconColor)}\",\n" + - " \"contributorName\": \"$contributorName\",\n" + - " \"isEnabled\": $isEnabled,\n" + - " \"isEnabledAll\": $isEnabledAll\n" + - " }" + override fun toString() = """ + { + "appName": "$appName", + "packageName": "$packageName", + "iconBitmap": "${iconBitmap.base64}", + "iconColor": "#${Integer.toHexString(iconColor)}", + "contributorName": "$contributorName", + "isEnabled": $isEnabled, + "isEnabledAll": $isEnabledAll + } + """.trimIndent() } \ No newline at end of file diff --git a/app/src/main/java/com/fankes/miui/notify/hook/entity/SystemUIHooker.kt b/app/src/main/java/com/fankes/miui/notify/hook/entity/SystemUIHooker.kt index 7a35134..1bffe42 100644 --- a/app/src/main/java/com/fankes/miui/notify/hook/entity/SystemUIHooker.kt +++ b/app/src/main/java/com/fankes/miui/notify/hook/entity/SystemUIHooker.kt @@ -20,7 +20,7 @@ * * This file is Created by fankes on 2022/3/25. */ -@file:Suppress("StaticFieldLeak") +@file:Suppress("StaticFieldLeak", "ConstPropertyName") package com.fankes.miui.notify.hook.entity @@ -53,17 +53,41 @@ import com.fankes.miui.notify.data.ConfigData import com.fankes.miui.notify.params.IconPackParams import com.fankes.miui.notify.params.factory.isAppNotifyHookAllOf import com.fankes.miui.notify.params.factory.isAppNotifyHookOf -import com.fankes.miui.notify.utils.factory.* +import com.fankes.miui.notify.utils.factory.appIconOf +import com.fankes.miui.notify.utils.factory.appNameOf +import com.fankes.miui.notify.utils.factory.brighterColor +import com.fankes.miui.notify.utils.factory.delayedRun +import com.fankes.miui.notify.utils.factory.dp +import com.fankes.miui.notify.utils.factory.dpFloat +import com.fankes.miui.notify.utils.factory.drawableOf +import com.fankes.miui.notify.utils.factory.isNotSystemInDarkMode +import com.fankes.miui.notify.utils.factory.isSystemInDarkMode +import com.fankes.miui.notify.utils.factory.isUpperOfAndroidS +import com.fankes.miui.notify.utils.factory.miuiIncrementalVersion +import com.fankes.miui.notify.utils.factory.round +import com.fankes.miui.notify.utils.factory.runInSafe +import com.fankes.miui.notify.utils.factory.safeOf +import com.fankes.miui.notify.utils.factory.safeOfFalse +import com.fankes.miui.notify.utils.factory.systemAccentColor import com.fankes.miui.notify.utils.tool.ActivationPromptTool import com.fankes.miui.notify.utils.tool.BitmapCompatTool import com.fankes.miui.notify.utils.tool.IconAdaptationTool import com.fankes.miui.notify.utils.tool.SystemUITool import com.highcapable.yukihookapi.hook.bean.VariousClass import com.highcapable.yukihookapi.hook.entity.YukiBaseHooker -import com.highcapable.yukihookapi.hook.factory.* +import com.highcapable.yukihookapi.hook.factory.MembersType +import com.highcapable.yukihookapi.hook.factory.current +import com.highcapable.yukihookapi.hook.factory.extends +import com.highcapable.yukihookapi.hook.factory.field +import com.highcapable.yukihookapi.hook.factory.hasField +import com.highcapable.yukihookapi.hook.factory.injectModuleAppResources +import com.highcapable.yukihookapi.hook.factory.method import com.highcapable.yukihookapi.hook.log.loggerD import com.highcapable.yukihookapi.hook.log.loggerW -import com.highcapable.yukihookapi.hook.type.android.* +import com.highcapable.yukihookapi.hook.type.android.ContextClass +import com.highcapable.yukihookapi.hook.type.android.DrawableClass +import com.highcapable.yukihookapi.hook.type.android.ImageViewClass +import com.highcapable.yukihookapi.hook.type.android.StatusBarNotificationClass import com.highcapable.yukihookapi.hook.type.java.BooleanType import com.highcapable.yukihookapi.hook.type.java.IntType import top.defaults.drawabletoolbox.DrawableBuilder @@ -237,15 +261,15 @@ object SystemUIHooker : YukiBaseHooker() { private fun loggerDebug(tag: String, context: Context, nf: StatusBarNotification?, isCustom: Boolean, isGrayscale: Boolean) { if (ConfigData.isEnableModuleLog) loggerD( msg = "(Processing $tag) ↓\n" + - "[Title]: ${nf?.notification?.extras?.getString(Notification.EXTRA_TITLE)}\n" + - "[Content]: ${nf?.notification?.extras?.getString(Notification.EXTRA_TEXT)}\n" + - "[App Name]: ${context.appNameOf(packageName = nf?.packageName ?: "")}\n" + - "[Package Name]: ${nf?.packageName}\n" + - "[Sender Package Name]: ${nf?.compatOpPkgName}\n" + - "[Custom Icon]: $isCustom\n" + - "[Grayscale Icon]: $isGrayscale\n" + - "[From Xmsf]: ${nf?.isXmsf}\n" + - "[String]: ${nf?.notification}" + "[Title]: ${nf?.notification?.extras?.getString(Notification.EXTRA_TITLE)}\n" + + "[Content]: ${nf?.notification?.extras?.getString(Notification.EXTRA_TEXT)}\n" + + "[App Name]: ${context.appNameOf(packageName = nf?.packageName ?: "")}\n" + + "[Package Name]: ${nf?.packageName}\n" + + "[Sender Package Name]: ${nf?.compatOpPkgName}\n" + + "[Custom Icon]: $isCustom\n" + + "[Grayscale Icon]: $isGrayscale\n" + + "[From Xmsf]: ${nf?.isXmsf}\n" + + "[String]: ${nf?.notification}" ) } 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 35ec452..97e0001 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 @@ -28,7 +28,11 @@ import android.content.Context import android.graphics.Color import com.fankes.miui.notify.bean.IconDataBean import com.fankes.miui.notify.data.ConfigData -import com.fankes.miui.notify.utils.factory.* +import com.fankes.miui.notify.utils.factory.bitmap +import com.fankes.miui.notify.utils.factory.safeOf +import com.fankes.miui.notify.utils.factory.safeOfNan +import com.fankes.miui.notify.utils.factory.safeOfNull +import com.fankes.miui.notify.utils.factory.snake import com.highcapable.yukihookapi.hook.factory.prefs import com.highcapable.yukihookapi.hook.param.PackageParam import org.json.JSONArray @@ -135,4 +139,4 @@ class IconPackParams(private val context: Context? = null, private val param: Pa * @param dataJson 图标数据 JSON */ fun save(dataJson: String) = context?.prefs()?.edit { put(ConfigData.NOTIFY_ICONS_DATA, dataJson) } -} +} \ No newline at end of file diff --git a/app/src/main/java/com/fankes/miui/notify/ui/activity/ConfigureActivity.kt b/app/src/main/java/com/fankes/miui/notify/ui/activity/ConfigureActivity.kt index 25462a4..a6d8c4e 100644 --- a/app/src/main/java/com/fankes/miui/notify/ui/activity/ConfigureActivity.kt +++ b/app/src/main/java/com/fankes/miui/notify/ui/activity/ConfigureActivity.kt @@ -37,7 +37,16 @@ import com.fankes.miui.notify.params.factory.isAppNotifyHookOf import com.fankes.miui.notify.params.factory.putAppNotifyHookAllOf import com.fankes.miui.notify.params.factory.putAppNotifyHookOf import com.fankes.miui.notify.ui.activity.base.BaseActivity -import com.fankes.miui.notify.utils.factory.* +import com.fankes.miui.notify.utils.factory.addOnBackPressedEvent +import com.fankes.miui.notify.utils.factory.bindAdapter +import com.fankes.miui.notify.utils.factory.callOnBackPressed +import com.fankes.miui.notify.utils.factory.colorOf +import com.fankes.miui.notify.utils.factory.copyToClipboard +import com.fankes.miui.notify.utils.factory.navigate +import com.fankes.miui.notify.utils.factory.openBrowser +import com.fankes.miui.notify.utils.factory.showDialog +import com.fankes.miui.notify.utils.factory.snake +import com.fankes.miui.notify.utils.factory.toast import com.fankes.miui.notify.utils.tool.IconRuleManagerTool import com.fankes.miui.notify.utils.tool.SystemUITool import com.highcapable.yukihookapi.YukiHookAPI @@ -145,8 +154,8 @@ class ConfigureActivity : BaseActivity() { if (b) showDialog { title = "全部替换" msg = "此功能仅针对严重不遵守规范的 APP 通知图标才需要开启,例如:APP 推送通知后无法识别出现的黑白块图标。\n\n" + - "此功能在一般情况下请保持关闭并跟随在线规则的配置,并不要随意改变此配置," + - "开启后 APP 的通知图标可能会被规则破坏,你确定还要开启吗?" + "此功能在一般情况下请保持关闭并跟随在线规则的配置,并不要随意改变此配置," + + "开启后 APP 的通知图标可能会被规则破坏,你确定还要开启吗?" confirmButton { saveState() } cancelButton { btn.isChecked = btn.isChecked.not() } noCancelable() @@ -188,10 +197,10 @@ class ConfigureActivity : BaseActivity() { val pkgName = intent?.getStringExtra("pkgName") ?: "" title = "新安装应用通知图标适配" msg = "你已安装 $appName($pkgName)\n\n" + - "此应用未在通知优化名单中发现适配数据,若此应用发送的通知为彩色图标," + - "可随时点击本页面下方的“贡献通知图标优化名单”按钮提交贡献或请求适配。\n\n" + - "若你已知晓此应用会遵守原生通知图标规范,可忽略此提示。\n\n" + - "你可以现在立即同步适配列表,以获取最新的适配数据。" + "此应用未在通知优化名单中发现适配数据,若此应用发送的通知为彩色图标," + + "可随时点击本页面下方的“贡献通知图标优化名单”按钮提交贡献或请求适配。\n\n" + + "若你已知晓此应用会遵守原生通知图标规范,可忽略此提示。\n\n" + + "你可以现在立即同步适配列表,以获取最新的适配数据。" confirmButton(text = "同步列表") { onStartRefresh() } cancelButton(text = "复制名称+包名") { copyToClipboard(content = "$appName($pkgName)") } neutralButton(text = "取消") @@ -250,7 +259,7 @@ class ConfigureActivity : BaseActivity() { onChanged?.invoke() binding.configTitleCountText.text = if (filterText.isBlank()) "已适配 ${iconDatas.size} 个 APP 的通知图标" - else "“${filterText}” 匹配到 ${iconDatas.size} 个结果" + else "“$filterText” 匹配到 ${iconDatas.size} 个结果" binding.configListNoDataView.apply { text = if (iconAllDatas.isEmpty()) "噫,竟然什么都没有~\n请点击右上角同步按钮获取云端数据" else "噫,竟然什么都没找到~" isVisible = iconDatas.isEmpty() diff --git a/app/src/main/java/com/fankes/miui/notify/utils/tool/BitmapCompatTool.kt b/app/src/main/java/com/fankes/miui/notify/utils/tool/BitmapCompatTool.kt index 32def5e..f0c5ff8 100644 --- a/app/src/main/java/com/fankes/miui/notify/utils/tool/BitmapCompatTool.kt +++ b/app/src/main/java/com/fankes/miui/notify/utils/tool/BitmapCompatTool.kt @@ -22,7 +22,11 @@ */ package com.fankes.miui.notify.utils.tool -import android.graphics.* +import android.graphics.Bitmap +import android.graphics.Canvas +import android.graphics.Matrix +import android.graphics.Paint +import android.graphics.PorterDuff import android.graphics.drawable.AnimationDrawable import android.graphics.drawable.BitmapDrawable import android.graphics.drawable.Drawable diff --git a/app/src/main/java/com/fankes/miui/notify/utils/tool/GithubReleaseTool.kt b/app/src/main/java/com/fankes/miui/notify/utils/tool/GithubReleaseTool.kt index 10018e2..83ff51d 100644 --- a/app/src/main/java/com/fankes/miui/notify/utils/tool/GithubReleaseTool.kt +++ b/app/src/main/java/com/fankes/miui/notify/utils/tool/GithubReleaseTool.kt @@ -27,12 +27,20 @@ import android.content.Context import android.icu.text.SimpleDateFormat import android.icu.util.Calendar import android.icu.util.TimeZone -import com.fankes.miui.notify.utils.factory.* -import okhttp3.* +import com.fankes.miui.notify.utils.factory.isNetWorkSuccess +import com.fankes.miui.notify.utils.factory.openBrowser +import com.fankes.miui.notify.utils.factory.openSelfSetting +import com.fankes.miui.notify.utils.factory.runInSafe +import com.fankes.miui.notify.utils.factory.showDialog +import okhttp3.Call +import okhttp3.Callback +import okhttp3.OkHttpClient +import okhttp3.Request +import okhttp3.Response import org.json.JSONObject import java.io.IOException import java.io.Serializable -import java.util.* +import java.util.Locale /** * 获取 GitHub Release 最新版本工具类 @@ -71,7 +79,7 @@ object GithubReleaseTool { fun showUpdate() = context.showDialog { title = "最新版本 $name" msg = "发布于 $date\n\n" + - "更新日志\n\n" + content + "更新日志\n\n" + content confirmButton(text = "更新") { context.openBrowser(htmlUrl) } cancelButton() } diff --git a/app/src/main/java/com/fankes/miui/notify/utils/tool/I18nWarnTool.kt b/app/src/main/java/com/fankes/miui/notify/utils/tool/I18nWarnTool.kt index b6ab2d2..4d59959 100644 --- a/app/src/main/java/com/fankes/miui/notify/utils/tool/I18nWarnTool.kt +++ b/app/src/main/java/com/fankes/miui/notify/utils/tool/I18nWarnTool.kt @@ -26,7 +26,7 @@ import android.content.Context import com.fankes.miui.notify.utils.factory.showDialog import com.highcapable.yukihookapi.hook.factory.prefs import com.highcapable.yukihookapi.hook.xposed.prefs.data.PrefsData -import java.util.* +import java.util.Locale /** * I18n 适配警告提示工具类 @@ -46,8 +46,8 @@ object I18nWarnTool { context.showDialog { title = "Notice of I18n Support" msg = "This Xposed Module is only for Chinese and the Chinese region.\n\n" + - "Currently, there will be no internationalization adaptation.\n\n" + - "There may be plans for internationalization adaptation in the future, so stay tuned." + "Currently, there will be no internationalization adaptation.\n\n" + + "There may be plans for internationalization adaptation in the future, so stay tuned." confirmButton(text = "Got It") { saveReaded() } noCancelable() } diff --git a/app/src/main/java/com/fankes/miui/notify/utils/tool/IconRuleManagerTool.kt b/app/src/main/java/com/fankes/miui/notify/utils/tool/IconRuleManagerTool.kt index bb4b593..2a6bc11 100644 --- a/app/src/main/java/com/fankes/miui/notify/utils/tool/IconRuleManagerTool.kt +++ b/app/src/main/java/com/fankes/miui/notify/utils/tool/IconRuleManagerTool.kt @@ -45,13 +45,25 @@ import com.fankes.miui.notify.databinding.DiaSourceFromBinding import com.fankes.miui.notify.databinding.DiaSourceFromStringBinding import com.fankes.miui.notify.params.IconPackParams import com.fankes.miui.notify.ui.activity.ConfigureActivity -import com.fankes.miui.notify.utils.factory.* +import com.fankes.miui.notify.utils.factory.delayedRun +import com.fankes.miui.notify.utils.factory.openBrowser +import com.fankes.miui.notify.utils.factory.safeOfNull +import com.fankes.miui.notify.utils.factory.showDialog +import com.fankes.miui.notify.utils.factory.snake import com.highcapable.yukihookapi.hook.log.loggerD -import okhttp3.* +import okhttp3.Call +import okhttp3.Callback +import okhttp3.OkHttpClient +import okhttp3.Request +import okhttp3.Response import java.io.IOException import java.security.SecureRandom import java.security.cert.X509Certificate -import javax.net.ssl.* +import javax.net.ssl.HostnameVerifier +import javax.net.ssl.SSLContext +import javax.net.ssl.SSLSocketFactory +import javax.net.ssl.TrustManager +import javax.net.ssl.X509TrustManager /** * 通知图标在线规则管理类 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 78cda81..9b009a8 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 @@ -32,7 +32,11 @@ import androidx.appcompat.app.AppCompatActivity import com.fankes.miui.notify.const.PackageName import com.fankes.miui.notify.data.ConfigData import com.fankes.miui.notify.ui.activity.MainActivity -import com.fankes.miui.notify.utils.factory.* +import com.fankes.miui.notify.utils.factory.delayedRun +import com.fankes.miui.notify.utils.factory.execShell +import com.fankes.miui.notify.utils.factory.miuiFullVersion +import com.fankes.miui.notify.utils.factory.showDialog +import com.fankes.miui.notify.utils.factory.snake import com.google.android.material.snackbar.Snackbar import com.highcapable.yukihookapi.YukiHookAPI import com.highcapable.yukihookapi.hook.factory.dataChannel @@ -40,7 +44,7 @@ import com.highcapable.yukihookapi.hook.log.YukiHookLogger import com.highcapable.yukihookapi.hook.log.YukiLoggerData import com.highcapable.yukihookapi.hook.param.PackageParam import com.highcapable.yukihookapi.hook.xposed.channel.data.ChannelData -import java.util.* +import java.util.Locale /** * 系统界面工具 @@ -88,17 +92,17 @@ object SystemUITool { runCatching { result?.let { e -> val content = "" + - "================================================================\n" + - " Generated by MIUINativeNotifyIcon\n" + - " Project Url: https://github.com/fankes/MIUINativeNotifyIcon\n" + - "================================================================\n\n" + - "[Device Brand]: ${Build.BRAND}\n" + - "[Device Model]: ${Build.MODEL}\n" + - "[Display]: ${Build.DISPLAY}\n" + - "[Android Version]: ${Build.VERSION.RELEASE}\n" + - "[Android API Level]: ${Build.VERSION.SDK_INT}\n" + - "[MIUI Version]: $miuiFullVersion\n" + - "[System Locale]: ${Locale.getDefault()}\n\n" + YukiHookLogger.contents(debugLogs).trim() + "================================================================\n" + + " Generated by MIUINativeNotifyIcon\n" + + " Project Url: https://github.com/fankes/MIUINativeNotifyIcon\n" + + "================================================================\n\n" + + "[Device Brand]: ${Build.BRAND}\n" + + "[Device Model]: ${Build.MODEL}\n" + + "[Display]: ${Build.DISPLAY}\n" + + "[Android Version]: ${Build.VERSION.RELEASE}\n" + + "[Android API Level]: ${Build.VERSION.SDK_INT}\n" + + "[MIUI Version]: $miuiFullVersion\n" + + "[System Locale]: ${Locale.getDefault()}\n\n" + YukiHookLogger.contents(debugLogs).trim() activity.contentResolver?.openOutputStream(e)?.apply { write(content.toByteArray()) }?.close() activity.snake(msg = "导出完成") } ?: activity.snake(msg = "已取消操作") @@ -125,9 +129,9 @@ object SystemUITool { context.showDialog { title = "导出全部调试日志" msg = "调试日志中会包含当前系统推送的全部通知内容,其中可能包含你的个人隐私," + - "你可以在导出后的日志文件中选择将这些敏感信息模糊化处理再进行共享," + - "开发者使用并查看你导出的调试日志仅为排查与修复问题,并且在之后会及时销毁这些日志。\n\n" + - "继续导出即代表你已阅读并知悉上述内容。" + "你可以在导出后的日志文件中选择将这些敏感信息模糊化处理再进行共享," + + "开发者使用并查看你导出的调试日志仅为排查与修复问题,并且在之后会及时销毁这些日志。\n\n" + + "继续导出即代表你已阅读并知悉上述内容。" confirmButton(text = "继续") { doExport() } cancelButton() } @@ -139,8 +143,8 @@ object SystemUITool { showDialog { title = "获取 Root 权限失败" msg = "当前无法获取 Root 权限,请确认你的设备已经被 Root 且同意授予 Root 权限。\n" + - "如果你正在使用 Magisk 并安装了 Shamiko 模块," + - "请确认当前是否正处于白名单模式。 (白名单模式将导致无法申请 Root 权限)" + "如果你正在使用 Magisk 并安装了 Shamiko 模块," + + "请确认当前是否正处于白名单模式。 (白名单模式将导致无法申请 Root 权限)" confirmButton(text = "我知道了") } @@ -160,8 +164,8 @@ object SystemUITool { }.onFailure { execShell( cmd = "am start -a" + - "com.miui.notification " + - "com.miui.notification/miui.notification.management.activity.NotificationDisplaySettingsActivity" + "com.miui.notification " + + "com.miui.notification/miui.notification.management.activity.NotificationDisplaySettingsActivity" ).also { when { it.isBlank() -> context.showWhenAccessRootFail() @@ -181,9 +185,9 @@ object SystemUITool { context.showDialog { title = "重启系统界面" msg = "你确定要立即重启系统界面吗?\n\n" + - "部分 MIUI 内测和开发版中使用了状态栏主题可能会发生主题失效的情况,这种情况请再重启一次即可。\n\n" + - "重启过程会黑屏并等待进入锁屏重新解锁。" + (if (isDynamicAvailable) - "\n\n你也可以选择“立即生效”来动态刷新系统界面并生效当前模块设置。" else "") + "部分 MIUI 内测和开发版中使用了状态栏主题可能会发生主题失效的情况,这种情况请再重启一次即可。\n\n" + + "重启过程会黑屏并等待进入锁屏重新解锁。" + (if (isDynamicAvailable) + "\n\n你也可以选择“立即生效”来动态刷新系统界面并生效当前模块设置。" else "") confirmButton { execShell(cmd = "pgrep systemui").also { pid -> if (pid.isNotBlank())