New preference: haptic feedback

This commit is contained in:
Super12138 2024-06-09 13:16:21 +08:00
parent 238856f403
commit 5a15826a62
18 changed files with 316 additions and 170 deletions

View file

@ -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"

View file

@ -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)
}

View file

@ -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,

View file

@ -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)
}

View file

@ -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()
}

View file

@ -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,

View file

@ -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

View file

@ -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()
}
}

View file

@ -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
}

View file

@ -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)
}
}
}

View file

@ -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)
}
}

View file

@ -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
}

View file

@ -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)
}

View 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>

View file

@ -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>

View file

@ -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>

View file

@ -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>