Skip to content

Commit 56416ec

Browse files
rohitsat13florina-muntenescu
authored andcommitted
Update the protodatastore code: (#7)
* Update the protodatastore code: 1) Use the new factory: context.createDataStore 2) handle unspecified values of SortOrder
1 parent 9610b1d commit 56416ec

File tree

2 files changed

+25
-32
lines changed

2 files changed

+25
-32
lines changed

app/src/main/java/com/codelab/android/datastore/data/UserPreferencesRepository.kt

Lines changed: 24 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -19,66 +19,58 @@ package com.codelab.android.datastore.data
1919
import android.content.Context
2020
import android.util.Log
2121
import androidx.datastore.DataStore
22-
import androidx.datastore.DataStoreFactory
23-
import androidx.datastore.migrations.MigrationFromSharedPreferences
22+
import androidx.datastore.createDataStore
2423
import androidx.datastore.migrations.SharedPreferencesMigration
2524
import androidx.datastore.migrations.SharedPreferencesView
2625
import com.codelab.android.datastore.UserPreferences
2726
import com.codelab.android.datastore.UserPreferences.SortOrder
2827
import kotlinx.coroutines.flow.Flow
2928
import kotlinx.coroutines.flow.catch
30-
import java.io.File
3129
import java.io.IOException
3230

3331
private const val USER_PREFERENCES_NAME = "user_preferences"
3432
private const val DATA_STORE_FILE_NAME = "user_prefs.pb"
3533
private const val SORT_ORDER_KEY = "sort_order"
3634

37-
// Define the mapping from SharedPreferences to UserPreferences
38-
private class UserPreferencesMigration : MigrationFromSharedPreferences<UserPreferences> {
39-
override suspend fun migrate(
40-
prefs: SharedPreferencesView,
41-
currentData: UserPreferences
42-
): UserPreferences {
43-
return if (currentData.sortOrder == SortOrder.UNSPECIFIED) {
44-
currentData.toBuilder()
45-
.setSortOrder(
46-
SortOrder.valueOf(
47-
prefs.getString(SORT_ORDER_KEY, SortOrder.NONE.name) ?: SortOrder.NONE.name
48-
)
49-
)
50-
.build()
51-
} else {
52-
currentData
53-
}
54-
}
55-
}
56-
5735
/**
5836
* Class that handles saving and retrieving user preferences
5937
*/
6038
class UserPreferencesRepository private constructor(context: Context) {
6139

6240
private val TAG: String = "UserPreferencesRepo"
6341

42+
private val sharedPrefsMigration = SharedPreferencesMigration(
43+
context,
44+
USER_PREFERENCES_NAME
45+
) { sharedPrefs: SharedPreferencesView, currentData: UserPreferences ->
46+
// Define the mapping from SharedPreferences to UserPreferences
47+
if (currentData.sortOrder == SortOrder.UNSPECIFIED) {
48+
currentData.toBuilder().setSortOrder(
49+
SortOrder.valueOf(
50+
sharedPrefs.getString(
51+
SORT_ORDER_KEY, SortOrder.NONE.name
52+
)!!
53+
)
54+
).build()
55+
} else {
56+
currentData
57+
}
58+
}
59+
60+
6461
// Build the DataStore
65-
private val userPreferencesStore: DataStore<UserPreferences> = DataStoreFactory().create(
66-
produceFile = { File(context.filesDir, DATA_STORE_FILE_NAME) },
62+
private val userPreferencesStore: DataStore<UserPreferences> = context.createDataStore(
63+
fileName = DATA_STORE_FILE_NAME,
6764
serializer = UserPreferencesSerializer,
68-
migrationProducers = listOf(
69-
SharedPreferencesMigration(
70-
context,
71-
USER_PREFERENCES_NAME,
72-
UserPreferencesMigration()
73-
)
74-
)
65+
migrations = listOf(sharedPrefsMigration)
7566
)
7667

7768
val userPreferencesFlow: Flow<UserPreferences> = userPreferencesStore.data
7869
.catch { exception ->
7970
// dataStore.data throws an IOException when an error is encountered when reading data
8071
if (exception is IOException) {
8172
Log.e(TAG, "Error reading sort order preferences.", exception)
73+
emit(UserPreferences.getDefaultInstance())
8274
} else {
8375
throw exception
8476
}

app/src/main/java/com/codelab/android/datastore/ui/TasksViewModel.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,7 @@ class TasksViewModel(
7272
}
7373
// sort the tasks
7474
return when (sortOrder) {
75+
SortOrder.UNSPECIFIED -> filteredTasks
7576
SortOrder.NONE -> filteredTasks
7677
SortOrder.BY_DEADLINE -> filteredTasks.sortedByDescending { it.deadline }
7778
SortOrder.BY_PRIORITY -> filteredTasks.sortedBy { it.priority }

0 commit comments

Comments
 (0)