From 5a15826a628167b713e4be20c4a87fecc4afbb9e Mon Sep 17 00:00:00 2001 From: Super12138 <70494801+Super12138@users.noreply.github.com> Date: Sun, 9 Jun 2024 13:16:21 +0800 Subject: [PATCH] New preference: haptic feedback --- .../cn/super12138/todo/constant/Constants.kt | 3 + .../super12138/todo/constant/GlobalValues.kt | 1 + .../cn/super12138/todo/utils/TextUtils.kt | 1 + .../todo/views/about/AboutActivity.kt | 18 ++ .../todo/views/all/AllTasksActivity.kt | 5 + .../todo/views/all/AllTasksAdapter.kt | 6 + .../todo/views/bottomsheet/ToDoBottomSheet.kt | 13 ++ .../todo/views/crash/CrashActivity.kt | 5 + .../todo/views/main/MainActivity.kt | 4 + .../todo/views/settings/SettingsActivity.kt | 162 +------------ .../todo/views/settings/SettingsFragment.kt | 221 ++++++++++++++++++ .../super12138/todo/views/todo/ToDoAdapter.kt | 4 +- .../todo/views/todo/ToDoFragment.kt | 5 +- .../{ic_all_todos.xml => ic_all_tasks.xml} | 0 app/src/main/res/drawable/ic_vibration.xml | 12 + app/src/main/res/values-zh-rCN/strings.xml | 2 + app/src/main/res/values/strings.xml | 2 + app/src/main/res/xml/preferences.xml | 22 +- 18 files changed, 316 insertions(+), 170 deletions(-) create mode 100644 app/src/main/kotlin/cn/super12138/todo/views/settings/SettingsFragment.kt rename app/src/main/res/drawable/{ic_all_todos.xml => ic_all_tasks.xml} (100%) create mode 100644 app/src/main/res/drawable/ic_vibration.xml diff --git a/app/src/main/kotlin/cn/super12138/todo/constant/Constants.kt b/app/src/main/kotlin/cn/super12138/todo/constant/Constants.kt index f38a1d9..0eb42be 100644 --- a/app/src/main/kotlin/cn/super12138/todo/constant/Constants.kt +++ b/app/src/main/kotlin/cn/super12138/todo/constant/Constants.kt @@ -9,6 +9,9 @@ object Constants { const val PREF_DARK_MODE = "dark_mode" const val PREF_SECURE_MODE = "secure_mode" + const val PREF_HAPTIC_FEEDBACK = "haptic_feedback" + const val PREF_ALL_TASKS = "all_tasks" + const val PREF_ABOUT = "about" const val PREF_DEV_MODE = "dev_mode" const val PREF_SPRING_FESTIVAL_THEME = "spring_festival_theme" const val PREF_BACKUP_DB = "backup_db" diff --git a/app/src/main/kotlin/cn/super12138/todo/constant/GlobalValues.kt b/app/src/main/kotlin/cn/super12138/todo/constant/GlobalValues.kt index 75497e8..da97a81 100644 --- a/app/src/main/kotlin/cn/super12138/todo/constant/GlobalValues.kt +++ b/app/src/main/kotlin/cn/super12138/todo/constant/GlobalValues.kt @@ -7,4 +7,5 @@ object GlobalValues { var devMode: Boolean by SPDelegates(Constants.PREF_DEV_MODE, false) var springFestivalTheme: Boolean by SPDelegates(Constants.PREF_SPRING_FESTIVAL_THEME, false) var secureMode: Boolean by SPDelegates(Constants.PREF_SECURE_MODE, false) + var hapticFeedback: Boolean by SPDelegates(Constants.PREF_HAPTIC_FEEDBACK, true) } \ No newline at end of file diff --git a/app/src/main/kotlin/cn/super12138/todo/utils/TextUtils.kt b/app/src/main/kotlin/cn/super12138/todo/utils/TextUtils.kt index 993819e..bd3f201 100644 --- a/app/src/main/kotlin/cn/super12138/todo/utils/TextUtils.kt +++ b/app/src/main/kotlin/cn/super12138/todo/utils/TextUtils.kt @@ -5,6 +5,7 @@ import cn.super12138.todo.R import cn.super12138.todo.ToDoApp object TextUtils { + // 更换为id匹配(数据库) private val subjectMap = mapOf( globalGetString(R.string.subject_chinese) to R.id.subject_chinese, globalGetString(R.string.subject_math) to R.id.subject_math, 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 8a71f89..e3e4bce 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 @@ -3,7 +3,9 @@ package cn.super12138.todo.views.about import android.content.Intent import android.net.Uri import android.os.Bundle +import android.view.HapticFeedbackConstants import cn.super12138.todo.constant.Constants +import cn.super12138.todo.constant.GlobalValues import cn.super12138.todo.databinding.ActivityAboutBinding import cn.super12138.todo.utils.VersionUtils import cn.super12138.todo.utils.showToast @@ -18,10 +20,18 @@ class AboutActivity : BaseActivity() { binding.appVersion.text = VersionUtils.getAppVersion(this) binding.toolBar.setNavigationOnClickListener { + if (GlobalValues.hapticFeedback) { + it.performHapticFeedback(HapticFeedbackConstants.CONTEXT_CLICK) + } + finish() } binding.checkUpdate.setOnClickListener { + if (GlobalValues.hapticFeedback) { + it.performHapticFeedback(HapticFeedbackConstants.CONTEXT_CLICK) + } + val intent = Intent(Intent.ACTION_VIEW).apply { data = Uri.parse(Constants.UPDATE_URL) } @@ -29,6 +39,10 @@ class AboutActivity : BaseActivity() { } binding.openSource.setOnClickListener { + if (GlobalValues.hapticFeedback) { + it.performHapticFeedback(HapticFeedbackConstants.CONTEXT_CLICK) + } + val intent = Intent(Intent.ACTION_VIEW).apply { data = Uri.parse(Constants.REPO_GITHUB_URL) } @@ -37,6 +51,10 @@ class AboutActivity : BaseActivity() { binding.developerInfo.setOnClickListener { + if (GlobalValues.hapticFeedback) { + it.performHapticFeedback(HapticFeedbackConstants.CONTEXT_CLICK) + } + val intent = Intent(Intent.ACTION_VIEW).apply { data = Uri.parse(Constants.AUTHOR_GITHUB_URL) } 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 bc8a80f..242fe4a 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 @@ -1,6 +1,7 @@ package cn.super12138.todo.views.all import android.os.Bundle +import android.view.HapticFeedbackConstants import android.view.View import android.view.WindowManager import androidx.activity.viewModels @@ -37,6 +38,10 @@ class AllTasksActivity : BaseActivity() { } binding.toolBar.setNavigationOnClickListener { + if (GlobalValues.hapticFeedback) { + it.performHapticFeedback(HapticFeedbackConstants.CONTEXT_CLICK) + } + finish() } diff --git a/app/src/main/kotlin/cn/super12138/todo/views/all/AllTasksAdapter.kt b/app/src/main/kotlin/cn/super12138/todo/views/all/AllTasksAdapter.kt index a62bf84..a7bd3e1 100644 --- a/app/src/main/kotlin/cn/super12138/todo/views/all/AllTasksAdapter.kt +++ b/app/src/main/kotlin/cn/super12138/todo/views/all/AllTasksAdapter.kt @@ -1,5 +1,6 @@ package cn.super12138.todo.views.all +import android.view.HapticFeedbackConstants import android.view.LayoutInflater import android.view.View import android.view.ViewGroup @@ -7,6 +8,7 @@ import android.widget.TextView import androidx.fragment.app.FragmentManager import androidx.recyclerview.widget.RecyclerView import cn.super12138.todo.R +import cn.super12138.todo.constant.GlobalValues import cn.super12138.todo.logic.model.ToDo class AllTasksAdapter( @@ -33,6 +35,10 @@ class AllTasksAdapter( holder.todoSubject.text = todo.subject holder.itemView.setOnClickListener { + if (GlobalValues.hapticFeedback) { + it.performHapticFeedback(HapticFeedbackConstants.CONTEXT_CLICK) + } + val infoBottomSheet = InfoBottomSheet.newInstance( todo.content, todo.subject, diff --git a/app/src/main/kotlin/cn/super12138/todo/views/bottomsheet/ToDoBottomSheet.kt b/app/src/main/kotlin/cn/super12138/todo/views/bottomsheet/ToDoBottomSheet.kt index 2b47d71..c1a58be 100644 --- a/app/src/main/kotlin/cn/super12138/todo/views/bottomsheet/ToDoBottomSheet.kt +++ b/app/src/main/kotlin/cn/super12138/todo/views/bottomsheet/ToDoBottomSheet.kt @@ -1,6 +1,7 @@ package cn.super12138.todo.views.bottomsheet import android.os.Bundle +import android.view.HapticFeedbackConstants import android.view.LayoutInflater import android.view.View import android.view.ViewGroup @@ -103,6 +104,10 @@ class ToDoBottomSheet : BottomSheetDialogFragment() { } binding.btnSave.setOnClickListener { + if (GlobalValues.hapticFeedback) { + it.performHapticFeedback(HapticFeedbackConstants.CONTEXT_CLICK) + } + val todoContent = binding.todoContent.editText?.text.toString() // 内容判空 if (todoContent.isEmpty()) { @@ -163,10 +168,18 @@ class ToDoBottomSheet : BottomSheetDialogFragment() { } binding.btnCancel.setOnClickListener { + if (GlobalValues.hapticFeedback) { + it.performHapticFeedback(HapticFeedbackConstants.CONTEXT_CLICK) + } + dismiss() } binding.btnDelete.setOnClickListener { + if (GlobalValues.hapticFeedback) { + it.performHapticFeedback(HapticFeedbackConstants.CONTEXT_CLICK) + } + todoViewModel.deleteTask(todoPosition, todoUUID) progressViewModel.updateProgress() todoViewModel.removeData.value = 1 diff --git a/app/src/main/kotlin/cn/super12138/todo/views/crash/CrashActivity.kt b/app/src/main/kotlin/cn/super12138/todo/views/crash/CrashActivity.kt index b1ba288..c86de0b 100644 --- a/app/src/main/kotlin/cn/super12138/todo/views/crash/CrashActivity.kt +++ b/app/src/main/kotlin/cn/super12138/todo/views/crash/CrashActivity.kt @@ -2,11 +2,13 @@ package cn.super12138.todo.views.crash import android.os.Build import android.os.Bundle +import android.view.HapticFeedbackConstants import android.view.ViewGroup import androidx.activity.enableEdgeToEdge import androidx.core.view.ViewCompat import androidx.core.view.WindowInsetsCompat import androidx.core.view.updateLayoutParams +import cn.super12138.todo.constant.GlobalValues import cn.super12138.todo.databinding.ActivityCrashBinding import cn.super12138.todo.utils.VersionUtils import cn.super12138.todo.views.BaseActivity @@ -54,6 +56,9 @@ class CrashActivity : BaseActivity() { } binding.exitApp.setOnClickListener { + if (GlobalValues.hapticFeedback) { + it.performHapticFeedback(HapticFeedbackConstants.CONTEXT_CLICK) + } this.finishAffinity() } } 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 bc844c2..58ff13a 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 @@ -2,6 +2,7 @@ package cn.super12138.todo.views.main // 2023.11.18立项 import android.content.Intent import android.os.Bundle +import android.view.HapticFeedbackConstants import android.view.WindowManager import cn.super12138.todo.R import cn.super12138.todo.ToDoApp @@ -18,6 +19,9 @@ class MainActivity : BaseActivity() { R.id.item_settings -> { val intent = Intent(ToDoApp.context, SettingsActivity::class.java) startActivity(intent) + if (GlobalValues.hapticFeedback) { + binding.toolBar.performHapticFeedback(HapticFeedbackConstants.CONTEXT_CLICK) + } true } 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 1e84bd5..481f98d 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 @@ -1,35 +1,11 @@ package cn.super12138.todo.views.settings -import android.content.Context -import android.content.Intent -import android.graphics.Color -import android.graphics.drawable.ColorDrawable -import android.graphics.drawable.Drawable import android.os.Bundle -import androidx.appcompat.app.AlertDialog -import androidx.appcompat.app.AppCompatDelegate -import androidx.lifecycle.lifecycleScope -import androidx.preference.ListPreference -import androidx.preference.Preference -import androidx.preference.PreferenceFragmentCompat -import androidx.preference.SwitchPreferenceCompat +import android.view.HapticFeedbackConstants import cn.super12138.todo.R -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 -import cn.super12138.todo.logic.Repository -import cn.super12138.todo.logic.dao.ToDoRoom import cn.super12138.todo.views.BaseActivity -import cn.super12138.todo.views.main.MainActivity -import com.google.android.material.dialog.MaterialAlertDialogBuilder -import com.google.android.material.snackbar.Snackbar -import com.google.gson.Gson -import com.google.gson.JsonSyntaxException -import com.google.gson.reflect.TypeToken -import kotlinx.coroutines.launch -import kotlin.system.exitProcess class SettingsActivity : BaseActivity() { override fun onCreate(savedInstanceState: Bundle?) { @@ -44,6 +20,10 @@ class SettingsActivity : BaseActivity() { supportActionBar?.setDisplayHomeAsUpEnabled(true) binding.toolBar.setNavigationOnClickListener { + if (GlobalValues.hapticFeedback) { + it.performHapticFeedback(HapticFeedbackConstants.CONTEXT_CLICK) + } + finish() } } @@ -51,136 +31,4 @@ class SettingsActivity : BaseActivity() { override fun getViewBinding(): ActivitySettingsBinding { return ActivitySettingsBinding.inflate(layoutInflater) } - - class SettingsFragment : PreferenceFragmentCompat() { - private lateinit var backupBinding: DialogBackupBinding - private lateinit var restoreBinding: DialogRestoreBinding - - override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) { - setPreferencesFromResource(R.xml.preferences, rootKey) - val gson = Gson() - - findPreference(Constants.PREF_DARK_MODE)?.apply { - setOnPreferenceChangeListener { _, newValue -> - when (newValue) { - "0" -> AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM) - - "1" -> AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES) - - "2" -> AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO) - } - activity?.recreate() - true - } - } - - findPreference(Constants.PREF_SECURE_MODE)?.apply { - setOnPreferenceChangeListener { _, _ -> - view?.let { - Snackbar.make(it, R.string.need_restart_app, Snackbar.LENGTH_LONG) - .setAction(R.string.restart_app_now) { - restartApp(context) - } - .show() - } - - true - } - } - - findPreference(Constants.PREF_BACKUP_DB)?.apply { - setOnPreferenceClickListener { - lifecycleScope.launch { - val data = Repository.getAll() - val jsonData = gson.toJson(data) - backupBinding = DialogBackupBinding.inflate(layoutInflater) - backupBinding.jsonOutput.text = jsonData - - activity?.let { - MaterialAlertDialogBuilder(it) - .setTitle(R.string.export_data) - .setView(backupBinding.root) - .setPositiveButton(R.string.ok, null) - .show() - } - } - true - } - } - - findPreference(Constants.PREF_RESTORE_DB)?.apply { - setOnPreferenceClickListener { - restoreBinding = DialogRestoreBinding.inflate(layoutInflater) - activity?.let { it1 -> - val dialog = MaterialAlertDialogBuilder(it1) - .setTitle(R.string.restore_data) - .setView(restoreBinding.root) - .setPositiveButton(R.string.ok, null) - .setNegativeButton(R.string.cancel, null) - .show() - - dialog.getButton(AlertDialog.BUTTON_POSITIVE).setOnClickListener { - val jsonInput = restoreBinding.jsonInput.editText?.text.toString() - if (jsonInput.isEmpty()) { - restoreBinding.jsonInput.error = - getString(R.string.please_paste_data) - return@setOnClickListener - } - - lifecycleScope.launch { - if (restoreBinding.overwriteData.isChecked) { - Repository.deleteAll() - } - try { - val listType = object : TypeToken>() {}.type - val taskList: List = - gson.fromJson(jsonInput, listType) - taskList.forEach { Repository.insert(it) } - dialog.dismiss() - MaterialAlertDialogBuilder(it1) - .setTitle(R.string.restore_successful) - .setMessage(R.string.restore_need_restart_app) - .setPositiveButton(R.string.ok) { _, _ -> - restartApp(context) - } - .setNegativeButton(R.string.cancel, null) - .setCancelable(false) - .show() - } catch (e: JsonSyntaxException) { - restoreBinding.jsonInput.error = - getString(R.string.json_data_incorrect) - } catch (e: Exception) { - if (GlobalValues.devMode) { - restoreBinding.jsonInput.error = e.toString() - } else { - restoreBinding.jsonInput.error = - getString(R.string.restore_failed) - } - } - } - } - } - true - } - } - } - - - override fun setDivider(divider: Drawable?) { - super.setDivider(ColorDrawable(Color.TRANSPARENT)) - } - - override fun setDividerHeight(height: Int) { - super.setDividerHeight(0) - } - - - private fun restartApp(restartContext: Context) { - val intent = Intent(restartContext, MainActivity::class.java).apply { - flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK - } - restartContext.startActivity(intent) - exitProcess(0) - } - } } \ No newline at end of file diff --git a/app/src/main/kotlin/cn/super12138/todo/views/settings/SettingsFragment.kt b/app/src/main/kotlin/cn/super12138/todo/views/settings/SettingsFragment.kt new file mode 100644 index 0000000..92fab7f --- /dev/null +++ b/app/src/main/kotlin/cn/super12138/todo/views/settings/SettingsFragment.kt @@ -0,0 +1,221 @@ +package cn.super12138.todo.views.settings + +import android.content.Context +import android.content.Intent +import android.graphics.Color +import android.graphics.drawable.ColorDrawable +import android.graphics.drawable.Drawable +import android.os.Bundle +import android.view.HapticFeedbackConstants +import androidx.appcompat.app.AlertDialog +import androidx.appcompat.app.AppCompatDelegate +import androidx.lifecycle.lifecycleScope +import androidx.preference.ListPreference +import androidx.preference.Preference +import androidx.preference.PreferenceFragmentCompat +import androidx.preference.SwitchPreferenceCompat +import cn.super12138.todo.R +import cn.super12138.todo.constant.Constants +import cn.super12138.todo.constant.GlobalValues +import cn.super12138.todo.databinding.DialogBackupBinding +import cn.super12138.todo.databinding.DialogRestoreBinding +import cn.super12138.todo.logic.Repository +import cn.super12138.todo.logic.dao.ToDoRoom +import cn.super12138.todo.utils.showToast +import cn.super12138.todo.views.about.AboutActivity +import cn.super12138.todo.views.all.AllTasksActivity +import cn.super12138.todo.views.main.MainActivity +import com.google.android.material.dialog.MaterialAlertDialogBuilder +import com.google.android.material.snackbar.Snackbar +import com.google.gson.Gson +import com.google.gson.JsonSyntaxException +import com.google.gson.reflect.TypeToken +import kotlinx.coroutines.launch +import kotlin.system.exitProcess + +class SettingsFragment : PreferenceFragmentCompat() { + private lateinit var backupBinding: DialogBackupBinding + private lateinit var restoreBinding: DialogRestoreBinding + + override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) { + setPreferencesFromResource(R.xml.preferences, rootKey) + val gson = Gson() + + findPreference(Constants.PREF_DARK_MODE)?.apply { + setOnPreferenceClickListener { + if (GlobalValues.hapticFeedback) { + view?.performHapticFeedback(HapticFeedbackConstants.CONTEXT_CLICK) + } + true + } + setOnPreferenceChangeListener { _, newValue -> + when (newValue) { + "0" -> AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM) + + "1" -> AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES) + + "2" -> AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO) + } + activity?.recreate() + true + } + } + + findPreference(Constants.PREF_SECURE_MODE)?.apply { + setOnPreferenceChangeListener { _, _ -> + if (GlobalValues.hapticFeedback) { + view?.performHapticFeedback(HapticFeedbackConstants.CONTEXT_CLICK) + } + + view?.let { + Snackbar.make(it, R.string.need_restart_app, Snackbar.LENGTH_LONG) + .setAction(R.string.restart_app_now) { + if (GlobalValues.hapticFeedback) { + view?.performHapticFeedback(HapticFeedbackConstants.CONTEXT_CLICK) + } + restartApp(context) + } + .show() + } + + true + } + } + + findPreference(Constants.PREF_HAPTIC_FEEDBACK)?.apply { + setOnPreferenceChangeListener { _, newValue -> + if (newValue as Boolean) { + view?.performHapticFeedback(HapticFeedbackConstants.CONTEXT_CLICK) + } + + true + } + } + + findPreference(Constants.PREF_BACKUP_DB)?.apply { + setOnPreferenceClickListener { + if (GlobalValues.hapticFeedback) { + view?.performHapticFeedback(HapticFeedbackConstants.CONTEXT_CLICK) + } + + lifecycleScope.launch { + val data = Repository.getAll() + val jsonData = gson.toJson(data) + backupBinding = DialogBackupBinding.inflate(layoutInflater) + backupBinding.jsonOutput.text = jsonData + + activity?.let { + MaterialAlertDialogBuilder(it) + .setTitle(R.string.export_data) + .setView(backupBinding.root) + .setPositiveButton(R.string.ok, null) + .show() + } + } + true + } + } + + findPreference(Constants.PREF_RESTORE_DB)?.apply { + setOnPreferenceClickListener { + if (GlobalValues.hapticFeedback) { + view?.performHapticFeedback(HapticFeedbackConstants.CONTEXT_CLICK) + } + + restoreBinding = DialogRestoreBinding.inflate(layoutInflater) + activity?.let { it1 -> + val dialog = MaterialAlertDialogBuilder(it1) + .setTitle(R.string.restore_data) + .setView(restoreBinding.root) + .setPositiveButton(R.string.ok, null) + .setNegativeButton(R.string.cancel, null) + .show() + + dialog.getButton(AlertDialog.BUTTON_POSITIVE).setOnClickListener { + val jsonInput = restoreBinding.jsonInput.editText?.text.toString() + if (jsonInput.isEmpty()) { + restoreBinding.jsonInput.error = + getString(R.string.please_paste_data) + return@setOnClickListener + } + + lifecycleScope.launch { + if (restoreBinding.overwriteData.isChecked) { + Repository.deleteAll() + } + try { + val listType = object : TypeToken>() {}.type + val taskList: List = + gson.fromJson(jsonInput, listType) + taskList.forEach { Repository.insert(it) } + dialog.dismiss() + MaterialAlertDialogBuilder(it1) + .setTitle(R.string.restore_successful) + .setMessage(R.string.restore_need_restart_app) + .setPositiveButton(R.string.ok) { _, _ -> + if (GlobalValues.hapticFeedback) { + view?.performHapticFeedback(HapticFeedbackConstants.CONTEXT_CLICK) + } + + restartApp(context) + } + .setNegativeButton(R.string.cancel, null) + .setCancelable(false) + .show() + } catch (e: JsonSyntaxException) { + restoreBinding.jsonInput.error = + getString(R.string.json_data_incorrect) + } catch (e: Exception) { + if (GlobalValues.devMode) { + restoreBinding.jsonInput.error = e.toString() + } else { + restoreBinding.jsonInput.error = + getString(R.string.restore_failed) + } + } + } + } + } + true + } + } + + findPreference(Constants.PREF_ALL_TASKS)?.apply { + setOnPreferenceClickListener { + startActivity(Intent(context, AllTasksActivity::class.java)) + if (GlobalValues.hapticFeedback) { + view?.performHapticFeedback(HapticFeedbackConstants.CONTEXT_CLICK) + } + true + } + } + + findPreference(Constants.PREF_ABOUT)?.apply { + setOnPreferenceClickListener { + startActivity(Intent(context, AboutActivity::class.java)) + if (GlobalValues.hapticFeedback) { + view?.performHapticFeedback(HapticFeedbackConstants.CONTEXT_CLICK) + } + true + } + } + } + + + override fun setDivider(divider: Drawable?) { + super.setDivider(ColorDrawable(Color.TRANSPARENT)) + } + + override fun setDividerHeight(height: Int) { + super.setDividerHeight(0) + } + + + private fun restartApp(restartContext: Context) { + val intent = Intent(restartContext, MainActivity::class.java).apply { + flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK + } + restartContext.startActivity(intent) + exitProcess(0) + } +} \ No newline at end of file diff --git a/app/src/main/kotlin/cn/super12138/todo/views/todo/ToDoAdapter.kt b/app/src/main/kotlin/cn/super12138/todo/views/todo/ToDoAdapter.kt index 8fe5590..e04bd60 100644 --- a/app/src/main/kotlin/cn/super12138/todo/views/todo/ToDoAdapter.kt +++ b/app/src/main/kotlin/cn/super12138/todo/views/todo/ToDoAdapter.kt @@ -54,7 +54,9 @@ class ToDoAdapter( ViewModelProvider(viewModelStoreOwner)[ToDoFragmentViewModel::class.java] holder.checkToDoBtn.setOnClickListener { - it.performHapticFeedback(HapticFeedbackConstants.CONTEXT_CLICK) + if (GlobalValues.hapticFeedback) { + it.performHapticFeedback(HapticFeedbackConstants.CONTEXT_CLICK) + } if (position < 0 || position >= todoList.size) { return@setOnClickListener } 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 c19779a..8da216d 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 @@ -13,6 +13,7 @@ import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.RecyclerView import cn.super12138.todo.R import cn.super12138.todo.ToDoApp +import cn.super12138.todo.constant.GlobalValues import cn.super12138.todo.databinding.FragmentTodoBinding import cn.super12138.todo.logic.Repository import cn.super12138.todo.views.bottomsheet.ToDoBottomSheet @@ -65,7 +66,9 @@ class ToDoFragment : Fragment() { } binding.addItem.setOnClickListener { - it.performHapticFeedback(HapticFeedbackConstants.CONTEXT_CLICK) + if (GlobalValues.hapticFeedback) { + it.performHapticFeedback(HapticFeedbackConstants.CONTEXT_CLICK) + } val toDoBottomSheet = ToDoBottomSheet() toDoBottomSheet.show(parentFragmentManager, ToDoBottomSheet.TAG) } diff --git a/app/src/main/res/drawable/ic_all_todos.xml b/app/src/main/res/drawable/ic_all_tasks.xml similarity index 100% rename from app/src/main/res/drawable/ic_all_todos.xml rename to app/src/main/res/drawable/ic_all_tasks.xml diff --git a/app/src/main/res/drawable/ic_vibration.xml b/app/src/main/res/drawable/ic_vibration.xml new file mode 100644 index 0000000..90f6ccf --- /dev/null +++ b/app/src/main/res/drawable/ic_vibration.xml @@ -0,0 +1,12 @@ + + + + + diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml index 9cc39a6..ec6e726 100644 --- a/app/src/main/res/values-zh-rCN/strings.xml +++ b/app/src/main/res/values-zh-rCN/strings.xml @@ -72,4 +72,6 @@ 保存 更新待办 更新 + 触感反馈 + 部分点按操作会有轻微震动 \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 3bd8cec..0fb796e 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -72,4 +72,6 @@ Save Update task Update + Haptic feedback + Some tap operations will cause a slight vibration \ No newline at end of file diff --git a/app/src/main/res/xml/preferences.xml b/app/src/main/res/xml/preferences.xml index 62b6e69..4d16991 100644 --- a/app/src/main/res/xml/preferences.xml +++ b/app/src/main/res/xml/preferences.xml @@ -26,6 +26,12 @@ app:key="secure_mode" app:summary="@string/secure_mode_summary" app:title="@string/secure_mode" /> + - - + app:title="@string/view_all_tasks_label" /> - - + app:title="@string/about_label" /> \ No newline at end of file