@@ -27,6 +27,7 @@ import kotlinx.coroutines.sync.withLock
27
27
import kotlinx.coroutines.withContext
28
28
import org.equeim.tremotesf.R
29
29
import org.equeim.tremotesf.TremotesfApplication
30
+ import org.equeim.tremotesf.torrentfile.rpc.requests.torrentproperties.TorrentLimits
30
31
import org.equeim.tremotesf.ui.Settings.Property
31
32
import org.equeim.tremotesf.ui.torrentslistfragment.TorrentsListFragmentViewModel
32
33
import timber.log.Timber
@@ -106,31 +107,58 @@ object Settings {
106
107
putString(colorTheme.key, newValue)
107
108
}
108
109
}
110
+ context.getString(R .string.deprecated_prefs_remember_download_directory_key)
111
+ .let { deprecatedRememberDownloadDirectoryKey ->
112
+ if (preferences.contains(deprecatedRememberDownloadDirectoryKey)) {
113
+ preferences.edit {
114
+ putBoolean(
115
+ rememberAddTorrentParameters.key,
116
+ preferences.getBoolean(deprecatedRememberDownloadDirectoryKey, false )
117
+ )
118
+ remove(deprecatedRememberDownloadDirectoryKey)
119
+ }
120
+ }
121
+ }
109
122
migrated = true
110
123
}
111
124
}
112
125
}
113
126
127
+ private class EnumPrefsMapper <T : Enum <T >>(
128
+ private val enumClass : Class <T >,
129
+ @StringRes private val keyResId : Int ,
130
+ @StringRes private val defaultValueResId : Int ,
131
+ val enumToPrefsValue : (T ) -> String ,
132
+ ) {
133
+ private val enumValues = requireNotNull(enumClass.enumConstants)
134
+
135
+ fun prefsValueToEnum (prefsValue : String ): T {
136
+ enumValues.find { enumToPrefsValue(it) == prefsValue }?.let { return it }
137
+ val key = context.getString(keyResId)
138
+ Timber .e(" Unknown prefs value $prefsValue for key $key and enum $enumClass " )
139
+ val defaultPrefsValue = context.getString(defaultValueResId)
140
+ return enumValues.find { enumToPrefsValue(it) == defaultPrefsValue }
141
+ ? : throw IllegalStateException (" Did not find value of enum $enumClass for default prefs value $defaultPrefsValue and key $key " )
142
+ }
143
+ }
144
+
145
+ private inline fun <reified T : Enum <T >> EnumPrefsMapper (
146
+ @StringRes keyResId : Int ,
147
+ @StringRes defaultValueResId : Int ,
148
+ noinline enumToPrefsValue : (T ) -> String ,
149
+ ): EnumPrefsMapper <T > =
150
+ EnumPrefsMapper (T ::class .java, keyResId, defaultValueResId, enumToPrefsValue)
151
+
114
152
private interface MappedPrefsEnum {
115
153
val prefsValue: String
116
-
117
- companion object {
118
- inline fun <reified T > fromPrefsValueProvider (
119
- @StringRes keyResId : Int ,
120
- @StringRes defaultValueResId : Int ,
121
- ): (String ) -> T where T : MappedPrefsEnum , T : Enum<T> {
122
- val values = enumValues<T >()
123
- return { prefsValue ->
124
- values.find { it.prefsValue == prefsValue } ? : run {
125
- Timber .e(" Unknown value $prefsValue for key ${context.getString(keyResId)} " )
126
- val defaultPrefsValue = context.getString(defaultValueResId)
127
- values.single { it.prefsValue == defaultPrefsValue }
128
- }
129
- }
130
- }
131
- }
132
154
}
133
155
156
+ private inline fun <reified T > EnumPrefsMapper (
157
+ @StringRes keyResId : Int ,
158
+ @StringRes defaultValueResId : Int ,
159
+ ): EnumPrefsMapper <T > where T : MappedPrefsEnum , T : Enum<T> =
160
+ EnumPrefsMapper (T ::class .java, keyResId, defaultValueResId, MappedPrefsEnum ::prefsValue)
161
+
134
162
enum class ColorTheme (
135
163
@StringRes prefsValueResId : Int ,
136
164
@StyleRes val activityThemeResId : Int = 0 ,
@@ -140,20 +168,15 @@ object Settings {
140
168
Teal (R .string.prefs_color_theme_value_teal, R .style.AppTheme_Teal );
141
169
142
170
override val prefsValue = context.getString(prefsValueResId)
143
-
144
- companion object {
145
- val fromPrefsValue = MappedPrefsEnum .fromPrefsValueProvider<ColorTheme >(
146
- R .string.prefs_color_theme_key,
147
- R .string.prefs_color_theme_default_value
148
- )
149
- }
150
171
}
151
172
173
+ private val colorThemeMapper =
174
+ EnumPrefsMapper <ColorTheme >(R .string.prefs_color_theme_key, R .string.prefs_color_theme_default_value)
152
175
val colorTheme: MutableProperty <ColorTheme > = mutableProperty<String >(
153
176
R .string.prefs_color_theme_key,
154
177
R .string.prefs_color_theme_default_value
155
178
).map(
156
- transformGetter = ColorTheme .fromPrefsValue ,
179
+ transformGetter = colorThemeMapper::prefsValueToEnum ,
157
180
transformSetter = { it.prefsValue }
158
181
)
159
182
@@ -171,20 +194,17 @@ object Settings {
171
194
Off (R .string.prefs_dark_theme_mode_value_off, AppCompatDelegate .MODE_NIGHT_NO );
172
195
173
196
override val prefsValue = context.getString(prefsValueResId)
174
-
175
- companion object {
176
- val fromPrefsValue = MappedPrefsEnum .fromPrefsValueProvider<DarkThemeMode >(
177
- R .string.prefs_dark_theme_mode_key,
178
- R .string.prefs_dark_theme_mode_default_value
179
- )
180
- }
181
197
}
182
198
199
+ private val darkThemeModeMapper = EnumPrefsMapper <DarkThemeMode >(
200
+ R .string.prefs_dark_theme_mode_key,
201
+ R .string.prefs_dark_theme_mode_default_value
202
+ )
183
203
val darkThemeMode: Property <DarkThemeMode > =
184
204
property<String >(
185
205
R .string.prefs_dark_theme_mode_key,
186
206
R .string.prefs_dark_theme_mode_default_value
187
- ).map(DarkThemeMode .fromPrefsValue )
207
+ ).map(darkThemeModeMapper::prefsValueToEnum )
188
208
189
209
val torrentCompactView: Property <Boolean > = property(
190
210
R .string.prefs_torrent_compact_view_key,
@@ -247,8 +267,47 @@ object Settings {
247
267
val fillTorrentLinkFromKeyboard: Property <Boolean > =
248
268
property(R .string.prefs_link_from_clipboard_key, R .bool.prefs_link_from_clipboard_default_value)
249
269
250
- val rememberDownloadDirectory: Property <Boolean > =
251
- property(R .string.prefs_remember_download_directory_key, R .bool.prefs_remember_download_directory_default_value)
270
+ val rememberAddTorrentParameters: Property <Boolean > =
271
+ property(
272
+ R .string.prefs_remember_add_torrent_parameters_key,
273
+ R .bool.prefs_remember_add_torrent_parameters_default_value
274
+ )
275
+
276
+ enum class StartTorrentAfterAdding (override val prefsValue : String ) : MappedPrefsEnum {
277
+ Start (" start" ),
278
+ DontStart (" dont_start" ),
279
+ Unknown (" unknown" )
280
+ }
281
+
282
+ private val startTorrentAfterAddingMapper = EnumPrefsMapper <StartTorrentAfterAdding >(
283
+ R .string.prefs_last_add_torrent_start_after_adding_key,
284
+ R .string.prefs_last_add_torrent_start_after_adding_default_value
285
+ )
286
+ val lastAddTorrentStartAfterAdding: MutableProperty <StartTorrentAfterAdding > = mutableProperty<String >(
287
+ R .string.prefs_last_add_torrent_start_after_adding_key,
288
+ R .string.prefs_last_add_torrent_start_after_adding_default_value
289
+ ).map(
290
+ transformGetter = startTorrentAfterAddingMapper::prefsValueToEnum,
291
+ transformSetter = startTorrentAfterAddingMapper.enumToPrefsValue
292
+ )
293
+
294
+ private val bandwidthPriorityMapper = EnumPrefsMapper <TorrentLimits .BandwidthPriority >(
295
+ R .string.prefs_last_add_torrent_priority_key,
296
+ R .string.prefs_last_add_torrent_priority_default_value
297
+ ) {
298
+ when (it) {
299
+ TorrentLimits .BandwidthPriority .Low -> " low"
300
+ TorrentLimits .BandwidthPriority .Normal -> " normal"
301
+ TorrentLimits .BandwidthPriority .High -> " high"
302
+ }
303
+ }
304
+ val lastAddTorrentPriority: MutableProperty <TorrentLimits .BandwidthPriority > = mutableProperty<String >(
305
+ R .string.prefs_last_add_torrent_priority_key,
306
+ R .string.prefs_last_add_torrent_priority_default_value
307
+ ).map(
308
+ transformGetter = bandwidthPriorityMapper::prefsValueToEnum,
309
+ transformSetter = bandwidthPriorityMapper.enumToPrefsValue
310
+ )
252
311
253
312
val torrentsSortMode: MutableProperty <TorrentsListFragmentViewModel .SortMode > =
254
313
mutableProperty<Int >(
0 commit comments