aboutsummaryrefslogtreecommitdiffstats
path: root/app/src/main/java/dev/msfjarvis/aps/ui/settings/GeneralSettings.kt
blob: 64b9c3f1b2133728066ee1aabb313c48cb693392 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
/*
 * Copyright © 2014-2021 The Android Password Store Authors. All Rights Reserved.
 * SPDX-License-Identifier: GPL-3.0-only
 */

package dev.msfjarvis.aps.ui.settings

import android.content.pm.ShortcutManager
import android.os.Build
import androidx.core.content.edit
import androidx.core.content.getSystemService
import androidx.fragment.app.FragmentActivity
import de.Maxr1998.modernpreferences.PreferenceScreen
import de.Maxr1998.modernpreferences.helpers.checkBox
import de.Maxr1998.modernpreferences.helpers.onClick
import de.Maxr1998.modernpreferences.helpers.singleChoice
import de.Maxr1998.modernpreferences.preferences.choice.SelectionItem
import dev.msfjarvis.aps.R
import dev.msfjarvis.aps.util.auth.BiometricAuthenticator
import dev.msfjarvis.aps.util.extensions.sharedPrefs
import dev.msfjarvis.aps.util.settings.PreferenceKeys

class GeneralSettings(private val activity: FragmentActivity) : SettingsProvider {

    override fun provideSettings(builder: PreferenceScreen.Builder) {
        builder.apply {
            val themeValues = activity.resources.getStringArray(R.array.app_theme_values)
            val themeOptions = activity.resources.getStringArray(R.array.app_theme_options)
            val themeItems = themeValues.zip(themeOptions).map { SelectionItem(it.first, it.second, null) }
            singleChoice(PreferenceKeys.APP_THEME, themeItems) {
                initialSelection = activity.resources.getString(R.string.app_theme_def)
                titleRes = R.string.pref_app_theme_title
            }

            val sortValues = activity.resources.getStringArray(R.array.sort_order_values)
            val sortOptions = activity.resources.getStringArray(R.array.sort_order_entries)
            val sortItems = sortValues.zip(sortOptions).map { SelectionItem(it.first, it.second, null) }
            singleChoice(PreferenceKeys.SORT_ORDER, sortItems) {
                initialSelection = sortValues[0]
                titleRes = R.string.pref_sort_order_title
            }

            checkBox(PreferenceKeys.FILTER_RECURSIVELY) {
                titleRes = R.string.pref_recursive_filter_title
                summaryRes = R.string.pref_recursive_filter_summary
                defaultValue = true
            }

            checkBox(PreferenceKeys.SEARCH_ON_START) {
                titleRes = R.string.pref_search_on_start_title
                summaryRes = R.string.pref_search_on_start_summary
                defaultValue = false
            }

            checkBox(PreferenceKeys.SHOW_HIDDEN_CONTENTS) {
                titleRes = R.string.pref_show_hidden_title
                summaryRes = R.string.pref_show_hidden_summary
                defaultValue = false
            }

            checkBox(PreferenceKeys.BIOMETRIC_AUTH) {
                titleRes = R.string.pref_biometric_auth_title
                defaultValue = false
            }.apply {
                val canAuthenticate = BiometricAuthenticator.canAuthenticate(activity)
                if (!canAuthenticate) {
                    enabled = false
                    checked = false
                    summaryRes = R.string.pref_biometric_auth_summary_error
                } else {
                    summaryRes = R.string.pref_biometric_auth_summary
                    onClick {
                        enabled = false
                        val isChecked = checked
                        activity.sharedPrefs.edit {
                            BiometricAuthenticator.authenticate(activity) { result ->
                                when (result) {
                                    is BiometricAuthenticator.Result.Success -> {
                                        // Apply the changes
                                        putBoolean(PreferenceKeys.BIOMETRIC_AUTH, checked)
                                        enabled = true
                                    }
                                    else -> {
                                        // If any error occurs, revert back to the previous state. This
                                        // catch-all clause includes the cancellation case.
                                        putBoolean(PreferenceKeys.BIOMETRIC_AUTH, !checked)
                                        checked = !isChecked
                                        enabled = true
                                    }
                                }
                            }
                        }
                        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N_MR1) {
                            activity.getSystemService<ShortcutManager>()?.apply {
                                removeDynamicShortcuts(dynamicShortcuts.map { it.id }.toMutableList())
                            }
                        }
                        false
                    }
                }
            }
        }
    }
}