From 25220b716edf0e486f292dd8c08b7e12c35d6f87 Mon Sep 17 00:00:00 2001 From: Super12138 <70494801+Super12138@users.noreply.github.com> Date: Fri, 23 Feb 2024 10:46:21 +0800 Subject: [PATCH] Refine code --- app/src/main/AndroidManifest.xml | 2 +- .../todo/{ToDoApplication.kt => ToDoApp.kt} | 2 +- .../cn/super12138/todo/constant/Constants.kt | 18 ++++++++++ .../super12138/todo/constant/GlobalValues.kt | 11 ++++++ .../cn/super12138/todo/logic/Repository.kt | 23 ++---------- .../todo/logic/database/SPDelegates.kt | 14 ++++++++ .../todo/logic/database/SPHelper.kt | 34 ------------------ .../cn/super12138/todo/utils/SPUtils.kt | 36 +++++++++++++++++++ .../kotlin/cn/super12138/todo/utils/Toast.kt | 8 +++-- .../cn/super12138/todo/views/BaseActivity.kt | 11 +++--- .../todo/views/about/AboutActivity.kt | 24 ++----------- .../todo/views/all/AllTasksActivity.kt | 9 ++--- .../todo/views/all/InfoBottomSheet.kt | 25 ++++++------- .../todo/views/main/MainActivity.kt | 10 +++--- .../todo/views/settings/SettingsActivity.kt | 16 ++++----- .../todo/views/todo/ToDoFragment.kt | 17 ++++----- .../main/res/layout/activity_all_tasks.xml | 1 - app/src/main/res/xml/preferences.xml | 4 +-- 18 files changed, 137 insertions(+), 128 deletions(-) rename app/src/main/kotlin/cn/super12138/todo/{ToDoApplication.kt => ToDoApp.kt} (95%) create mode 100644 app/src/main/kotlin/cn/super12138/todo/constant/GlobalValues.kt create mode 100644 app/src/main/kotlin/cn/super12138/todo/logic/database/SPDelegates.kt delete mode 100644 app/src/main/kotlin/cn/super12138/todo/logic/database/SPHelper.kt create mode 100644 app/src/main/kotlin/cn/super12138/todo/utils/SPUtils.kt diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 104ca1f..5cd7df0 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -3,7 +3,7 @@ xmlns:tools="http://schemas.android.com/tools"> (private val key: String, private val default: T) : ReadWriteProperty { + override fun getValue(thisRef: Any?, property: KProperty<*>): T { + return SPUtils.getValue(key, default) + } + override fun setValue(thisRef: Any?, property: KProperty<*>, value: T) { + SPUtils.putValue(key, value) + } +} \ No newline at end of file diff --git a/app/src/main/kotlin/cn/super12138/todo/logic/database/SPHelper.kt b/app/src/main/kotlin/cn/super12138/todo/logic/database/SPHelper.kt deleted file mode 100644 index 5c156c6..0000000 --- a/app/src/main/kotlin/cn/super12138/todo/logic/database/SPHelper.kt +++ /dev/null @@ -1,34 +0,0 @@ -package cn.super12138.todo.logic.database - -import android.content.Context -import androidx.preference.PreferenceManager - -object SPHelper { - fun getPreferenceString(context: Context, name: String, defaultValue: String): String? { - val sharedPreferences = - PreferenceManager.getDefaultSharedPreferences(context /* Activity context */) - return sharedPreferences.getString(name, defaultValue) - } - - fun getPreferenceBoolean(context: Context, name: String, defaultValue: Boolean): Boolean { - val sharedPreferences = - PreferenceManager.getDefaultSharedPreferences(context /* Activity context */) - return sharedPreferences.getBoolean(name, defaultValue) - } - - fun setPreference(context: Context, name: String, value: Any) { - val sharedPreferences = PreferenceManager.getDefaultSharedPreferences(context) - val editor = sharedPreferences.edit() - - when (value) { - is String -> editor.putString(name, value) - is Boolean -> editor.putBoolean(name, value) - is Int -> editor.putInt(name, value) - is Float -> editor.putFloat(name, value) - is Long -> editor.putLong(name, value) - else -> throw IllegalArgumentException("Unsupported data type") - } - - editor.apply() - } -} \ No newline at end of file diff --git a/app/src/main/kotlin/cn/super12138/todo/utils/SPUtils.kt b/app/src/main/kotlin/cn/super12138/todo/utils/SPUtils.kt new file mode 100644 index 0000000..e457b44 --- /dev/null +++ b/app/src/main/kotlin/cn/super12138/todo/utils/SPUtils.kt @@ -0,0 +1,36 @@ +package cn.super12138.todo.utils + +import android.content.Context +import android.content.SharedPreferences +import cn.super12138.todo.ToDoApp +import cn.super12138.todo.constant.Constants + +object SPUtils { + private val sp: SharedPreferences by lazy { + ToDoApp.context.getSharedPreferences(Constants.SP_NAME, Context.MODE_PRIVATE) + } + + fun getValue(name: String, default: T): T = with(sp) { + val res: Any = when (default) { + is Long -> getLong(name, default) + is String -> getString(name, default).orEmpty() + is Int -> getInt(name, default) + is Boolean -> getBoolean(name, default) + is Float -> getFloat(name, default) + else -> throw java.lang.IllegalArgumentException() + } + @Suppress("UNCHECKED_CAST") + res as T + } + + fun putValue(name: String, value: T) = with(sp.edit()) { + when (value) { + is Long -> putLong(name, value) + is String -> putString(name, value) + is Int -> putInt(name, value) + is Boolean -> putBoolean(name, value) + is Float -> putFloat(name, value) + else -> throw IllegalArgumentException("This type can't be saved into Preferences") + }.apply() + } +} \ No newline at end of file diff --git a/app/src/main/kotlin/cn/super12138/todo/utils/Toast.kt b/app/src/main/kotlin/cn/super12138/todo/utils/Toast.kt index e6a0990..9a7fd0e 100644 --- a/app/src/main/kotlin/cn/super12138/todo/utils/Toast.kt +++ b/app/src/main/kotlin/cn/super12138/todo/utils/Toast.kt @@ -1,14 +1,16 @@ +package cn.super12138.todo.utils + import android.content.Context import android.widget.Toast -import cn.super12138.todo.ToDoApplication +import cn.super12138.todo.ToDoApp fun String.showToast( - context: Context = ToDoApplication.context, + context: Context = ToDoApp.context, duration: Int = Toast.LENGTH_SHORT ) { Toast.makeText(context, this, duration).show() } -fun Int.showToast(context: Context = ToDoApplication.context, duration: Int = Toast.LENGTH_SHORT) { +fun Int.showToast(context: Context = ToDoApp.context, duration: Int = Toast.LENGTH_SHORT) { Toast.makeText(context, this, duration).show() } \ No newline at end of file diff --git a/app/src/main/kotlin/cn/super12138/todo/views/BaseActivity.kt b/app/src/main/kotlin/cn/super12138/todo/views/BaseActivity.kt index ae58b16..39988ce 100644 --- a/app/src/main/kotlin/cn/super12138/todo/views/BaseActivity.kt +++ b/app/src/main/kotlin/cn/super12138/todo/views/BaseActivity.kt @@ -6,22 +6,21 @@ import android.view.WindowManager import androidx.appcompat.app.AppCompatActivity import androidx.appcompat.app.AppCompatDelegate import cn.super12138.todo.R -import cn.super12138.todo.ToDoApplication +import cn.super12138.todo.ToDoApp +import cn.super12138.todo.constant.Constants +import cn.super12138.todo.constant.GlobalValues import cn.super12138.todo.logic.Repository open class BaseActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { - val springFestivalTheme = - Repository.getPreferenceBoolean(ToDoApplication.context, "spring_festival_theme", false) - if (springFestivalTheme) { + if (GlobalValues.springFestivalTheme) { setTheme(R.style.Theme_SpringFestival) } // enableEdgeToEdge() super.onCreate(savedInstanceState) // 深色模式 - val isDarkMode = Repository.getPreferenceString(this, "dark_mode", "0") - when (isDarkMode) { + when (GlobalValues.darkMode) { "0" -> AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM) "1" -> AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES) diff --git a/app/src/main/kotlin/cn/super12138/todo/views/about/AboutActivity.kt b/app/src/main/kotlin/cn/super12138/todo/views/about/AboutActivity.kt index 36e8843..77eaeac 100644 --- a/app/src/main/kotlin/cn/super12138/todo/views/about/AboutActivity.kt +++ b/app/src/main/kotlin/cn/super12138/todo/views/about/AboutActivity.kt @@ -4,12 +4,11 @@ import android.content.Intent import android.net.Uri import android.os.Build import android.os.Bundle -import cn.super12138.todo.ToDoApplication import cn.super12138.todo.constant.Constants +import cn.super12138.todo.constant.GlobalValues import cn.super12138.todo.databinding.ActivityAboutBinding -import cn.super12138.todo.logic.Repository +import cn.super12138.todo.utils.showToast import cn.super12138.todo.views.BaseActivity -import showToast class AboutActivity : BaseActivity() { private lateinit var binding: ActivityAboutBinding @@ -61,24 +60,7 @@ class AboutActivity : BaseActivity() { when (clickCount) { 5 -> { clickCount = 0 - val isSpringFestivalTheme = Repository.getPreferenceBoolean( - ToDoApplication.context, - "spring_festival_theme", - false - ) - if (isSpringFestivalTheme) { - Repository.setPreference( - ToDoApplication.context, - "spring_festival_theme", - false - ) - } else { - Repository.setPreference( - ToDoApplication.context, - "spring_festival_theme", - true - ) - } + GlobalValues.springFestivalTheme = !GlobalValues.springFestivalTheme "🧧".showToast() } } diff --git a/app/src/main/kotlin/cn/super12138/todo/views/all/AllTasksActivity.kt b/app/src/main/kotlin/cn/super12138/todo/views/all/AllTasksActivity.kt index a65dff3..a896252 100644 --- a/app/src/main/kotlin/cn/super12138/todo/views/all/AllTasksActivity.kt +++ b/app/src/main/kotlin/cn/super12138/todo/views/all/AllTasksActivity.kt @@ -6,7 +6,9 @@ import android.view.WindowManager import androidx.lifecycle.Observer import androidx.lifecycle.ViewModelProvider import androidx.recyclerview.widget.LinearLayoutManager -import cn.super12138.todo.ToDoApplication +import cn.super12138.todo.ToDoApp +import cn.super12138.todo.constant.Constants +import cn.super12138.todo.constant.GlobalValues import cn.super12138.todo.databinding.ActivityAllTasksBinding import cn.super12138.todo.logic.Repository import cn.super12138.todo.views.BaseActivity @@ -17,8 +19,7 @@ class AllTasksActivity : BaseActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - val isSecureMode = Repository.getPreferenceBoolean(this, "secure_mode", false) - when (isSecureMode) { + when (GlobalValues.secureMode) { true -> window.setFlags( WindowManager.LayoutParams.FLAG_SECURE, WindowManager.LayoutParams.FLAG_SECURE @@ -32,7 +33,7 @@ class AllTasksActivity : BaseActivity() { val viewModel = ViewModelProvider(this)[AllTasksViewModel::class.java] - val layoutManager = LinearLayoutManager(ToDoApplication.context) + val layoutManager = LinearLayoutManager(ToDoApp.context) binding.allTasksList.layoutManager = layoutManager val adapter = AllTasksAdapter(viewModel.todoListAll, supportFragmentManager) binding.allTasksList.adapter = adapter diff --git a/app/src/main/kotlin/cn/super12138/todo/views/all/InfoBottomSheet.kt b/app/src/main/kotlin/cn/super12138/todo/views/all/InfoBottomSheet.kt index dcc6f55..722d5ad 100644 --- a/app/src/main/kotlin/cn/super12138/todo/views/all/InfoBottomSheet.kt +++ b/app/src/main/kotlin/cn/super12138/todo/views/all/InfoBottomSheet.kt @@ -5,7 +5,9 @@ import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import cn.super12138.todo.R -import cn.super12138.todo.ToDoApplication +import cn.super12138.todo.ToDoApp +import cn.super12138.todo.constant.Constants +import cn.super12138.todo.constant.GlobalValues import cn.super12138.todo.databinding.BottomSheetInfoBinding import cn.super12138.todo.logic.Repository import com.google.android.material.bottomsheet.BottomSheetBehavior @@ -21,7 +23,7 @@ class InfoBottomSheet : BottomSheetDialogFragment() { private lateinit var todoUUID: String companion object { - const val TAG = "InfoBtmSheet" + const val TAG = Constants.TAG_INFO_BOTTOM_SHEET fun newInstance( todoContent: String, todoSubject: String, @@ -29,10 +31,10 @@ class InfoBottomSheet : BottomSheetDialogFragment() { todoUUID: String ) = InfoBottomSheet().apply { arguments = Bundle().apply { - putString("todoContent", todoContent) - putString("todoSubject", todoSubject) - putInt("todoState", todoState) - putString("todoUUID", todoUUID) + putString(Constants.BUNDLE_TODO_CONTENT, todoContent) + putString(Constants.BUNDLE_TODO_SUBJECT, todoSubject) + putInt(Constants.BUNDLE_TODO_STATE, todoState) + putString(Constants.BUNDLE_TODO_UUID, todoUUID) } } } @@ -40,10 +42,10 @@ class InfoBottomSheet : BottomSheetDialogFragment() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) arguments?.let { - todoContent = it.getString("todoContent", "") - todoSubject = it.getString("todoSubject", "") - todoState = it.getInt("todoState", 0) - todoUUID = it.getString("todoUUID", "") + todoContent = it.getString(Constants.BUNDLE_TODO_CONTENT, "") + todoSubject = it.getString(Constants.BUNDLE_TODO_SUBJECT, "") + todoState = it.getInt(Constants.BUNDLE_TODO_STATE, 0) + todoUUID = it.getString(Constants.BUNDLE_TODO_UUID, "") } } @@ -57,7 +59,6 @@ class InfoBottomSheet : BottomSheetDialogFragment() { return binding.root } - @androidx.annotation.OptIn(com.google.android.material.badge.ExperimentalBadgeUtils::class) override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) @@ -72,7 +73,7 @@ class InfoBottomSheet : BottomSheetDialogFragment() { } else { binding.todoState.text = getString(R.string.info_state_incomplete) } - if (Repository.getPreferenceBoolean(ToDoApplication.context, "dev_mode", false)) { + if (GlobalValues.devMode) { binding.todoUuid.apply { visibility = View.VISIBLE text = String.format(getString(R.string.info_uuid), todoUUID) diff --git a/app/src/main/kotlin/cn/super12138/todo/views/main/MainActivity.kt b/app/src/main/kotlin/cn/super12138/todo/views/main/MainActivity.kt index 9af2fcb..0e0707a 100644 --- a/app/src/main/kotlin/cn/super12138/todo/views/main/MainActivity.kt +++ b/app/src/main/kotlin/cn/super12138/todo/views/main/MainActivity.kt @@ -3,9 +3,10 @@ package cn.super12138.todo.views.main import android.content.Intent import android.os.Bundle import android.view.WindowManager -import androidx.appcompat.app.AppCompatDelegate import cn.super12138.todo.R -import cn.super12138.todo.ToDoApplication +import cn.super12138.todo.ToDoApp +import cn.super12138.todo.constant.Constants +import cn.super12138.todo.constant.GlobalValues import cn.super12138.todo.databinding.ActivityMainBinding import cn.super12138.todo.logic.Repository import cn.super12138.todo.views.BaseActivity @@ -23,7 +24,7 @@ class MainActivity : BaseActivity() { binding.toolbar.setOnMenuItemClickListener { menuItem -> when (menuItem.itemId) { R.id.item_settings -> { - val intent = Intent(ToDoApplication.context, SettingsActivity::class.java) + val intent = Intent(ToDoApp.context, SettingsActivity::class.java) startActivity(intent) true } @@ -47,8 +48,7 @@ class MainActivity : BaseActivity() { } .show() }*/ - val isSecureMode = Repository.getPreferenceBoolean(this, "secure_mode", false) - when (isSecureMode) { + when (GlobalValues.secureMode) { true -> window.setFlags( WindowManager.LayoutParams.FLAG_SECURE, WindowManager.LayoutParams.FLAG_SECURE diff --git a/app/src/main/kotlin/cn/super12138/todo/views/settings/SettingsActivity.kt b/app/src/main/kotlin/cn/super12138/todo/views/settings/SettingsActivity.kt index 3b4b5e2..626151d 100644 --- a/app/src/main/kotlin/cn/super12138/todo/views/settings/SettingsActivity.kt +++ b/app/src/main/kotlin/cn/super12138/todo/views/settings/SettingsActivity.kt @@ -3,7 +3,6 @@ package cn.super12138.todo.views.settings import android.content.Context import android.content.Intent import android.os.Bundle -import android.os.Process import androidx.appcompat.app.AlertDialog import androidx.appcompat.app.AppCompatDelegate import androidx.lifecycle.lifecycleScope @@ -12,7 +11,8 @@ import androidx.preference.Preference import androidx.preference.PreferenceFragmentCompat import androidx.preference.SwitchPreferenceCompat import cn.super12138.todo.R -import cn.super12138.todo.ToDoApplication +import cn.super12138.todo.constant.Constants +import cn.super12138.todo.constant.GlobalValues import cn.super12138.todo.databinding.ActivitySettingsBinding import cn.super12138.todo.databinding.DialogBackupBinding import cn.super12138.todo.databinding.DialogRestoreBinding @@ -56,10 +56,8 @@ class SettingsActivity : BaseActivity() { override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) { setPreferencesFromResource(R.xml.preferences, rootKey) val gson = Gson() - val isDevMode = - Repository.getPreferenceBoolean(ToDoApplication.context, "dev_mode", false) - findPreference("dark_mode")?.apply { + findPreference(Constants.PREF_DARK_MODE)?.apply { setOnPreferenceChangeListener { _, newValue -> when (newValue) { "0" -> AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM) @@ -73,7 +71,7 @@ class SettingsActivity : BaseActivity() { } } - findPreference("secure_mode")?.apply { + findPreference(Constants.PREF_SECURE_MODE)?.apply { setOnPreferenceChangeListener { _, _ -> view?.let { Snackbar.make(it, R.string.need_restart_app, Snackbar.LENGTH_LONG) @@ -87,7 +85,7 @@ class SettingsActivity : BaseActivity() { } } - findPreference("backupDB")?.apply { + findPreference(Constants.PREF_BACKUP_DB)?.apply { setOnPreferenceClickListener { lifecycleScope.launch { val data = Repository.getAll() @@ -107,7 +105,7 @@ class SettingsActivity : BaseActivity() { } } - findPreference("restoreDB")?.apply { + findPreference(Constants.PREF_RESTORE_DB)?.apply { setOnPreferenceClickListener { restoreBinding = DialogRestoreBinding.inflate(layoutInflater) activity?.let { it1 -> @@ -149,7 +147,7 @@ class SettingsActivity : BaseActivity() { restoreBinding.jsonInput.error = getString(R.string.json_data_incorrect) } catch (e: Exception) { - if (isDevMode) { + if (GlobalValues.devMode) { restoreBinding.jsonInput.error = e.toString() } else { restoreBinding.jsonInput.error = diff --git a/app/src/main/kotlin/cn/super12138/todo/views/todo/ToDoFragment.kt b/app/src/main/kotlin/cn/super12138/todo/views/todo/ToDoFragment.kt index 3e3dbff..94948fb 100644 --- a/app/src/main/kotlin/cn/super12138/todo/views/todo/ToDoFragment.kt +++ b/app/src/main/kotlin/cn/super12138/todo/views/todo/ToDoFragment.kt @@ -12,7 +12,8 @@ import androidx.lifecycle.lifecycleScope import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.RecyclerView import cn.super12138.todo.R -import cn.super12138.todo.ToDoApplication +import cn.super12138.todo.ToDoApp +import cn.super12138.todo.constant.Constants import cn.super12138.todo.databinding.DialogAddTodoBinding import cn.super12138.todo.databinding.FragmentTodoBinding import cn.super12138.todo.logic.Repository @@ -22,7 +23,7 @@ import cn.super12138.todo.views.progress.ProgressFragmentViewModel import com.google.android.material.dialog.MaterialAlertDialogBuilder import kotlinx.coroutines.launch import me.zhanghai.android.fastscroll.FastScrollerBuilder -import showToast +import cn.super12138.todo.utils.showToast import java.util.UUID class ToDoFragment : Fragment() { @@ -59,7 +60,7 @@ class ToDoFragment : Fragment() { val todoList = todoViewModel.todoList - val layoutManager = LinearLayoutManager(ToDoApplication.context) + val layoutManager = LinearLayoutManager(ToDoApp.context) binding.todoList.layoutManager = layoutManager val adapter = ToDoAdapter(todoList, requireActivity()) binding.todoList.adapter = adapter @@ -89,16 +90,16 @@ class ToDoFragment : Fragment() { toDoDialogBinding.todoContent.error = getString(R.string.content_cannot_be_empty) } else { - if (todoContent == "/DEV_MODE") { + if (todoContent == Constants.STRING_DEV_MODE) { if (Repository.getPreferenceBoolean( - ToDoApplication.context, - "dev_mode", + ToDoApp.context, + Constants.PREF_DEV_MODE, true ) ) { - Repository.setPreference(ToDoApplication.context, "dev_mode", false) + Repository.setPreference(ToDoApp.context, Constants.PREF_DEV_MODE, false) } else { - Repository.setPreference(ToDoApplication.context, "dev_mode", true) + Repository.setPreference(ToDoApp.context, Constants.PREF_DEV_MODE, true) "Dev Mode".showToast() } dialog.dismiss() diff --git a/app/src/main/res/layout/activity_all_tasks.xml b/app/src/main/res/layout/activity_all_tasks.xml index 87912ba..301b0cf 100644 --- a/app/src/main/res/layout/activity_all_tasks.xml +++ b/app/src/main/res/layout/activity_all_tasks.xml @@ -35,7 +35,6 @@ android:layout_height="match_parent" android:visibility="gone" /> -