Skip to content

Commit

Permalink
Merge pull request #114 from VictorKabata/ktx-datastore
Browse files Browse the repository at this point in the history
Migrate from multiplatform-settings to datastore
  • Loading branch information
VictorKabata authored Jul 24, 2024
2 parents 5dd8174 + 646edea commit 009e04c
Show file tree
Hide file tree
Showing 19 changed files with 104 additions and 89 deletions.
4 changes: 1 addition & 3 deletions appiOS/Notflix/Koin.swift
Original file line number Diff line number Diff line change
Expand Up @@ -24,9 +24,7 @@ extension KoinApplication {
}

extension KoinApplication {
private static let keyPaths: [PartialKeyPath<Koin>] = [
\.homeViewModel

private static let keyPaths: [PartialKeyPath<Koin>] = [
]

static func inject<T>() -> T {
Expand Down
9 changes: 3 additions & 6 deletions gradle/libs.versions.toml
Original file line number Diff line number Diff line change
Expand Up @@ -23,12 +23,12 @@ kotlinxDateTime = "0.5.0"
napier = "2.6.1"
ktor = "2.3.7"
sqlDelight = "2.0.1"
multiplatformSettings = "1.1.1"
buildKonfig = "0.13.3"
kover = "0.6.1"
materialWindowSizeClass = "0.3.0"
navigation = "2.7.0-alpha07"
coil = "3.0.0-alpha06"
datastore = "1.1.1"

#Android Versions
androidxActivity = "1.8.2"
Expand Down Expand Up @@ -78,6 +78,7 @@ firebase-performance-plugin = { id = "com.google.firebase.firebase-perf", versio
#Kotlin Multiplatform Lib Dependencies
coroutines = { module = "org.jetbrains.kotlinx:kotlinx-coroutines-core", version.ref = "kotlinxCoroutines" }
coroutines-swing={module="org.jetbrains.kotlinx:kotlinx-coroutines-swing", version.ref="coroutines"}
datastore-preferences = { module = "androidx.datastore:datastore-preferences-core", version.ref = "datastore" }
koin-core = { module = "io.insert-koin:koin-core", version.ref = "koinCore" }
kotlinX-serializationJson = { module = "org.jetbrains.kotlinx:kotlinx-serialization-json", version.ref = "kotlinxSerializationJson" }
ktor-core = { module = "io.ktor:ktor-client-core", version.ref = "ktor" }
Expand All @@ -96,9 +97,6 @@ sqlDelight-native = { module = "app.cash.sqldelight:native-driver", version.ref
sqlDelight-JVM = { module = "app.cash.sqldelight:sqlite-driver", version.ref = "sqlDelight" }
napier = { module = "io.github.aakira:napier", version.ref = "napier" }
kotlinX-dateTime = { module = "org.jetbrains.kotlinx:kotlinx-datetime", version.ref = "kotlinxDateTime" }
multiplatformSettings-noArg = { module = "com.russhwolf:multiplatform-settings-no-arg", version.ref = "multiplatformSettings" }
multiplatformSettings-coroutines = { module = "com.russhwolf:multiplatform-settings-coroutines", version.ref = "multiplatformSettings" }
multiplatformSettings-test = { module = "com.russhwolf:multiplatform-settings-test", version.ref = "multiplatformSettings" }
material-windowSizeClass = { module = "dev.chrisbanes.material3:material3-window-size-class-multiplatform", version.ref = "materialWindowSizeClass" }
navigation = { module = "org.jetbrains.androidx.navigation:navigation-compose", version.ref = "navigation" }
coil-compose = { module = "io.coil-kt.coil3:coil-compose", version.ref = "coil" }
Expand Down Expand Up @@ -139,5 +137,4 @@ turbine = { module = "app.cash.turbine:turbine", version.ref = "turbine" }

[bundles]
ktor = ["ktor-core", "ktor-contentNegotiation", "ktor-json", "ktor-logging"]
coil = ["coil-compose-core", "coil-compose", "coil-ktor", "coil-multiplatform"]
multiplatformSettings = ["multiplatformSettings-coroutines", "multiplatformSettings-noArg"]
coil = ["coil-compose-core", "coil-compose", "coil-ktor", "coil-multiplatform"]
Binary file added notflix.preferences_pb
Binary file not shown.
4 changes: 2 additions & 2 deletions shared/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -62,8 +62,6 @@ kotlin {

implementation(libs.kotlinX.dateTime)

implementation(libs.bundles.multiplatformSettings)

api(libs.napier)

implementation(libs.bundles.coil)
Expand All @@ -72,6 +70,8 @@ kotlin {

implementation(libs.sqlDelight.coroutine)

implementation(libs.datastore.preferences)

// implementation(libs.material.windowSizeClass)
}

Expand Down
4 changes: 2 additions & 2 deletions shared/src/androidMain/kotlin/com/vickbt/shared/di/Module.kt
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
package com.vickbt.shared.di

import com.vickbt.shared.utils.DatabaseDriverFactory
import com.vickbt.shared.utils.MultiplatformSettingsWrapper
import com.vickbt.shared.utils.DatastoreFactory
import org.koin.core.module.Module
import org.koin.dsl.module

actual fun platformModule(): Module = module {
single { DatabaseDriverFactory(context = get()) }
single { MultiplatformSettingsWrapper().createSettings() }
single { DatastoreFactory(context = get()).createDatastore() }
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
package com.vickbt.shared.utils

import android.content.Context
import androidx.datastore.core.DataStore
import androidx.datastore.preferences.core.Preferences
import com.vickbt.shared.domain.utils.Constants

actual class DatastoreFactory(private val context: Context) {
actual fun createDatastore(): DataStore<Preferences> {
return initDataStore {
context.filesDir.resolve(Constants.dataStoreFileName).absolutePath
}
}
}

This file was deleted.

Original file line number Diff line number Diff line change
@@ -1,25 +1,34 @@
package com.vickbt.shared.data.datasources

import com.russhwolf.settings.ExperimentalSettingsApi
import com.russhwolf.settings.ObservableSettings
import com.russhwolf.settings.coroutines.getIntFlow
import androidx.datastore.core.DataStore
import androidx.datastore.preferences.core.Preferences
import androidx.datastore.preferences.core.edit
import androidx.datastore.preferences.core.intPreferencesKey
import com.vickbt.shared.domain.repositories.SettingsRepository
import com.vickbt.shared.domain.utils.Constants.KEY_IMAGE_QUALITY
import com.vickbt.shared.domain.utils.Constants.KEY_THEME
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.map

@ExperimentalSettingsApi
class SettingsRepositoryImpl(private val observableSettings: ObservableSettings) :
SettingsRepository {
class SettingsRepositoryImpl(
private val dataStore: DataStore<Preferences>
) : SettingsRepository {

override suspend fun savePreferenceSelection(key: String, selection: Int) =
observableSettings.putInt(key = key, value = selection)
override suspend fun savePreferenceSelection(key: String, selection: Int) {
dataStore.edit { preferences ->
preferences[intPreferencesKey(key)] = selection
}
}

override suspend fun getThemePreference(): Flow<Int> {
return observableSettings.getIntFlow(key = KEY_THEME, defaultValue = 2)
return dataStore.data.map { preferences ->
preferences[intPreferencesKey(KEY_THEME)] ?: 2
}
}

override suspend fun getImageQualityPreference(): Flow<Int> {
return observableSettings.getIntFlow(key = KEY_IMAGE_QUALITY, defaultValue = 1)
return dataStore.data.map { preferences ->
preferences[intPreferencesKey(KEY_IMAGE_QUALITY)] ?: 1
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -12,11 +12,11 @@ import com.vickbt.shared.domain.repositories.MoviesRepository
import com.vickbt.shared.domain.repositories.SettingsRepository
import com.vickbt.shared.domain.utils.Constants.BASE_URL
import com.vickbt.shared.domain.utils.Constants.URL_PATH
import com.vickbt.shared.ui.screens.details.DetailsViewModel
import com.vickbt.shared.ui.screens.favorites.FavoritesViewModel
import com.vickbt.shared.ui.screens.home.HomeViewModel
import com.vickbt.shared.ui.screens.main.MainViewModel
import com.vickbt.shared.ui.screens.settings.SettingsViewModel
import com.vickbt.shared.ui.screens.details.DetailsViewModel
import com.vickbt.shared.ui.screens.favorites.FavoritesViewModel
import io.github.aakira.napier.DebugAntilog
import io.github.aakira.napier.Napier
import io.ktor.client.HttpClient
Expand Down Expand Up @@ -84,7 +84,7 @@ fun commonModule(enableNetworkLogs: Boolean) = module {
MovieDetailsRepositoryImpl(httpClient = get(), favoriteMovieDao = get())
}
single<FavoritesRepository> { FavoritesRepositoryImpl(favoriteMovieDao = get()) }
single<SettingsRepository> { SettingsRepositoryImpl(observableSettings = get()) }
single<SettingsRepository> { SettingsRepositoryImpl(dataStore = get()) }

viewModelOf(::MainViewModel)
viewModelOf(::HomeViewModel)
Expand Down
13 changes: 0 additions & 13 deletions shared/src/commonMain/kotlin/com/vickbt/shared/di/Koin.kt
Original file line number Diff line number Diff line change
@@ -1,9 +1,5 @@
package com.vickbt.shared.di

import com.vickbt.shared.ui.screens.home.HomeViewModel
import com.vickbt.shared.ui.screens.main.MainViewModel
import com.vickbt.shared.ui.screens.settings.SettingsViewModel
import org.koin.core.Koin
import org.koin.core.KoinApplication
import org.koin.core.context.startKoin
import org.koin.dsl.KoinAppDeclaration
Expand All @@ -18,12 +14,3 @@ fun initKoin(enableNetworkLogs: Boolean = true, appDeclaration: KoinAppDeclarati
// fun initKoin() = initKoin(enableNetworkLogs = false) {}

fun KoinApplication.Companion.start(): KoinApplication = initKoin { }

val Koin.mainViewModel: MainViewModel
get() = get()

val Koin.homeViewModel: HomeViewModel
get() = get()

val Koin.settingsViewModel: SettingsViewModel
get() = get()
Original file line number Diff line number Diff line change
Expand Up @@ -16,4 +16,6 @@ object Constants {
const val KEY_THEME = "theme"
const val KEY_LANGUAGE = "language"
const val KEY_IMAGE_QUALITY = "image_quality"

internal const val dataStoreFileName = "notflix.preferences_pb"
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
package com.vickbt.shared.utils

import androidx.datastore.core.DataStore
import androidx.datastore.preferences.core.PreferenceDataStoreFactory
import androidx.datastore.preferences.core.Preferences
import okio.Path.Companion.toPath

expect class DatastoreFactory {
fun createDatastore(): DataStore<Preferences>
}

fun initDataStore(producePath: () -> String): DataStore<Preferences> =
PreferenceDataStoreFactory.createWithPath(
produceFile = { producePath().toPath() }
)

This file was deleted.

4 changes: 2 additions & 2 deletions shared/src/desktopMain/kotlin/com/vickbt/shared/di/Module.kt
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
package com.vickbt.shared.di

import com.vickbt.shared.utils.DatabaseDriverFactory
import com.vickbt.shared.utils.MultiplatformSettingsWrapper
import com.vickbt.shared.utils.DatastoreFactory
import org.koin.core.module.Module
import org.koin.dsl.module

actual fun platformModule(): Module = module {
single { DatabaseDriverFactory() }
single { MultiplatformSettingsWrapper().createSettings() }
single { DatastoreFactory().createDatastore() }
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package com.vickbt.shared.utils

import androidx.datastore.core.DataStore
import androidx.datastore.preferences.core.Preferences
import com.vickbt.shared.domain.utils.Constants

actual class DatastoreFactory {
actual fun createDatastore(): DataStore<Preferences> {
return initDataStore {
Constants.dataStoreFileName
}
}
}

This file was deleted.

4 changes: 2 additions & 2 deletions shared/src/iosMain/kotlin/com/vickbt/shared/di/Module.kt
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
package com.vickbt.shared.di

import com.vickbt.shared.utils.DatabaseDriverFactory
import com.vickbt.shared.utils.MultiplatformSettingsWrapper
import com.vickbt.shared.utils.DatastoreFactory
import org.koin.core.module.Module
import org.koin.dsl.module

actual fun platformModule(): Module = module {
single { DatabaseDriverFactory() }
single { MultiplatformSettingsWrapper().createSettings() }
single { DatastoreFactory().createDatastore() }
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
@file:OptIn(ExperimentalForeignApi::class)

package com.vickbt.shared.utils

import androidx.datastore.core.DataStore
import androidx.datastore.preferences.core.Preferences
import com.vickbt.shared.domain.utils.Constants
import kotlinx.cinterop.ExperimentalForeignApi
import platform.Foundation.NSDocumentDirectory
import platform.Foundation.NSFileManager
import platform.Foundation.NSUserDomainMask

actual class DatastoreFactory {
actual fun createDatastore(): DataStore<Preferences> {
return initDataStore {
val directory = NSFileManager.defaultManager.URLForDirectory(
directory = NSDocumentDirectory,
inDomain = NSUserDomainMask,
appropriateForURL = null,
create = false,
error = null
)
requireNotNull(directory).path() + "/${Constants.dataStoreFileName}"
}
}
}

This file was deleted.

0 comments on commit 009e04c

Please sign in to comment.