diff --git a/.idea/misc.xml b/.idea/misc.xml
index 643db78..1964724 100644
--- a/.idea/misc.xml
+++ b/.idea/misc.xml
@@ -7,6 +7,7 @@
+
diff --git a/README.md b/README.md
index db47247..4c94c1e 100644
--- a/README.md
+++ b/README.md
@@ -1,6 +1,6 @@
# MIUI 原生通知图标
-
+


[](https://t.me/XiaofangInternet)
diff --git a/app/build.gradle b/app/build.gradle
index 9818413..0c56f95 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/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 61395e5..1893fd5 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -26,7 +26,7 @@
android:value="93" />
@@ -42,7 +42,7 @@
android:exported="true"
android:label="@string/app_name"
android:screenOrientation="behind"
- android:targetActivity=".ui.MainActivity">
+ android:targetActivity=".ui.activity.MainActivity">
@@ -51,7 +51,7 @@
diff --git a/app/src/main/java/com/fankes/miui/notify/ui/ConfigureActivity.kt b/app/src/main/java/com/fankes/miui/notify/ui/activity/ConfigureActivity.kt
similarity index 68%
rename from app/src/main/java/com/fankes/miui/notify/ui/ConfigureActivity.kt
rename to app/src/main/java/com/fankes/miui/notify/ui/activity/ConfigureActivity.kt
index b7c657d..82397de 100644
--- a/app/src/main/java/com/fankes/miui/notify/ui/ConfigureActivity.kt
+++ b/app/src/main/java/com/fankes/miui/notify/ui/activity/ConfigureActivity.kt
@@ -22,21 +22,17 @@
*/
@file:Suppress("SetTextI18n", "InflateParams", "DEPRECATION")
-package com.fankes.miui.notify.ui
+package com.fankes.miui.notify.ui.activity
-import android.app.ProgressDialog
-import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.BaseAdapter
-import android.widget.ListView
-import android.widget.TextView
-import androidx.constraintlayout.utils.widget.ImageFilterView
import androidx.core.view.isVisible
import androidx.core.widget.doOnTextChanged
import com.fankes.miui.notify.R
import com.fankes.miui.notify.bean.IconDataBean
+import com.fankes.miui.notify.databinding.*
import com.fankes.miui.notify.hook.HookConst.SOURCE_SYNC_WAY
import com.fankes.miui.notify.hook.HookConst.SOURCE_SYNC_WAY_CUSTOM_URL
import com.fankes.miui.notify.hook.HookConst.TYPE_SOURCE_SYNC_WAY_1
@@ -47,17 +43,14 @@ import com.fankes.miui.notify.hook.factory.isAppNotifyHookOf
import com.fankes.miui.notify.hook.factory.putAppNotifyHookAllOf
import com.fankes.miui.notify.hook.factory.putAppNotifyHookOf
import com.fankes.miui.notify.params.IconPackParams
-import com.fankes.miui.notify.ui.base.BaseActivity
+import com.fankes.miui.notify.ui.activity.base.BaseActivity
import com.fankes.miui.notify.utils.factory.*
import com.fankes.miui.notify.utils.tool.ClientRequestTool
import com.fankes.miui.notify.utils.tool.SystemUITool
-import com.fankes.miui.notify.view.MaterialSwitch
-import com.google.android.material.radiobutton.MaterialRadioButton
-import com.google.android.material.textfield.TextInputEditText
import com.highcapable.yukihookapi.hook.factory.modulePrefs
import com.highcapable.yukihookapi.hook.xposed.YukiHookModuleStatus
-class ConfigureActivity : BaseActivity() {
+class ConfigureActivity : BaseActivity() {
/** 当前筛选条件 */
private var filterText = ""
@@ -71,9 +64,7 @@ class ConfigureActivity : BaseActivity() {
/** 全部的通知优化图标数据 */
private var iconAllDatas = ArrayList()
- override fun onCreate(savedInstanceState: Bundle?) {
- super.onCreate(savedInstanceState)
- setContentView(R.layout.activity_config)
+ override fun onCreate() {
/** 检查激活状态 */
if (!YukiHookModuleStatus.isActive()) {
showDialog {
@@ -85,31 +76,28 @@ class ConfigureActivity : BaseActivity() {
return
}
/** 返回按钮点击事件 */
- findViewById(R.id.title_back_icon).setOnClickListener { onBackPressed() }
+ binding.titleBackIcon.setOnClickListener { onBackPressed() }
/** 刷新适配器结果相关 */
refreshAdapterResult()
/** 设置上下按钮点击事件 */
- findViewById(R.id.config_title_up).setOnClickListener {
+ binding.configTitleUp.setOnClickListener {
snake(msg = "滚动到顶部")
onScrollEvent?.invoke(false)
}
- findViewById(R.id.config_title_down).setOnClickListener {
+ binding.configTitleDown.setOnClickListener {
snake(msg = "滚动到底部")
onScrollEvent?.invoke(true)
}
/** 设置过滤按钮点击事件 */
- findViewById(R.id.config_title_filter).setOnClickListener {
+ binding.configTitleFilter.setOnClickListener {
showDialog {
title = "按条件过滤"
- var editText: TextInputEditText
- addView(R.layout.dia_icon_filter).apply {
- editText = findViewById(R.id.dia_icon_filter_input_edit).apply {
- requestFocus()
- invalidate()
- if (filterText.isNotBlank()) {
- setText(filterText)
- setSelection(filterText.length)
- }
+ val editText = bind().diaIconFilterInputEdit.apply {
+ requestFocus()
+ invalidate()
+ if (filterText.isNotBlank()) {
+ setText(filterText)
+ setSelection(filterText.length)
}
}
confirmButton {
@@ -130,13 +118,11 @@ class ConfigureActivity : BaseActivity() {
}
}
/** 设置同步列表按钮点击事件 */
- findViewById(R.id.config_title_sync).setOnClickListener { onStartRefresh() }
+ binding.configTitleSync.setOnClickListener { onStartRefresh() }
/** 设置列表元素和 Adapter */
- findViewById(R.id.config_list_view).apply {
+ binding.configListView.apply {
adapter = object : BaseAdapter() {
- private val inflater = LayoutInflater.from(context)
-
override fun getCount() = iconDatas.size
override fun getItem(position: Int) = iconDatas[position]
@@ -145,40 +131,33 @@ class ConfigureActivity : BaseActivity() {
override fun getView(position: Int, convertView: View?, parent: ViewGroup?): View {
var cView = convertView
- val holder: ViewHolder
+ val holder: AdapterConfigBinding
if (convertView == null) {
- holder = ViewHolder()
- cView = inflater.inflate(R.layout.adapter_config, null).also {
- holder.appIcon = it.findViewById(R.id.adp_app_icon)
- holder.appName = it.findViewById(R.id.adp_app_name)
- holder.pkgName = it.findViewById(R.id.adp_app_pkg_name)
- holder.cbrName = it.findViewById(R.id.adp_cbr_name)
- holder.switchOpen = it.findViewById(R.id.adp_app_open_switch)
- holder.switchAll = it.findViewById(R.id.adp_app_all_switch)
- }
+ holder = AdapterConfigBinding.inflate(LayoutInflater.from(context))
+ cView = holder.root
cView.tag = holder
- } else holder = convertView.tag as ViewHolder
+ } else holder = convertView.tag as AdapterConfigBinding
getItem(position).also {
- holder.appIcon.setImageBitmap(it.iconBitmap)
+ holder.adpAppIcon.setImageBitmap(it.iconBitmap)
(if (it.iconColor != 0) it.iconColor else resources.getColor(R.color.colorTextGray)).also { color ->
- holder.appIcon.setColorFilter(color)
- holder.appName.setTextColor(color)
+ holder.adpAppIcon.setColorFilter(color)
+ holder.adpAppName.setTextColor(color)
}
- holder.appName.text = it.appName
- holder.pkgName.text = it.packageName
- holder.cbrName.text = "贡献者:" + it.contributorName
+ holder.adpAppName.text = it.appName
+ holder.adpAppPkgName.text = it.packageName
+ holder.adpCbrName.text = "贡献者:" + it.contributorName
isAppNotifyHookOf(it).also { e ->
- holder.switchOpen.isChecked = e
- holder.switchAll.isEnabled = e
+ holder.adpAppOpenSwitch.isChecked = e
+ holder.adpAppAllSwitch.isEnabled = e
}
- holder.switchOpen.setOnCheckedChangeListener { btn, b ->
+ holder.adpAppOpenSwitch.setOnCheckedChangeListener { btn, b ->
if (!btn.isPressed) return@setOnCheckedChangeListener
putAppNotifyHookOf(it, b)
- holder.switchAll.isEnabled = b
+ holder.adpAppAllSwitch.isEnabled = b
SystemUITool.showNeedRestartSnake(context = this@ConfigureActivity)
}
- holder.switchAll.isChecked = isAppNotifyHookAllOf(it)
- holder.switchAll.setOnCheckedChangeListener { btn, b ->
+ holder.adpAppAllSwitch.isChecked = isAppNotifyHookAllOf(it)
+ holder.adpAppAllSwitch.setOnCheckedChangeListener { btn, b ->
if (!btn.isPressed) return@setOnCheckedChangeListener
putAppNotifyHookAllOf(it, b)
SystemUITool.showNeedRestartSnake(context = this@ConfigureActivity)
@@ -186,15 +165,6 @@ class ConfigureActivity : BaseActivity() {
}
return cView!!
}
-
- inner class ViewHolder {
- lateinit var appIcon: ImageFilterView
- lateinit var appName: TextView
- lateinit var pkgName: TextView
- lateinit var cbrName: TextView
- lateinit var switchOpen: MaterialSwitch
- lateinit var switchAll: MaterialSwitch
- }
}.apply {
setOnItemLongClickListener { _, _, p, _ ->
showDialog {
@@ -210,7 +180,7 @@ class ConfigureActivity : BaseActivity() {
onScrollEvent = { post { setSelection(if (it) iconDatas.lastIndex else 0) } }
}
/** 设置点击事件 */
- findViewById(R.id.config_cbr_button).setOnClickListener {
+ binding.configCbrButton.setOnClickListener {
openBrowser(url = "https://github.com/fankes/AndroidNotifyIconAdapt/blob/main/CONTRIBUTING.md")
}
/** 装载数据 */
@@ -231,12 +201,8 @@ class ConfigureActivity : BaseActivity() {
title = "同步列表"
var sourceType = modulePrefs.getInt(SOURCE_SYNC_WAY, TYPE_SOURCE_SYNC_WAY_1)
var customUrl = modulePrefs.getString(SOURCE_SYNC_WAY_CUSTOM_URL)
- addView(R.layout.dia_source_from).apply {
- val radio1 = findViewById(R.id.dia_sf_rd1)
- val radio2 = findViewById(R.id.dia_sf_rd2)
- val radio3 = findViewById(R.id.dia_sf_rd3)
- val edLin = findViewById(R.id.dia_sf_text_lin)
- findViewById(R.id.dia_sf_text).apply {
+ bind().apply {
+ diaSfText.apply {
if (customUrl.isNotBlank()) {
setText(customUrl)
setSelection(customUrl.length)
@@ -246,28 +212,28 @@ class ConfigureActivity : BaseActivity() {
modulePrefs.putString(SOURCE_SYNC_WAY_CUSTOM_URL, text.toString())
}
}
- edLin.isVisible = sourceType == TYPE_SOURCE_SYNC_WAY_3
- radio1.isChecked = sourceType == TYPE_SOURCE_SYNC_WAY_1
- radio2.isChecked = sourceType == TYPE_SOURCE_SYNC_WAY_2
- radio3.isChecked = sourceType == TYPE_SOURCE_SYNC_WAY_3
- radio1.setOnClickListener {
- radio2.isChecked = false
- radio3.isChecked = false
- edLin.isVisible = false
+ diaSfTextLin.isVisible = sourceType == TYPE_SOURCE_SYNC_WAY_3
+ diaSfRd1.isChecked = sourceType == TYPE_SOURCE_SYNC_WAY_1
+ diaSfRd2.isChecked = sourceType == TYPE_SOURCE_SYNC_WAY_2
+ diaSfRd3.isChecked = sourceType == TYPE_SOURCE_SYNC_WAY_3
+ diaSfRd1.setOnClickListener {
+ diaSfRd2.isChecked = false
+ diaSfRd3.isChecked = false
+ diaSfTextLin.isVisible = false
sourceType = TYPE_SOURCE_SYNC_WAY_1
modulePrefs.putInt(SOURCE_SYNC_WAY, TYPE_SOURCE_SYNC_WAY_1)
}
- radio2.setOnClickListener {
- radio1.isChecked = false
- radio3.isChecked = false
- edLin.isVisible = false
+ diaSfRd2.setOnClickListener {
+ diaSfRd1.isChecked = false
+ diaSfRd3.isChecked = false
+ diaSfTextLin.isVisible = false
sourceType = TYPE_SOURCE_SYNC_WAY_2
modulePrefs.putInt(SOURCE_SYNC_WAY, TYPE_SOURCE_SYNC_WAY_2)
}
- radio3.setOnClickListener {
- radio1.isChecked = false
- radio2.isChecked = false
- edLin.isVisible = true
+ diaSfRd3.setOnClickListener {
+ diaSfRd1.isChecked = false
+ diaSfRd2.isChecked = false
+ diaSfTextLin.isVisible = true
sourceType = TYPE_SOURCE_SYNC_WAY_3
modulePrefs.putInt(SOURCE_SYNC_WAY, TYPE_SOURCE_SYNC_WAY_3)
}
@@ -289,14 +255,11 @@ class ConfigureActivity : BaseActivity() {
neutralButton(text = "自定义规则") {
showDialog {
title = "自定义规则"
- var editText: TextInputEditText
- addView(R.layout.dia_source_from_string).apply {
- editText = findViewById(R.id.dia_sfs_input_edit).apply {
- requestFocus()
- invalidate()
- }
+ val editText = bind().diaSfsInputEdit.apply {
+ requestFocus()
+ invalidate()
}
- IconPackParams(context = this@ConfigureActivity).also { params ->
+ IconPackParams(context).also { params ->
confirmButton(text = "合并") {
editText.text.toString().also { jsonString ->
when {
@@ -310,7 +273,7 @@ class ConfigureActivity : BaseActivity() {
)
filterText = ""
mockLocalData()
- SystemUITool.showNeedUpdateApplySnake(context = this@ConfigureActivity)
+ SystemUITool.showNeedUpdateApplySnake(context)
}
else -> snake(msg = "请输入有效内容")
}
@@ -324,7 +287,7 @@ class ConfigureActivity : BaseActivity() {
params.save(dataJson = jsonString.takeIf { params.isJsonArray(it) } ?: "[$jsonString]")
filterText = ""
mockLocalData()
- SystemUITool.showNeedUpdateApplySnake(context = this@ConfigureActivity)
+ SystemUITool.showNeedUpdateApplySnake(context)
}
else -> snake(msg = "请输入有效内容")
}
@@ -341,24 +304,15 @@ class ConfigureActivity : BaseActivity() {
* @param url
*/
private fun onRefreshing(url: String) = ClientRequestTool.checkingInternetConnect(context = this) {
- ProgressDialog(this).apply {
- setDefaultStyle(context = this@ConfigureActivity)
- setCancelable(false)
- setTitle("同步中")
- setMessage("正在同步 OS 数据")
- show()
- }.also {
- ClientRequestTool.wait(
- context = this,
- url = "$url/OS/MIUI/NotifyIconsSupportConfig.json"
- ) { isDone1, ctOS ->
- it.setMessage("正在同步 APP 数据")
- ClientRequestTool.wait(
- context = this,
- url = "$url/APP/NotifyIconsSupportConfig.json"
- ) { isDone2, ctAPP ->
- it.cancel()
- IconPackParams(context = this).also { params ->
+ showDialog {
+ title = "同步中"
+ progressContent = "正在同步 OS 数据"
+ noCancelable()
+ ClientRequestTool.wait(context, url = "$url/OS/MIUI/NotifyIconsSupportConfig.json") { isDone1, ctOS ->
+ progressContent = "正在同步 APP 数据"
+ ClientRequestTool.wait(context, url = "$url/APP/NotifyIconsSupportConfig.json") { isDone2, ctAPP ->
+ cancel()
+ IconPackParams(context).also { params ->
if (isDone1 && isDone2) params.splicingJsonArray(ctOS, ctAPP).also {
when {
params.isHackString(it) -> snake(msg = "请求需要验证,请尝试魔法上网或关闭魔法")
@@ -367,7 +321,7 @@ class ConfigureActivity : BaseActivity() {
params.save(it)
filterText = ""
mockLocalData()
- SystemUITool.showNeedUpdateApplySnake(context = this)
+ SystemUITool.showNeedUpdateApplySnake(context)
}
else -> snake(msg = "列表数据已是最新")
}
@@ -390,19 +344,13 @@ class ConfigureActivity : BaseActivity() {
* @param url
*/
private fun onRefreshingCustom(url: String) = ClientRequestTool.checkingInternetConnect(context = this) {
- ProgressDialog(this).apply {
- setDefaultStyle(context = this@ConfigureActivity)
- setCancelable(false)
- setTitle("同步中")
- setMessage("正在通过自定义地址同步数据")
- show()
- }.also {
- ClientRequestTool.wait(
- context = this,
- url = url
- ) { isDone, content ->
- it.cancel()
- IconPackParams(context = this).also { params ->
+ showDialog {
+ title = "同步中"
+ progressContent = "正在通过自定义地址同步数据"
+ noCancelable()
+ ClientRequestTool.wait(context, url) { isDone, content ->
+ cancel()
+ IconPackParams(context).also { params ->
if (isDone)
when {
params.isHackString(content) -> snake(msg = "请求需要验证,请尝试魔法上网或关闭魔法")
@@ -411,7 +359,7 @@ class ConfigureActivity : BaseActivity() {
params.save(content)
filterText = ""
mockLocalData()
- SystemUITool.showNeedUpdateApplySnake(context = this)
+ SystemUITool.showNeedUpdateApplySnake(context)
}
else -> snake(msg = "列表数据已是最新")
}
@@ -428,10 +376,10 @@ class ConfigureActivity : BaseActivity() {
/** 刷新适配器结果相关 */
private fun refreshAdapterResult() {
onChanged?.invoke()
- findViewById(R.id.config_title_count_text).text =
+ binding.configTitleCountText.text =
if (filterText.isBlank()) "已适配 ${iconDatas.size} 个 APP 的通知图标"
else "“${filterText}” 匹配到 ${iconDatas.size} 个结果"
- findViewById(R.id.config_list_no_data_view).apply {
+ binding.configListNoDataView.apply {
text = if (iconAllDatas.isEmpty()) "噫,竟然什么都没有~\n请点击右上角同步按钮获取云端数据" else "噫,竟然什么都没找到~"
isVisible = iconDatas.isEmpty()
}
diff --git a/app/src/main/java/com/fankes/miui/notify/ui/MainActivity.kt b/app/src/main/java/com/fankes/miui/notify/ui/activity/MainActivity.kt
similarity index 64%
rename from app/src/main/java/com/fankes/miui/notify/ui/MainActivity.kt
rename to app/src/main/java/com/fankes/miui/notify/ui/activity/MainActivity.kt
index 9e28317..e1ba4aa 100644
--- a/app/src/main/java/com/fankes/miui/notify/ui/MainActivity.kt
+++ b/app/src/main/java/com/fankes/miui/notify/ui/activity/MainActivity.kt
@@ -22,21 +22,17 @@
*/
@file:Suppress("SetTextI18n")
-package com.fankes.miui.notify.ui
+package com.fankes.miui.notify.ui.activity
import android.content.ComponentName
import android.content.Intent
import android.content.pm.PackageManager
-import android.os.Bundle
-import android.view.View
-import android.widget.LinearLayout
-import android.widget.TextView
-import androidx.appcompat.widget.SwitchCompat
-import androidx.constraintlayout.utils.widget.ImageFilterView
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.databinding.ActivityMainBinding
+import com.fankes.miui.notify.databinding.DiaStatusIconCountBinding
import com.fankes.miui.notify.hook.HookConst.ENABLE_COLOR_ICON_COMPAT
import com.fankes.miui.notify.hook.HookConst.ENABLE_COLOR_ICON_HOOK
import com.fankes.miui.notify.hook.HookConst.ENABLE_HIDE_ICON
@@ -46,14 +42,13 @@ import com.fankes.miui.notify.hook.HookConst.ENABLE_MODULE_LOG
import com.fankes.miui.notify.hook.HookConst.ENABLE_NOTIFY_ICON_FIX
import com.fankes.miui.notify.hook.HookConst.HOOK_STATUS_ICON_COUNT
import com.fankes.miui.notify.params.IconPackParams
-import com.fankes.miui.notify.ui.base.BaseActivity
+import com.fankes.miui.notify.ui.activity.base.BaseActivity
import com.fankes.miui.notify.utils.factory.*
import com.fankes.miui.notify.utils.tool.SystemUITool
-import com.google.android.material.textfield.TextInputEditText
import com.highcapable.yukihookapi.hook.factory.modulePrefs
import com.highcapable.yukihookapi.hook.xposed.YukiHookModuleStatus
-class MainActivity : BaseActivity() {
+class MainActivity : BaseActivity() {
companion object {
@@ -61,14 +56,13 @@ class MainActivity : BaseActivity() {
private const val moduleVersion = BuildConfig.VERSION_NAME
}
- private var isWarnDialogShowing = false // 警告对话框是否显示
+ /** 警告对话框是否显示 */
+ private var isWarnDialogShowing = false
- override fun onCreate(savedInstanceState: Bundle?) {
- super.onCreate(savedInstanceState)
- setContentView(R.layout.activity_main)
+ override fun onCreate() {
/** 设置文本 */
- findViewById(R.id.main_text_version).text = "模块版本:$moduleVersion"
- findViewById(R.id.main_text_miui_version).text = "系统版本:$miuiFullVersion"
+ binding.mainTextVersion.text = "模块版本:$moduleVersion"
+ binding.mainTextMiuiVersion.text = "系统版本:$miuiFullVersion"
when {
/** 判断是否为 MIUI 系统 */
isNotMIUI ->
@@ -105,7 +99,7 @@ class MainActivity : BaseActivity() {
title = "配置通知图标优化名单"
msg = "模块需要获取在线规则以更新“通知图标优化名单”,它现在是空的,这看起来是你第一次使用模块,请首先进行配置才可以使用相关功能。\n" +
"你可以随时在本页面下方找到“配置通知图标优化名单”手动前往。"
- confirmButton(text = "前往") { startActivity(Intent(this@MainActivity, ConfigureActivity::class.java)) }
+ confirmButton(text = "前往") { navigate() }
cancelButton()
noCancelable()
}
@@ -121,55 +115,39 @@ class MainActivity : BaseActivity() {
noCancelable()
}
}
- /** 初始化 View */
- val moduleEnableSwitch = findViewById(R.id.module_enable_switch)
- val moduleEnableLogSwitch = findViewById(R.id.module_enable_log_switch)
- val statusIconCountItem = findViewById(R.id.config_item_s_count_hook)
- val statusIconCountChildItem = findViewById(R.id.config_item_s_count_child_hook)
- val statusIconCountSwitch = findViewById(R.id.config_status_icon_count_switch)
- val statusIconCountText = findViewById(R.id.config_status_icon_count_text)
- val colorIconHookItem = findViewById(R.id.config_item_color_hook)
- val notifyIconConfigItem = findViewById(R.id.config_item_notify)
- val hideIconInLauncherSwitch = findViewById(R.id.hide_icon_in_launcher_switch)
- val colorIconHookSwitch = findViewById(R.id.color_icon_fix_switch)
- val colorIconCompatSwitch = findViewById(R.id.color_icon_compat_switch)
- val colorIconCompatText = findViewById(R.id.color_icon_compat_text)
- val notifyIconFixSwitch = findViewById(R.id.notify_icon_fix_switch)
- val notifyIconFixButton = findViewById(R.id.config_notify_app_button)
-
/** 获取 Sp 存储的信息 */
var statusBarIconCount = modulePrefs.getInt(HOOK_STATUS_ICON_COUNT, default = 5)
- colorIconHookItem.isVisible = modulePrefs.getBoolean(ENABLE_MODULE, default = true)
- statusIconCountItem.isVisible = modulePrefs.getBoolean(ENABLE_MODULE, default = true)
- colorIconCompatSwitch.isVisible = modulePrefs.getBoolean(ENABLE_COLOR_ICON_HOOK, default = true)
- colorIconCompatText.isVisible = modulePrefs.getBoolean(ENABLE_COLOR_ICON_HOOK, default = true)
- notifyIconConfigItem.isVisible = modulePrefs.getBoolean(ENABLE_MODULE, default = true) &&
+ binding.colorIconHookItem.isVisible = modulePrefs.getBoolean(ENABLE_MODULE, default = true)
+ binding.statusIconCountItem.isVisible = modulePrefs.getBoolean(ENABLE_MODULE, default = true)
+ binding.colorIconCompatSwitch.isVisible = modulePrefs.getBoolean(ENABLE_COLOR_ICON_HOOK, default = true)
+ binding.colorIconCompatText.isVisible = modulePrefs.getBoolean(ENABLE_COLOR_ICON_HOOK, default = true)
+ binding.notifyIconConfigItem.isVisible = modulePrefs.getBoolean(ENABLE_MODULE, default = true) &&
modulePrefs.getBoolean(ENABLE_COLOR_ICON_HOOK, default = true)
- notifyIconFixButton.isVisible = modulePrefs.getBoolean(ENABLE_NOTIFY_ICON_FIX, default = true)
- statusIconCountSwitch.isChecked = modulePrefs.getBoolean(ENABLE_HOOK_STATUS_ICON_COUNT, default = true)
- statusIconCountChildItem.isVisible = modulePrefs.getBoolean(ENABLE_HOOK_STATUS_ICON_COUNT, default = true)
- moduleEnableSwitch.isChecked = modulePrefs.getBoolean(ENABLE_MODULE, default = true)
- moduleEnableLogSwitch.isChecked = modulePrefs.getBoolean(ENABLE_MODULE_LOG, default = false)
- hideIconInLauncherSwitch.isChecked = modulePrefs.getBoolean(ENABLE_HIDE_ICON)
- colorIconHookSwitch.isChecked = modulePrefs.getBoolean(ENABLE_COLOR_ICON_HOOK, default = true)
- colorIconCompatSwitch.isChecked = modulePrefs.getBoolean(ENABLE_COLOR_ICON_COMPAT)
- notifyIconFixSwitch.isChecked = modulePrefs.getBoolean(ENABLE_NOTIFY_ICON_FIX, default = true)
- statusIconCountText.text = statusBarIconCount.toString()
- moduleEnableSwitch.setOnCheckedChangeListener { btn, b ->
+ binding.notifyIconFixButton.isVisible = modulePrefs.getBoolean(ENABLE_NOTIFY_ICON_FIX, default = true)
+ binding.statusIconCountSwitch.isChecked = modulePrefs.getBoolean(ENABLE_HOOK_STATUS_ICON_COUNT, default = true)
+ binding.statusIconCountChildItem.isVisible = modulePrefs.getBoolean(ENABLE_HOOK_STATUS_ICON_COUNT, default = true)
+ binding.moduleEnableSwitch.isChecked = modulePrefs.getBoolean(ENABLE_MODULE, default = true)
+ binding.moduleEnableLogSwitch.isChecked = modulePrefs.getBoolean(ENABLE_MODULE_LOG, default = false)
+ binding.hideIconInLauncherSwitch.isChecked = modulePrefs.getBoolean(ENABLE_HIDE_ICON)
+ binding.colorIconHookSwitch.isChecked = modulePrefs.getBoolean(ENABLE_COLOR_ICON_HOOK, default = true)
+ binding.colorIconCompatSwitch.isChecked = modulePrefs.getBoolean(ENABLE_COLOR_ICON_COMPAT)
+ binding.notifyIconFixSwitch.isChecked = modulePrefs.getBoolean(ENABLE_NOTIFY_ICON_FIX, default = true)
+ binding.statusIconCountText.text = statusBarIconCount.toString()
+ binding.moduleEnableSwitch.setOnCheckedChangeListener { btn, b ->
if (!btn.isPressed) return@setOnCheckedChangeListener
modulePrefs.putBoolean(ENABLE_MODULE, b)
- moduleEnableLogSwitch.isVisible = b
- colorIconHookItem.isVisible = b
- statusIconCountItem.isVisible = b
- notifyIconConfigItem.isVisible = b && colorIconHookSwitch.isChecked
+ binding.moduleEnableLogSwitch.isVisible = b
+ binding.colorIconHookItem.isVisible = b
+ binding.statusIconCountItem.isVisible = b
+ binding.notifyIconConfigItem.isVisible = b && binding.colorIconHookSwitch.isChecked
SystemUITool.showNeedRestartSnake(context = this)
}
- moduleEnableLogSwitch.setOnCheckedChangeListener { btn, b ->
+ binding.moduleEnableLogSwitch.setOnCheckedChangeListener { btn, b ->
if (!btn.isPressed) return@setOnCheckedChangeListener
modulePrefs.putBoolean(ENABLE_MODULE_LOG, b)
SystemUITool.showNeedRestartSnake(context = this)
}
- hideIconInLauncherSwitch.setOnCheckedChangeListener { btn, b ->
+ binding.hideIconInLauncherSwitch.setOnCheckedChangeListener { btn, b ->
if (!btn.isPressed) return@setOnCheckedChangeListener
modulePrefs.putBoolean(ENABLE_HIDE_ICON, b)
packageManager.setComponentEnabledSetting(
@@ -178,47 +156,44 @@ class MainActivity : BaseActivity() {
PackageManager.DONT_KILL_APP
)
}
- statusIconCountSwitch.setOnCheckedChangeListener { btn, b ->
+ binding.statusIconCountSwitch.setOnCheckedChangeListener { btn, b ->
if (!btn.isPressed) return@setOnCheckedChangeListener
modulePrefs.putBoolean(ENABLE_HOOK_STATUS_ICON_COUNT, b)
- statusIconCountChildItem.isVisible = b
+ binding.statusIconCountChildItem.isVisible = b
SystemUITool.showNeedRestartSnake(context = this)
}
- colorIconHookSwitch.setOnCheckedChangeListener { btn, b ->
+ binding.colorIconHookSwitch.setOnCheckedChangeListener { btn, b ->
if (!btn.isPressed) return@setOnCheckedChangeListener
modulePrefs.putBoolean(ENABLE_COLOR_ICON_HOOK, b)
- notifyIconConfigItem.isVisible = b
- colorIconCompatSwitch.isVisible = b
- colorIconCompatText.isVisible = b
+ binding.notifyIconConfigItem.isVisible = b
+ binding.colorIconCompatSwitch.isVisible = b
+ binding.colorIconCompatText.isVisible = b
SystemUITool.showNeedRestartSnake(context = this)
}
- colorIconCompatSwitch.setOnCheckedChangeListener { btn, b ->
+ binding.colorIconCompatSwitch.setOnCheckedChangeListener { btn, b ->
if (!btn.isPressed) return@setOnCheckedChangeListener
modulePrefs.putBoolean(ENABLE_COLOR_ICON_COMPAT, b)
SystemUITool.showNeedRestartSnake(context = this)
}
- notifyIconFixSwitch.setOnCheckedChangeListener { btn, b ->
+ binding.notifyIconFixSwitch.setOnCheckedChangeListener { btn, b ->
if (!btn.isPressed) return@setOnCheckedChangeListener
modulePrefs.putBoolean(ENABLE_NOTIFY_ICON_FIX, b)
- notifyIconFixButton.isVisible = b
+ binding.notifyIconFixButton.isVisible = b
SystemUITool.showNeedRestartSnake(context = this)
}
/** 通知图标优化名单按钮点击事件 */
- notifyIconFixButton.setOnClickListener { startActivity(Intent(this, ConfigureActivity::class.java)) }
+ binding.notifyIconFixButton.setOnClickListener { navigate() }
/** 设置警告 */
- findViewById(R.id.config_warn_s_count_dis_tip).isGone = miuiVersionCode > 12.5
+ binding.warnSCountDisTip.isGone = miuiVersionCode > 12.5
/** 修改状态栏通知图标个数按钮点击事件 */
- findViewById(R.id.config_status_icon_count_button).setOnClickListener {
+ binding.statusIconCountButton.setOnClickListener {
showDialog {
title = "设置最多显示的图标个数"
- var editText: TextInputEditText
- addView(R.layout.dia_status_icon_count).apply {
- editText = findViewById(R.id.dia_status_icon_count_input_edit).apply {
- requestFocus()
- invalidate()
- setText(statusBarIconCount.toString())
- setSelection(statusBarIconCount.toString().length)
- }
+ val editText = bind().diaStatusIconCountInputEdit.apply {
+ requestFocus()
+ invalidate()
+ setText(statusBarIconCount.toString())
+ setSelection(statusBarIconCount.toString().length)
}
confirmButton {
when {
@@ -227,8 +202,8 @@ class MainActivity : BaseActivity() {
editText.text.toString().isNotBlank() -> runCatching {
statusBarIconCount = editText.text.toString().trim().toInt()
modulePrefs.putInt(HOOK_STATUS_ICON_COUNT, statusBarIconCount)
- statusIconCountText.text = statusBarIconCount.toString()
- SystemUITool.showNeedRestartSnake(context = this@MainActivity)
+ binding.statusIconCountText.text = statusBarIconCount.toString()
+ SystemUITool.showNeedRestartSnake(context)
}.onFailure { snake(msg = "数值格式无效") }
else -> snake(msg = "请输入有效数值")
}
@@ -237,33 +212,33 @@ class MainActivity : BaseActivity() {
}
}
/** 重启按钮点击事件 */
- findViewById(R.id.title_restart_icon).setOnClickListener { SystemUITool.restartSystemUI(context = this) }
+ binding.titleRestartIcon.setOnClickListener { SystemUITool.restartSystemUI(context = this) }
/** 项目地址按钮点击事件 */
- findViewById(R.id.title_github_icon).setOnClickListener {
+ binding.titleGithubIcon.setOnClickListener {
openBrowser(url = "https://github.com/fankes/MIUINativeNotifyIcon")
}
/** 恰饭! */
- findViewById(R.id.link_with_follow_me).setOnClickListener {
+ binding.linkWithFollowMe.setOnClickListener {
openBrowser(url = "https://www.coolapk.com/u/876977", packageName = "com.coolapk.market")
}
}
/** 刷新模块状态 */
private fun refreshModuleStatus() {
- findViewById(R.id.main_lin_status).setBackgroundResource(
+ binding.mainLinStatus.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(
+ binding.mainImgStatus.setImageResource(
when {
YukiHookModuleStatus.isActive() && !isMiuiNotifyStyle -> R.mipmap.ic_success
else -> R.mipmap.ic_warn
}
)
- findViewById(R.id.main_text_status).text =
+ binding.mainTextStatus.text =
when {
YukiHookModuleStatus.isActive() && isMiuiNotifyStyle -> "模块已激活,但未在工作"
YukiHookModuleStatus.isActive() -> "模块已激活"
diff --git a/app/src/main/java/com/fankes/miui/notify/ui/base/BaseActivity.kt b/app/src/main/java/com/fankes/miui/notify/ui/activity/base/BaseActivity.kt
similarity index 63%
rename from app/src/main/java/com/fankes/miui/notify/ui/base/BaseActivity.kt
rename to app/src/main/java/com/fankes/miui/notify/ui/activity/base/BaseActivity.kt
index 874efb4..0288fa8 100644
--- a/app/src/main/java/com/fankes/miui/notify/ui/base/BaseActivity.kt
+++ b/app/src/main/java/com/fankes/miui/notify/ui/activity/base/BaseActivity.kt
@@ -20,18 +20,36 @@
*
* This file is Created by fankes on 2022/1/30.
*/
-package com.fankes.miui.notify.ui.base
+@file:Suppress("UNCHECKED_CAST")
+
+package com.fankes.miui.notify.ui.activity.base
import android.os.Bundle
import androidx.appcompat.app.AppCompatActivity
+import androidx.viewbinding.ViewBinding
import com.fankes.miui.notify.R
import com.fankes.miui.notify.utils.factory.isNotSystemInDarkMode
import com.gyf.immersionbar.ktx.immersionBar
+import com.highcapable.yukihookapi.hook.factory.method
+import com.highcapable.yukihookapi.hook.type.android.LayoutInflaterClass
+import java.lang.reflect.ParameterizedType
-abstract class BaseActivity : AppCompatActivity() {
+abstract class BaseActivity : AppCompatActivity() {
+
+ /** 获取绑定布局对象 */
+ lateinit var binding: VB
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
+ javaClass.genericSuperclass.also { type ->
+ if (type is ParameterizedType) {
+ binding = (type.actualTypeArguments[0] as Class).method {
+ name = "inflate"
+ param(LayoutInflaterClass)
+ }.get().invoke(layoutInflater) ?: error("binding failed")
+ setContentView(binding.root)
+ } else error("binding but got wrong type")
+ }
/** 隐藏系统的标题栏 */
supportActionBar?.hide()
/** 初始化沉浸状态栏 */
@@ -43,5 +61,10 @@ abstract class BaseActivity : AppCompatActivity() {
navigationBarDarkIcon(isNotSystemInDarkMode)
fitsSystemWindows(true)
}
+ /** 装载子类 */
+ onCreate()
}
+
+ /** 回调 [onCreate] 方法 */
+ abstract fun onCreate()
}
\ No newline at end of file
diff --git a/app/src/main/java/com/fankes/miui/notify/view/MaterialSwitch.kt b/app/src/main/java/com/fankes/miui/notify/ui/view/MaterialSwitch.kt
similarity index 98%
rename from app/src/main/java/com/fankes/miui/notify/view/MaterialSwitch.kt
rename to app/src/main/java/com/fankes/miui/notify/ui/view/MaterialSwitch.kt
index dfebd0a..7214409 100644
--- a/app/src/main/java/com/fankes/miui/notify/view/MaterialSwitch.kt
+++ b/app/src/main/java/com/fankes/miui/notify/ui/view/MaterialSwitch.kt
@@ -22,7 +22,7 @@
*/
@file:Suppress("SameParameterValue")
-package com.fankes.miui.notify.view
+package com.fankes.miui.notify.ui.view
import android.content.Context
import android.content.res.ColorStateList
diff --git a/app/src/main/java/com/fankes/miui/notify/utils/factory/DialogBuilderFactory.kt b/app/src/main/java/com/fankes/miui/notify/utils/factory/DialogBuilderFactory.kt
index 89d1f36..8377949 100644
--- a/app/src/main/java/com/fankes/miui/notify/utils/factory/DialogBuilderFactory.kt
+++ b/app/src/main/java/com/fankes/miui/notify/utils/factory/DialogBuilderFactory.kt
@@ -20,94 +20,182 @@
*
* This file is Created by fankes on 2022/1/7.
*/
-@file:Suppress("unused", "DEPRECATION")
+@file:Suppress("unused", "OPT_IN_USAGE", "EXPERIMENTAL_API_USAGE")
package com.fankes.miui.notify.utils.factory
-import android.app.AlertDialog
+import android.app.Dialog
import android.content.Context
-import android.util.DisplayMetrics
+import android.graphics.Color
+import android.graphics.drawable.GradientDrawable
+import android.view.Gravity
import android.view.LayoutInflater
import android.view.View
-import android.view.WindowManager
-import kotlin.math.round
+import android.view.ViewGroup
+import android.widget.LinearLayout
+import android.widget.ProgressBar
+import android.widget.TextView
+import androidx.appcompat.app.AppCompatActivity
+import androidx.viewbinding.ViewBinding
+import com.google.android.material.dialog.MaterialAlertDialogBuilder
+import com.highcapable.yukihookapi.annotation.DoNotUseField
+import com.highcapable.yukihookapi.hook.factory.method
+import com.highcapable.yukihookapi.hook.type.android.LayoutInflaterClass
/**
* 构造对话框
+ * @param isUseBlackTheme 是否使用深色主题
* @param it 对话框方法体
*/
-fun Context.showDialog(it: DialogBuilder.() -> Unit) = DialogBuilder(this).apply(it).show()
+fun Context.showDialog(isUseBlackTheme: Boolean = false, it: DialogBuilder.() -> Unit) =
+ DialogBuilder(this, isUseBlackTheme).apply(it).show()
/**
* 对话框构造器
* @param context 实例
+ * @param isUseBlackTheme 是否使用深色主题 - 对 AndroidX 风格无效
*/
-class DialogBuilder(private val context: Context) {
+class DialogBuilder(val context: Context, private val isUseBlackTheme: Boolean) {
- private var instance: AlertDialog.Builder? = null // 实例对象
+ private var instanceAndroidX: androidx.appcompat.app.AlertDialog.Builder? = null // 实例对象
+ private var instanceAndroid: android.app.AlertDialog.Builder? = null // 实例对象
- private var customLayoutView: View? = null // 自定义布局
+ private var dialogInstance: Dialog? = null // 对话框实例
+
+ @DoNotUseField
+ var customLayoutView: View? = null // 自定义布局
+
+ /**
+ * 是否需要使用 AndroidX 风格对话框
+ * @return [Boolean]
+ */
+ private val isUsingAndroidX get() = runCatching { context is AppCompatActivity }.getOrNull() ?: false
init {
- instance = AlertDialog.Builder(context, android.R.style.Theme_Material_Light_Dialog)
+ if (isUsingAndroidX)
+ runCatching { instanceAndroidX = MaterialAlertDialogBuilder(context) }
+ else runCatching {
+ instanceAndroid = android.app.AlertDialog.Builder(
+ context,
+ if (isUseBlackTheme) android.R.style.Theme_Material_Dialog else android.R.style.Theme_Material_Light_Dialog
+ )
+ }
}
/** 设置对话框不可关闭 */
- fun noCancelable() = instance?.setCancelable(false)
+ fun noCancelable() {
+ if (isUsingAndroidX)
+ runCatching { instanceAndroidX?.setCancelable(false) }
+ else runCatching { instanceAndroid?.setCancelable(false) }
+ }
/** 设置对话框标题 */
var title
get() = ""
set(value) {
- instance?.setTitle(value)
+ if (isUsingAndroidX)
+ runCatching { instanceAndroidX?.setTitle(value) }
+ else runCatching { instanceAndroid?.setTitle(value) }
}
/** 设置对话框消息内容 */
var msg
get() = ""
set(value) {
- instance?.setMessage(value)
+ if (isUsingAndroidX)
+ runCatching { instanceAndroidX?.setMessage(value) }
+ else runCatching { instanceAndroid?.setMessage(value) }
+ }
+
+ /** 设置进度条对话框消息内容 */
+ var progressContent
+ get() = ""
+ set(value) {
+ if (customLayoutView == null)
+ customLayoutView = LinearLayout(context).apply {
+ orientation = LinearLayout.HORIZONTAL
+ gravity = Gravity.CENTER or Gravity.START
+ addView(ProgressBar(context))
+ addView(View(context).apply { layoutParams = ViewGroup.LayoutParams(20.dp(context), 5) })
+ addView(TextView(context).apply {
+ tag = "progressContent"
+ text = value
+ })
+ setPadding(20.dp(context), 20.dp(context), 20.dp(context), 20.dp(context))
+ }
+ else customLayoutView?.findViewWithTag("progressContent")?.text = value
}
/**
* 设置对话框自定义布局
- * @param resId 属性资源 Id
- * @return [View]
+ * @return [ViewBinding]
*/
- fun addView(resId: Int): View {
- customLayoutView = LayoutInflater.from(context).inflate(resId, null)
- return customLayoutView ?: error("Inflate $resId failed")
- }
+ inline fun bind() =
+ T::class.java.method {
+ name = "inflate"
+ param(LayoutInflaterClass)
+ }.get().invoke(LayoutInflater.from(context))?.apply {
+ customLayoutView = root
+ } ?: error("binding failed")
/**
* 设置对话框确定按钮
* @param text 按钮文本内容
* @param it 点击事件
*/
- fun confirmButton(text: String = "确定", it: () -> Unit = {}) =
- instance?.setPositiveButton(text) { _, _ -> it() }
+ fun confirmButton(text: String = "确定", it: () -> Unit = {}) {
+ if (isUsingAndroidX)
+ runCatching { instanceAndroidX?.setPositiveButton(text) { _, _ -> it() } }
+ else runCatching { instanceAndroid?.setPositiveButton(text) { _, _ -> it() } }
+ }
/**
* 设置对话框取消按钮
* @param text 按钮文本内容
* @param it 点击事件
*/
- fun cancelButton(text: String = "取消", it: () -> Unit = {}) =
- instance?.setNegativeButton(text) { _, _ -> it() }
+ fun cancelButton(text: String = "取消", it: () -> Unit = {}) {
+ if (isUsingAndroidX)
+ runCatching { instanceAndroidX?.setNegativeButton(text) { _, _ -> it() } }
+ else runCatching { instanceAndroid?.setNegativeButton(text) { _, _ -> it() } }
+ }
/**
* 设置对话框第三个按钮
* @param text 按钮文本内容
* @param it 点击事件
*/
- fun neutralButton(text: String = "更多", it: () -> Unit = {}) =
- instance?.setNeutralButton(text) { _, _ -> it() }
+ fun neutralButton(text: String = "更多", it: () -> Unit = {}) {
+ if (isUsingAndroidX)
+ runCatching { instanceAndroidX?.setNeutralButton(text) { _, _ -> it() } }
+ else runCatching { instanceAndroid?.setNeutralButton(text) { _, _ -> it() } }
+ }
+
+ /** 取消对话框 */
+ fun cancel() = dialogInstance?.cancel()
/** 显示对话框 */
- internal fun show() = instance?.create()?.apply {
- val dm = DisplayMetrics()
- (context.getSystemService(Context.WINDOW_SERVICE) as WindowManager).defaultDisplay.getMetrics(dm)
- customLayoutView?.let { setView(it.apply { minimumWidth = round(x = dm.widthPixels / 1.3).toInt() }) }
- setDefaultStyle(context = this@DialogBuilder.context)
- }?.show()
+ internal fun show() {
+ if (isUsingAndroidX) runCatching {
+ instanceAndroidX?.create()?.apply {
+ customLayoutView?.let { setView(it) }
+ dialogInstance = this
+ }?.show()
+ } else runCatching {
+ instanceAndroid?.create()?.apply {
+ customLayoutView?.let { setView(it) }
+ window?.setBackgroundDrawable(
+ GradientDrawable(
+ GradientDrawable.Orientation.TOP_BOTTOM,
+ if (isUseBlackTheme) intArrayOf(0xFF2D2D2D.toInt(), 0xFF2D2D2D.toInt())
+ else intArrayOf(Color.WHITE, Color.WHITE)
+ ).apply {
+ shape = GradientDrawable.RECTANGLE
+ gradientType = GradientDrawable.LINEAR_GRADIENT
+ cornerRadius = 15.dpFloat(this@DialogBuilder.context)
+ })
+ dialogInstance = this
+ }?.show()
+ }
+ }
}
\ No newline at end of file
diff --git a/app/src/main/java/com/fankes/miui/notify/utils/factory/FunctionFactory.kt b/app/src/main/java/com/fankes/miui/notify/utils/factory/FunctionFactory.kt
index 84fe756..1adb934 100644
--- a/app/src/main/java/com/fankes/miui/notify/utils/factory/FunctionFactory.kt
+++ b/app/src/main/java/com/fankes/miui/notify/utils/factory/FunctionFactory.kt
@@ -25,7 +25,6 @@
package com.fankes.miui.notify.utils.factory
import android.app.Activity
-import android.app.AlertDialog
import android.content.ClipData
import android.content.ClipboardManager
import android.content.Context
@@ -36,7 +35,6 @@ import android.content.res.Configuration
import android.graphics.Bitmap
import android.graphics.BitmapFactory
import android.graphics.Color
-import android.graphics.drawable.GradientDrawable
import android.net.Uri
import android.os.Build
import android.provider.Settings
@@ -51,7 +49,6 @@ import com.highcapable.yukihookapi.hook.type.java.StringType
import com.topjohnwu.superuser.Shell
import java.io.ByteArrayOutputStream
-
/**
* 系统深色模式是否开启
* @return [Boolean] 是否开启
@@ -278,21 +275,6 @@ val ByteArray.bitmap: Bitmap get() = BitmapFactory.decodeByteArray(this, 0, size
*/
val String.bitmap: Bitmap get() = unbase64.bitmap
-/**
- * 设置对话框默认风格
- * @param context 使用的实例
- */
-fun AlertDialog.setDefaultStyle(context: Context) =
- window?.setBackgroundDrawable(
- GradientDrawable(
- GradientDrawable.Orientation.TOP_BOTTOM,
- intArrayOf(Color.WHITE, Color.WHITE)
- ).apply {
- shape = GradientDrawable.RECTANGLE
- gradientType = GradientDrawable.LINEAR_GRADIENT
- cornerRadius = 15.dpFloat(context)
- })
-
/**
* 获取系统 Prop 值
* @param key Key
@@ -323,6 +305,13 @@ fun execShellSu(cmd: String) = safeOfNothing {
*/
fun toast(msg: String) = Toast.makeText(appContext, msg, Toast.LENGTH_SHORT).show()
+/**
+ * 跳转到指定页面
+ *
+ * [T] 为指定的 [Activity]
+ */
+inline fun Context.navigate() = startActivity(Intent(this, T::class.java))
+
/**
* 弹出 [Snackbar]
* @param msg 提示内容
diff --git a/app/src/main/java/com/fankes/miui/notify/utils/tool/ClientRequestTool.kt b/app/src/main/java/com/fankes/miui/notify/utils/tool/ClientRequestTool.kt
index 1945da7..8c909b1 100644
--- a/app/src/main/java/com/fankes/miui/notify/utils/tool/ClientRequestTool.kt
+++ b/app/src/main/java/com/fankes/miui/notify/utils/tool/ClientRequestTool.kt
@@ -25,12 +25,11 @@
package com.fankes.miui.notify.utils.tool
import android.app.Activity
-import android.app.ProgressDialog
+import android.content.Context
import android.content.Intent
import android.net.Uri
import android.provider.Settings
import com.fankes.miui.notify.utils.factory.safeOfNull
-import com.fankes.miui.notify.utils.factory.setDefaultStyle
import com.fankes.miui.notify.utils.factory.showDialog
import com.fankes.miui.notify.utils.factory.snake
import com.highcapable.yukihookapi.hook.log.loggerD
@@ -50,13 +49,11 @@ object ClientRequestTool {
* @param context 实例
* @param it 已连接回调
*/
- fun checkingInternetConnect(context: Activity, it: () -> Unit) =
- ProgressDialog(context).apply {
- setDefaultStyle(context)
- setCancelable(false)
- setTitle("准备中")
- setMessage("正在检查网络连接情况")
- }.apply {
+ fun checkingInternetConnect(context: Context, it: () -> Unit) =
+ context.showDialog {
+ title = "准备中"
+ progressContent = "正在检查网络连接情况"
+ noCancelable()
wait(context, url = "https://www.baidu.com") { isDone, _ ->
cancel()
if (isDone) it() else
@@ -75,7 +72,7 @@ object ClientRequestTool {
cancelButton()
}
}
- }.show()
+ }
/**
* 发送 GET 请求内容并等待
@@ -83,7 +80,7 @@ object ClientRequestTool {
* @param url 请求地址
* @param it 回调 - ([Boolean] 是否成功,[String] 成功的内容或失败消息)
*/
- fun wait(context: Activity, url: String, it: (Boolean, String) -> Unit) = runCatching {
+ fun wait(context: Context, url: String, it: (Boolean, String) -> Unit) = runCatching {
OkHttpClient().newBuilder().apply {
SSLSocketClient.sSLSocketFactory?.let { sslSocketFactory(it, SSLSocketClient.trustManager) }
hostnameVerifier(SSLSocketClient.hostnameVerifier)
@@ -94,12 +91,12 @@ object ClientRequestTool {
.build()
).enqueue(object : Callback {
override fun onFailure(call: Call, e: IOException) {
- context.runOnUiThread { it(false, e.toString()) }
+ (context as? Activity?)?.runOnUiThread { it(false, e.toString()) }
}
override fun onResponse(call: Call, response: Response) {
val bodyString = response.body?.string() ?: ""
- context.runOnUiThread { it(true, bodyString) }
+ (context as? Activity?)?.runOnUiThread { it(true, bodyString) }
}
})
}.onFailure { it(false, "URL 无效") }
diff --git a/app/src/main/res/layout/activity_config.xml b/app/src/main/res/layout/activity_config.xml
index 78167c1..04aa37e 100644
--- a/app/src/main/res/layout/activity_config.xml
+++ b/app/src/main/res/layout/activity_config.xml
@@ -5,7 +5,7 @@
android:layout_height="match_parent"
android:background="@color/colorThemeBackground"
android:orientation="vertical"
- tools:context=".ui.MainActivity"
+ tools:context=".ui.activity.MainActivity"
tools:ignore="HardcodedText,UseCompoundDrawables,ContentDescription">
-
-
-
-
-
-
-
-
-
+
\ No newline at end of file
diff --git a/app/src/main/res/values/themes.xml b/app/src/main/res/values/themes.xml
index c287302..bcff579 100644
--- a/app/src/main/res/values/themes.xml
+++ b/app/src/main/res/values/themes.xml
@@ -1,4 +1,4 @@
-
+
\ No newline at end of file