Skip to content

Commit

Permalink
feat(settings): support export and import json for preferences (Ashin…
Browse files Browse the repository at this point in the history
  • Loading branch information
Ashinch authored May 31, 2024
1 parent 66e38c4 commit a1e4383
Show file tree
Hide file tree
Showing 72 changed files with 803 additions and 793 deletions.
14 changes: 7 additions & 7 deletions app/src/main/java/me/ash/reader/domain/service/AccountService.kt
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ import me.ash.reader.domain.repository.AccountDao
import me.ash.reader.domain.repository.ArticleDao
import me.ash.reader.domain.repository.FeedDao
import me.ash.reader.domain.repository.GroupDao
import me.ash.reader.ui.ext.DataStoreKeys
import me.ash.reader.ui.ext.DataStoreKey
import me.ash.reader.ui.ext.currentAccountId
import me.ash.reader.ui.ext.dataStore
import me.ash.reader.ui.ext.getDefaultGroupId
Expand Down Expand Up @@ -54,8 +54,8 @@ class AccountService @Inject constructor(
)
}
}
context.dataStore.put(DataStoreKeys.CurrentAccountId, it.id!!)
context.dataStore.put(DataStoreKeys.CurrentAccountType, it.type.id)
context.dataStore.put(DataStoreKey.currentAccountId, it.id!!)
context.dataStore.put(DataStoreKey.currentAccountType, it.type.id)
}

suspend fun addDefaultAccount(): Account =
Expand Down Expand Up @@ -84,15 +84,15 @@ class AccountService @Inject constructor(
groupDao.deleteByAccountId(accountId)
accountDao.delete(it)
accountDao.queryAll().getOrNull(0)?.let {
context.dataStore.put(DataStoreKeys.CurrentAccountId, it.id!!)
context.dataStore.put(DataStoreKeys.CurrentAccountType, it.type.id)
context.dataStore.put(DataStoreKey.currentAccountId, it.id!!)
context.dataStore.put(DataStoreKey.currentAccountType, it.type.id)
}
}
}

suspend fun switch(account: Account) {
rssService.get().cancelSync()
context.dataStore.put(DataStoreKeys.CurrentAccountId, account.id!!)
context.dataStore.put(DataStoreKeys.CurrentAccountType, account.type.id)
context.dataStore.put(DataStoreKey.currentAccountId, account.id!!)
context.dataStore.put(DataStoreKey.currentAccountType, account.type.id)
}
}
Original file line number Diff line number Diff line change
@@ -1,23 +1,25 @@
package me.ash.reader.infrastructure.preference

import android.content.Context
import androidx.compose.runtime.compositionLocalOf
import androidx.datastore.preferences.core.Preferences
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.launch
import me.ash.reader.ui.ext.DataStoreKeys
import me.ash.reader.ui.ext.DataStoreKey
import me.ash.reader.ui.ext.DataStoreKey.Companion.amoledDarkTheme
import me.ash.reader.ui.ext.dataStore
import me.ash.reader.ui.ext.put

val LocalAmoledDarkTheme =
compositionLocalOf<AmoledDarkThemePreference> { AmoledDarkThemePreference.default }

