Skip to content

Commit

Permalink
Extracts ApplicationPreferencesMigrations out of ApplicationPreferenc…
Browse files Browse the repository at this point in the history
…esImpl
  • Loading branch information
meikpiep committed Feb 26, 2025
1 parent 6accc61 commit cac6b94
Show file tree
Hide file tree
Showing 6 changed files with 121 additions and 72 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ import org.koin.core.module.dsl.withOptions
import org.koin.dsl.module
import org.piepmeyer.gauguin.preferences.ApplicationPreferences
import org.piepmeyer.gauguin.preferences.ApplicationPreferencesImpl
import org.piepmeyer.gauguin.preferences.ApplicationPreferencesMigrations
import org.piepmeyer.gauguin.preferences.StatisticsManager
import org.piepmeyer.gauguin.preferences.StatisticsManagerImpl
import org.piepmeyer.gauguin.ui.ActivityUtils
Expand All @@ -28,7 +29,8 @@ class MainApplication : Application() {
logger.info { "Starting application Gauguin..." }

val applicationPreferences = ApplicationPreferencesImpl(this)
applicationPreferences.migrateThemeToNightModeIfNecessary()
val preferenceMigrations = ApplicationPreferencesMigrations(applicationPreferences)
preferenceMigrations.migrateThemeToNightModeIfNecessary()

val options =
DynamicColorsOptions
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,39 +24,15 @@ class ApplicationPreferencesImpl(
preferences.edit { clear() }
}

override fun migrateThemeToNightModeIfNecessary() {
if (!preferences.getString("nightMode", null).isNullOrEmpty()) {
return
}

val oldThemeValue = preferences.getString("theme", null)
/*
* Possible values:
* LIGHT
* DARK
* SYSTEM_DEFAULT
* DYNAMIC_COLORS
*/

val (newThemeValue, newNightModeValue) = migrateToNewThemeNightModesValues(oldThemeValue)

theme = newThemeValue
nightMode = newNightModeValue
}

fun migrateToNewThemeNightModesValues(oldThemeValue: String?): Pair<Theme, NightMode> {
val newThemeValue = if (oldThemeValue == "DYNAMIC_COLORS") Theme.DYNAMIC_COLORS else Theme.GAUGUIN

val newNightModeValue =
when (oldThemeValue) {
"LIGHT", "DYNAMIC_COLORS" -> NightMode.LIGHT
"DARK" -> NightMode.DARK
"SYSTEM_DEFAULT" -> NightMode.SYSTEM_DEFAULT
else -> NightMode.DARK
}

return Pair(newThemeValue, newNightModeValue)
}
override fun getString(
key: String?,
defValue: String?,
): String? = preferences.getString(key, defValue)

override fun getStringSet(
key: String?,
defValues: Set<String?>?,
): Set<String?>? = preferences.getStringSet(key, defValues)

override var theme: Theme
get() {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,8 +1,6 @@
package org.piepmeyer.gauguin.preferences

import android.content.SharedPreferences
import io.kotest.assertions.assertSoftly
import io.kotest.assertions.withClue
import io.kotest.core.spec.style.FunSpec
import io.kotest.datatest.withData
import io.kotest.matchers.shouldBe
Expand Down Expand Up @@ -63,39 +61,4 @@ class ApplicationPreferencesImplTest :

preferences.theme shouldBe testData.expectedTheme
}

data class OldThemeMigrationTestData(
val sharedPreferenceValue: String?,
val expectedTheme: Theme,
val expectedNightMode: NightMode,
)

withData(
OldThemeMigrationTestData(null, Theme.GAUGUIN, NightMode.DARK),
OldThemeMigrationTestData("unknown", Theme.GAUGUIN, NightMode.DARK),
OldThemeMigrationTestData("DARK", Theme.GAUGUIN, NightMode.DARK),
OldThemeMigrationTestData("LIGHT", Theme.GAUGUIN, NightMode.LIGHT),
OldThemeMigrationTestData("DYNAMIC_COLORS", Theme.DYNAMIC_COLORS, NightMode.LIGHT),
OldThemeMigrationTestData("SYSTEM_DEFAULT", Theme.GAUGUIN, NightMode.SYSTEM_DEFAULT),
) { testData ->
val sharedPreferences =
mockk<SharedPreferences>()

val preferences =
ApplicationPreferencesImpl(
mockk(),
sharedPreferences,
)

val (theme, nightMode) = preferences.migrateToNewThemeNightModesValues(testData.sharedPreferenceValue)

assertSoftly {
withClue("theme") {
theme shouldBe testData.expectedTheme
}
withClue("nightMode") {
nightMode shouldBe testData.expectedNightMode
}
}
}
})
Original file line number Diff line number Diff line change
Expand Up @@ -61,5 +61,13 @@ interface ApplicationPreferences {

var mergingCageAlgorithm: Boolean

fun migrateThemeToNightModeIfNecessary()
fun getString(
key: String?,
defValue: String?,
): String?

fun getStringSet(
key: String?,
defValues: Set<String?>?,
): Set<String?>?
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
package org.piepmeyer.gauguin.preferences

import org.piepmeyer.gauguin.NightMode
import org.piepmeyer.gauguin.Theme

class ApplicationPreferencesMigrations(
private val applicationPreferences: ApplicationPreferences,
) {
fun migrateThemeToNightModeIfNecessary() {
if (applicationPreferences.getString("nightMode", null) != null) {
return
}

val oldThemeValue = applicationPreferences.getString("theme", null)
/*
* Possible values:
* LIGHT
* DARK
* SYSTEM_DEFAULT
* DYNAMIC_COLORS
*/

val (newThemeValue, newNightModeValue) = migrateToNewThemeNightModesValues(oldThemeValue)

applicationPreferences.theme = newThemeValue
applicationPreferences.nightMode = newNightModeValue
}

private fun migrateToNewThemeNightModesValues(oldThemeValue: String?): Pair<Theme, NightMode> {
val newThemeValue = if (oldThemeValue == "DYNAMIC_COLORS") Theme.DYNAMIC_COLORS else Theme.GAUGUIN

val newNightModeValue =
when (oldThemeValue) {
"LIGHT", "DYNAMIC_COLORS" -> NightMode.LIGHT
"DARK" -> NightMode.DARK
"SYSTEM_DEFAULT" -> NightMode.SYSTEM_DEFAULT
else -> NightMode.DARK
}

return Pair(newThemeValue, newNightModeValue)
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
package org.piepmeyer.gauguin.preferences

import io.kotest.core.spec.style.FunSpec
import io.kotest.datatest.withData
import io.mockk.every
import io.mockk.just
import io.mockk.mockk
import io.mockk.runs
import io.mockk.verify
import org.piepmeyer.gauguin.NightMode
import org.piepmeyer.gauguin.Theme

class ApplicationPreferencesMigrationsTest :
FunSpec({
test("night mode migration gets not triggered if night mode is already in use") {
val preferences =
mockk<ApplicationPreferences> {
every { getString("nightMode", null) } returns "DARK"
// no setter of 'nightMode' or 'theme' allowed here
}

val migrations = ApplicationPreferencesMigrations(preferences)

migrations.migrateThemeToNightModeIfNecessary()
}

data class OldThemeMigrationTestData(
val sharedPreferenceValue: String?,
val expectedTheme: Theme,
val expectedNightMode: NightMode,
)

withData(
OldThemeMigrationTestData(null, Theme.GAUGUIN, NightMode.DARK),
OldThemeMigrationTestData("unknown", Theme.GAUGUIN, NightMode.DARK),
OldThemeMigrationTestData("DARK", Theme.GAUGUIN, NightMode.DARK),
OldThemeMigrationTestData("LIGHT", Theme.GAUGUIN, NightMode.LIGHT),
OldThemeMigrationTestData("DYNAMIC_COLORS", Theme.DYNAMIC_COLORS, NightMode.LIGHT),
OldThemeMigrationTestData("SYSTEM_DEFAULT", Theme.GAUGUIN, NightMode.SYSTEM_DEFAULT),
) { testData ->
val preferences =
mockk<ApplicationPreferences> {
every { getString("nightMode", null) } returns null
every { getString("theme", null) } returns testData.sharedPreferenceValue
every { theme = testData.expectedTheme } just runs
every { nightMode = testData.expectedNightMode } just runs
}

val migrations = ApplicationPreferencesMigrations(preferences)

migrations.migrateThemeToNightModeIfNecessary()

verify {
preferences.theme = testData.expectedTheme
preferences.nightMode = testData.expectedNightMode
}
}
})

0 comments on commit cac6b94

Please sign in to comment.