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 原生通知图标 -![Eclipse Marketplace](https://img.shields.io/badge/build-passing-brightgreen) +![Eclipse Marketplace](https://img.shields.io/badge/build-pending-dbab09) ![Eclipse Marketplace](https://img.shields.io/badge/license-AGPL3.0-blue) ![Eclipse Marketplace](https://img.shields.io/badge/version-v2.16-green) [![Telegram](https://img.shields.io/static/v1?label=Telegram&message=交流讨论&color=0088cc)](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