New preference: haptic feedback
This commit is contained in:
parent
238856f403
commit
5a15826a62
18 changed files with 316 additions and 170 deletions
|
|
@ -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"
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
}
|
||||
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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<ActivityAboutBinding>() {
|
|||
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<ActivityAboutBinding>() {
|
|||
}
|
||||
|
||||
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<ActivityAboutBinding>() {
|
|||
|
||||
|
||||
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)
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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<ActivityAllTasksBinding>() {
|
|||
}
|
||||
|
||||
binding.toolBar.setNavigationOnClickListener {
|
||||
if (GlobalValues.hapticFeedback) {
|
||||
it.performHapticFeedback(HapticFeedbackConstants.CONTEXT_CLICK)
|
||||
}
|
||||
|
||||
finish()
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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<ActivityCrashBinding>() {
|
|||
}
|
||||
|
||||
binding.exitApp.setOnClickListener {
|
||||
if (GlobalValues.hapticFeedback) {
|
||||
it.performHapticFeedback(HapticFeedbackConstants.CONTEXT_CLICK)
|
||||
}
|
||||
this.finishAffinity()
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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<ActivityMainBinding>() {
|
|||
R.id.item_settings -> {
|
||||
val intent = Intent(ToDoApp.context, SettingsActivity::class.java)
|
||||
startActivity(intent)
|
||||
if (GlobalValues.hapticFeedback) {
|
||||
binding.toolBar.performHapticFeedback(HapticFeedbackConstants.CONTEXT_CLICK)
|
||||
}
|
||||
true
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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<ActivitySettingsBinding>() {
|
||||
override fun onCreate(savedInstanceState: Bundle?) {
|
||||
|
|
@ -44,6 +20,10 @@ class SettingsActivity : BaseActivity<ActivitySettingsBinding>() {
|
|||
supportActionBar?.setDisplayHomeAsUpEnabled(true)
|
||||
|
||||
binding.toolBar.setNavigationOnClickListener {
|
||||
if (GlobalValues.hapticFeedback) {
|
||||
it.performHapticFeedback(HapticFeedbackConstants.CONTEXT_CLICK)
|
||||
}
|
||||
|
||||
finish()
|
||||
}
|
||||
}
|
||||
|
|
@ -51,136 +31,4 @@ class SettingsActivity : BaseActivity<ActivitySettingsBinding>() {
|
|||
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<ListPreference>(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<SwitchPreferenceCompat>(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<Preference>(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<Preference>(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<List<ToDoRoom>>() {}.type
|
||||
val taskList: List<ToDoRoom> =
|
||||
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)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -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<ListPreference>(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<SwitchPreferenceCompat>(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<SwitchPreferenceCompat>(Constants.PREF_HAPTIC_FEEDBACK)?.apply {
|
||||
setOnPreferenceChangeListener { _, newValue ->
|
||||
if (newValue as Boolean) {
|
||||
view?.performHapticFeedback(HapticFeedbackConstants.CONTEXT_CLICK)
|
||||
}
|
||||
|
||||
true
|
||||
}
|
||||
}
|
||||
|
||||
findPreference<Preference>(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<Preference>(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<List<ToDoRoom>>() {}.type
|
||||
val taskList: List<ToDoRoom> =
|
||||
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<Preference>(Constants.PREF_ALL_TASKS)?.apply {
|
||||
setOnPreferenceClickListener {
|
||||
startActivity(Intent(context, AllTasksActivity::class.java))
|
||||
if (GlobalValues.hapticFeedback) {
|
||||
view?.performHapticFeedback(HapticFeedbackConstants.CONTEXT_CLICK)
|
||||
}
|
||||
true
|
||||
}
|
||||
}
|
||||
|
||||
findPreference<Preference>(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)
|
||||
}
|
||||
}
|
||||
|
|
@ -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
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
}
|
||||
|
|
|
|||
12
app/src/main/res/drawable/ic_vibration.xml
Normal file
12
app/src/main/res/drawable/ic_vibration.xml
Normal file
|
|
@ -0,0 +1,12 @@
|
|||
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:width="24dp"
|
||||
android:height="24dp"
|
||||
android:tint="?attr/colorControlNormal"
|
||||
android:viewportWidth="24"
|
||||
android:viewportHeight="24">
|
||||
|
||||
<path
|
||||
android:fillColor="@android:color/white"
|
||||
android:pathData="M0,15h2L2,9L0,9v6zM3,17h2L5,7L3,7v10zM22,9v6h2L24,9h-2zM19,17h2L21,7h-2v10zM16.5,3h-9C6.67,3 6,3.67 6,4.5v15c0,0.83 0.67,1.5 1.5,1.5h9c0.83,0 1.5,-0.67 1.5,-1.5v-15c0,-0.83 -0.67,-1.5 -1.5,-1.5zM16,19L8,19L8,5h8v14z" />
|
||||
|
||||
</vector>
|
||||
|
|
@ -72,4 +72,6 @@
|
|||
<string name="save">保存</string>
|
||||
<string name="update_task">更新待办</string>
|
||||
<string name="update">更新</string>
|
||||
<string name="haptic_feedback">触感反馈</string>
|
||||
<string name="haptic_feedback_summary">部分点按操作会有轻微震动</string>
|
||||
</resources>
|
||||
|
|
@ -72,4 +72,6 @@
|
|||
<string name="save">Save</string>
|
||||
<string name="update_task">Update task</string>
|
||||
<string name="update">Update</string>
|
||||
<string name="haptic_feedback">Haptic feedback</string>
|
||||
<string name="haptic_feedback_summary">Some tap operations will cause a slight vibration</string>
|
||||
</resources>
|
||||
|
|
@ -26,6 +26,12 @@
|
|||
app:key="secure_mode"
|
||||
app:summary="@string/secure_mode_summary"
|
||||
app:title="@string/secure_mode" />
|
||||
<SwitchPreferenceCompat
|
||||
app:defaultValue="true"
|
||||
app:icon="@drawable/ic_vibration"
|
||||
app:key="haptic_feedback"
|
||||
app:summary="@string/haptic_feedback_summary"
|
||||
app:title="@string/haptic_feedback" />
|
||||
<Preference
|
||||
android:icon="@drawable/ic_backup"
|
||||
app:key="backup_db"
|
||||
|
|
@ -40,19 +46,13 @@
|
|||
|
||||
<PreferenceCategory app:title="@string/others">
|
||||
<Preference
|
||||
app:icon="@drawable/ic_all_todos"
|
||||
app:icon="@drawable/ic_all_tasks"
|
||||
app:key="all_tasks"
|
||||
app:summary="@string/view_all_tasks_summary"
|
||||
app:title="@string/view_all_tasks_label">
|
||||
<intent
|
||||
android:targetClass="cn.super12138.todo.views.all.AllTasksActivity"
|
||||
android:targetPackage="cn.super12138.todo" />
|
||||
</Preference>
|
||||
app:title="@string/view_all_tasks_label" />
|
||||
<Preference
|
||||
app:key="about"
|
||||
app:icon="@drawable/ic_about"
|
||||
app:title="@string/about_label">
|
||||
<intent
|
||||
android:targetClass="cn.super12138.todo.views.about.AboutActivity"
|
||||
android:targetPackage="cn.super12138.todo" />
|
||||
</Preference>
|
||||
app:title="@string/about_label" />
|
||||
</PreferenceCategory>
|
||||
</PreferenceScreen>
|
||||
Loading…
Reference in a new issue