Skip to content

Commit d965e34

Browse files
[Feature] Retain data order across app session (#28)
* retain data order across app session #9 * fixed flickering issue --------- Co-authored-by: anas shikoh <[email protected]>
1 parent 7d9211b commit d965e34

File tree

5 files changed

+49
-4
lines changed

5 files changed

+49
-4
lines changed

app/build.gradle.kts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -91,4 +91,5 @@ dependencies {
9191
implementation(libs.androidx.navigation3.ui)
9292
implementation(libs.androidx.navigation3.runtime)
9393
implementation(libs.androidx.lifecycle.viewmodel.navigation3)
94+
implementation(libs.androidx.datastore.preferences)
9495
}

app/src/main/java/com/yogeshpaliyal/deepr/DeeprApplication.kt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package com.yogeshpaliyal.deepr
33
import android.app.Application
44
import app.cash.sqldelight.db.SqlDriver
55
import app.cash.sqldelight.driver.android.AndroidSqliteDriver
6+
import com.yogeshpaliyal.deepr.preference.AppPreferenceDataStore
67
import com.yogeshpaliyal.deepr.viewmodel.AccountViewModel
78
import org.koin.android.ext.koin.androidContext
89
import org.koin.androidx.viewmodel.dsl.viewModel
@@ -31,6 +32,8 @@ class DeeprApplication : Application() {
3132
database.deeprQueries
3233
}
3334

35+
single { AppPreferenceDataStore(androidContext()) }
36+
3437
viewModel { AccountViewModel(get()) }
3538
}
3639

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
package com.yogeshpaliyal.deepr.preference
2+
3+
import android.content.Context
4+
import androidx.datastore.core.DataStore
5+
import androidx.datastore.preferences.core.Preferences
6+
import androidx.datastore.preferences.core.edit
7+
import androidx.datastore.preferences.core.stringPreferencesKey
8+
import androidx.datastore.preferences.preferencesDataStore
9+
import com.yogeshpaliyal.deepr.viewmodel.SortOrder
10+
import kotlinx.coroutines.flow.Flow
11+
import kotlinx.coroutines.flow.map
12+
13+
private val Context.appDataStore: DataStore<Preferences> by preferencesDataStore(name = "app_data_store")
14+
15+
class AppPreferenceDataStore(private val context: Context) {
16+
companion object {
17+
private val SORTING_ORDER = stringPreferencesKey("sorting_order")
18+
}
19+
20+
val getSortingOrder: Flow<String> = context.appDataStore.data.map { preferences ->
21+
preferences[SORTING_ORDER] ?: SortOrder.DESC.name
22+
}
23+
24+
suspend fun setSortingOrder(order: String) {
25+
context.appDataStore.edit { prefs ->
26+
prefs[SORTING_ORDER] = order
27+
}
28+
}
29+
}

app/src/main/java/com/yogeshpaliyal/deepr/viewmodel/AccountViewModel.kt

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,23 +6,32 @@ import app.cash.sqldelight.coroutines.asFlow
66
import app.cash.sqldelight.coroutines.mapToList
77
import com.yogeshpaliyal.deepr.Deepr
88
import com.yogeshpaliyal.deepr.DeeprQueries
9+
import com.yogeshpaliyal.deepr.preference.AppPreferenceDataStore
910
import kotlinx.coroutines.ExperimentalCoroutinesApi
11+
import kotlinx.coroutines.flow.Flow
1012
import kotlinx.coroutines.flow.MutableStateFlow
1113
import kotlinx.coroutines.flow.SharingStarted
1214
import kotlinx.coroutines.flow.StateFlow
1315
import kotlinx.coroutines.flow.combine
1416
import kotlinx.coroutines.flow.flatMapLatest
17+
import kotlinx.coroutines.flow.map
1518
import kotlinx.coroutines.flow.stateIn
1619
import kotlinx.coroutines.launch
20+
import org.koin.core.component.KoinComponent
21+
import org.koin.core.component.get
1722

1823
enum class SortOrder {
1924
ASC, DESC, OPENED_ASC, OPENED_DESC
2025
}
2126

22-
class AccountViewModel(private val deeprQueries: DeeprQueries) : ViewModel() {
27+
class AccountViewModel(private val deeprQueries: DeeprQueries) : ViewModel(), KoinComponent {
2328

29+
private val preferenceDataStore: AppPreferenceDataStore = get()
2430
private val searchQuery = MutableStateFlow("")
25-
private val sortOrder = MutableStateFlow(SortOrder.DESC)
31+
private val sortOrder: Flow<SortOrder> =
32+
preferenceDataStore.getSortingOrder.map { sortOrderName ->
33+
SortOrder.valueOf(sortOrderName)
34+
}
2635

2736
@OptIn(ExperimentalCoroutinesApi::class)
2837
val accounts: StateFlow<List<Deepr>> =
@@ -51,7 +60,9 @@ class AccountViewModel(private val deeprQueries: DeeprQueries) : ViewModel() {
5160
}
5261

5362
fun setSortOrder(order: SortOrder) {
54-
sortOrder.value = order
63+
viewModelScope.launch {
64+
preferenceDataStore.setSortingOrder(order.name)
65+
}
5566
}
5667

5768
fun insertAccount(link: String, executed: Boolean) {

gradle/libs.versions.toml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ koin-bom = "4.0.3"
1414
tablerIcons = "1.1.1"
1515
nav3Core = "1.0.0-alpha01"
1616
lifecycleViewmodelNav3 = "1.0.0-alpha01"
17-
17+
dataStore = "1.1.7"
1818

1919
[libraries]
2020
android-driver = { module = "app.cash.sqldelight:android-driver", version.ref = "androidDriver" }
@@ -37,6 +37,7 @@ koin-bom = { module = "io.insert-koin:koin-bom", version.ref = "koin-bom" }
3737
koin-core = { module = "io.insert-koin:koin-core" }
3838
koin-android = { module = "io.insert-koin:koin-android" }
3939
tabler-icons = { module = "br.com.devsrsouza.compose.icons:tabler-icons", version.ref = "tablerIcons" }
40+
androidx-datastore-preferences = { group = "androidx.datastore", name = "datastore-preferences", version.ref = "dataStore" }
4041
# Core Navigation 3 libraries
4142
androidx-navigation3-runtime = { module = "androidx.navigation3:navigation3-runtime", version.ref = "nav3Core" }
4243
androidx-navigation3-ui = { module = "androidx.navigation3:navigation3-ui", version.ref = "nav3Core" }

0 commit comments

Comments
 (0)