sealed class AmoledDarkThemePreference(val value: Boolean) : Preference() {
object ON : AmoledDarkThemePreference(true)
object OFF : AmoledDarkThemePreference(false)

override fun put(context: Context, scope: CoroutineScope) {
scope.launch {
context.dataStore.put(
DataStoreKeys.AmoledDarkTheme,
value
)
context.dataStore.put(DataStoreKey.amoledDarkTheme, value)
}
}

Expand All @@ -27,7 +29,7 @@ sealed class AmoledDarkThemePreference(val value: Boolean) : Preference() {
val values = listOf(ON, OFF)

fun fromPreferences(preferences: Preferences) =
when (preferences[DataStoreKeys.AmoledDarkTheme.key]) {
when (preferences[DataStoreKey.keys[amoledDarkTheme]?.key as Preferences.Key<Boolean>]) {
true -> ON
false -> OFF
else -> default
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,25 +2,29 @@ package me.ash.reader.infrastructure.preference

import android.content.Context
import androidx.compose.material3.Typography
import androidx.compose.runtime.compositionLocalOf
import androidx.compose.ui.text.font.FontFamily
import androidx.datastore.preferences.core.Preferences
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.launch
import me.ash.reader.R
import me.ash.reader.ui.ext.DataStoreKeys
import me.ash.reader.ui.ext.DataStoreKey
import me.ash.reader.ui.ext.DataStoreKey.Companion.basicFonts
import me.ash.reader.ui.ext.ExternalFonts
import me.ash.reader.ui.ext.dataStore
import me.ash.reader.ui.ext.put
import me.ash.reader.ui.ext.restart
import me.ash.reader.ui.theme.SystemTypography

val LocalBasicFonts = compositionLocalOf<BasicFontsPreference> { BasicFontsPreference.default }

sealed class BasicFontsPreference(val value: Int) : Preference() {
object System : BasicFontsPreference(0)
object External : BasicFontsPreference(5)

override fun put(context: Context, scope: CoroutineScope) {
scope.launch {
context.dataStore.put(DataStoreKeys.BasicFonts, value)
context.dataStore.put(DataStoreKey.basicFonts, value)
if (this@BasicFontsPreference == External) {
context.restart()
}
Expand Down Expand Up @@ -51,7 +55,7 @@ sealed class BasicFontsPreference(val value: Int) : Preference() {
val values = listOf(System, External)

fun fromPreferences(preferences: Preferences): BasicFontsPreference =
when (preferences[DataStoreKeys.BasicFonts.key]) {
when (preferences[DataStoreKey.keys[basicFonts]?.key as Preferences.Key<Int>]) {
0 -> System
5 -> External
else -> default
Expand Down
Original file line number Diff line number Diff line change
@@ -1,23 +1,28 @@
package me.ash.reader.infrastructure.preference

import android.content.Context
import androidx.compose.runtime.compositionLocalOf
import androidx.datastore.preferences.core.Preferences
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.launch
import me.ash.reader.ui.ext.DataStoreKeys
import me.ash.reader.ui.ext.DataStoreKey
import me.ash.reader.ui.ext.DataStoreKey.Companion.customPrimaryColor
import me.ash.reader.ui.ext.dataStore
import me.ash.reader.ui.ext.put

val LocalCustomPrimaryColor =
compositionLocalOf { CustomPrimaryColorPreference.default }

object CustomPrimaryColorPreference {

const val default = ""

fun put(context: Context, scope: CoroutineScope, value: String) {
scope.launch {
context.dataStore.put(DataStoreKeys.CustomPrimaryColor, value)
context.dataStore.put(DataStoreKey.customPrimaryColor, value)
}
}

fun fromPreferences(preferences: Preferences) =
preferences[DataStoreKeys.CustomPrimaryColor.key] ?: default
preferences[DataStoreKey.keys[customPrimaryColor]?.key as Preferences.Key<String>] ?: default
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,25 +4,27 @@ import android.content.Context
import androidx.compose.foundation.isSystemInDarkTheme
import androidx.compose.runtime.Composable
import androidx.compose.runtime.ReadOnlyComposable
import androidx.compose.runtime.compositionLocalOf
import androidx.datastore.preferences.core.Preferences
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.launch
import me.ash.reader.R
import me.ash.reader.ui.ext.DataStoreKeys
import me.ash.reader.ui.ext.DataStoreKey
import me.ash.reader.ui.ext.DataStoreKey.Companion.darkTheme
import me.ash.reader.ui.ext.dataStore
import me.ash.reader.ui.ext.put

val LocalDarkTheme =
compositionLocalOf<DarkThemePreference> { DarkThemePreference.default }

sealed class DarkThemePreference(val value: Int) : Preference() {
object UseDeviceTheme : DarkThemePreference(0)
object ON : DarkThemePreference(1)
object OFF : DarkThemePreference(2)

override fun put(context: Context, scope: CoroutineScope) {
scope.launch {
context.dataStore.put(
DataStoreKeys.DarkTheme,
value
)
context.dataStore.put(darkTheme, value)
}
}

Expand All @@ -47,7 +49,7 @@ sealed class DarkThemePreference(val value: Int) : Preference() {
val values = listOf(UseDeviceTheme, ON, OFF)

fun fromPreferences(preferences: Preferences) =
when (preferences[DataStoreKeys.DarkTheme.key]) {
when (preferences[DataStoreKey.keys[darkTheme]?.key as Preferences.Key<Int>]) {
0 -> UseDeviceTheme
1 -> ON
2 -> OFF
Expand Down
Original file line number Diff line number Diff line change
@@ -1,23 +1,25 @@
package me.ash.reader.infrastructure.preference

import android.content.Context
import androidx.compose.runtime.compositionLocalOf
import androidx.datastore.preferences.core.Preferences
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.launch
import me.ash.reader.ui.ext.DataStoreKeys
import me.ash.reader.ui.ext.DataStoreKey
import me.ash.reader.ui.ext.DataStoreKey.Companion.feedsFilterBarFilled
import me.ash.reader.ui.ext.dataStore
import me.ash.reader.ui.ext.put

val LocalFeedsFilterBarFilled =
compositionLocalOf<FeedsFilterBarFilledPreference> { FeedsFilterBarFilledPreference.default }

sealed class FeedsFilterBarFilledPreference(val value: Boolean) : Preference() {
object ON : FeedsFilterBarFilledPreference(true)
object OFF : FeedsFilterBarFilledPreference(false)

override fun put(context: Context, scope: CoroutineScope) {
scope.launch {
context.dataStore.put(
DataStoreKeys.FeedsFilterBarFilled,
value
)
context.dataStore.put(DataStoreKey.feedsFilterBarFilled, value)
}
}

Expand All @@ -27,7 +29,7 @@ sealed class FeedsFilterBarFilledPreference(val value: Boolean) : Preference() {
val values = listOf(ON, OFF)

fun fromPreferences(preferences: Preferences) =
when (preferences[DataStoreKeys.FeedsFilterBarFilled.key]) {
when (preferences[DataStoreKey.keys[feedsFilterBarFilled]?.key as Preferences.Key<Boolean>]) {
true -> ON
false -> OFF
else -> default
Expand Down
Original file line number Diff line number Diff line change
@@ -1,23 +1,28 @@
package me.ash.reader.infrastructure.preference

import android.content.Context
import androidx.compose.runtime.compositionLocalOf
import androidx.datastore.preferences.core.Preferences
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.launch
import me.ash.reader.ui.ext.DataStoreKeys
import me.ash.reader.ui.ext.DataStoreKey
import me.ash.reader.ui.ext.DataStoreKey.Companion.feedsFilterBarPadding
import me.ash.reader.ui.ext.dataStore
import me.ash.reader.ui.ext.put

val LocalFeedsFilterBarPadding =
compositionLocalOf { FeedsFilterBarPaddingPreference.default }

object FeedsFilterBarPaddingPreference {

const val default = 60

fun put(context: Context, scope: CoroutineScope, value: Int) {
scope.launch {
context.dataStore.put(DataStoreKeys.FeedsFilterBarPadding, value)
context.dataStore.put(DataStoreKey.feedsFilterBarPadding, value)
}
}

fun fromPreferences(preferences: Preferences) =
preferences[DataStoreKeys.FeedsFilterBarPadding.key] ?: default
preferences[DataStoreKey.keys[feedsFilterBarPadding]?.key as Preferences.Key<Int>] ?: default
}
Original file line number Diff line number Diff line change
@@ -1,14 +1,19 @@
package me.ash.reader.infrastructure.preference

import android.content.Context
import androidx.compose.runtime.compositionLocalOf
import androidx.datastore.preferences.core.Preferences
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.launch
import me.ash.reader.R
import me.ash.reader.ui.ext.DataStoreKeys
import me.ash.reader.ui.ext.DataStoreKey
import me.ash.reader.ui.ext.DataStoreKey.Companion.feedsFilterBarStyle
import me.ash.reader.ui.ext.dataStore
import me.ash.reader.ui.ext.put

val LocalFeedsFilterBarStyle =
compositionLocalOf<FeedsFilterBarStylePreference> { FeedsFilterBarStylePreference.default }

sealed class FeedsFilterBarStylePreference(val value: Int) : Preference() {
object Icon : FeedsFilterBarStylePreference(0)
object IconLabel : FeedsFilterBarStylePreference(1)
Expand All @@ -17,7 +22,7 @@ sealed class FeedsFilterBarStylePreference(val value: Int) : Preference() {
override fun put(context: Context, scope: CoroutineScope) {
scope.launch {
context.dataStore.put(
DataStoreKeys.FeedsFilterBarStyle,
DataStoreKey.feedsFilterBarStyle,
value
)
}
Expand All @@ -36,7 +41,7 @@ sealed class FeedsFilterBarStylePreference(val value: Int) : Preference() {
val values = listOf(Icon, IconLabel, IconLabelOnlySelected)

fun fromPreferences(preferences: Preferences): FeedsFilterBarStylePreference =
when (preferences[DataStoreKeys.FeedsFilterBarStyle.key]) {
when (preferences[DataStoreKey.keys[feedsFilterBarStyle]?.key as Preferences.Key<Int>]) {
0 -> Icon
1 -> IconLabel
2 -> IconLabelOnlySelected
Expand Down
Original file line number Diff line number Diff line change
@@ -1,14 +1,19 @@
package me.ash.reader.infrastructure.preference

import android.content.Context
import androidx.compose.runtime.compositionLocalOf
import androidx.datastore.preferences.core.Preferences
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.launch
import me.ash.reader.domain.model.constant.ElevationTokens
import me.ash.reader.ui.ext.DataStoreKeys
import me.ash.reader.ui.ext.DataStoreKey
import me.ash.reader.ui.ext.DataStoreKey.Companion.feedsFilterBarTonalElevation
import me.ash.reader.ui.ext.dataStore
import me.ash.reader.ui.ext.put

val LocalFeedsFilterBarTonalElevation =
compositionLocalOf<FeedsFilterBarTonalElevationPreference> { FeedsFilterBarTonalElevationPreference.default }

sealed class FeedsFilterBarTonalElevationPreference(val value: Int) : Preference() {
object Level0 : FeedsFilterBarTonalElevationPreference(ElevationTokens.Level0)
object Level1 : FeedsFilterBarTonalElevationPreference(ElevationTokens.Level1)
Expand All @@ -20,7 +25,7 @@ sealed class FeedsFilterBarTonalElevationPreference(val value: Int) : Preference
override fun put(context: Context, scope: CoroutineScope) {
scope.launch {
context.dataStore.put(
DataStoreKeys.FeedsFilterBarTonalElevation,
DataStoreKey.feedsFilterBarTonalElevation,
value
)
}
Expand All @@ -42,7 +47,7 @@ sealed class FeedsFilterBarTonalElevationPreference(val value: Int) : Preference
val values = listOf(Level0, Level1, Level2, Level3, Level4, Level5)

fun fromPreferences(preferences: Preferences) =
when (preferences[DataStoreKeys.FeedsFilterBarTonalElevation.key]) {
when (preferences[DataStoreKey.keys[feedsFilterBarTonalElevation]?.key as Preferences.Key<Int>]) {
ElevationTokens.Level0 -> Level0
ElevationTokens.Level1 -> Level1
ElevationTokens.Level2 -> Level2
Expand Down
Original file line number Diff line number Diff line change
@@ -1,21 +1,26 @@
package me.ash.reader.infrastructure.preference

import android.content.Context
import androidx.compose.runtime.compositionLocalOf
import androidx.datastore.preferences.core.Preferences
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.launch
import me.ash.reader.ui.ext.DataStoreKeys
import me.ash.reader.ui.ext.DataStoreKey
import me.ash.reader.ui.ext.DataStoreKey.Companion.feedsGroupListExpand
import me.ash.reader.ui.ext.dataStore
import me.ash.reader.ui.ext.put

val LocalFeedsGroupListExpand =
compositionLocalOf<FeedsGroupListExpandPreference> { FeedsGroupListExpandPreference.default }

sealed class FeedsGroupListExpandPreference(val value: Boolean) : Preference() {
object ON : FeedsGroupListExpandPreference(true)
object OFF : FeedsGroupListExpandPreference(false)

override fun put(context: Context, scope: CoroutineScope) {
scope.launch {
context.dataStore.put(
DataStoreKeys.FeedsGroupListExpand,
DataStoreKey.feedsGroupListExpand,
value
)
}
Expand All @@ -27,7 +32,7 @@ sealed class FeedsGroupListExpandPreference(val value: Boolean) : Preference() {
val values = listOf(ON, OFF)

fun fromPreferences(preferences: Preferences) =
when (preferences[DataStoreKeys.FeedsGroupListExpand.key]) {
when (preferences[DataStoreKey.keys[feedsGroupListExpand]?.key as Preferences.Key<Boolean>]) {
true -> ON
false -> OFF
else -> default
Expand Down
Loading

0 comments on commit a1e4383

Please sign in to comment.