Skip to content

Commit a611a28

Browse files
committed
refactor(Prefs): deprecate PrefKey
adding a preference key leads to a lot of boilerplate (mostly caused by me) because it is necessary to 1. add a constant in preferences.xml 2. add the string for analytics 3. add the string to PrefKey To reduce the boiler, `PrefKey` is being replaced with the preferences.xml constants. Since the XMLs keys can be used in both code and XMLs, keeping it as default seems like the best option. Some of PrefKey strings were just inlined to reduce the scope of the PR
1 parent b0d3758 commit a611a28

File tree

11 files changed

+167
-130
lines changed

11 files changed

+167
-130
lines changed

AnkiDroid/src/main/java/com/ichi2/anki/CrashReportService.kt

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,6 @@ import com.ichi2.anki.exception.ManuallyReportedException
3030
import com.ichi2.anki.exception.UserSubmittedException
3131
import com.ichi2.anki.preferences.sharedPrefs
3232
import com.ichi2.anki.servicelayer.ThrowableFilterService
33-
import com.ichi2.anki.settings.PrefKey
3433
import com.ichi2.libanki.utils.TimeManager
3534
import com.ichi2.utils.WebViewDebugging.setDataDirectorySuffix
3635
import org.acra.ACRA
@@ -93,7 +92,7 @@ object CrashReportService {
9392
val builder =
9493
CoreConfigurationBuilder()
9594
.withBuildConfigClass(com.ichi2.anki.BuildConfig::class.java) // AnkiDroid BuildConfig - Acrarium#319
96-
.withExcludeMatchingSharedPreferencesKeys(PrefKey.USERNAME, "hkey")
95+
.withExcludeMatchingSharedPreferencesKeys("username", "hkey")
9796
.withSharedPreferencesName("acra")
9897
.withReportContent(
9998
ReportField.REPORT_ID,

AnkiDroid/src/main/java/com/ichi2/anki/Sync.kt

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,6 @@ import com.ichi2.anki.CollectionManager.TR
3131
import com.ichi2.anki.CollectionManager.withCol
3232
import com.ichi2.anki.dialogs.SyncErrorDialog
3333
import com.ichi2.anki.preferences.sharedPrefs
34-
import com.ichi2.anki.settings.PrefKey
3534
import com.ichi2.anki.settings.Prefs
3635
import com.ichi2.anki.snackbar.showSnackbar
3736
import com.ichi2.anki.worker.SyncMediaWorker
@@ -123,8 +122,8 @@ fun customSyncBase(preferences: SharedPreferences): String? =
123122
suspend fun syncLogout(context: Context) {
124123
val preferences = context.sharedPrefs()
125124
preferences.edit {
126-
remove(PrefKey.HKEY)
127-
remove(PrefKey.USERNAME)
125+
remove("hkey")
126+
remove("username")
128127
remove(SyncPreferences.CURRENT_SYNC_URI)
129128
remove(SyncPreferences.HOSTNUM)
130129
}

AnkiDroid/src/main/java/com/ichi2/anki/analytics/UsageAnalytics.kt

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,6 @@ import com.ichi2.anki.AnkiDroidApp
3030
import com.ichi2.anki.BuildConfig
3131
import com.ichi2.anki.R
3232
import com.ichi2.anki.preferences.sharedPrefs
33-
import com.ichi2.anki.settings.PrefKey
3433
import com.ichi2.utils.DisplayUtils
3534
import com.ichi2.utils.KotlinCleanup
3635
import com.ichi2.utils.WebViewDebugging.hasSetDataDirectory
@@ -489,7 +488,7 @@ object UsageAnalytics {
489488
"doubleTapTimeInterval", // Double tap time interval (milliseconds)
490489
// ******************************** Sync ***************************************************
491490
"syncFetchMedia", // Fetch media on sync
492-
PrefKey.AUTO_SYNC, // Automatic synchronization
491+
"automaticSyncMode", // Automatic synchronization
493492
"showSyncStatusBadge", // Display synchronization status
494493
"allowMetered", // Allow sync on metered connections
495494
"one_way_sync", // One-way sync
@@ -570,7 +569,7 @@ object UsageAnalytics {
570569
// ******************************** Accessibility ******************************************
571570
"cardZoom",
572571
"imageZoom",
573-
PrefKey.ANSWER_BUTTON_SIZE,
572+
"answerButtonSize",
574573
"showLargeAnswerButtons",
575574
"relativeCardBrowserFontSize",
576575
"showCardAnswerButtonTime",
@@ -582,7 +581,7 @@ object UsageAnalytics {
582581
"useInputTag", // Type answer into the card
583582
"disableExtendedTextUi", // Disable Single-Field Edit Mode
584583
"noteEditorNewlineReplace", // Replace newlines with HTML
585-
PrefKey.AUTO_FOCUS_TYPE_ANSWER, // Focus ‘type in answer’
584+
"autoFocusTypeInAnswer", // Focus ‘type in answer’
586585
"mediaImportAllowAllFiles", // Allow all files in media imports
587586
"providerEnabled", // Enable AnkiDroid API
588587
// ******************************** App bar buttons ****************************************

AnkiDroid/src/main/java/com/ichi2/anki/settings/PrefKey.kt

Lines changed: 0 additions & 35 deletions
This file was deleted.

AnkiDroid/src/main/java/com/ichi2/anki/settings/Prefs.kt

Lines changed: 57 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -15,10 +15,12 @@
1515
*/
1616
package com.ichi2.anki.settings
1717

18+
import androidx.annotation.StringRes
1819
import androidx.annotation.VisibleForTesting
1920
import androidx.core.content.edit
2021
import com.ichi2.anki.AnkiDroidApp
2122
import com.ichi2.anki.BuildConfig
23+
import com.ichi2.anki.R
2224
import com.ichi2.anki.settings.enums.FrameStyle
2325
import com.ichi2.anki.settings.enums.HideSystemBars
2426
import com.ichi2.anki.settings.enums.PrefEnum
@@ -30,47 +32,55 @@ import kotlin.reflect.KProperty
3032
object Prefs {
3133
private val sharedPrefs get() = AnkiDroidApp.sharedPrefs()
3234

35+
@VisibleForTesting
36+
val resources get() = AnkiDroidApp.appResources
37+
38+
@VisibleForTesting
39+
fun key(
40+
@StringRes resId: Int,
41+
): String = resources.getString(resId)
42+
3343
@VisibleForTesting
3444
fun getBoolean(
35-
key: String,
45+
@StringRes keyResId: Int,
3646
defValue: Boolean,
37-
): Boolean = sharedPrefs.getBoolean(key, defValue)
47+
): Boolean = sharedPrefs.getBoolean(key(keyResId), defValue)
3848

3949
@VisibleForTesting
4050
fun putBoolean(
41-
key: String,
51+
@StringRes keyResId: Int,
4252
value: Boolean,
4353
) {
44-
sharedPrefs.edit { putBoolean(key, value) }
54+
sharedPrefs.edit { putBoolean(key(keyResId), value) }
4555
}
4656

4757
@VisibleForTesting
4858
fun getString(
49-
key: String,
59+
@StringRes keyResId: Int,
5060
defValue: String?,
51-
): String? = sharedPrefs.getString(key, defValue)
61+
): String? = sharedPrefs.getString(key(keyResId), defValue)
5262

5363
@VisibleForTesting
5464
fun putString(
55-
key: String,
65+
@StringRes keyResId: Int,
5666
value: String?,
5767
) {
58-
sharedPrefs.edit { putString(key, value) }
68+
sharedPrefs.edit { putString(key(keyResId), value) }
5969
}
6070

6171
@VisibleForTesting
6272
fun getInt(
63-
key: String,
73+
@StringRes keyResId: Int,
6474
defValue: Int,
65-
): Int = sharedPrefs.getInt(key, defValue)
75+
): Int = sharedPrefs.getInt(key(keyResId), defValue)
6676

6777
@VisibleForTesting
6878
fun <E> getEnum(
69-
key: String,
79+
@StringRes keyResId: Int,
7080
defaultValue: E,
7181
): E where E : Enum<E>, E : PrefEnum {
7282
val enumClass = defaultValue.javaClass
73-
val stringValue = getString(key, defaultValue.entryValue)
83+
val stringValue = getString(keyResId, defaultValue.entryValue)
7484
return enumClass.enumConstants?.firstOrNull {
7585
it.entryValue == stringValue
7686
} ?: defaultValue
@@ -80,69 +90,88 @@ object Prefs {
8090

8191
@VisibleForTesting
8292
fun booleanPref(
83-
key: String,
93+
@StringRes keyResId: Int,
8494
defaultValue: Boolean,
8595
): ReadWriteProperty<Any?, Boolean> =
8696
object : ReadWriteProperty<Any?, Boolean> {
8797
override fun getValue(
8898
thisRef: Any?,
8999
property: KProperty<*>,
90-
): Boolean = getBoolean(key, defaultValue)
100+
): Boolean = getBoolean(keyResId, defaultValue)
91101

92102
override fun setValue(
93103
thisRef: Any?,
94104
property: KProperty<*>,
95105
value: Boolean,
96106
) {
97-
putBoolean(key, value)
107+
putBoolean(keyResId, value)
98108
}
99109
}
100110

101111
@VisibleForTesting
102112
fun stringPref(
103-
key: String,
113+
@StringRes keyResId: Int,
104114
defaultValue: String? = null,
105115
): ReadWriteProperty<Any?, String?> =
106116
object : ReadWriteProperty<Any?, String?> {
107117
override fun getValue(
108118
thisRef: Any?,
109119
property: KProperty<*>,
110-
): String? = getString(key, defaultValue) ?: defaultValue
120+
): String? = getString(keyResId, defaultValue) ?: defaultValue
111121

112122
override fun setValue(
113123
thisRef: Any?,
114124
property: KProperty<*>,
115125
value: String?,
116126
) {
117-
putString(key, value)
127+
putString(keyResId, value)
118128
}
119129
}
120130

131+
@VisibleForTesting
132+
class StringPref(
133+
@StringRes private val keyResId: Int,
134+
private val defaultValue: String? = null,
135+
) : ReadWriteProperty<Any?, String?> {
136+
override fun getValue(
137+
thisRef: Any?,
138+
property: KProperty<*>,
139+
): String? = getString(keyResId, defaultValue) ?: defaultValue
140+
141+
override fun setValue(
142+
thisRef: Any?,
143+
property: KProperty<*>,
144+
value: String?,
145+
) {
146+
putString(keyResId, value)
147+
}
148+
}
149+
121150
// ****************************************************************************************** //
122151
// **************************************** Settings **************************************** //
123152
// ****************************************************************************************** //
124153

125154
// ****************************************** Sync ****************************************** //
126155

127-
val isAutoSyncEnabled by booleanPref(PrefKey.AUTO_SYNC, false)
128-
var username by stringPref(PrefKey.USERNAME)
129-
var hkey by stringPref(PrefKey.HKEY)
156+
val isAutoSyncEnabled by booleanPref(R.string.automatic_sync_choice_key, false)
157+
var username by stringPref(R.string.username_key)
158+
var hkey by stringPref(R.string.hkey_key)
130159

131160
// **************************************** Reviewer **************************************** //
132161

133-
val ignoreDisplayCutout by booleanPref(PrefKey.IGNORE_DISPLAY_CUTOUT, false)
134-
val autoFocusTypeAnswer by booleanPref(PrefKey.AUTO_FOCUS_TYPE_ANSWER, true)
162+
val ignoreDisplayCutout by booleanPref(R.string.ignore_display_cutout_key, false)
163+
val autoFocusTypeAnswer by booleanPref(R.string.type_in_answer_focus_key, true)
135164

136165
val frameStyle: FrameStyle
137-
get() = getEnum(PrefKey.FRAME_STYLE, FrameStyle.CARD)
166+
get() = getEnum(R.string.reviewer_frame_style_key, FrameStyle.CARD)
138167

139168
val hideSystemBars: HideSystemBars
140-
get() = getEnum(PrefKey.HIDE_SYSTEM_BARS, HideSystemBars.NONE)
169+
get() = getEnum(R.string.hide_system_bars_key, HideSystemBars.NONE)
141170

142171
// ************************************** Accessibility ************************************* //
143172

144173
val answerButtonsSize: Int
145-
get() = getInt(PrefKey.ANSWER_BUTTON_SIZE, 100)
174+
get() = getInt(R.string.answer_button_size_preference, 100)
146175

147176
// ************************************* Developer options ********************************** //
148177

@@ -152,6 +181,6 @@ object Prefs {
152181
* or if the user has enabled it with the secret on [com.ichi2.anki.preferences.AboutFragment]
153182
*/
154183
var isDevOptionsEnabled: Boolean
155-
get() = getBoolean(PrefKey.DEV_OPTIONS_ENABLED, false) || BuildConfig.DEBUG
156-
set(value) = putBoolean(PrefKey.DEV_OPTIONS_ENABLED, value)
184+
get() = getBoolean(R.string.dev_options_enabled_by_user_key, false) || BuildConfig.DEBUG
185+
set(value) = putBoolean(R.string.dev_options_enabled_by_user_key, value)
157186
}

AnkiDroid/src/main/res/values/preferences.xml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,8 @@
2424
<string name="sync_status_badge_key">showSyncStatusBadge</string>
2525
<string name="metered_sync_key">allowMetered</string>
2626
<string name="custom_sync_server_key">custom_sync_server_link</string>
27+
<string name="hkey_key">hkey</string>
28+
<string name="username_key">username</string>
2729
<!-- Backup -->
2830
<string name="pref_backup_limits_screen_key">backupLimitsScreen</string>
2931
<!-- Appearance -->

AnkiDroid/src/test/java/com/ichi2/anki/ConstantUniquenessTest.kt

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,6 @@ package com.ichi2.anki
1919
import com.ichi2.anki.browser.BrowserColumnSelectionRecyclerItem
2020
import com.ichi2.anki.notifications.NotificationId
2121
import com.ichi2.anki.preferences.reviewer.ReviewerMenuSettingsRecyclerItem
22-
import com.ichi2.anki.settings.PrefKey
2322
import com.ichi2.anki.worker.UniqueWorkNames
2423
import org.junit.Test
2524
import kotlin.reflect.KClass
@@ -35,7 +34,6 @@ class ConstantUniquenessTest {
3534
assertConstantUniqueness(NotificationId::class)
3635
assertConstantUniqueness(UniqueWorkNames::class)
3736
assertConstantUniqueness(ReviewerMenuSettingsRecyclerItem.Companion::class)
38-
assertConstantUniqueness(PrefKey::class)
3937
assertConstantUniqueness(BrowserColumnSelectionRecyclerItem.Companion::class)
4038
}
4139

AnkiDroid/src/test/java/com/ichi2/anki/analytics/PreferencesAnalyticsTest.kt

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,6 @@ import com.ichi2.anki.RobolectricTest
2121
import com.ichi2.anki.analytics.UsageAnalytics.preferencesWhoseChangesShouldBeReported
2222
import com.ichi2.anki.preferences.PreferenceTestUtils
2323
import com.ichi2.anki.preferences.SettingsFragment
24-
import com.ichi2.anki.settings.PrefKey
2524
import org.hamcrest.MatcherAssert.assertThat
2625
import org.hamcrest.Matchers
2726
import org.junit.Test
@@ -85,8 +84,8 @@ class PreferencesAnalyticsTest : RobolectricTest() {
8584
"hideAnswerButtons",
8685
"hideHardAndEasy",
8786
"reviewerFrameStyle",
88-
PrefKey.HIDE_SYSTEM_BARS,
89-
PrefKey.IGNORE_DISPLAY_CUTOUT,
87+
"hideSystemBars",
88+
"ignoreDisplayCutout",
9089
)
9190

9291
@Test

0 commit comments

Comments
 (0)