Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Migrate from multiplatform-settings to datastore #114

Merged
merged 6 commits into from
Jul 24, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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.

Loading