From b47543e71aff86eaa56a03f7515c892f9d5db3cc Mon Sep 17 00:00:00 2001 From: fankesyooni Date: Fri, 3 Feb 2023 02:22:05 +0800 Subject: [PATCH] Modify merge to CompoundButtonDataBinder and optimize code in MainActivity --- .../apperrorstracking/data/ConfigData.kt | 20 +--- .../data/factory/CompoundButtonFactory.kt | 101 ++++++++++++++++++ .../ui/activity/main/MainActivity.kt | 33 +++--- 3 files changed, 120 insertions(+), 34 deletions(-) create mode 100644 app/src/main/java/com/fankes/apperrorstracking/data/factory/CompoundButtonFactory.kt diff --git a/app/src/main/java/com/fankes/apperrorstracking/data/ConfigData.kt b/app/src/main/java/com/fankes/apperrorstracking/data/ConfigData.kt index 6c57633..a76c6c5 100644 --- a/app/src/main/java/com/fankes/apperrorstracking/data/ConfigData.kt +++ b/app/src/main/java/com/fankes/apperrorstracking/data/ConfigData.kt @@ -25,7 +25,6 @@ package com.fankes.apperrorstracking.data import android.content.Context import android.os.Build -import android.widget.CompoundButton import com.highcapable.yukihookapi.hook.factory.modulePrefs import com.highcapable.yukihookapi.hook.log.loggerW import com.highcapable.yukihookapi.hook.param.PackageParam @@ -126,7 +125,7 @@ object ConfigData { * @param data 键值数据模板 * @return [Boolean] */ - private fun getBoolean(data: PrefsData) = when (instance) { + internal fun getBoolean(data: PrefsData) = when (instance) { is Context -> (instance as Context).modulePrefs.get(data) is PackageParam -> (instance as PackageParam).prefs.get(data) else -> error("Unknown type for get prefs data") @@ -137,7 +136,7 @@ object ConfigData { * @param data 键值数据模板 * @param value 键值内容 */ - private fun putBoolean(data: PrefsData, value: Boolean) { + internal fun putBoolean(data: PrefsData, value: Boolean) { when (instance) { is Context -> (instance as Context).modulePrefs.put(data, value) is PackageParam -> loggerW(msg = "Not support for this method") @@ -145,21 +144,6 @@ object ConfigData { } } - /** - * 绑定到 [CompoundButton] 自动设置选中状态 - * @param data 键值数据模板 - * @param onChange 当改变时回调 - */ - fun CompoundButton.bind(data: PrefsData, onChange: (Boolean) -> Unit = {}) { - isChecked = getBoolean(data).also(onChange) - setOnCheckedChangeListener { button, isChecked -> - if (button.isPressed) { - putBoolean(data, isChecked) - onChange(isChecked) - } - } - } - /** * 是否显示开发者提示 * @return [Boolean] diff --git a/app/src/main/java/com/fankes/apperrorstracking/data/factory/CompoundButtonFactory.kt b/app/src/main/java/com/fankes/apperrorstracking/data/factory/CompoundButtonFactory.kt new file mode 100644 index 0000000..f043111 --- /dev/null +++ b/app/src/main/java/com/fankes/apperrorstracking/data/factory/CompoundButtonFactory.kt @@ -0,0 +1,101 @@ +/* + * AppErrorsTracking - Added more features to app's crash dialog, fixed custom rom deleted dialog, the best experience to Android developer. + * Copyright (C) 2017-2023 Fankes Studio(qzmmcn@163.com) + * https://github.com/KitsunePie/AppErrorsTracking + * + * This software is non-free but opensource software: you can redistribute it + * and/or modify it under the terms of the GNU Affero General Public License + * as published by the Free Software Foundation; either + * version 3 of the License, or any later version. + * + * This software is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * and eula along with this software. If not, see + * + * + * This file is Created by fankes on 2023/2/3. + */ +@file:Suppress("unused", "MemberVisibilityCanBePrivate") + +package com.fankes.apperrorstracking.data.factory + +import android.widget.CompoundButton +import com.fankes.apperrorstracking.data.ConfigData +import com.highcapable.yukihookapi.hook.xposed.prefs.data.PrefsData + +/** + * 绑定到 [CompoundButton] 自动设置选中状态 + * @param data 键值数据模板 + * @param initiate 方法体 + */ +fun CompoundButton.bind(data: PrefsData, initiate: CompoundButtonDataBinder.(CompoundButton) -> Unit = {}) { + val binder = CompoundButtonDataBinder(button = this).also { initiate(it, this) } + isChecked = ConfigData.getBoolean(data).also { binder.initializeCallback?.invoke(it) } + binder.applyChangesCallback = { ConfigData.putBoolean(data, it) } + setOnCheckedChangeListener { button, isChecked -> + if (button.isPressed) { + binder.changedCallback?.invoke(isChecked) + if (binder.isAutoApplyChanges) binder.applyChangesCallback?.invoke(isChecked) + } + } +} + +/** + * [CompoundButton] 数据绑定管理器实例 + * @param button 当前实例 + */ +class CompoundButtonDataBinder(private val button: CompoundButton) { + + /** 状态初始化回调事件 */ + internal var initializeCallback: ((Boolean) -> Unit)? = null + + /** 状态改变回调事件 */ + internal var changedCallback: ((Boolean) -> Unit)? = null + + /** 应用更改回调事件 */ + internal var applyChangesCallback: ((Boolean) -> Unit)? = null + + /** 是否启用自动应用更改 */ + var isAutoApplyChanges = true + + /** + * 监听状态初始化 + * @param result 回调结果 + */ + fun onInitialize(result: (Boolean) -> Unit) { + initializeCallback = result + } + + /** + * 监听状态改变 + * @param result 回调结果 + */ + fun onChanged(result: (Boolean) -> Unit) { + changedCallback = result + } + + /** 重新初始化 */ + fun reinitialize() { + initializeCallback?.invoke(button.isChecked) + } + + /** 应用更改并重新初始化 */ + fun applyChangesAndReinitialize() { + applyChanges() + reinitialize() + } + + /** 应用更改 */ + fun applyChanges() { + applyChangesCallback?.invoke(button.isChecked) + } + + /** 取消更改 */ + fun cancelChanges() { + button.isChecked = button.isChecked.not() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/fankes/apperrorstracking/ui/activity/main/MainActivity.kt b/app/src/main/java/com/fankes/apperrorstracking/ui/activity/main/MainActivity.kt index 0720479..ea1d068 100644 --- a/app/src/main/java/com/fankes/apperrorstracking/ui/activity/main/MainActivity.kt +++ b/app/src/main/java/com/fankes/apperrorstracking/ui/activity/main/MainActivity.kt @@ -28,7 +28,7 @@ import androidx.core.view.isVisible import com.fankes.apperrorstracking.BuildConfig import com.fankes.apperrorstracking.R import com.fankes.apperrorstracking.data.ConfigData -import com.fankes.apperrorstracking.data.ConfigData.bind +import com.fankes.apperrorstracking.data.factory.bind import com.fankes.apperrorstracking.databinding.ActivityMainBinding import com.fankes.apperrorstracking.locale.LocaleString import com.fankes.apperrorstracking.ui.activity.base.BaseActivity @@ -62,21 +62,24 @@ class MainActivity : BaseActivity() { setOnClickListener { function() } } } + /** 显示开发者提示 */ + if (ConfigData.isShowDeveloperNotice) + showDialog { + title = LocaleString.developerNotice + msg = LocaleString.developerNoticeTip + confirmButton(LocaleString.gotIt) { ConfigData.isShowDeveloperNotice = false } + noCancelable() + } binding.mainTextVersion.text = LocaleString.moduleVersion(BuildConfig.VERSION_NAME) binding.mainTextSystemVersion.text = LocaleString.systemVersion(systemVersion) binding.onlyShowErrorsInFrontSwitch.bind(ConfigData.ENABLE_ONLY_SHOW_ERRORS_IN_FRONT) binding.onlyShowErrorsInMainProcessSwitch.bind(ConfigData.ENABLE_ONLY_SHOW_ERRORS_IN_MAIN) binding.alwaysShowsReopenAppOptionsSwitch.bind(ConfigData.ENABLE_ALWAYS_SHOWS_REOPEN_APP_OPTIONS) binding.enableAppsConfigsTemplateSwitch.bind(ConfigData.ENABLE_APP_CONFIG_TEMPLATE) { - binding.mgrAppsConfigsTemplateButton.isVisible = it + onInitialize { binding.mgrAppsConfigsTemplateButton.isVisible = it } + onChanged { reinitialize() } } binding.enableMaterial3AppErrorsDialogSwitch.bind(ConfigData.ENABLE_MATERIAL3_STYLE_APP_ERRORS_DIALOG) - /** 设置桌面图标显示隐藏 */ - binding.hideIconInLauncherSwitch.isChecked = isLauncherIconShowing.not() - binding.hideIconInLauncherSwitch.setOnCheckedChangeListener { btn, b -> - if (btn.isPressed.not()) return@setOnCheckedChangeListener - hideOrShowLauncherIcon(b) - } /** 设置匿名统计 */ binding.enableAnonymousStatisticsSwitch.bindAppAnalytics() /** 系统版本点击事件 */ @@ -98,14 +101,12 @@ class MainActivity : BaseActivity() { binding.titleRestartIcon.setOnClickListener { FrameworkTool.restartSystem(context = this) } /** 项目地址按钮点击事件 */ binding.titleGithubIcon.setOnClickListener { openBrowser(url = "https://github.com/KitsunePie/AppErrorsTracking") } - /** 显示开发者提示 */ - if (ConfigData.isShowDeveloperNotice) - showDialog { - title = LocaleString.developerNotice - msg = LocaleString.developerNoticeTip - confirmButton(LocaleString.gotIt) { ConfigData.isShowDeveloperNotice = false } - noCancelable() - } + /** 设置桌面图标显示隐藏 */ + binding.hideIconInLauncherSwitch.isChecked = isLauncherIconShowing.not() + binding.hideIconInLauncherSwitch.setOnCheckedChangeListener { btn, b -> + if (btn.isPressed.not()) return@setOnCheckedChangeListener + hideOrShowLauncherIcon(b) + } } /** 刷新模块状态 */