From a1e4383441bde12b4f39b5ca68db556b3c40d193 Mon Sep 17 00:00:00 2001 From: Ash Date: Fri, 31 May 2024 15:11:39 +0800 Subject: [PATCH] feat(settings): support export and import json for preferences (#710) --- .../reader/domain/service/AccountService.kt | 14 +- .../preference/AmoledDarkThemePreference.kt | 14 +- .../preference/BasicFontsPreference.kt | 10 +- .../CustomPrimaryColorPreference.kt | 11 +- .../preference/DarkThemePreference.kt | 14 +- .../FeedsFilterBarFilledPreference.kt | 14 +- .../FeedsFilterBarPaddingPreference.kt | 11 +- .../FeedsFilterBarStylePreference.kt | 11 +- .../FeedsFilterBarTonalElevationPreference.kt | 11 +- .../FeedsGroupListExpandPreference.kt | 11 +- .../FeedsGroupListTonalElevationPreference.kt | 11 +- .../FeedsTopBarTonalElevationPreference.kt | 11 +- ...owArticleListDateStickyHeaderPreference.kt | 11 +- .../FlowArticleListDescPreference.kt | 11 +- .../FlowArticleListFeedIconPreference.kt | 11 +- .../FlowArticleListFeedNamePreference.kt | 11 +- .../FlowArticleListImagePreference.kt | 11 +- .../FlowArticleListTimePreference.kt | 11 +- ...FlowArticleListTonalElevationPreference.kt | 11 +- .../FlowArticleReadIndicatorPreference.kt | 13 +- .../FlowFilterBarFilledPreference.kt | 11 +- .../FlowFilterBarPaddingPreference.kt | 11 +- .../FlowFilterBarStylePreference.kt | 11 +- .../FlowFilterBarTonalElevationPreference.kt | 11 +- .../FlowTopBarTonalElevationPreference.kt | 14 +- .../preference/InitialFilterPreference.kt | 11 +- .../preference/InitialPagePreference.kt | 10 +- .../preference/LanguagesPreference.kt | 14 +- .../NewVersionDownloadUrlPreference.kt | 10 +- .../preference/NewVersionLogPreference.kt | 10 +- .../preference/NewVersionNumberPreference.kt | 14 +- .../NewVersionPublishDatePreference.kt | 10 +- .../preference/NewVersionSizePreference.kt | 10 +- .../preference/OpenLinkPreference.kt | 11 +- .../OpenLinkSpecificBrowserPreference.kt | 10 +- .../infrastructure/preference/Preference.kt | 2 +- .../PullToSwitchArticlePreference.kt | 12 +- .../ReadingAutoHideToolbarPreference.kt | 11 +- .../preference/ReadingDarkThemePreference.kt | 11 +- .../preference/ReadingFontsPreference.kt | 11 +- ...ReadingImageHorizontalPaddingPreference.kt | 11 +- .../ReadingImageMaximizePreference.kt | 11 +- .../ReadingImageRoundedCornersPreference.kt | 11 +- .../ReadingLetterSpacingPreference.kt | 23 - .../ReadingPageTonalElevationPreference.kt | 11 +- .../ReadingSubheadAlignPreference.kt | 11 +- .../ReadingSubheadBoldPreference.kt | 11 +- .../ReadingSubheadUpperCasePreference.kt | 11 +- .../preference/ReadingTextAlignPreference.kt | 11 +- .../preference/ReadingTextBoldPreference.kt | 11 +- .../ReadingTextFontSizePreference.kt | 10 +- .../ReadingTextHorizontalPaddingPreference.kt | 11 +- .../ReadingTextLetterSpacingPreference.kt | 27 + .../ReadingTextLineHeightPreference.kt | 12 +- .../preference/ReadingThemePreference.kt | 19 +- .../preference/ReadingTitleAlignPreference.kt | 11 +- .../preference/ReadingTitleBoldPreference.kt | 11 +- .../ReadingTitleUpperCasePreference.kt | 11 +- .../infrastructure/preference/Settings.kt | 124 +--- .../preference/SharedContentPreference.kt | 10 +- .../preference/SkipVersionNumberPreference.kt | 10 +- .../preference/SwipeActionPreference.kt | 21 +- .../preference/ThemeIndexPreference.kt | 11 +- .../ash/reader/ui/component/reader/Styles.kt | 2 +- .../java/me/ash/reader/ui/ext/ContextExt.kt | 6 - .../java/me/ash/reader/ui/ext/DataStoreExt.kt | 621 ++++++------------ .../settings/color/reading/ReadingTextPage.kt | 47 +- .../page/settings/tips/TipsAndSupportPage.kt | 7 +- .../troubleshooting/TroubleshootingPage.kt | 15 +- .../TroubleshootingViewModel.kt | 12 +- .../ash/reader/ui/page/startup/StartupPage.kt | 25 +- app/src/main/res/values/strings.xml | 3 + 72 files changed, 803 insertions(+), 793 deletions(-) delete mode 100644 app/src/main/java/me/ash/reader/infrastructure/preference/ReadingLetterSpacingPreference.kt create mode 100644 app/src/main/java/me/ash/reader/infrastructure/preference/ReadingTextLetterSpacingPreference.kt diff --git a/app/src/main/java/me/ash/reader/domain/service/AccountService.kt b/app/src/main/java/me/ash/reader/domain/service/AccountService.kt index 55cd4640c..72ca9277e 100644 --- a/app/src/main/java/me/ash/reader/domain/service/AccountService.kt +++ b/app/src/main/java/me/ash/reader/domain/service/AccountService.kt @@ -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 @@ -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 = @@ -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) } } diff --git a/app/src/main/java/me/ash/reader/infrastructure/preference/AmoledDarkThemePreference.kt b/app/src/main/java/me/ash/reader/infrastructure/preference/AmoledDarkThemePreference.kt index 87c878843..89276ae13 100644 --- a/app/src/main/java/me/ash/reader/infrastructure/preference/AmoledDarkThemePreference.kt +++ b/app/src/main/java/me/ash/reader/infrastructure/preference/AmoledDarkThemePreference.kt @@ -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.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) } } @@ -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]) { true -> ON false -> OFF else -> default diff --git a/app/src/main/java/me/ash/reader/infrastructure/preference/BasicFontsPreference.kt b/app/src/main/java/me/ash/reader/infrastructure/preference/BasicFontsPreference.kt index 699ba192e..377393bea 100644 --- a/app/src/main/java/me/ash/reader/infrastructure/preference/BasicFontsPreference.kt +++ b/app/src/main/java/me/ash/reader/infrastructure/preference/BasicFontsPreference.kt @@ -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.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() } @@ -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]) { 0 -> System 5 -> External else -> default diff --git a/app/src/main/java/me/ash/reader/infrastructure/preference/CustomPrimaryColorPreference.kt b/app/src/main/java/me/ash/reader/infrastructure/preference/CustomPrimaryColorPreference.kt index 8eb16bcf4..9cc2a696c 100644 --- a/app/src/main/java/me/ash/reader/infrastructure/preference/CustomPrimaryColorPreference.kt +++ b/app/src/main/java/me/ash/reader/infrastructure/preference/CustomPrimaryColorPreference.kt @@ -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] ?: default } diff --git a/app/src/main/java/me/ash/reader/infrastructure/preference/DarkThemePreference.kt b/app/src/main/java/me/ash/reader/infrastructure/preference/DarkThemePreference.kt index 91bd776b9..a3c4b2861 100644 --- a/app/src/main/java/me/ash/reader/infrastructure/preference/DarkThemePreference.kt +++ b/app/src/main/java/me/ash/reader/infrastructure/preference/DarkThemePreference.kt @@ -4,14 +4,19 @@ 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.default } + sealed class DarkThemePreference(val value: Int) : Preference() { object UseDeviceTheme : DarkThemePreference(0) object ON : DarkThemePreference(1) @@ -19,10 +24,7 @@ sealed class DarkThemePreference(val value: Int) : Preference() { override fun put(context: Context, scope: CoroutineScope) { scope.launch { - context.dataStore.put( - DataStoreKeys.DarkTheme, - value - ) + context.dataStore.put(darkTheme, value) } } @@ -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]) { 0 -> UseDeviceTheme 1 -> ON 2 -> OFF diff --git a/app/src/main/java/me/ash/reader/infrastructure/preference/FeedsFilterBarFilledPreference.kt b/app/src/main/java/me/ash/reader/infrastructure/preference/FeedsFilterBarFilledPreference.kt index 658d8a0bc..24cf1c797 100644 --- a/app/src/main/java/me/ash/reader/infrastructure/preference/FeedsFilterBarFilledPreference.kt +++ b/app/src/main/java/me/ash/reader/infrastructure/preference/FeedsFilterBarFilledPreference.kt @@ -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.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) } } @@ -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]) { true -> ON false -> OFF else -> default diff --git a/app/src/main/java/me/ash/reader/infrastructure/preference/FeedsFilterBarPaddingPreference.kt b/app/src/main/java/me/ash/reader/infrastructure/preference/FeedsFilterBarPaddingPreference.kt index c8ff6a090..0b14c0b60 100644 --- a/app/src/main/java/me/ash/reader/infrastructure/preference/FeedsFilterBarPaddingPreference.kt +++ b/app/src/main/java/me/ash/reader/infrastructure/preference/FeedsFilterBarPaddingPreference.kt @@ -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] ?: default } diff --git a/app/src/main/java/me/ash/reader/infrastructure/preference/FeedsFilterBarStylePreference.kt b/app/src/main/java/me/ash/reader/infrastructure/preference/FeedsFilterBarStylePreference.kt index 09ade6290..72e85c49b 100644 --- a/app/src/main/java/me/ash/reader/infrastructure/preference/FeedsFilterBarStylePreference.kt +++ b/app/src/main/java/me/ash/reader/infrastructure/preference/FeedsFilterBarStylePreference.kt @@ -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.default } + sealed class FeedsFilterBarStylePreference(val value: Int) : Preference() { object Icon : FeedsFilterBarStylePreference(0) object IconLabel : FeedsFilterBarStylePreference(1) @@ -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 ) } @@ -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]) { 0 -> Icon 1 -> IconLabel 2 -> IconLabelOnlySelected diff --git a/app/src/main/java/me/ash/reader/infrastructure/preference/FeedsFilterBarTonalElevationPreference.kt b/app/src/main/java/me/ash/reader/infrastructure/preference/FeedsFilterBarTonalElevationPreference.kt index 3d7bb9654..e10b099c8 100644 --- a/app/src/main/java/me/ash/reader/infrastructure/preference/FeedsFilterBarTonalElevationPreference.kt +++ b/app/src/main/java/me/ash/reader/infrastructure/preference/FeedsFilterBarTonalElevationPreference.kt @@ -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.default } + sealed class FeedsFilterBarTonalElevationPreference(val value: Int) : Preference() { object Level0 : FeedsFilterBarTonalElevationPreference(ElevationTokens.Level0) object Level1 : FeedsFilterBarTonalElevationPreference(ElevationTokens.Level1) @@ -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 ) } @@ -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]) { ElevationTokens.Level0 -> Level0 ElevationTokens.Level1 -> Level1 ElevationTokens.Level2 -> Level2 diff --git a/app/src/main/java/me/ash/reader/infrastructure/preference/FeedsGroupListExpandPreference.kt b/app/src/main/java/me/ash/reader/infrastructure/preference/FeedsGroupListExpandPreference.kt index 292128509..fdbb21dc8 100644 --- a/app/src/main/java/me/ash/reader/infrastructure/preference/FeedsGroupListExpandPreference.kt +++ b/app/src/main/java/me/ash/reader/infrastructure/preference/FeedsGroupListExpandPreference.kt @@ -1,13 +1,18 @@ 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.default } + sealed class FeedsGroupListExpandPreference(val value: Boolean) : Preference() { object ON : FeedsGroupListExpandPreference(true) object OFF : FeedsGroupListExpandPreference(false) @@ -15,7 +20,7 @@ sealed class FeedsGroupListExpandPreference(val value: Boolean) : Preference() { override fun put(context: Context, scope: CoroutineScope) { scope.launch { context.dataStore.put( - DataStoreKeys.FeedsGroupListExpand, + DataStoreKey.feedsGroupListExpand, value ) } @@ -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]) { true -> ON false -> OFF else -> default diff --git a/app/src/main/java/me/ash/reader/infrastructure/preference/FeedsGroupListTonalElevationPreference.kt b/app/src/main/java/me/ash/reader/infrastructure/preference/FeedsGroupListTonalElevationPreference.kt index 6bba0b797..1681d9910 100644 --- a/app/src/main/java/me/ash/reader/infrastructure/preference/FeedsGroupListTonalElevationPreference.kt +++ b/app/src/main/java/me/ash/reader/infrastructure/preference/FeedsGroupListTonalElevationPreference.kt @@ -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.feedsGroupListTonalElevation import me.ash.reader.ui.ext.dataStore import me.ash.reader.ui.ext.put +val LocalFeedsGroupListTonalElevation = + compositionLocalOf { FeedsGroupListTonalElevationPreference.default } + sealed class FeedsGroupListTonalElevationPreference(val value: Int) : Preference() { object Level0 : FeedsGroupListTonalElevationPreference(ElevationTokens.Level0) object Level1 : FeedsGroupListTonalElevationPreference(ElevationTokens.Level1) @@ -20,7 +25,7 @@ sealed class FeedsGroupListTonalElevationPreference(val value: Int) : Preference override fun put(context: Context, scope: CoroutineScope) { scope.launch { context.dataStore.put( - DataStoreKeys.FeedsGroupListTonalElevation, + DataStoreKey.feedsGroupListTonalElevation, value ) } @@ -42,7 +47,7 @@ sealed class FeedsGroupListTonalElevationPreference(val value: Int) : Preference val values = listOf(Level0, Level1, Level2, Level3, Level4, Level5) fun fromPreferences(preferences: Preferences) = - when (preferences[DataStoreKeys.FeedsGroupListTonalElevation.key]) { + when (preferences[DataStoreKey.keys[feedsGroupListTonalElevation]?.key as Preferences.Key]) { ElevationTokens.Level0 -> Level0 ElevationTokens.Level1 -> Level1 ElevationTokens.Level2 -> Level2 diff --git a/app/src/main/java/me/ash/reader/infrastructure/preference/FeedsTopBarTonalElevationPreference.kt b/app/src/main/java/me/ash/reader/infrastructure/preference/FeedsTopBarTonalElevationPreference.kt index c756ab0ec..c329c84cd 100644 --- a/app/src/main/java/me/ash/reader/infrastructure/preference/FeedsTopBarTonalElevationPreference.kt +++ b/app/src/main/java/me/ash/reader/infrastructure/preference/FeedsTopBarTonalElevationPreference.kt @@ -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.feedsTopBarTonalElevation import me.ash.reader.ui.ext.dataStore import me.ash.reader.ui.ext.put +val LocalFeedsTopBarTonalElevation = + compositionLocalOf { FeedsTopBarTonalElevationPreference.default } + sealed class FeedsTopBarTonalElevationPreference(val value: Int) : Preference() { object Level0 : FeedsTopBarTonalElevationPreference(ElevationTokens.Level0) object Level1 : FeedsTopBarTonalElevationPreference(ElevationTokens.Level1) @@ -20,7 +25,7 @@ sealed class FeedsTopBarTonalElevationPreference(val value: Int) : Preference() override fun put(context: Context, scope: CoroutineScope) { scope.launch { context.dataStore.put( - DataStoreKeys.FeedsTopBarTonalElevation, + DataStoreKey.feedsTopBarTonalElevation, value ) } @@ -42,7 +47,7 @@ sealed class FeedsTopBarTonalElevationPreference(val value: Int) : Preference() val values = listOf(Level0, Level1, Level2, Level3, Level4, Level5) fun fromPreferences(preferences: Preferences) = - when (preferences[DataStoreKeys.FeedsTopBarTonalElevation.key]) { + when (preferences[DataStoreKey.keys[feedsTopBarTonalElevation]?.key as Preferences.Key]) { ElevationTokens.Level0 -> Level0 ElevationTokens.Level1 -> Level1 ElevationTokens.Level2 -> Level2 diff --git a/app/src/main/java/me/ash/reader/infrastructure/preference/FlowArticleListDateStickyHeaderPreference.kt b/app/src/main/java/me/ash/reader/infrastructure/preference/FlowArticleListDateStickyHeaderPreference.kt index 30baf3a43..dd2c5a930 100644 --- a/app/src/main/java/me/ash/reader/infrastructure/preference/FlowArticleListDateStickyHeaderPreference.kt +++ b/app/src/main/java/me/ash/reader/infrastructure/preference/FlowArticleListDateStickyHeaderPreference.kt @@ -1,13 +1,18 @@ 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.flowArticleListDateStickyHeader import me.ash.reader.ui.ext.dataStore import me.ash.reader.ui.ext.put +val LocalFlowArticleListDateStickyHeader = + compositionLocalOf { FlowArticleListDateStickyHeaderPreference.default } + sealed class FlowArticleListDateStickyHeaderPreference(val value: Boolean) : Preference() { object ON : FlowArticleListDateStickyHeaderPreference(true) object OFF : FlowArticleListDateStickyHeaderPreference(false) @@ -15,7 +20,7 @@ sealed class FlowArticleListDateStickyHeaderPreference(val value: Boolean) : Pre override fun put(context: Context, scope: CoroutineScope) { scope.launch { context.dataStore.put( - DataStoreKeys.FlowArticleListDateStickyHeader, + DataStoreKey.flowArticleListDateStickyHeader, value ) } @@ -27,7 +32,7 @@ sealed class FlowArticleListDateStickyHeaderPreference(val value: Boolean) : Pre val values = listOf(ON, OFF) fun fromPreferences(preferences: Preferences) = - when (preferences[DataStoreKeys.FlowArticleListDateStickyHeader.key]) { + when (preferences[DataStoreKey.keys[flowArticleListDateStickyHeader]?.key as Preferences.Key]) { true -> ON false -> OFF else -> default diff --git a/app/src/main/java/me/ash/reader/infrastructure/preference/FlowArticleListDescPreference.kt b/app/src/main/java/me/ash/reader/infrastructure/preference/FlowArticleListDescPreference.kt index ac6b3e89c..a573c7c58 100644 --- a/app/src/main/java/me/ash/reader/infrastructure/preference/FlowArticleListDescPreference.kt +++ b/app/src/main/java/me/ash/reader/infrastructure/preference/FlowArticleListDescPreference.kt @@ -1,13 +1,18 @@ 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.flowArticleListDesc import me.ash.reader.ui.ext.dataStore import me.ash.reader.ui.ext.put +val LocalFlowArticleListDesc = + compositionLocalOf { FlowArticleListDescPreference.default } + sealed class FlowArticleListDescPreference(val value: Boolean) : Preference() { object ON : FlowArticleListDescPreference(true) object OFF : FlowArticleListDescPreference(false) @@ -15,7 +20,7 @@ sealed class FlowArticleListDescPreference(val value: Boolean) : Preference() { override fun put(context: Context, scope: CoroutineScope) { scope.launch { context.dataStore.put( - DataStoreKeys.FlowArticleListDesc, + DataStoreKey.flowArticleListDesc, value ) } @@ -27,7 +32,7 @@ sealed class FlowArticleListDescPreference(val value: Boolean) : Preference() { val values = listOf(ON, OFF) fun fromPreferences(preferences: Preferences) = - when (preferences[DataStoreKeys.FlowArticleListDesc.key]) { + when (preferences[DataStoreKey.keys[flowArticleListDesc]?.key as Preferences.Key]) { true -> ON false -> OFF else -> default diff --git a/app/src/main/java/me/ash/reader/infrastructure/preference/FlowArticleListFeedIconPreference.kt b/app/src/main/java/me/ash/reader/infrastructure/preference/FlowArticleListFeedIconPreference.kt index 21819b914..79c507155 100644 --- a/app/src/main/java/me/ash/reader/infrastructure/preference/FlowArticleListFeedIconPreference.kt +++ b/app/src/main/java/me/ash/reader/infrastructure/preference/FlowArticleListFeedIconPreference.kt @@ -1,13 +1,18 @@ 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.flowArticleListFeedIcon import me.ash.reader.ui.ext.dataStore import me.ash.reader.ui.ext.put +val LocalFlowArticleListFeedIcon = + compositionLocalOf { FlowArticleListFeedIconPreference.default } + sealed class FlowArticleListFeedIconPreference(val value: Boolean) : Preference() { object ON : FlowArticleListFeedIconPreference(true) object OFF : FlowArticleListFeedIconPreference(false) @@ -15,7 +20,7 @@ sealed class FlowArticleListFeedIconPreference(val value: Boolean) : Preference( override fun put(context: Context, scope: CoroutineScope) { scope.launch { context.dataStore.put( - DataStoreKeys.FlowArticleListFeedIcon, + DataStoreKey.flowArticleListFeedIcon, value ) } @@ -27,7 +32,7 @@ sealed class FlowArticleListFeedIconPreference(val value: Boolean) : Preference( val values = listOf(ON, OFF) fun fromPreferences(preferences: Preferences) = - when (preferences[DataStoreKeys.FlowArticleListFeedIcon.key]) { + when (preferences[DataStoreKey.keys[flowArticleListFeedIcon]?.key as Preferences.Key]) { true -> ON false -> OFF else -> default diff --git a/app/src/main/java/me/ash/reader/infrastructure/preference/FlowArticleListFeedNamePreference.kt b/app/src/main/java/me/ash/reader/infrastructure/preference/FlowArticleListFeedNamePreference.kt index c61966fbe..f621002fb 100644 --- a/app/src/main/java/me/ash/reader/infrastructure/preference/FlowArticleListFeedNamePreference.kt +++ b/app/src/main/java/me/ash/reader/infrastructure/preference/FlowArticleListFeedNamePreference.kt @@ -1,13 +1,18 @@ 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.flowArticleListFeedName import me.ash.reader.ui.ext.dataStore import me.ash.reader.ui.ext.put +val LocalFlowArticleListFeedName = + compositionLocalOf { FlowArticleListFeedNamePreference.default } + sealed class FlowArticleListFeedNamePreference(val value: Boolean) : Preference() { object ON : FlowArticleListFeedNamePreference(true) object OFF : FlowArticleListFeedNamePreference(false) @@ -15,7 +20,7 @@ sealed class FlowArticleListFeedNamePreference(val value: Boolean) : Preference( override fun put(context: Context, scope: CoroutineScope) { scope.launch { context.dataStore.put( - DataStoreKeys.FlowArticleListFeedName, + DataStoreKey.flowArticleListFeedName, value ) } @@ -27,7 +32,7 @@ sealed class FlowArticleListFeedNamePreference(val value: Boolean) : Preference( val values = listOf(ON, OFF) fun fromPreferences(preferences: Preferences) = - when (preferences[DataStoreKeys.FlowArticleListFeedName.key]) { + when (preferences[DataStoreKey.keys[flowArticleListFeedName]?.key as Preferences.Key]) { true -> ON false -> OFF else -> default diff --git a/app/src/main/java/me/ash/reader/infrastructure/preference/FlowArticleListImagePreference.kt b/app/src/main/java/me/ash/reader/infrastructure/preference/FlowArticleListImagePreference.kt index 781ae2be9..a9189285a 100644 --- a/app/src/main/java/me/ash/reader/infrastructure/preference/FlowArticleListImagePreference.kt +++ b/app/src/main/java/me/ash/reader/infrastructure/preference/FlowArticleListImagePreference.kt @@ -1,13 +1,18 @@ 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.flowArticleListImage import me.ash.reader.ui.ext.dataStore import me.ash.reader.ui.ext.put +val LocalFlowArticleListImage = + compositionLocalOf { FlowArticleListImagePreference.default } + sealed class FlowArticleListImagePreference(val value: Boolean) : Preference() { object ON : FlowArticleListImagePreference(true) object OFF : FlowArticleListImagePreference(false) @@ -15,7 +20,7 @@ sealed class FlowArticleListImagePreference(val value: Boolean) : Preference() { override fun put(context: Context, scope: CoroutineScope) { scope.launch { context.dataStore.put( - DataStoreKeys.FlowArticleListImage, + DataStoreKey.flowArticleListImage, value ) } @@ -27,7 +32,7 @@ sealed class FlowArticleListImagePreference(val value: Boolean) : Preference() { val values = listOf(ON, OFF) fun fromPreferences(preferences: Preferences) = - when (preferences[DataStoreKeys.FlowArticleListImage.key]) { + when (preferences[DataStoreKey.keys[flowArticleListImage]?.key as Preferences.Key]) { true -> ON false -> OFF else -> default diff --git a/app/src/main/java/me/ash/reader/infrastructure/preference/FlowArticleListTimePreference.kt b/app/src/main/java/me/ash/reader/infrastructure/preference/FlowArticleListTimePreference.kt index 2b9f8b682..a4715a8ba 100644 --- a/app/src/main/java/me/ash/reader/infrastructure/preference/FlowArticleListTimePreference.kt +++ b/app/src/main/java/me/ash/reader/infrastructure/preference/FlowArticleListTimePreference.kt @@ -1,13 +1,18 @@ 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.flowArticleListTime import me.ash.reader.ui.ext.dataStore import me.ash.reader.ui.ext.put +val LocalFlowArticleListTime = + compositionLocalOf { FlowArticleListTimePreference.default } + sealed class FlowArticleListTimePreference(val value: Boolean) : Preference() { object ON : FlowArticleListTimePreference(true) object OFF : FlowArticleListTimePreference(false) @@ -15,7 +20,7 @@ sealed class FlowArticleListTimePreference(val value: Boolean) : Preference() { override fun put(context: Context, scope: CoroutineScope) { scope.launch { context.dataStore.put( - DataStoreKeys.FlowArticleListTime, + DataStoreKey.flowArticleListTime, value ) } @@ -27,7 +32,7 @@ sealed class FlowArticleListTimePreference(val value: Boolean) : Preference() { val values = listOf(ON, OFF) fun fromPreferences(preferences: Preferences) = - when (preferences[DataStoreKeys.FlowArticleListTime.key]) { + when (preferences[DataStoreKey.keys[flowArticleListTime]?.key as Preferences.Key]) { true -> ON false -> OFF else -> default diff --git a/app/src/main/java/me/ash/reader/infrastructure/preference/FlowArticleListTonalElevationPreference.kt b/app/src/main/java/me/ash/reader/infrastructure/preference/FlowArticleListTonalElevationPreference.kt index 41fc76395..f3d1bbc08 100644 --- a/app/src/main/java/me/ash/reader/infrastructure/preference/FlowArticleListTonalElevationPreference.kt +++ b/app/src/main/java/me/ash/reader/infrastructure/preference/FlowArticleListTonalElevationPreference.kt @@ -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.flowArticleListTonalElevation import me.ash.reader.ui.ext.dataStore import me.ash.reader.ui.ext.put +val LocalFlowArticleListTonalElevation = + compositionLocalOf { FlowArticleListTonalElevationPreference.default } + sealed class FlowArticleListTonalElevationPreference(val value: Int) : Preference() { object Level0 : FlowArticleListTonalElevationPreference(ElevationTokens.Level0) object Level1 : FlowArticleListTonalElevationPreference(ElevationTokens.Level1) @@ -20,7 +25,7 @@ sealed class FlowArticleListTonalElevationPreference(val value: Int) : Preferenc override fun put(context: Context, scope: CoroutineScope) { scope.launch { context.dataStore.put( - DataStoreKeys.FlowArticleListTonalElevation, + DataStoreKey.flowArticleListTonalElevation, value ) } @@ -42,7 +47,7 @@ sealed class FlowArticleListTonalElevationPreference(val value: Int) : Preferenc val values = listOf(Level0, Level1, Level2, Level3, Level4, Level5) fun fromPreferences(preferences: Preferences) = - when (preferences[DataStoreKeys.FlowArticleListTonalElevation.key]) { + when (preferences[DataStoreKey.keys[flowArticleListTonalElevation]?.key as Preferences.Key]) { ElevationTokens.Level0 -> Level0 ElevationTokens.Level1 -> Level1 ElevationTokens.Level2 -> Level2 diff --git a/app/src/main/java/me/ash/reader/infrastructure/preference/FlowArticleReadIndicatorPreference.kt b/app/src/main/java/me/ash/reader/infrastructure/preference/FlowArticleReadIndicatorPreference.kt index 5c010bb47..816b731b8 100644 --- a/app/src/main/java/me/ash/reader/infrastructure/preference/FlowArticleReadIndicatorPreference.kt +++ b/app/src/main/java/me/ash/reader/infrastructure/preference/FlowArticleReadIndicatorPreference.kt @@ -2,15 +2,20 @@ package me.ash.reader.infrastructure.preference import android.content.Context import androidx.compose.runtime.Composable +import androidx.compose.runtime.compositionLocalOf import androidx.compose.ui.res.stringResource 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.flowArticleListReadIndicator import me.ash.reader.ui.ext.dataStore import me.ash.reader.ui.ext.put +val LocalFlowArticleListReadIndicator = + compositionLocalOf { FlowArticleReadIndicatorPreference.default } + sealed class FlowArticleReadIndicatorPreference(val value: Boolean) : Preference() { object ExcludingStarred : FlowArticleReadIndicatorPreference(true) object AllRead : FlowArticleReadIndicatorPreference(false) @@ -18,7 +23,7 @@ sealed class FlowArticleReadIndicatorPreference(val value: Boolean) : Preference override fun put(context: Context, scope: CoroutineScope) { scope.launch { context.dataStore.put( - DataStoreKeys.FlowArticleListReadIndicator, + DataStoreKey.flowArticleListReadIndicator, value ) } @@ -38,7 +43,7 @@ sealed class FlowArticleReadIndicatorPreference(val value: Boolean) : Preference val values = listOf(ExcludingStarred, AllRead) fun fromPreferences(preferences: Preferences) = - when (preferences[DataStoreKeys.FlowArticleListReadIndicator.key]) { + when (preferences[DataStoreKey.keys[flowArticleListReadIndicator]?.key as Preferences.Key]) { true -> ExcludingStarred false -> AllRead else -> default @@ -51,4 +56,4 @@ operator fun FlowArticleReadIndicatorPreference.not(): FlowArticleReadIndicatorP when (value) { true -> FlowArticleReadIndicatorPreference.AllRead false -> FlowArticleReadIndicatorPreference.ExcludingStarred - } \ No newline at end of file + } diff --git a/app/src/main/java/me/ash/reader/infrastructure/preference/FlowFilterBarFilledPreference.kt b/app/src/main/java/me/ash/reader/infrastructure/preference/FlowFilterBarFilledPreference.kt index 0cab17652..6a8f9bb74 100644 --- a/app/src/main/java/me/ash/reader/infrastructure/preference/FlowFilterBarFilledPreference.kt +++ b/app/src/main/java/me/ash/reader/infrastructure/preference/FlowFilterBarFilledPreference.kt @@ -1,13 +1,18 @@ 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.flowFilterBarFilled import me.ash.reader.ui.ext.dataStore import me.ash.reader.ui.ext.put +val LocalFlowFilterBarFilled = + compositionLocalOf { FlowFilterBarFilledPreference.default } + sealed class FlowFilterBarFilledPreference(val value: Boolean) : Preference() { object ON : FlowFilterBarFilledPreference(true) object OFF : FlowFilterBarFilledPreference(false) @@ -15,7 +20,7 @@ sealed class FlowFilterBarFilledPreference(val value: Boolean) : Preference() { override fun put(context: Context, scope: CoroutineScope) { scope.launch { context.dataStore.put( - DataStoreKeys.FlowFilterBarFilled, + DataStoreKey.flowFilterBarFilled, value ) } @@ -27,7 +32,7 @@ sealed class FlowFilterBarFilledPreference(val value: Boolean) : Preference() { val values = listOf(ON, OFF) fun fromPreferences(preferences: Preferences) = - when (preferences[DataStoreKeys.FlowFilterBarFilled.key]) { + when (preferences[DataStoreKey.keys[flowFilterBarFilled]?.key as Preferences.Key]) { true -> ON false -> OFF else -> default diff --git a/app/src/main/java/me/ash/reader/infrastructure/preference/FlowFilterBarPaddingPreference.kt b/app/src/main/java/me/ash/reader/infrastructure/preference/FlowFilterBarPaddingPreference.kt index 4dddaad23..18001462b 100644 --- a/app/src/main/java/me/ash/reader/infrastructure/preference/FlowFilterBarPaddingPreference.kt +++ b/app/src/main/java/me/ash/reader/infrastructure/preference/FlowFilterBarPaddingPreference.kt @@ -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.flowFilterBarPadding import me.ash.reader.ui.ext.dataStore import me.ash.reader.ui.ext.put +val LocalFlowFilterBarPadding = + compositionLocalOf { FlowFilterBarPaddingPreference.default } + object FlowFilterBarPaddingPreference { const val default = 60 fun put(context: Context, scope: CoroutineScope, value: Int) { scope.launch { - context.dataStore.put(DataStoreKeys.FlowFilterBarPadding, value) + context.dataStore.put(DataStoreKey.flowFilterBarPadding, value) } } fun fromPreferences(preferences: Preferences) = - preferences[DataStoreKeys.FlowFilterBarPadding.key] ?: default + preferences[DataStoreKey.keys[flowFilterBarPadding]?.key as Preferences.Key] ?: default } diff --git a/app/src/main/java/me/ash/reader/infrastructure/preference/FlowFilterBarStylePreference.kt b/app/src/main/java/me/ash/reader/infrastructure/preference/FlowFilterBarStylePreference.kt index 36ec0d9d6..94cc9f0d4 100644 --- a/app/src/main/java/me/ash/reader/infrastructure/preference/FlowFilterBarStylePreference.kt +++ b/app/src/main/java/me/ash/reader/infrastructure/preference/FlowFilterBarStylePreference.kt @@ -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.flowFilterBarStyle import me.ash.reader.ui.ext.dataStore import me.ash.reader.ui.ext.put +val LocalFlowFilterBarStyle = + compositionLocalOf { FlowFilterBarStylePreference.default } + sealed class FlowFilterBarStylePreference(val value: Int) : Preference() { object Icon : FlowFilterBarStylePreference(0) object IconLabel : FlowFilterBarStylePreference(1) @@ -17,7 +22,7 @@ sealed class FlowFilterBarStylePreference(val value: Int) : Preference() { override fun put(context: Context, scope: CoroutineScope) { scope.launch { context.dataStore.put( - DataStoreKeys.FlowFilterBarStyle, + DataStoreKey.flowFilterBarStyle, value ) } @@ -36,7 +41,7 @@ sealed class FlowFilterBarStylePreference(val value: Int) : Preference() { val values = listOf(Icon, IconLabel, IconLabelOnlySelected) fun fromPreferences(preferences: Preferences) = - when (preferences[DataStoreKeys.FlowFilterBarStyle.key]) { + when (preferences[DataStoreKey.keys[flowFilterBarStyle]?.key as Preferences.Key]) { 0 -> Icon 1 -> IconLabel 2 -> IconLabelOnlySelected diff --git a/app/src/main/java/me/ash/reader/infrastructure/preference/FlowFilterBarTonalElevationPreference.kt b/app/src/main/java/me/ash/reader/infrastructure/preference/FlowFilterBarTonalElevationPreference.kt index f2206c161..972158800 100644 --- a/app/src/main/java/me/ash/reader/infrastructure/preference/FlowFilterBarTonalElevationPreference.kt +++ b/app/src/main/java/me/ash/reader/infrastructure/preference/FlowFilterBarTonalElevationPreference.kt @@ -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.flowFilterBarTonalElevation import me.ash.reader.ui.ext.dataStore import me.ash.reader.ui.ext.put +val LocalFlowFilterBarTonalElevation = + compositionLocalOf { FlowFilterBarTonalElevationPreference.default } + sealed class FlowFilterBarTonalElevationPreference(val value: Int) : Preference() { object Level0 : FlowFilterBarTonalElevationPreference(ElevationTokens.Level0) object Level1 : FlowFilterBarTonalElevationPreference(ElevationTokens.Level1) @@ -20,7 +25,7 @@ sealed class FlowFilterBarTonalElevationPreference(val value: Int) : Preference( override fun put(context: Context, scope: CoroutineScope) { scope.launch { context.dataStore.put( - DataStoreKeys.FlowFilterBarTonalElevation, + DataStoreKey.flowFilterBarTonalElevation, value ) } @@ -42,7 +47,7 @@ sealed class FlowFilterBarTonalElevationPreference(val value: Int) : Preference( val values = listOf(Level0, Level1, Level2, Level3, Level4, Level5) fun fromPreferences(preferences: Preferences) = - when (preferences[DataStoreKeys.FlowFilterBarTonalElevation.key]) { + when (preferences[DataStoreKey.keys[flowFilterBarTonalElevation]?.key as Preferences.Key]) { ElevationTokens.Level0 -> Level0 ElevationTokens.Level1 -> Level1 ElevationTokens.Level2 -> Level2 diff --git a/app/src/main/java/me/ash/reader/infrastructure/preference/FlowTopBarTonalElevationPreference.kt b/app/src/main/java/me/ash/reader/infrastructure/preference/FlowTopBarTonalElevationPreference.kt index dc1a60d4a..eae8c2982 100644 --- a/app/src/main/java/me/ash/reader/infrastructure/preference/FlowTopBarTonalElevationPreference.kt +++ b/app/src/main/java/me/ash/reader/infrastructure/preference/FlowTopBarTonalElevationPreference.kt @@ -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.flowTopBarTonalElevation import me.ash.reader.ui.ext.dataStore import me.ash.reader.ui.ext.put +val LocalFlowTopBarTonalElevation = + compositionLocalOf { FlowTopBarTonalElevationPreference.default } + sealed class FlowTopBarTonalElevationPreference(val value: Int) : Preference() { object Level0 : FlowTopBarTonalElevationPreference(ElevationTokens.Level0) object Level1 : FlowTopBarTonalElevationPreference(ElevationTokens.Level1) @@ -19,10 +24,7 @@ sealed class FlowTopBarTonalElevationPreference(val value: Int) : Preference() { override fun put(context: Context, scope: CoroutineScope) { scope.launch { - context.dataStore.put( - DataStoreKeys.FlowTopBarTonalElevation, - value - ) + context.dataStore.put(flowTopBarTonalElevation, value) } } @@ -42,7 +44,7 @@ sealed class FlowTopBarTonalElevationPreference(val value: Int) : Preference() { val values = listOf(Level0, Level1, Level2, Level3, Level4, Level5) fun fromPreferences(preferences: Preferences) = - when (preferences[DataStoreKeys.FlowTopBarTonalElevation.key]) { + when (preferences[DataStoreKey.keys[flowTopBarTonalElevation]?.key as Preferences.Key]) { ElevationTokens.Level0 -> Level0 ElevationTokens.Level1 -> Level1 ElevationTokens.Level2 -> Level2 diff --git a/app/src/main/java/me/ash/reader/infrastructure/preference/InitialFilterPreference.kt b/app/src/main/java/me/ash/reader/infrastructure/preference/InitialFilterPreference.kt index c8bdbf81d..c8bc0ad58 100644 --- a/app/src/main/java/me/ash/reader/infrastructure/preference/InitialFilterPreference.kt +++ b/app/src/main/java/me/ash/reader/infrastructure/preference/InitialFilterPreference.kt @@ -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.initialFilter import me.ash.reader.ui.ext.dataStore import me.ash.reader.ui.ext.put +val LocalInitialFilter = + compositionLocalOf { InitialFilterPreference.default } + sealed class InitialFilterPreference(val value: Int) : Preference() { object Starred : InitialFilterPreference(0) object Unread : InitialFilterPreference(1) @@ -17,7 +22,7 @@ sealed class InitialFilterPreference(val value: Int) : Preference() { override fun put(context: Context, scope: CoroutineScope) { scope.launch { context.dataStore.put( - DataStoreKeys.InitialFilter, + DataStoreKey.initialFilter, value ) } @@ -36,7 +41,7 @@ sealed class InitialFilterPreference(val value: Int) : Preference() { val values = listOf(Starred, Unread, All) fun fromPreferences(preferences: Preferences) = - when (preferences[DataStoreKeys.InitialFilter.key]) { + when (preferences[DataStoreKey.keys[initialFilter]?.key as Preferences.Key]) { 0 -> Starred 1 -> Unread 2 -> All diff --git a/app/src/main/java/me/ash/reader/infrastructure/preference/InitialPagePreference.kt b/app/src/main/java/me/ash/reader/infrastructure/preference/InitialPagePreference.kt index a380579e4..f95f15f33 100644 --- a/app/src/main/java/me/ash/reader/infrastructure/preference/InitialPagePreference.kt +++ b/app/src/main/java/me/ash/reader/infrastructure/preference/InitialPagePreference.kt @@ -1,14 +1,18 @@ 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.initialPage import me.ash.reader.ui.ext.dataStore import me.ash.reader.ui.ext.put +val LocalInitialPage = compositionLocalOf { InitialPagePreference.default } + sealed class InitialPagePreference(val value: Int) : Preference() { object FeedsPage : InitialPagePreference(0) object FlowPage : InitialPagePreference(1) @@ -16,7 +20,7 @@ sealed class InitialPagePreference(val value: Int) : Preference() { override fun put(context: Context, scope: CoroutineScope) { scope.launch { context.dataStore.put( - DataStoreKeys.InitialPage, + DataStoreKey.initialPage, value ) } @@ -34,7 +38,7 @@ sealed class InitialPagePreference(val value: Int) : Preference() { val values = listOf(FeedsPage, FlowPage) fun fromPreferences(preferences: Preferences) = - when (preferences[DataStoreKeys.InitialPage.key]) { + when (preferences[DataStoreKey.keys[initialPage]?.key as Preferences.Key]) { 0 -> FeedsPage 1 -> FlowPage else -> default diff --git a/app/src/main/java/me/ash/reader/infrastructure/preference/LanguagesPreference.kt b/app/src/main/java/me/ash/reader/infrastructure/preference/LanguagesPreference.kt index 3ab957aba..25eee4224 100644 --- a/app/src/main/java/me/ash/reader/infrastructure/preference/LanguagesPreference.kt +++ b/app/src/main/java/me/ash/reader/infrastructure/preference/LanguagesPreference.kt @@ -3,6 +3,7 @@ package me.ash.reader.infrastructure.preference import android.content.Context import androidx.appcompat.app.AppCompatDelegate import androidx.compose.runtime.Composable +import androidx.compose.runtime.compositionLocalOf import androidx.compose.ui.res.stringResource import androidx.core.os.LocaleListCompat import androidx.datastore.preferences.core.Preferences @@ -10,10 +11,14 @@ import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers 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.languages import me.ash.reader.ui.ext.dataStore import me.ash.reader.ui.ext.put -import java.util.* +import java.util.Locale + +val LocalLanguages = + compositionLocalOf { LanguagesPreference.default } sealed class LanguagesPreference(val value: Int) : Preference() { data object UseDeviceLanguages : LanguagesPreference(0) @@ -57,7 +62,7 @@ sealed class LanguagesPreference(val value: Int) : Preference() { override fun put(context: Context, scope: CoroutineScope) { scope.launch { context.dataStore.put( - DataStoreKeys.Languages, value + DataStoreKey.languages, value ) scope.launch(Dispatchers.Main) { setLocale(this@LanguagesPreference) } } @@ -160,7 +165,8 @@ sealed class LanguagesPreference(val value: Int) : Preference() { ) fun fromPreferences(preferences: Preferences): LanguagesPreference = - fromValue(preferences[DataStoreKeys.Languages.key] ?: 0) + fromValue(preferences[DataStoreKey.keys[languages]?.key as Preferences.Key] ?: 0) + fun fromValue(value: Int): LanguagesPreference = when (value) { 0 -> UseDeviceLanguages diff --git a/app/src/main/java/me/ash/reader/infrastructure/preference/NewVersionDownloadUrlPreference.kt b/app/src/main/java/me/ash/reader/infrastructure/preference/NewVersionDownloadUrlPreference.kt index 94d41fc42..429ff051e 100644 --- a/app/src/main/java/me/ash/reader/infrastructure/preference/NewVersionDownloadUrlPreference.kt +++ b/app/src/main/java/me/ash/reader/infrastructure/preference/NewVersionDownloadUrlPreference.kt @@ -1,24 +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.Dispatchers 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.newVersionDownloadUrl import me.ash.reader.ui.ext.dataStore import me.ash.reader.ui.ext.put +val LocalNewVersionDownloadUrl = compositionLocalOf { NewVersionDownloadUrlPreference.default } + object NewVersionDownloadUrlPreference { const val default = "" fun put(context: Context, scope: CoroutineScope, value: String) { scope.launch(Dispatchers.IO) { - context.dataStore.put(DataStoreKeys.NewVersionDownloadUrl, value) + context.dataStore.put(DataStoreKey.newVersionDownloadUrl, value) } } fun fromPreferences(preferences: Preferences) = - preferences[DataStoreKeys.NewVersionDownloadUrl.key] ?: default + preferences[DataStoreKey.keys[newVersionDownloadUrl]?.key as Preferences.Key] ?: default } diff --git a/app/src/main/java/me/ash/reader/infrastructure/preference/NewVersionLogPreference.kt b/app/src/main/java/me/ash/reader/infrastructure/preference/NewVersionLogPreference.kt index 3a78291a4..b5e55ac4a 100644 --- a/app/src/main/java/me/ash/reader/infrastructure/preference/NewVersionLogPreference.kt +++ b/app/src/main/java/me/ash/reader/infrastructure/preference/NewVersionLogPreference.kt @@ -1,24 +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.Dispatchers 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.newVersionLog import me.ash.reader.ui.ext.dataStore import me.ash.reader.ui.ext.put +val LocalNewVersionLog = compositionLocalOf { NewVersionLogPreference.default } + object NewVersionLogPreference { const val default = "" fun put(context: Context, scope: CoroutineScope, value: String) { scope.launch(Dispatchers.IO) { - context.dataStore.put(DataStoreKeys.NewVersionLog, value) + context.dataStore.put(DataStoreKey.newVersionLog, value) } } fun fromPreferences(preferences: Preferences) = - preferences[DataStoreKeys.NewVersionLog.key] ?: default + preferences[DataStoreKey.keys[newVersionLog]?.key as Preferences.Key] ?: default } diff --git a/app/src/main/java/me/ash/reader/infrastructure/preference/NewVersionNumberPreference.kt b/app/src/main/java/me/ash/reader/infrastructure/preference/NewVersionNumberPreference.kt index dc589f59d..04db86a0d 100644 --- a/app/src/main/java/me/ash/reader/infrastructure/preference/NewVersionNumberPreference.kt +++ b/app/src/main/java/me/ash/reader/infrastructure/preference/NewVersionNumberPreference.kt @@ -1,26 +1,34 @@ package me.ash.reader.infrastructure.preference import android.content.Context +import androidx.compose.runtime.ProvidedValue +import androidx.compose.runtime.compositionLocalOf import androidx.datastore.preferences.core.Preferences import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch import me.ash.reader.domain.model.general.Version import me.ash.reader.domain.model.general.toVersion -import me.ash.reader.ui.ext.DataStoreKeys +import me.ash.reader.ui.ext.DataStoreKey +import me.ash.reader.ui.ext.DataStoreKey.Companion.newVersionNumber import me.ash.reader.ui.ext.dataStore import me.ash.reader.ui.ext.put +val LocalNewVersionNumber = compositionLocalOf { NewVersionNumberPreference.default } + object NewVersionNumberPreference { + val provide: (Settings) -> ProvidedValue = + fun(settings: Settings) = LocalNewVersionNumber provides settings.newVersionNumber + val default = Version() fun put(context: Context, scope: CoroutineScope, value: String) { scope.launch(Dispatchers.IO) { - context.dataStore.put(DataStoreKeys.NewVersionNumber, value) + context.dataStore.put(newVersionNumber, value) } } fun fromPreferences(preferences: Preferences) = - preferences[DataStoreKeys.NewVersionNumber.key].toVersion() + preferences[DataStoreKey.keys[newVersionNumber]?.key as Preferences.Key].toVersion() } diff --git a/app/src/main/java/me/ash/reader/infrastructure/preference/NewVersionPublishDatePreference.kt b/app/src/main/java/me/ash/reader/infrastructure/preference/NewVersionPublishDatePreference.kt index af7a45c7f..e510109df 100644 --- a/app/src/main/java/me/ash/reader/infrastructure/preference/NewVersionPublishDatePreference.kt +++ b/app/src/main/java/me/ash/reader/infrastructure/preference/NewVersionPublishDatePreference.kt @@ -1,24 +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.Dispatchers 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.newVersionPublishDate import me.ash.reader.ui.ext.dataStore import me.ash.reader.ui.ext.put +val LocalNewVersionPublishDate = compositionLocalOf { NewVersionPublishDatePreference.default } + object NewVersionPublishDatePreference { const val default = "" fun put(context: Context, scope: CoroutineScope, value: String) { scope.launch(Dispatchers.IO) { - context.dataStore.put(DataStoreKeys.NewVersionPublishDate, value) + context.dataStore.put(DataStoreKey.newVersionPublishDate, value) } } fun fromPreferences(preferences: Preferences) = - preferences[DataStoreKeys.NewVersionPublishDate.key] ?: default + preferences[DataStoreKey.keys[newVersionPublishDate]?.key as Preferences.Key] ?: default } diff --git a/app/src/main/java/me/ash/reader/infrastructure/preference/NewVersionSizePreference.kt b/app/src/main/java/me/ash/reader/infrastructure/preference/NewVersionSizePreference.kt index ac7a2a436..2ab9ab839 100644 --- a/app/src/main/java/me/ash/reader/infrastructure/preference/NewVersionSizePreference.kt +++ b/app/src/main/java/me/ash/reader/infrastructure/preference/NewVersionSizePreference.kt @@ -1,14 +1,18 @@ 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.Dispatchers 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.newVersionSize import me.ash.reader.ui.ext.dataStore import me.ash.reader.ui.ext.put +val LocalNewVersionSize = compositionLocalOf { NewVersionSizePreference.default } + object NewVersionSizePreference { const val default = "" @@ -20,10 +24,10 @@ object NewVersionSizePreference { fun put(context: Context, scope: CoroutineScope, value: String) { scope.launch(Dispatchers.IO) { - context.dataStore.put(DataStoreKeys.NewVersionSize, value) + context.dataStore.put(newVersionSize, value) } } fun fromPreferences(preferences: Preferences) = - preferences[DataStoreKeys.NewVersionSize.key] ?: default + preferences[DataStoreKey.keys[newVersionSize]?.key as Preferences.Key] ?: default } diff --git a/app/src/main/java/me/ash/reader/infrastructure/preference/OpenLinkPreference.kt b/app/src/main/java/me/ash/reader/infrastructure/preference/OpenLinkPreference.kt index 604120013..be12c975a 100644 --- a/app/src/main/java/me/ash/reader/infrastructure/preference/OpenLinkPreference.kt +++ b/app/src/main/java/me/ash/reader/infrastructure/preference/OpenLinkPreference.kt @@ -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.openLink import me.ash.reader.ui.ext.dataStore import me.ash.reader.ui.ext.put +val LocalOpenLink = + compositionLocalOf { OpenLinkPreference.default } + sealed class OpenLinkPreference(val value: Int) : Preference() { object AutoPreferCustomTabs : OpenLinkPreference(0) object AutoPreferDefaultBrowser : OpenLinkPreference(1) @@ -20,7 +25,7 @@ sealed class OpenLinkPreference(val value: Int) : Preference() { override fun put(context: Context, scope: CoroutineScope) { scope.launch { context.dataStore.put( - DataStoreKeys.OpenLink, + DataStoreKey.openLink, value ) } @@ -42,7 +47,7 @@ sealed class OpenLinkPreference(val value: Int) : Preference() { val values = listOf(AutoPreferCustomTabs, AutoPreferDefaultBrowser, CustomTabs, DefaultBrowser, SpecificBrowser, AlwaysAsk) fun fromPreferences(preferences: Preferences) = - when (preferences[DataStoreKeys.OpenLink.key]) { + when (preferences[DataStoreKey.keys[openLink]?.key as Preferences.Key]) { 0 -> AutoPreferCustomTabs 1 -> AutoPreferDefaultBrowser 2 -> CustomTabs diff --git a/app/src/main/java/me/ash/reader/infrastructure/preference/OpenLinkSpecificBrowserPreference.kt b/app/src/main/java/me/ash/reader/infrastructure/preference/OpenLinkSpecificBrowserPreference.kt index 883b2960f..ba30c8cb4 100644 --- a/app/src/main/java/me/ash/reader/infrastructure/preference/OpenLinkSpecificBrowserPreference.kt +++ b/app/src/main/java/me/ash/reader/infrastructure/preference/OpenLinkSpecificBrowserPreference.kt @@ -3,14 +3,18 @@ package me.ash.reader.infrastructure.preference import android.content.Context import android.content.pm.PackageManager import android.os.Build +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.openLinkAppSpecificBrowser import me.ash.reader.ui.ext.dataStore import me.ash.reader.ui.ext.put +val LocalOpenLinkSpecificBrowser = compositionLocalOf { OpenLinkSpecificBrowserPreference.default } + data class OpenLinkSpecificBrowserPreference( val packageName: String? ) : Preference() { @@ -18,7 +22,7 @@ data class OpenLinkSpecificBrowserPreference( override fun put(context: Context, scope: CoroutineScope) { scope.launch { context.dataStore.put( - DataStoreKeys.OpenLinkAppSpecificBrowser, + DataStoreKey.openLinkAppSpecificBrowser, packageName.orEmpty() ) } @@ -47,7 +51,7 @@ data class OpenLinkSpecificBrowserPreference( companion object { val default = OpenLinkSpecificBrowserPreference(null) fun fromPreferences(preferences: Preferences): OpenLinkSpecificBrowserPreference { - val packageName = preferences[DataStoreKeys.OpenLinkAppSpecificBrowser.key] + val packageName = preferences[DataStoreKey.keys[openLinkAppSpecificBrowser]?.key as Preferences.Key] return OpenLinkSpecificBrowserPreference(packageName) } } diff --git a/app/src/main/java/me/ash/reader/infrastructure/preference/Preference.kt b/app/src/main/java/me/ash/reader/infrastructure/preference/Preference.kt index 0d5575b39..b001b01a0 100644 --- a/app/src/main/java/me/ash/reader/infrastructure/preference/Preference.kt +++ b/app/src/main/java/me/ash/reader/infrastructure/preference/Preference.kt @@ -59,7 +59,7 @@ fun Preferences.toSettings(): Settings { readingAutoHideToolbar = ReadingAutoHideToolbarPreference.fromPreferences(this), readingTextFontSize = ReadingTextFontSizePreference.fromPreferences(this), readingTextLineHeight = ReadingTextLineHeightPreference.fromPreferences(this), - readingLetterSpacing = ReadingLetterSpacingPreference.fromPreferences(this), + readingLetterSpacing = ReadingTextLetterSpacingPreference.fromPreferences(this), readingTextHorizontalPadding = ReadingTextHorizontalPaddingPreference.fromPreferences(this), readingTextAlign = ReadingTextAlignPreference.fromPreferences(this), readingTextBold = ReadingTextBoldPreference.fromPreferences(this), diff --git a/app/src/main/java/me/ash/reader/infrastructure/preference/PullToSwitchArticlePreference.kt b/app/src/main/java/me/ash/reader/infrastructure/preference/PullToSwitchArticlePreference.kt index fac614597..4561463ba 100644 --- a/app/src/main/java/me/ash/reader/infrastructure/preference/PullToSwitchArticlePreference.kt +++ b/app/src/main/java/me/ash/reader/infrastructure/preference/PullToSwitchArticlePreference.kt @@ -1,17 +1,21 @@ 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.pullToSwitchArticle import me.ash.reader.ui.ext.dataStore import me.ash.reader.ui.ext.put +val LocalPullToSwitchArticle = compositionLocalOf { PullToSwitchArticlePreference.default } + class PullToSwitchArticlePreference(val value: Boolean) : Preference() { override fun put(context: Context, scope: CoroutineScope) { scope.launch { - context.dataStore.put(DataStoreKeys.PullToSwitchArticle, value) + context.dataStore.put(DataStoreKey.pullToSwitchArticle, value) } } @@ -22,8 +26,8 @@ class PullToSwitchArticlePreference(val value: Boolean) : Preference() { val default = PullToSwitchArticlePreference(true) fun fromPreference(preference: Preferences): PullToSwitchArticlePreference { return PullToSwitchArticlePreference( - preference[DataStoreKeys.PullToSwitchArticle.key] ?: return default + preference[DataStoreKey.keys[pullToSwitchArticle]?.key as Preferences.Key] ?: return default ) } } -} \ No newline at end of file +} diff --git a/app/src/main/java/me/ash/reader/infrastructure/preference/ReadingAutoHideToolbarPreference.kt b/app/src/main/java/me/ash/reader/infrastructure/preference/ReadingAutoHideToolbarPreference.kt index 2edfb2441..1c8f4abaf 100644 --- a/app/src/main/java/me/ash/reader/infrastructure/preference/ReadingAutoHideToolbarPreference.kt +++ b/app/src/main/java/me/ash/reader/infrastructure/preference/ReadingAutoHideToolbarPreference.kt @@ -1,20 +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.readingAutoHideToolbar import me.ash.reader.ui.ext.dataStore import me.ash.reader.ui.ext.put +val LocalReadingAutoHideToolbar = + compositionLocalOf { ReadingAutoHideToolbarPreference.default } + sealed class ReadingAutoHideToolbarPreference(val value: Boolean) : Preference() { object ON : ReadingAutoHideToolbarPreference(true) object OFF : ReadingAutoHideToolbarPreference(false) override fun put(context: Context, scope: CoroutineScope) { scope.launch { - context.dataStore.put(DataStoreKeys.ReadingAutoHideToolbar, value) + context.dataStore.put(DataStoreKey.readingAutoHideToolbar, value) } } @@ -24,7 +29,7 @@ sealed class ReadingAutoHideToolbarPreference(val value: Boolean) : Preference() val values = listOf(ON, OFF) fun fromPreferences(preferences: Preferences) = - when (preferences[DataStoreKeys.ReadingAutoHideToolbar.key]) { + when (preferences[DataStoreKey.keys[readingAutoHideToolbar]?.key as Preferences.Key]) { true -> ON false -> OFF else -> default diff --git a/app/src/main/java/me/ash/reader/infrastructure/preference/ReadingDarkThemePreference.kt b/app/src/main/java/me/ash/reader/infrastructure/preference/ReadingDarkThemePreference.kt index 07b36d033..5ea64a7b9 100644 --- a/app/src/main/java/me/ash/reader/infrastructure/preference/ReadingDarkThemePreference.kt +++ b/app/src/main/java/me/ash/reader/infrastructure/preference/ReadingDarkThemePreference.kt @@ -4,14 +4,19 @@ import android.content.Context import androidx.compose.runtime.Composable import androidx.compose.runtime.ReadOnlyComposable import androidx.compose.runtime.Stable +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.readingDarkTheme import me.ash.reader.ui.ext.dataStore import me.ash.reader.ui.ext.put +val LocalReadingDarkTheme = + compositionLocalOf { ReadingDarkThemePreference.default } + sealed class ReadingDarkThemePreference(val value: Int) : Preference() { object UseAppTheme : ReadingDarkThemePreference(0) object ON : ReadingDarkThemePreference(1) @@ -20,7 +25,7 @@ sealed class ReadingDarkThemePreference(val value: Int) : Preference() { override fun put(context: Context, scope: CoroutineScope) { scope.launch { context.dataStore.put( - DataStoreKeys.ReadingDarkTheme, + DataStoreKey.readingDarkTheme, value ) } @@ -47,7 +52,7 @@ sealed class ReadingDarkThemePreference(val value: Int) : Preference() { val values = listOf(UseAppTheme, ON, OFF) fun fromPreferences(preferences: Preferences) = - when (preferences[DataStoreKeys.ReadingDarkTheme.key]) { + when (preferences[DataStoreKey.keys[readingDarkTheme]?.key as Preferences.Key]) { 0 -> UseAppTheme 1 -> ON 2 -> OFF diff --git a/app/src/main/java/me/ash/reader/infrastructure/preference/ReadingFontsPreference.kt b/app/src/main/java/me/ash/reader/infrastructure/preference/ReadingFontsPreference.kt index a9cb9033c..7e30cfac9 100644 --- a/app/src/main/java/me/ash/reader/infrastructure/preference/ReadingFontsPreference.kt +++ b/app/src/main/java/me/ash/reader/infrastructure/preference/ReadingFontsPreference.kt @@ -1,17 +1,22 @@ package me.ash.reader.infrastructure.preference import android.content.Context +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.readingFonts 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 +val LocalReadingFonts = + compositionLocalOf { ReadingFontsPreference.default } + sealed class ReadingFontsPreference(val value: Int) : Preference() { object System : ReadingFontsPreference(0) object Serif : ReadingFontsPreference(1) @@ -22,7 +27,7 @@ sealed class ReadingFontsPreference(val value: Int) : Preference() { override fun put(context: Context, scope: CoroutineScope) { scope.launch { - context.dataStore.put(DataStoreKeys.ReadingFonts, value) + context.dataStore.put(DataStoreKey.readingFonts, value) if (this@ReadingFontsPreference == External) { context.restart() } @@ -55,7 +60,7 @@ sealed class ReadingFontsPreference(val value: Int) : Preference() { val values = listOf(System, Serif, SansSerif, Monospace, Cursive, External) fun fromPreferences(preferences: Preferences): ReadingFontsPreference = - when (preferences[DataStoreKeys.ReadingFonts.key]) { + when (preferences[DataStoreKey.keys[readingFonts]?.key as Preferences.Key]) { 0 -> System 1 -> Serif 2 -> SansSerif diff --git a/app/src/main/java/me/ash/reader/infrastructure/preference/ReadingImageHorizontalPaddingPreference.kt b/app/src/main/java/me/ash/reader/infrastructure/preference/ReadingImageHorizontalPaddingPreference.kt index b7ae3f9d7..d0e1ab7a5 100644 --- a/app/src/main/java/me/ash/reader/infrastructure/preference/ReadingImageHorizontalPaddingPreference.kt +++ b/app/src/main/java/me/ash/reader/infrastructure/preference/ReadingImageHorizontalPaddingPreference.kt @@ -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.readingImageHorizontalPadding import me.ash.reader.ui.ext.dataStore import me.ash.reader.ui.ext.put +val LocalReadingImageHorizontalPadding = + compositionLocalOf { ReadingImageHorizontalPaddingPreference.default } + object ReadingImageHorizontalPaddingPreference { const val default = 24 fun put(context: Context, scope: CoroutineScope, value: Int) { scope.launch { - context.dataStore.put(DataStoreKeys.ReadingImageHorizontalPadding, value) + context.dataStore.put(DataStoreKey.readingImageHorizontalPadding, value) } } fun fromPreferences(preferences: Preferences) = - preferences[DataStoreKeys.ReadingImageHorizontalPadding.key] ?: default + preferences[DataStoreKey.keys[readingImageHorizontalPadding]?.key as Preferences.Key] ?: default } diff --git a/app/src/main/java/me/ash/reader/infrastructure/preference/ReadingImageMaximizePreference.kt b/app/src/main/java/me/ash/reader/infrastructure/preference/ReadingImageMaximizePreference.kt index 63623930e..a76f5155b 100644 --- a/app/src/main/java/me/ash/reader/infrastructure/preference/ReadingImageMaximizePreference.kt +++ b/app/src/main/java/me/ash/reader/infrastructure/preference/ReadingImageMaximizePreference.kt @@ -1,20 +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.readingImageMaximize import me.ash.reader.ui.ext.dataStore import me.ash.reader.ui.ext.put +val LocalReadingImageMaximize = + compositionLocalOf { ReadingImageMaximizePreference.default } + sealed class ReadingImageMaximizePreference(val value: Boolean) : Preference() { object ON : ReadingImageMaximizePreference(true) object OFF : ReadingImageMaximizePreference(false) override fun put(context: Context, scope: CoroutineScope) { scope.launch { - context.dataStore.put(DataStoreKeys.ReadingImageMaximize, value) + context.dataStore.put(DataStoreKey.readingImageMaximize, value) } } @@ -24,7 +29,7 @@ sealed class ReadingImageMaximizePreference(val value: Boolean) : Preference() { val values = listOf(ON, OFF) fun fromPreferences(preferences: Preferences) = - when (preferences[DataStoreKeys.ReadingImageMaximize.key]) { + when (preferences[DataStoreKey.keys[readingImageMaximize]?.key as Preferences.Key]) { true -> ON false -> OFF else -> default diff --git a/app/src/main/java/me/ash/reader/infrastructure/preference/ReadingImageRoundedCornersPreference.kt b/app/src/main/java/me/ash/reader/infrastructure/preference/ReadingImageRoundedCornersPreference.kt index 175fbf789..faf37206b 100644 --- a/app/src/main/java/me/ash/reader/infrastructure/preference/ReadingImageRoundedCornersPreference.kt +++ b/app/src/main/java/me/ash/reader/infrastructure/preference/ReadingImageRoundedCornersPreference.kt @@ -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.readingImageRoundedCorners import me.ash.reader.ui.ext.dataStore import me.ash.reader.ui.ext.put +val LocalReadingImageRoundedCorners = + compositionLocalOf { ReadingImageRoundedCornersPreference.default } + object ReadingImageRoundedCornersPreference { const val default = 32 fun put(context: Context, scope: CoroutineScope, value: Int) { scope.launch { - context.dataStore.put(DataStoreKeys.ReadingImageRoundedCorners, value) + context.dataStore.put(DataStoreKey.readingImageRoundedCorners, value) } } fun fromPreferences(preferences: Preferences) = - preferences[DataStoreKeys.ReadingImageRoundedCorners.key] ?: default + preferences[DataStoreKey.keys[readingImageRoundedCorners]?.key as Preferences.Key] ?: default } diff --git a/app/src/main/java/me/ash/reader/infrastructure/preference/ReadingLetterSpacingPreference.kt b/app/src/main/java/me/ash/reader/infrastructure/preference/ReadingLetterSpacingPreference.kt deleted file mode 100644 index 35d68bc8d..000000000 --- a/app/src/main/java/me/ash/reader/infrastructure/preference/ReadingLetterSpacingPreference.kt +++ /dev/null @@ -1,23 +0,0 @@ -package me.ash.reader.infrastructure.preference - -import android.content.Context -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.dataStore -import me.ash.reader.ui.ext.put - -object ReadingLetterSpacingPreference { - - const val default = 0.5 - - fun put(context: Context, scope: CoroutineScope, value: Double) { - scope.launch { - context.dataStore.put(DataStoreKeys.ReadingLetterSpacing, value) - } - } - - fun fromPreferences(preferences: Preferences) = - preferences[DataStoreKeys.ReadingLetterSpacing.key] ?: default -} diff --git a/app/src/main/java/me/ash/reader/infrastructure/preference/ReadingPageTonalElevationPreference.kt b/app/src/main/java/me/ash/reader/infrastructure/preference/ReadingPageTonalElevationPreference.kt index d7920eefc..542a23dc7 100644 --- a/app/src/main/java/me/ash/reader/infrastructure/preference/ReadingPageTonalElevationPreference.kt +++ b/app/src/main/java/me/ash/reader/infrastructure/preference/ReadingPageTonalElevationPreference.kt @@ -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.readingPageTonalElevation import me.ash.reader.ui.ext.dataStore import me.ash.reader.ui.ext.put +val LocalReadingPageTonalElevation = + compositionLocalOf { ReadingPageTonalElevationPreference.default } + sealed class ReadingPageTonalElevationPreference(val value: Int) : Preference() { object Level0 : ReadingPageTonalElevationPreference(ElevationTokens.Level0) object Level1 : ReadingPageTonalElevationPreference(ElevationTokens.Level1) @@ -19,7 +24,7 @@ sealed class ReadingPageTonalElevationPreference(val value: Int) : Preference() override fun put(context: Context, scope: CoroutineScope) { scope.launch { - context.dataStore.put(DataStoreKeys.ReadingPageTonalElevation, value) + context.dataStore.put(DataStoreKey.readingPageTonalElevation, value) } } @@ -39,7 +44,7 @@ sealed class ReadingPageTonalElevationPreference(val value: Int) : Preference() val values = listOf(Level0, Level1, Level2, Level3, Level4, Level5) fun fromPreferences(preferences: Preferences) = - when (preferences[DataStoreKeys.ReadingPageTonalElevation.key]) { + when (preferences[DataStoreKey.keys[readingPageTonalElevation]?.key as Preferences.Key]) { ElevationTokens.Level0 -> Level0 ElevationTokens.Level1 -> Level1 ElevationTokens.Level2 -> Level2 diff --git a/app/src/main/java/me/ash/reader/infrastructure/preference/ReadingSubheadAlignPreference.kt b/app/src/main/java/me/ash/reader/infrastructure/preference/ReadingSubheadAlignPreference.kt index f368934d3..af64b2ce9 100644 --- a/app/src/main/java/me/ash/reader/infrastructure/preference/ReadingSubheadAlignPreference.kt +++ b/app/src/main/java/me/ash/reader/infrastructure/preference/ReadingSubheadAlignPreference.kt @@ -1,15 +1,20 @@ package me.ash.reader.infrastructure.preference import android.content.Context +import androidx.compose.runtime.compositionLocalOf import androidx.compose.ui.text.style.TextAlign 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.readingSubheadAlign import me.ash.reader.ui.ext.dataStore import me.ash.reader.ui.ext.put +val LocalReadingSubheadAlign = + compositionLocalOf { ReadingSubheadAlignPreference.default } + sealed class ReadingSubheadAlignPreference(val value: Int) : Preference() { object Left : ReadingSubheadAlignPreference(0) object Right : ReadingSubheadAlignPreference(1) @@ -19,7 +24,7 @@ sealed class ReadingSubheadAlignPreference(val value: Int) : Preference() { override fun put(context: Context, scope: CoroutineScope) { scope.launch { context.dataStore.put( - DataStoreKeys.ReadingSubheadAlign, + DataStoreKey.readingSubheadAlign, value ) } @@ -47,7 +52,7 @@ sealed class ReadingSubheadAlignPreference(val value: Int) : Preference() { val values = listOf(Left, Right, Center, Justify) fun fromPreferences(preferences: Preferences): ReadingSubheadAlignPreference = - when (preferences[DataStoreKeys.ReadingSubheadAlign.key]) { + when (preferences[DataStoreKey.keys[readingSubheadAlign]?.key as Preferences.Key]) { 0 -> Left 1 -> Right 2 -> Center diff --git a/app/src/main/java/me/ash/reader/infrastructure/preference/ReadingSubheadBoldPreference.kt b/app/src/main/java/me/ash/reader/infrastructure/preference/ReadingSubheadBoldPreference.kt index 14b47fe63..61c3a5cf4 100644 --- a/app/src/main/java/me/ash/reader/infrastructure/preference/ReadingSubheadBoldPreference.kt +++ b/app/src/main/java/me/ash/reader/infrastructure/preference/ReadingSubheadBoldPreference.kt @@ -1,13 +1,18 @@ 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.readingSubheadBold import me.ash.reader.ui.ext.dataStore import me.ash.reader.ui.ext.put +val LocalReadingSubheadBold = + compositionLocalOf { ReadingSubheadBoldPreference.default } + sealed class ReadingSubheadBoldPreference(val value: Boolean) : Preference() { object ON : ReadingSubheadBoldPreference(true) object OFF : ReadingSubheadBoldPreference(false) @@ -15,7 +20,7 @@ sealed class ReadingSubheadBoldPreference(val value: Boolean) : Preference() { override fun put(context: Context, scope: CoroutineScope) { scope.launch { context.dataStore.put( - DataStoreKeys.ReadingSubheadBold, + DataStoreKey.readingSubheadBold, value ) } @@ -27,7 +32,7 @@ sealed class ReadingSubheadBoldPreference(val value: Boolean) : Preference() { val values = listOf(ON, OFF) fun fromPreferences(preferences: Preferences) = - when (preferences[DataStoreKeys.ReadingSubheadBold.key]) { + when (preferences[DataStoreKey.keys[readingSubheadBold]?.key as Preferences.Key]) { true -> ON false -> OFF else -> default diff --git a/app/src/main/java/me/ash/reader/infrastructure/preference/ReadingSubheadUpperCasePreference.kt b/app/src/main/java/me/ash/reader/infrastructure/preference/ReadingSubheadUpperCasePreference.kt index 08308f3db..c2c3b0e80 100644 --- a/app/src/main/java/me/ash/reader/infrastructure/preference/ReadingSubheadUpperCasePreference.kt +++ b/app/src/main/java/me/ash/reader/infrastructure/preference/ReadingSubheadUpperCasePreference.kt @@ -1,13 +1,18 @@ 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.readingSubheadUpperCase import me.ash.reader.ui.ext.dataStore import me.ash.reader.ui.ext.put +val LocalReadingSubheadUpperCase = + compositionLocalOf { ReadingSubheadUpperCasePreference.default } + sealed class ReadingSubheadUpperCasePreference(val value: Boolean) : Preference() { object ON : ReadingSubheadUpperCasePreference(true) object OFF : ReadingSubheadUpperCasePreference(false) @@ -15,7 +20,7 @@ sealed class ReadingSubheadUpperCasePreference(val value: Boolean) : Preference( override fun put(context: Context, scope: CoroutineScope) { scope.launch { context.dataStore.put( - DataStoreKeys.ReadingSubheadUpperCase, + DataStoreKey.readingSubheadUpperCase, value ) } @@ -27,7 +32,7 @@ sealed class ReadingSubheadUpperCasePreference(val value: Boolean) : Preference( val values = listOf(ON, OFF) fun fromPreferences(preferences: Preferences) = - when (preferences[DataStoreKeys.ReadingSubheadUpperCase.key]) { + when (preferences[DataStoreKey.keys[readingSubheadUpperCase]?.key as Preferences.Key]) { true -> ON false -> OFF else -> default diff --git a/app/src/main/java/me/ash/reader/infrastructure/preference/ReadingTextAlignPreference.kt b/app/src/main/java/me/ash/reader/infrastructure/preference/ReadingTextAlignPreference.kt index c78356e5c..87a24eea3 100644 --- a/app/src/main/java/me/ash/reader/infrastructure/preference/ReadingTextAlignPreference.kt +++ b/app/src/main/java/me/ash/reader/infrastructure/preference/ReadingTextAlignPreference.kt @@ -1,16 +1,21 @@ package me.ash.reader.infrastructure.preference import android.content.Context +import androidx.compose.runtime.compositionLocalOf import androidx.compose.ui.Alignment import androidx.compose.ui.text.style.TextAlign 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.readingTextAlign import me.ash.reader.ui.ext.dataStore import me.ash.reader.ui.ext.put +val LocalReadingTextAlign = + compositionLocalOf { ReadingTextAlignPreference.default } + sealed class ReadingTextAlignPreference(val value: Int) : Preference() { object Left : ReadingTextAlignPreference(0) object Right : ReadingTextAlignPreference(1) @@ -20,7 +25,7 @@ sealed class ReadingTextAlignPreference(val value: Int) : Preference() { override fun put(context: Context, scope: CoroutineScope) { scope.launch { context.dataStore.put( - DataStoreKeys.ReadingTextAlign, + DataStoreKey.readingTextAlign, value ) } @@ -56,7 +61,7 @@ sealed class ReadingTextAlignPreference(val value: Int) : Preference() { val values = listOf(Left, Right, Center, Justify) fun fromPreferences(preferences: Preferences): ReadingTextAlignPreference = - when (preferences[DataStoreKeys.ReadingTextAlign.key]) { + when (preferences[DataStoreKey.keys[readingTextAlign]?.key as Preferences.Key]) { 0 -> Left 1 -> Right 2 -> Center diff --git a/app/src/main/java/me/ash/reader/infrastructure/preference/ReadingTextBoldPreference.kt b/app/src/main/java/me/ash/reader/infrastructure/preference/ReadingTextBoldPreference.kt index 404b57403..bd76ff2f9 100644 --- a/app/src/main/java/me/ash/reader/infrastructure/preference/ReadingTextBoldPreference.kt +++ b/app/src/main/java/me/ash/reader/infrastructure/preference/ReadingTextBoldPreference.kt @@ -1,13 +1,18 @@ 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.readingTextBold import me.ash.reader.ui.ext.dataStore import me.ash.reader.ui.ext.put +val LocalReadingTextBold = + compositionLocalOf { ReadingTextBoldPreference.default } + sealed class ReadingTextBoldPreference(val value: Boolean) : Preference() { object ON : ReadingTextBoldPreference(true) object OFF : ReadingTextBoldPreference(false) @@ -15,7 +20,7 @@ sealed class ReadingTextBoldPreference(val value: Boolean) : Preference() { override fun put(context: Context, scope: CoroutineScope) { scope.launch { context.dataStore.put( - DataStoreKeys.ReadingTextBold, + DataStoreKey.readingTextBold, value ) } @@ -27,7 +32,7 @@ sealed class ReadingTextBoldPreference(val value: Boolean) : Preference() { val values = listOf(ON, OFF) fun fromPreferences(preferences: Preferences) = - when (preferences[DataStoreKeys.ReadingTextBold.key]) { + when (preferences[DataStoreKey.keys[readingTextBold]?.key as Preferences.Key]) { true -> ON false -> OFF else -> default diff --git a/app/src/main/java/me/ash/reader/infrastructure/preference/ReadingTextFontSizePreference.kt b/app/src/main/java/me/ash/reader/infrastructure/preference/ReadingTextFontSizePreference.kt index cb9a4496a..a2a527142 100644 --- a/app/src/main/java/me/ash/reader/infrastructure/preference/ReadingTextFontSizePreference.kt +++ b/app/src/main/java/me/ash/reader/infrastructure/preference/ReadingTextFontSizePreference.kt @@ -1,23 +1,27 @@ 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.readingTextFontSize import me.ash.reader.ui.ext.dataStore import me.ash.reader.ui.ext.put +val LocalReadingTextFontSize = compositionLocalOf { ReadingTextFontSizePreference.default } + object ReadingTextFontSizePreference { const val default = 17 fun put(context: Context, scope: CoroutineScope, value: Int) { scope.launch { - context.dataStore.put(DataStoreKeys.ReadingTextFontSize, value) + context.dataStore.put(DataStoreKey.readingTextFontSize, value) } } fun fromPreferences(preferences: Preferences) = - preferences[DataStoreKeys.ReadingTextFontSize.key] ?: default + preferences[DataStoreKey.keys[readingTextFontSize]?.key as Preferences.Key] ?: default } diff --git a/app/src/main/java/me/ash/reader/infrastructure/preference/ReadingTextHorizontalPaddingPreference.kt b/app/src/main/java/me/ash/reader/infrastructure/preference/ReadingTextHorizontalPaddingPreference.kt index 5c4ab5423..3676e6c0b 100644 --- a/app/src/main/java/me/ash/reader/infrastructure/preference/ReadingTextHorizontalPaddingPreference.kt +++ b/app/src/main/java/me/ash/reader/infrastructure/preference/ReadingTextHorizontalPaddingPreference.kt @@ -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.readingTextHorizontalPadding import me.ash.reader.ui.ext.dataStore import me.ash.reader.ui.ext.put +val LocalReadingTextHorizontalPadding = + compositionLocalOf { ReadingTextHorizontalPaddingPreference.default } + object ReadingTextHorizontalPaddingPreference { const val default = 24 fun put(context: Context, scope: CoroutineScope, value: Int) { scope.launch { - context.dataStore.put(DataStoreKeys.ReadingTextHorizontalPadding, value) + context.dataStore.put(DataStoreKey.readingTextHorizontalPadding, value) } } fun fromPreferences(preferences: Preferences) = - preferences[DataStoreKeys.ReadingTextHorizontalPadding.key] ?: default + preferences[DataStoreKey.keys[readingTextHorizontalPadding]?.key as Preferences.Key] ?: default } diff --git a/app/src/main/java/me/ash/reader/infrastructure/preference/ReadingTextLetterSpacingPreference.kt b/app/src/main/java/me/ash/reader/infrastructure/preference/ReadingTextLetterSpacingPreference.kt new file mode 100644 index 000000000..537f4a27f --- /dev/null +++ b/app/src/main/java/me/ash/reader/infrastructure/preference/ReadingTextLetterSpacingPreference.kt @@ -0,0 +1,27 @@ +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.DataStoreKey +import me.ash.reader.ui.ext.DataStoreKey.Companion.readingTextLetterSpacing +import me.ash.reader.ui.ext.dataStore +import me.ash.reader.ui.ext.put + +val LocalReadingTextLetterSpacing = compositionLocalOf { ReadingTextLetterSpacingPreference.default } + +object ReadingTextLetterSpacingPreference { + + const val default = 0.5F + + fun put(context: Context, scope: CoroutineScope, value: Float) { + scope.launch { + context.dataStore.put(DataStoreKey.readingTextLetterSpacing, value) + } + } + + fun fromPreferences(preferences: Preferences) = + preferences[DataStoreKey.keys[readingTextLetterSpacing]?.key as Preferences.Key] ?: default +} diff --git a/app/src/main/java/me/ash/reader/infrastructure/preference/ReadingTextLineHeightPreference.kt b/app/src/main/java/me/ash/reader/infrastructure/preference/ReadingTextLineHeightPreference.kt index 2b5432728..1d8213919 100644 --- a/app/src/main/java/me/ash/reader/infrastructure/preference/ReadingTextLineHeightPreference.kt +++ b/app/src/main/java/me/ash/reader/infrastructure/preference/ReadingTextLineHeightPreference.kt @@ -1,25 +1,29 @@ 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.readingTextLineHeight import me.ash.reader.ui.ext.dataStore import me.ash.reader.ui.ext.put +val LocalReadingTextLineHeight = compositionLocalOf { ReadingTextLineHeightPreference.default } + data object ReadingTextLineHeightPreference { const val default = 1f private val range = 0.8f..2f fun put(context: Context, scope: CoroutineScope, value: Float) { scope.launch { - context.dataStore.put(DataStoreKeys.ReadingLineHeight, value) + context.dataStore.put(DataStoreKey.readingTextLineHeight, value) } } fun Float.coerceToRange() = coerceIn(range) fun fromPreferences(preferences: Preferences) = - preferences[DataStoreKeys.ReadingLineHeight.key] ?: default -} \ No newline at end of file + preferences[DataStoreKey.keys[readingTextLineHeight]?.key as Preferences.Key] ?: default +} diff --git a/app/src/main/java/me/ash/reader/infrastructure/preference/ReadingThemePreference.kt b/app/src/main/java/me/ash/reader/infrastructure/preference/ReadingThemePreference.kt index af2e27d5c..d63978296 100644 --- a/app/src/main/java/me/ash/reader/infrastructure/preference/ReadingThemePreference.kt +++ b/app/src/main/java/me/ash/reader/infrastructure/preference/ReadingThemePreference.kt @@ -2,13 +2,18 @@ package me.ash.reader.infrastructure.preference import android.content.Context import androidx.compose.runtime.Immutable +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.readingTheme import me.ash.reader.ui.ext.dataStore import me.ash.reader.ui.ext.put +val LocalReadingTheme = + compositionLocalOf { ReadingThemePreference.default } + @Immutable sealed class ReadingThemePreference(val value: Int) : Preference() { @@ -19,7 +24,7 @@ sealed class ReadingThemePreference(val value: Int) : Preference() { override fun put(context: Context, scope: CoroutineScope) { scope.launch { - context.dataStore.put(DataStoreKeys.ReadingTheme, value) + context.dataStore.put(DataStoreKey.readingTheme, value) } } @@ -44,7 +49,7 @@ sealed class ReadingThemePreference(val value: Int) : Preference() { ReadingTextHorizontalPaddingPreference.put(context, scope, ReadingTextHorizontalPaddingPreference.default) ReadingTextAlignPreference.default.put(context, scope) - ReadingLetterSpacingPreference.put(context, scope, ReadingLetterSpacingPreference.default) + ReadingTextLetterSpacingPreference.put(context, scope, ReadingTextLetterSpacingPreference.default) ReadingTextFontSizePreference.put(context, scope, ReadingTextFontSizePreference.default) ReadingImageRoundedCornersPreference.put(context, scope, ReadingImageRoundedCornersPreference.default) ReadingImageHorizontalPaddingPreference.put(context, scope, @@ -63,7 +68,7 @@ sealed class ReadingThemePreference(val value: Int) : Preference() { ReadingTextHorizontalPaddingPreference.put(context, scope, ReadingTextHorizontalPaddingPreference.default) ReadingTextAlignPreference.default.put(context, scope) - ReadingLetterSpacingPreference.put(context, scope, ReadingLetterSpacingPreference.default) + ReadingTextLetterSpacingPreference.put(context, scope, ReadingTextLetterSpacingPreference.default) ReadingTextFontSizePreference.put(context, scope, 18) ReadingImageRoundedCornersPreference.put(context, scope, 0) ReadingImageHorizontalPaddingPreference.put(context, scope, 0) @@ -81,7 +86,7 @@ sealed class ReadingThemePreference(val value: Int) : Preference() { ReadingTextHorizontalPaddingPreference.put(context, scope, ReadingTextHorizontalPaddingPreference.default) ReadingTextAlignPreference.Center.put(context, scope) - ReadingLetterSpacingPreference.put(context, scope, ReadingLetterSpacingPreference.default) + ReadingTextLetterSpacingPreference.put(context, scope, ReadingTextLetterSpacingPreference.default) ReadingTextFontSizePreference.put(context, scope, 20) ReadingImageRoundedCornersPreference.put(context, scope, 0) ReadingImageHorizontalPaddingPreference.put(context, scope, @@ -100,7 +105,7 @@ sealed class ReadingThemePreference(val value: Int) : Preference() { ReadingTextHorizontalPaddingPreference.put(context, scope, ReadingTextHorizontalPaddingPreference.default) ReadingTextAlignPreference.default.put(context, scope) - ReadingLetterSpacingPreference.put(context, scope, ReadingLetterSpacingPreference.default) + ReadingTextLetterSpacingPreference.put(context, scope, ReadingTextLetterSpacingPreference.default) ReadingTextFontSizePreference.put(context, scope, ReadingTextFontSizePreference.default) ReadingImageRoundedCornersPreference.put(context, scope, ReadingImageRoundedCornersPreference.default) ReadingImageHorizontalPaddingPreference.put(context, scope, @@ -116,7 +121,7 @@ sealed class ReadingThemePreference(val value: Int) : Preference() { val values = listOf(MaterialYou, Reeder, Paper, Custom) fun fromPreferences(preferences: Preferences): ReadingThemePreference = - when (preferences[DataStoreKeys.ReadingTheme.key]) { + when (preferences[DataStoreKey.keys[readingTheme]?.key as Preferences.Key]) { 0 -> MaterialYou 1 -> Reeder 2 -> Paper diff --git a/app/src/main/java/me/ash/reader/infrastructure/preference/ReadingTitleAlignPreference.kt b/app/src/main/java/me/ash/reader/infrastructure/preference/ReadingTitleAlignPreference.kt index 84321e08a..f48b246ad 100644 --- a/app/src/main/java/me/ash/reader/infrastructure/preference/ReadingTitleAlignPreference.kt +++ b/app/src/main/java/me/ash/reader/infrastructure/preference/ReadingTitleAlignPreference.kt @@ -2,15 +2,20 @@ package me.ash.reader.infrastructure.preference import android.content.Context import androidx.compose.runtime.Stable +import androidx.compose.runtime.compositionLocalOf import androidx.compose.ui.text.style.TextAlign 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.readingTitleAlign import me.ash.reader.ui.ext.dataStore import me.ash.reader.ui.ext.put +val LocalReadingTitleAlign = + compositionLocalOf { ReadingTitleAlignPreference.default } + sealed class ReadingTitleAlignPreference(val value: Int) : Preference() { object Left : ReadingTitleAlignPreference(0) object Right : ReadingTitleAlignPreference(1) @@ -20,7 +25,7 @@ sealed class ReadingTitleAlignPreference(val value: Int) : Preference() { override fun put(context: Context, scope: CoroutineScope) { scope.launch { context.dataStore.put( - DataStoreKeys.ReadingTitleAlign, + DataStoreKey.readingTitleAlign, value ) } @@ -50,7 +55,7 @@ sealed class ReadingTitleAlignPreference(val value: Int) : Preference() { val values = listOf(Left, Right, Center, Justify) fun fromPreferences(preferences: Preferences): ReadingTitleAlignPreference = - when (preferences[DataStoreKeys.ReadingTitleAlign.key]) { + when (preferences[DataStoreKey.keys[readingTitleAlign]?.key as Preferences.Key]) { 0 -> Left 1 -> Right 2 -> Center diff --git a/app/src/main/java/me/ash/reader/infrastructure/preference/ReadingTitleBoldPreference.kt b/app/src/main/java/me/ash/reader/infrastructure/preference/ReadingTitleBoldPreference.kt index 54f87a144..aaf24bd3e 100644 --- a/app/src/main/java/me/ash/reader/infrastructure/preference/ReadingTitleBoldPreference.kt +++ b/app/src/main/java/me/ash/reader/infrastructure/preference/ReadingTitleBoldPreference.kt @@ -1,13 +1,18 @@ 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.readingTitleBold import me.ash.reader.ui.ext.dataStore import me.ash.reader.ui.ext.put +val LocalReadingTitleBold = + compositionLocalOf { ReadingTitleBoldPreference.default } + sealed class ReadingTitleBoldPreference(val value: Boolean) : Preference() { object ON : ReadingTitleBoldPreference(true) object OFF : ReadingTitleBoldPreference(false) @@ -15,7 +20,7 @@ sealed class ReadingTitleBoldPreference(val value: Boolean) : Preference() { override fun put(context: Context, scope: CoroutineScope) { scope.launch { context.dataStore.put( - DataStoreKeys.ReadingTitleBold, + DataStoreKey.readingTitleBold, value ) } @@ -27,7 +32,7 @@ sealed class ReadingTitleBoldPreference(val value: Boolean) : Preference() { val values = listOf(ON, OFF) fun fromPreferences(preferences: Preferences) = - when (preferences[DataStoreKeys.ReadingTitleBold.key]) { + when (preferences[DataStoreKey.keys[readingTitleBold]?.key as Preferences.Key]) { true -> ON false -> OFF else -> default diff --git a/app/src/main/java/me/ash/reader/infrastructure/preference/ReadingTitleUpperCasePreference.kt b/app/src/main/java/me/ash/reader/infrastructure/preference/ReadingTitleUpperCasePreference.kt index 487fb9ae1..f27e58462 100644 --- a/app/src/main/java/me/ash/reader/infrastructure/preference/ReadingTitleUpperCasePreference.kt +++ b/app/src/main/java/me/ash/reader/infrastructure/preference/ReadingTitleUpperCasePreference.kt @@ -1,13 +1,18 @@ 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.readingTitleUpperCase import me.ash.reader.ui.ext.dataStore import me.ash.reader.ui.ext.put +val LocalReadingTitleUpperCase = + compositionLocalOf { ReadingTitleUpperCasePreference.default } + sealed class ReadingTitleUpperCasePreference(val value: Boolean) : Preference() { object ON : ReadingTitleUpperCasePreference(true) object OFF : ReadingTitleUpperCasePreference(false) @@ -15,7 +20,7 @@ sealed class ReadingTitleUpperCasePreference(val value: Boolean) : Preference() override fun put(context: Context, scope: CoroutineScope) { scope.launch { context.dataStore.put( - DataStoreKeys.ReadingTitleUpperCase, + DataStoreKey.readingTitleUpperCase, value ) } @@ -27,7 +32,7 @@ sealed class ReadingTitleUpperCasePreference(val value: Boolean) : Preference() val values = listOf(ON, OFF) fun fromPreferences(preferences: Preferences) = - when (preferences[DataStoreKeys.ReadingTitleUpperCase.key]) { + when (preferences[DataStoreKey.keys[readingTitleUpperCase]?.key as Preferences.Key]) { true -> ON false -> OFF else -> default diff --git a/app/src/main/java/me/ash/reader/infrastructure/preference/Settings.kt b/app/src/main/java/me/ash/reader/infrastructure/preference/Settings.kt index 0d3bc3cc2..c7d8b8459 100644 --- a/app/src/main/java/me/ash/reader/infrastructure/preference/Settings.kt +++ b/app/src/main/java/me/ash/reader/infrastructure/preference/Settings.kt @@ -3,7 +3,6 @@ package me.ash.reader.infrastructure.preference import android.util.Log import androidx.compose.runtime.Composable import androidx.compose.runtime.CompositionLocalProvider -import androidx.compose.runtime.compositionLocalOf import androidx.compose.runtime.remember import androidx.compose.ui.platform.LocalContext import kotlinx.coroutines.flow.map @@ -58,7 +57,7 @@ data class Settings( val readingAutoHideToolbar: ReadingAutoHideToolbarPreference = ReadingAutoHideToolbarPreference.default, val readingTextFontSize: Int = ReadingTextFontSizePreference.default, val readingTextLineHeight: Float = ReadingTextLineHeightPreference.default, - val readingLetterSpacing: Double = ReadingLetterSpacingPreference.default, + val readingLetterSpacing: Float = ReadingTextLetterSpacingPreference.default, val readingTextHorizontalPadding: Int = ReadingTextHorizontalPaddingPreference.default, val readingTextAlign: ReadingTextAlignPreference = ReadingTextAlignPreference.default, val readingTextBold: ReadingTextBoldPreference = ReadingTextBoldPreference.default, @@ -87,123 +86,6 @@ data class Settings( val languages: LanguagesPreference = LanguagesPreference.default, ) -// Version -val LocalNewVersionNumber = compositionLocalOf { NewVersionNumberPreference.default } -val LocalSkipVersionNumber = compositionLocalOf { SkipVersionNumberPreference.default } -val LocalNewVersionPublishDate = compositionLocalOf { NewVersionPublishDatePreference.default } -val LocalNewVersionLog = compositionLocalOf { NewVersionLogPreference.default } -val LocalNewVersionSize = compositionLocalOf { NewVersionSizePreference.default } -val LocalNewVersionDownloadUrl = compositionLocalOf { NewVersionDownloadUrlPreference.default } - -// Theme -val LocalThemeIndex = - compositionLocalOf { ThemeIndexPreference.default } -val LocalCustomPrimaryColor = - compositionLocalOf { CustomPrimaryColorPreference.default } -val LocalDarkTheme = - compositionLocalOf { DarkThemePreference.default } -val LocalAmoledDarkTheme = - compositionLocalOf { AmoledDarkThemePreference.default } -val LocalBasicFonts = compositionLocalOf { BasicFontsPreference.default } - -// Feeds page -val LocalFeedsFilterBarStyle = - compositionLocalOf { FeedsFilterBarStylePreference.default } -val LocalFeedsFilterBarFilled = - compositionLocalOf { FeedsFilterBarFilledPreference.default } -val LocalFeedsFilterBarPadding = - compositionLocalOf { FeedsFilterBarPaddingPreference.default } -val LocalFeedsFilterBarTonalElevation = - compositionLocalOf { FeedsFilterBarTonalElevationPreference.default } -val LocalFeedsTopBarTonalElevation = - compositionLocalOf { FeedsTopBarTonalElevationPreference.default } -val LocalFeedsGroupListExpand = - compositionLocalOf { FeedsGroupListExpandPreference.default } -val LocalFeedsGroupListTonalElevation = - compositionLocalOf { FeedsGroupListTonalElevationPreference.default } - -// Flow page -val LocalFlowFilterBarStyle = - compositionLocalOf { FlowFilterBarStylePreference.default } -val LocalFlowFilterBarFilled = - compositionLocalOf { FlowFilterBarFilledPreference.default } -val LocalFlowFilterBarPadding = - compositionLocalOf { FlowFilterBarPaddingPreference.default } -val LocalFlowFilterBarTonalElevation = - compositionLocalOf { FlowFilterBarTonalElevationPreference.default } -val LocalFlowTopBarTonalElevation = - compositionLocalOf { FlowTopBarTonalElevationPreference.default } -val LocalFlowArticleListFeedIcon = - compositionLocalOf { FlowArticleListFeedIconPreference.default } -val LocalFlowArticleListFeedName = - compositionLocalOf { FlowArticleListFeedNamePreference.default } -val LocalFlowArticleListImage = - compositionLocalOf { FlowArticleListImagePreference.default } -val LocalFlowArticleListDesc = - compositionLocalOf { FlowArticleListDescPreference.default } -val LocalFlowArticleListTime = - compositionLocalOf { FlowArticleListTimePreference.default } -val LocalFlowArticleListDateStickyHeader = - compositionLocalOf { FlowArticleListDateStickyHeaderPreference.default } -val LocalFlowArticleListTonalElevation = - compositionLocalOf { FlowArticleListTonalElevationPreference.default } -val LocalFlowArticleListReadIndicator = - compositionLocalOf { FlowArticleReadIndicatorPreference.default } - -// Reading page -val LocalReadingTheme = - compositionLocalOf { ReadingThemePreference.default } -val LocalReadingDarkTheme = - compositionLocalOf { ReadingDarkThemePreference.default } -val LocalReadingPageTonalElevation = - compositionLocalOf { ReadingPageTonalElevationPreference.default } -val LocalReadingAutoHideToolbar = - compositionLocalOf { ReadingAutoHideToolbarPreference.default } -val LocalReadingTextFontSize = compositionLocalOf { ReadingTextFontSizePreference.default } -val LocalReadingTextLineHeight = compositionLocalOf { ReadingTextLineHeightPreference.default } -val LocalReadingLetterSpacing = compositionLocalOf { ReadingLetterSpacingPreference.default } -val LocalReadingTextHorizontalPadding = - compositionLocalOf { ReadingTextHorizontalPaddingPreference.default } -val LocalReadingTextAlign = - compositionLocalOf { ReadingTextAlignPreference.default } -val LocalReadingTextBold = - compositionLocalOf { ReadingTextBoldPreference.default } -val LocalReadingTitleAlign = - compositionLocalOf { ReadingTitleAlignPreference.default } -val LocalReadingSubheadAlign = - compositionLocalOf { ReadingSubheadAlignPreference.default } -val LocalReadingFonts = - compositionLocalOf { ReadingFontsPreference.default } -val LocalReadingTitleBold = - compositionLocalOf { ReadingTitleBoldPreference.default } -val LocalReadingSubheadBold = - compositionLocalOf { ReadingSubheadBoldPreference.default } -val LocalReadingTitleUpperCase = - compositionLocalOf { ReadingTitleUpperCasePreference.default } -val LocalReadingSubheadUpperCase = - compositionLocalOf { ReadingSubheadUpperCasePreference.default } -val LocalReadingImageHorizontalPadding = - compositionLocalOf { ReadingImageHorizontalPaddingPreference.default } -val LocalReadingImageRoundedCorners = - compositionLocalOf { ReadingImageRoundedCornersPreference.default } -val LocalReadingImageMaximize = - compositionLocalOf { ReadingImageMaximizePreference.default } - -// Interaction -val LocalInitialPage = compositionLocalOf { InitialPagePreference.default } -val LocalInitialFilter = - compositionLocalOf { InitialFilterPreference.default } -val LocalArticleListSwipeEndAction = compositionLocalOf { SwipeEndActionPreference.default } -val LocalArticleListSwipeStartAction = compositionLocalOf { SwipeStartActionPreference.default } -val LocalPullToSwitchArticle = compositionLocalOf { PullToSwitchArticlePreference.default } -val LocalOpenLink = compositionLocalOf { OpenLinkPreference.default } -val LocalOpenLinkSpecificBrowser = compositionLocalOf { OpenLinkSpecificBrowserPreference.default } -val LocalSharedContent = compositionLocalOf { SharedContentPreference.default } - -// Languages -val LocalLanguages = - compositionLocalOf { LanguagesPreference.default } - @Composable fun SettingsProvider( content: @Composable () -> Unit, @@ -218,7 +100,7 @@ fun SettingsProvider( CompositionLocalProvider( // Version - LocalNewVersionNumber provides settings.newVersionNumber, + NewVersionNumberPreference.provide(settings), LocalSkipVersionNumber provides settings.skipVersionNumber, LocalNewVersionPublishDate provides settings.newVersionPublishDate, LocalNewVersionLog provides settings.newVersionLog, @@ -264,7 +146,7 @@ fun SettingsProvider( LocalReadingAutoHideToolbar provides settings.readingAutoHideToolbar, LocalReadingTextFontSize provides settings.readingTextFontSize, LocalReadingTextLineHeight provides settings.readingTextLineHeight, - LocalReadingLetterSpacing provides settings.readingLetterSpacing, + LocalReadingTextLetterSpacing provides settings.readingLetterSpacing, LocalReadingTextHorizontalPadding provides settings.readingTextHorizontalPadding, LocalReadingTextAlign provides settings.readingTextAlign, LocalReadingTextBold provides settings.readingTextBold, diff --git a/app/src/main/java/me/ash/reader/infrastructure/preference/SharedContentPreference.kt b/app/src/main/java/me/ash/reader/infrastructure/preference/SharedContentPreference.kt index 64ee925b5..195c1f1c5 100644 --- a/app/src/main/java/me/ash/reader/infrastructure/preference/SharedContentPreference.kt +++ b/app/src/main/java/me/ash/reader/infrastructure/preference/SharedContentPreference.kt @@ -3,15 +3,19 @@ package me.ash.reader.infrastructure.preference import android.content.Context import android.content.Intent import androidx.compose.runtime.Stable +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.sharedContent import me.ash.reader.ui.ext.dataStore import me.ash.reader.ui.ext.orNotEmpty import me.ash.reader.ui.ext.put +val LocalSharedContent = compositionLocalOf { SharedContentPreference.default } + sealed class SharedContentPreference(val value: Int) : Preference() { object OnlyLink : SharedContentPreference(0) object TitleAndLink : SharedContentPreference(1) @@ -19,7 +23,7 @@ sealed class SharedContentPreference(val value: Int) : Preference() { override fun put(context: Context, scope: CoroutineScope) { scope.launch { context.dataStore.put( - DataStoreKeys.SharedContent, + DataStoreKey.sharedContent, value ) } @@ -52,7 +56,7 @@ sealed class SharedContentPreference(val value: Int) : Preference() { val values = listOf(OnlyLink, TitleAndLink) fun fromPreferences(preferences: Preferences): SharedContentPreference = - when (preferences[DataStoreKeys.SharedContent.key]) { + when (preferences[DataStoreKey.keys[sharedContent]?.key as Preferences.Key]) { 0 -> OnlyLink 1 -> TitleAndLink else -> default diff --git a/app/src/main/java/me/ash/reader/infrastructure/preference/SkipVersionNumberPreference.kt b/app/src/main/java/me/ash/reader/infrastructure/preference/SkipVersionNumberPreference.kt index 950967022..917d2788b 100644 --- a/app/src/main/java/me/ash/reader/infrastructure/preference/SkipVersionNumberPreference.kt +++ b/app/src/main/java/me/ash/reader/infrastructure/preference/SkipVersionNumberPreference.kt @@ -1,26 +1,30 @@ 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.Dispatchers import kotlinx.coroutines.launch import me.ash.reader.domain.model.general.Version import me.ash.reader.domain.model.general.toVersion -import me.ash.reader.ui.ext.DataStoreKeys +import me.ash.reader.ui.ext.DataStoreKey +import me.ash.reader.ui.ext.DataStoreKey.Companion.skipVersionNumber import me.ash.reader.ui.ext.dataStore import me.ash.reader.ui.ext.put +val LocalSkipVersionNumber = compositionLocalOf { SkipVersionNumberPreference.default } + object SkipVersionNumberPreference { val default = Version() fun put(context: Context, scope: CoroutineScope, value: String) { scope.launch(Dispatchers.IO) { - context.dataStore.put(DataStoreKeys.SkipVersionNumber, value) + context.dataStore.put(DataStoreKey.skipVersionNumber, value) } } fun fromPreferences(preferences: Preferences) = - preferences[DataStoreKeys.SkipVersionNumber.key].toVersion() + preferences[DataStoreKey.keys[skipVersionNumber]?.key as Preferences.Key].toVersion() } diff --git a/app/src/main/java/me/ash/reader/infrastructure/preference/SwipeActionPreference.kt b/app/src/main/java/me/ash/reader/infrastructure/preference/SwipeActionPreference.kt index 216b0c4d1..86e9133fe 100644 --- a/app/src/main/java/me/ash/reader/infrastructure/preference/SwipeActionPreference.kt +++ b/app/src/main/java/me/ash/reader/infrastructure/preference/SwipeActionPreference.kt @@ -2,12 +2,15 @@ package me.ash.reader.infrastructure.preference import android.content.Context import androidx.compose.runtime.Composable +import androidx.compose.runtime.compositionLocalOf import androidx.compose.ui.res.stringResource 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.swipeEndAction +import me.ash.reader.ui.ext.DataStoreKey.Companion.swipeStartAction import me.ash.reader.ui.ext.dataStore import me.ash.reader.ui.ext.put @@ -17,11 +20,13 @@ data object SwipeGestureActions { const val ToggleStarred = 2 } +val LocalArticleListSwipeEndAction = compositionLocalOf { SwipeEndActionPreference.default } + sealed class SwipeEndActionPreference(val action: Int) : Preference() { override fun put(context: Context, scope: CoroutineScope) { scope.launch { context.dataStore.put( - DataStoreKeys.SwipeEndAction, action + DataStoreKey.swipeEndAction, action ) } } @@ -47,7 +52,7 @@ sealed class SwipeEndActionPreference(val action: Int) : Preference() { ) fun fromPreferences(preferences: Preferences): SwipeEndActionPreference { - return when (preferences[DataStoreKeys.SwipeEndAction.key]) { + return when (preferences[DataStoreKey.keys[swipeEndAction]?.key as Preferences.Key]) { SwipeGestureActions.None -> None SwipeGestureActions.ToggleRead -> ToggleRead SwipeGestureActions.ToggleStarred -> ToggleStarred @@ -57,12 +62,12 @@ sealed class SwipeEndActionPreference(val action: Int) : Preference() { } } +val LocalArticleListSwipeStartAction = compositionLocalOf { SwipeStartActionPreference.default } + sealed class SwipeStartActionPreference(val action: Int) : Preference() { override fun put(context: Context, scope: CoroutineScope) { scope.launch { - context.dataStore.put( - DataStoreKeys.SwipeStartAction, action - ) + context.dataStore.put(DataStoreKey.swipeStartAction, action) } } @@ -87,7 +92,7 @@ sealed class SwipeStartActionPreference(val action: Int) : Preference() { ) fun fromPreferences(preferences: Preferences): SwipeStartActionPreference { - return when (preferences[DataStoreKeys.SwipeStartAction.key]) { + return when (preferences[DataStoreKey.keys[swipeStartAction]?.key as Preferences.Key]) { SwipeGestureActions.None -> None SwipeGestureActions.ToggleRead -> ToggleRead SwipeGestureActions.ToggleStarred -> ToggleStarred @@ -95,4 +100,4 @@ sealed class SwipeStartActionPreference(val action: Int) : Preference() { } } } -} \ No newline at end of file +} diff --git a/app/src/main/java/me/ash/reader/infrastructure/preference/ThemeIndexPreference.kt b/app/src/main/java/me/ash/reader/infrastructure/preference/ThemeIndexPreference.kt index ef5f33de1..ad4c36574 100644 --- a/app/src/main/java/me/ash/reader/infrastructure/preference/ThemeIndexPreference.kt +++ b/app/src/main/java/me/ash/reader/infrastructure/preference/ThemeIndexPreference.kt @@ -1,24 +1,29 @@ 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.Dispatchers 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.themeIndex import me.ash.reader.ui.ext.dataStore import me.ash.reader.ui.ext.put +val LocalThemeIndex = + compositionLocalOf { ThemeIndexPreference.default } + object ThemeIndexPreference { const val default = 5 fun put(context: Context, scope: CoroutineScope, value: Int) { scope.launch(Dispatchers.IO) { - context.dataStore.put(DataStoreKeys.ThemeIndex, value) + context.dataStore.put(DataStoreKey.themeIndex, value) } } fun fromPreferences(preferences: Preferences) = - preferences[DataStoreKeys.ThemeIndex.key] ?: default + preferences[DataStoreKey.keys[themeIndex]?.key as Preferences.Key] ?: default } diff --git a/app/src/main/java/me/ash/reader/ui/component/reader/Styles.kt b/app/src/main/java/me/ash/reader/ui/component/reader/Styles.kt index eedbab4cd..5692359c0 100644 --- a/app/src/main/java/me/ash/reader/ui/component/reader/Styles.kt +++ b/app/src/main/java/me/ash/reader/ui/component/reader/Styles.kt @@ -84,7 +84,7 @@ fun bodyStyle(): TextStyle = LocalTextStyle.current.merge( fontFamily = LocalReadingFonts.current.asFontFamily(LocalContext.current), fontWeight = if (LocalReadingTextBold.current.value) FontWeight.SemiBold else FontWeight.Normal, fontSize = LocalReadingTextFontSize.current.sp, - letterSpacing = LocalReadingLetterSpacing.current.sp, + letterSpacing = LocalReadingTextLetterSpacing.current.sp, color = bodyForeground(), textAlign = LocalReadingTextAlign.current.toTextAlign(), ) diff --git a/app/src/main/java/me/ash/reader/ui/ext/ContextExt.kt b/app/src/main/java/me/ash/reader/ui/ext/ContextExt.kt index 6cf99f523..7420b4757 100644 --- a/app/src/main/java/me/ash/reader/ui/ext/ContextExt.kt +++ b/app/src/main/java/me/ash/reader/ui/ext/ContextExt.kt @@ -183,9 +183,3 @@ fun Context.getCustomTabsPackages(): List { return@mapNotNull null }.toList() } - -fun Context.getPreferencesFile(): File = - File(filesDir.absolutePath + File.separator + - "datastore" + File.separator + - "settings.preferences_pb" - ) diff --git a/app/src/main/java/me/ash/reader/ui/ext/DataStoreExt.kt b/app/src/main/java/me/ash/reader/ui/ext/DataStoreExt.kt index 67d27a596..fae6492a1 100644 --- a/app/src/main/java/me/ash/reader/ui/ext/DataStoreExt.kt +++ b/app/src/main/java/me/ash/reader/ui/ext/DataStoreExt.kt @@ -5,13 +5,14 @@ import android.util.Log import androidx.datastore.core.DataStore import androidx.datastore.preferences.core.Preferences import androidx.datastore.preferences.core.booleanPreferencesKey -import androidx.datastore.preferences.core.doublePreferencesKey import androidx.datastore.preferences.core.edit import androidx.datastore.preferences.core.emptyPreferences import androidx.datastore.preferences.core.floatPreferencesKey import androidx.datastore.preferences.core.intPreferencesKey import androidx.datastore.preferences.core.stringPreferencesKey import androidx.datastore.preferences.preferencesDataStore +import com.google.gson.Gson +import com.google.gson.reflect.TypeToken import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.flow.catch import kotlinx.coroutines.flow.first @@ -23,40 +24,55 @@ import java.io.IOException val Context.dataStore: DataStore by preferencesDataStore(name = "settings") val Context.skipVersionNumber: String - get() = this.dataStore.get(DataStoreKeys.SkipVersionNumber) ?: "" + get() = this.dataStore.get(DataStoreKey.skipVersionNumber) ?: "" val Context.isFirstLaunch: Boolean - get() = this.dataStore.get(DataStoreKeys.IsFirstLaunch) ?: true + get() = this.dataStore.get(DataStoreKey.isFirstLaunch) ?: true val Context.currentAccountId: Int - get() = this.dataStore.get(DataStoreKeys.CurrentAccountId) ?: 1 + get() = this.dataStore.get(DataStoreKey.currentAccountId) ?: 1 val Context.currentAccountType: Int - get() = this.dataStore.get(DataStoreKeys.CurrentAccountType) ?: 1 + get() = this.dataStore.get(DataStoreKey.currentAccountType) ?: 1 val Context.initialPage: Int - get() = this.dataStore.get(DataStoreKeys.InitialPage) ?: 0 + get() = this.dataStore.get(DataStoreKey.initialPage) ?: 0 val Context.initialFilter: Int - get() = this.dataStore.get(DataStoreKeys.InitialFilter) ?: 2 + get() = this.dataStore.get(DataStoreKey.initialFilter) ?: 2 val Context.languages: Int - get() = this.dataStore.get(DataStoreKeys.Languages) ?: 0 + get() = this.dataStore.get(DataStoreKey.languages) ?: 0 -suspend fun DataStore.put(dataStoreKeys: DataStoreKeys, value: T) { +suspend fun DataStore.put(dataStoreKeys: String, value: Any) { + val key = DataStoreKey.keys[dataStoreKeys]?.key ?: return this.edit { withContext(Dispatchers.IO) { - it[dataStoreKeys.key] = value - } - } -} - -fun DataStore.putBlocking(dataStoreKeys: DataStoreKeys, value: T) { - runBlocking { - this@putBlocking.edit { - it[dataStoreKeys.key] = value + when (value) { + is Int -> { + it[key as Preferences.Key] = value + } + is Long -> { + it[key as Preferences.Key] = value + } + is String -> { + it[key as Preferences.Key] = value + } + is Boolean -> { + it[key as Preferences.Key] = value + } + is Float -> { + it[key as Preferences.Key] = value + } + is Double -> { + it[key as Preferences.Key] = value + } + else -> { + throw IllegalArgumentException("Unsupported type") + } + } } } } @Suppress("UNCHECKED_CAST") -fun DataStore.get(dataStoreKeys: DataStoreKeys): T? { +fun DataStore.get(key: String): T? { return runBlocking { this@get.data.catch { exception -> if (exception is IOException) { @@ -67,395 +83,196 @@ fun DataStore.get(dataStoreKeys: DataStoreKeys): T? { throw exception } }.map { - it[dataStoreKeys.key] + it[DataStoreKey.keys[key]?.key as Preferences.Key] }.first() as T } } -sealed class DataStoreKeys { - - abstract val key: Preferences.Key - - // Version - object IsFirstLaunch : DataStoreKeys() { - - override val key: Preferences.Key - get() = booleanPreferencesKey("isFirstLaunch") - } - - object NewVersionPublishDate : DataStoreKeys() { - - override val key: Preferences.Key - get() = stringPreferencesKey("newVersionPublishDate") - } - - object NewVersionLog : DataStoreKeys() { - - override val key: Preferences.Key - get() = stringPreferencesKey("newVersionLog") - } - - object NewVersionSize : DataStoreKeys() { - - override val key: Preferences.Key - get() = stringPreferencesKey("newVersionSizeString") - } - - object NewVersionDownloadUrl : DataStoreKeys() { - - override val key: Preferences.Key - get() = stringPreferencesKey("newVersionDownloadUrl") - } - - object NewVersionNumber : DataStoreKeys() { - - override val key: Preferences.Key - get() = stringPreferencesKey("newVersionNumber") - } - - object SkipVersionNumber : DataStoreKeys() { - - override val key: Preferences.Key - get() = stringPreferencesKey("skipVersionNumber") - } - - object CurrentAccountId : DataStoreKeys() { - - override val key: Preferences.Key - get() = intPreferencesKey("currentAccountId") - } - - object CurrentAccountType : DataStoreKeys() { - - override val key: Preferences.Key - get() = intPreferencesKey("currentAccountType") - } - - object ThemeIndex : DataStoreKeys() { - - override val key: Preferences.Key - get() = intPreferencesKey("themeIndex") - } - - object CustomPrimaryColor : DataStoreKeys() { - - override val key: Preferences.Key - get() = stringPreferencesKey("customPrimaryColor") - } - - object DarkTheme : DataStoreKeys() { - - override val key: Preferences.Key - get() = intPreferencesKey("darkTheme") - } - - object AmoledDarkTheme : DataStoreKeys() { - - override val key: Preferences.Key - get() = booleanPreferencesKey("amoledDarkTheme") - } - - object BasicFonts : DataStoreKeys() { - - override val key: Preferences.Key - get() = intPreferencesKey("basicFonts") - } - - // Feeds page - object FeedsFilterBarStyle : DataStoreKeys() { - - override val key: Preferences.Key - get() = intPreferencesKey("feedsFilterBarStyle") - } - - object FeedsFilterBarFilled : DataStoreKeys() { - - override val key: Preferences.Key - get() = booleanPreferencesKey("feedsFilterBarFilled") - } - - object FeedsFilterBarPadding : DataStoreKeys() { - - override val key: Preferences.Key - get() = intPreferencesKey("feedsFilterBarPadding") - } - - object FeedsFilterBarTonalElevation : DataStoreKeys() { - - override val key: Preferences.Key - get() = intPreferencesKey("feedsFilterBarTonalElevation") - } - - object FeedsTopBarTonalElevation : DataStoreKeys() { - - override val key: Preferences.Key - get() = intPreferencesKey("feedsTopBarTonalElevation") - } - - object FeedsGroupListExpand : DataStoreKeys() { - - override val key: Preferences.Key - get() = booleanPreferencesKey("feedsGroupListExpand") - } - - object FeedsGroupListTonalElevation : DataStoreKeys() { - - override val key: Preferences.Key - get() = intPreferencesKey("feedsGroupListTonalElevation") - } - - // Flow page - object FlowFilterBarStyle : DataStoreKeys() { - - override val key: Preferences.Key - get() = intPreferencesKey("flowFilterBarStyle") - } - - object FlowFilterBarFilled : DataStoreKeys() { - - override val key: Preferences.Key - get() = booleanPreferencesKey("flowFilterBarFilled") - } - - object FlowFilterBarPadding : DataStoreKeys() { - - override val key: Preferences.Key - get() = intPreferencesKey("flowFilterBarPadding") - } - - object FlowFilterBarTonalElevation : DataStoreKeys() { - - override val key: Preferences.Key - get() = intPreferencesKey("flowFilterBarTonalElevation") - } - - object FlowTopBarTonalElevation : DataStoreKeys() { - - override val key: Preferences.Key - get() = intPreferencesKey("flowTopBarTonalElevation") - } - - object FlowArticleListFeedIcon : DataStoreKeys() { - - override val key: Preferences.Key - get() = booleanPreferencesKey("flowArticleListFeedIcon") - } - - object FlowArticleListFeedName : DataStoreKeys() { - - override val key: Preferences.Key - get() = booleanPreferencesKey("flowArticleListFeedName") - } - - object FlowArticleListImage : DataStoreKeys() { - - override val key: Preferences.Key - get() = booleanPreferencesKey("flowArticleListImage") - } - - object FlowArticleListDesc : DataStoreKeys() { - - override val key: Preferences.Key - get() = booleanPreferencesKey("flowArticleListDesc") - } - - object FlowArticleListTime : DataStoreKeys() { - - override val key: Preferences.Key - get() = booleanPreferencesKey("flowArticleListTime") - } - - object FlowArticleListDateStickyHeader : DataStoreKeys() { - - override val key: Preferences.Key - get() = booleanPreferencesKey("flowArticleListDateStickyHeader") - } - - object FlowArticleListTonalElevation : DataStoreKeys() { - - override val key: Preferences.Key - get() = intPreferencesKey("flowArticleListTonalElevation") - } - - object FlowArticleListReadIndicator : DataStoreKeys() { - - override val key: Preferences.Key - get() = booleanPreferencesKey("flowArticleListReadIndicator") - } - - // Reading page - object ReadingDarkTheme : DataStoreKeys() { - - override val key: Preferences.Key - get() = intPreferencesKey("readingDarkTheme") - } - - object ReadingPageTonalElevation : DataStoreKeys() { - - override val key: Preferences.Key - get() = intPreferencesKey("ReadingPageTonalElevation") - } - - object ReadingTextFontSize : DataStoreKeys() { - - override val key: Preferences.Key - get() = intPreferencesKey("readingTextFontSize") - } - - object ReadingLineHeight : DataStoreKeys() { - - override val key: Preferences.Key - get() = floatPreferencesKey("readingTextLineHeight") - } - - object ReadingLetterSpacing : DataStoreKeys() { - - override val key: Preferences.Key - get() = doublePreferencesKey("readingLetterSpacing") - } - - object ReadingTextHorizontalPadding : DataStoreKeys() { - - override val key: Preferences.Key - get() = intPreferencesKey("readingTextHorizontalPadding") - } - - object ReadingTextBold : DataStoreKeys() { - - override val key: Preferences.Key - get() = booleanPreferencesKey("readingTextBold") - } - - object ReadingTextAlign : DataStoreKeys() { - - override val key: Preferences.Key - get() = intPreferencesKey("readingTextAlign") - } - - object ReadingTitleAlign : DataStoreKeys() { - - override val key: Preferences.Key - get() = intPreferencesKey("readingTitleAlign") - } - - object ReadingSubheadAlign : DataStoreKeys() { - - override val key: Preferences.Key - get() = intPreferencesKey("readingSubheadAlign") - } - - object ReadingTheme : DataStoreKeys() { - - override val key: Preferences.Key - get() = intPreferencesKey("readingTheme") - } - - object ReadingFonts : DataStoreKeys() { - - override val key: Preferences.Key - get() = intPreferencesKey("readingFonts") - } - - object ReadingAutoHideToolbar : DataStoreKeys() { - - override val key: Preferences.Key - get() = booleanPreferencesKey("readingAutoHideToolbar") - } - - object ReadingTitleBold : DataStoreKeys() { - - override val key: Preferences.Key - get() = booleanPreferencesKey("readingTitleBold") - } - - object ReadingSubheadBold : DataStoreKeys() { - - override val key: Preferences.Key - get() = booleanPreferencesKey("ReadingSubheadBold") - } - - object ReadingTitleUpperCase : DataStoreKeys() { - - override val key: Preferences.Key - get() = booleanPreferencesKey("readingTitleUpperCase") - } - - object ReadingSubheadUpperCase : DataStoreKeys() { - - override val key: Preferences.Key - get() = booleanPreferencesKey("ReadingSubheadUpperCase") - } - - object ReadingImageMaximize : DataStoreKeys() { - - override val key: Preferences.Key - get() = booleanPreferencesKey("readingImageMaximize") - } - - object ReadingImageHorizontalPadding : DataStoreKeys() { - - override val key: Preferences.Key - get() = intPreferencesKey("readingImageHorizontalPadding") - } - - object ReadingImageRoundedCorners : DataStoreKeys() { - - override val key: Preferences.Key - get() = intPreferencesKey("readingImageRoundedCorners") - } - - // Interaction - object InitialPage : DataStoreKeys() { - - override val key: Preferences.Key - get() = intPreferencesKey("initialPage") - } - - object InitialFilter : DataStoreKeys() { - - override val key: Preferences.Key - get() = intPreferencesKey("initialFilter") - } - - data object SwipeStartAction : DataStoreKeys() { - - override val key: Preferences.Key - get() = intPreferencesKey("swipeStartAction") - } - - data object SwipeEndAction : DataStoreKeys() { - - override val key: Preferences.Key - get() = intPreferencesKey("swipeEndAction") - } - - data object PullToSwitchArticle : DataStoreKeys() { - override val key: Preferences.Key - get() = booleanPreferencesKey("pullToSwitchArticle") - } - - object OpenLink : DataStoreKeys() { - - override val key: Preferences.Key - get() = intPreferencesKey("openLink") - } - - object OpenLinkAppSpecificBrowser : DataStoreKeys() { - - override val key: Preferences.Key - get() = stringPreferencesKey("openLppSpecificBrowser") - } - - object SharedContent : DataStoreKeys() { - - override val key: Preferences.Key - get() = intPreferencesKey("sharedContent") +@Suppress("ConstPropertyName") +data class DataStoreKey( + val key: Preferences.Key, + val type: Class, +) { + companion object { + const val isFirstLaunch = "isFirstLaunch" + const val newVersionPublishDate = "newVersionPublishDate" + const val newVersionLog = "newVersionLog" + const val newVersionSize = "newVersionSize" + const val newVersionDownloadUrl = "newVersionDownloadUrl" + const val newVersionNumber = "newVersionNumber" + const val skipVersionNumber = "skipVersionNumber" + const val currentAccountId = "currentAccountId" + const val currentAccountType = "currentAccountType" + const val themeIndex = "themeIndex" + const val customPrimaryColor = "customPrimaryColor" + const val darkTheme = "darkTheme" + const val amoledDarkTheme = "amoledDarkTheme" + const val basicFonts = "basicFonts" + + // Feeds page + const val feedsFilterBarStyle = "feedsFilterBarStyle" + const val feedsFilterBarFilled = "feedsFilterBarFilled" + const val feedsFilterBarPadding = "feedsFilterBarPadding" + const val feedsFilterBarTonalElevation = "feedsFilterBarTonalElevation" + const val feedsTopBarTonalElevation = "feedsTopBarTonalElevation" + const val feedsGroupListExpand = "feedsGroupListExpand" + const val feedsGroupListTonalElevation = "feedsGroupListTonalElevation" + + // Flow page + const val flowFilterBarStyle = "flowFilterBarStyle" + const val flowFilterBarFilled = "flowFilterBarFilled" + const val flowFilterBarPadding = "flowFilterBarPadding" + const val flowFilterBarTonalElevation = "flowFilterBarTonalElevation" + const val flowTopBarTonalElevation = "flowTopBarTonalElevation" + const val flowArticleListFeedIcon = "flowArticleListFeedIcon" + const val flowArticleListFeedName = "flowArticleListFeedName" + const val flowArticleListImage = "flowArticleListImage" + const val flowArticleListDesc = "flowArticleListDesc" + const val flowArticleListTime = "flowArticleListTime" + const val flowArticleListDateStickyHeader = "flowArticleListDateStickyHeader" + const val flowArticleListTonalElevation = "flowArticleListTonalElevation" + const val flowArticleListReadIndicator = "flowArticleListReadIndicator" + + // Reading page + const val readingDarkTheme = "readingDarkTheme" + const val readingPageTonalElevation = "readingPageTonalElevation" + const val readingTextFontSize = "readingTextFontSize" + const val readingTextLineHeight = "readingTextLineHeight" + const val readingTextLetterSpacing = "readingTextLetterSpacing" + const val readingTextHorizontalPadding = "readingTextHorizontalPadding" + const val readingTextBold = "readingTextBold" + const val readingTextAlign = "readingTextAlign" + const val readingTitleAlign = "readingTitleAlign" + const val readingSubheadAlign = "readingSubheadAlign" + const val readingTheme = "readingTheme" + const val readingFonts = "readingFonts" + const val readingAutoHideToolbar = "readingAutoHideToolbar" + const val readingTitleBold = "readingTitleBold" + const val readingSubheadBold = "readingSubheadBold" + const val readingTitleUpperCase = "readingTitleUpperCase" + const val readingSubheadUpperCase = "readingSubheadUpperCase" + const val readingImageMaximize = "readingImageMaximize" + const val readingImageHorizontalPadding = "readingImageHorizontalPadding" + const val readingImageRoundedCorners = "readingImageRoundedCorners" + + // Interaction + const val initialPage = "initialPage" + const val initialFilter = "initialFilter" + const val swipeStartAction = "swipeStartAction" + const val swipeEndAction = "swipeEndAction" + const val pullToSwitchArticle = "pullToSwitchArticle" + const val openLink = "openLink" + const val openLinkAppSpecificBrowser = "openLinkAppSpecificBrowser" + const val sharedContent = "sharedContent" + + // Languages + const val languages = "languages" + + val keys: MutableMap> = mutableMapOf( + // Version + isFirstLaunch to DataStoreKey(booleanPreferencesKey(isFirstLaunch), Boolean::class.java), + newVersionPublishDate to DataStoreKey(stringPreferencesKey(newVersionPublishDate), String::class.java), + newVersionLog to DataStoreKey(stringPreferencesKey(newVersionLog), String::class.java), + newVersionSize to DataStoreKey(stringPreferencesKey(newVersionSize), String::class.java), + newVersionDownloadUrl to DataStoreKey(stringPreferencesKey(newVersionDownloadUrl), String::class.java), + newVersionNumber to DataStoreKey(stringPreferencesKey(newVersionNumber), String::class.java), + skipVersionNumber to DataStoreKey(stringPreferencesKey(skipVersionNumber), String::class.java), + currentAccountId to DataStoreKey(intPreferencesKey(currentAccountId), Int::class.java), + currentAccountType to DataStoreKey(intPreferencesKey(currentAccountType), Int::class.java), + themeIndex to DataStoreKey(intPreferencesKey(themeIndex), Int::class.java), + customPrimaryColor to DataStoreKey(stringPreferencesKey(customPrimaryColor), String::class.java), + darkTheme to DataStoreKey(intPreferencesKey(darkTheme), Int::class.java), + amoledDarkTheme to DataStoreKey(booleanPreferencesKey(amoledDarkTheme), Boolean::class.java), + basicFonts to DataStoreKey(intPreferencesKey(basicFonts), Int::class.java), + // Feeds page + feedsFilterBarStyle to DataStoreKey(intPreferencesKey(feedsFilterBarStyle), Int::class.java), + feedsFilterBarFilled to DataStoreKey(booleanPreferencesKey(feedsFilterBarFilled), Boolean::class.java), + feedsFilterBarPadding to DataStoreKey(intPreferencesKey(feedsFilterBarPadding), Int::class.java), + feedsFilterBarTonalElevation to DataStoreKey(intPreferencesKey(feedsFilterBarTonalElevation), Int::class.java), + feedsTopBarTonalElevation to DataStoreKey(intPreferencesKey(feedsTopBarTonalElevation), Int::class.java), + feedsGroupListExpand to DataStoreKey(booleanPreferencesKey(feedsGroupListExpand), Boolean::class.java), + feedsGroupListTonalElevation to DataStoreKey(intPreferencesKey(feedsGroupListTonalElevation), Int::class.java), + // Flow page + flowFilterBarStyle to DataStoreKey(intPreferencesKey(flowFilterBarStyle), Int::class.java), + flowFilterBarFilled to DataStoreKey(booleanPreferencesKey(flowFilterBarFilled), Boolean::class.java), + flowFilterBarPadding to DataStoreKey(intPreferencesKey(flowFilterBarPadding), Int::class.java), + flowFilterBarTonalElevation to DataStoreKey(intPreferencesKey(flowFilterBarTonalElevation), Int::class.java), + flowTopBarTonalElevation to DataStoreKey(intPreferencesKey(flowTopBarTonalElevation), Int::class.java), + flowArticleListFeedIcon to DataStoreKey(booleanPreferencesKey(flowArticleListFeedIcon), Boolean::class.java), + flowArticleListFeedName to DataStoreKey(booleanPreferencesKey(flowArticleListFeedName), Boolean::class.java), + flowArticleListImage to DataStoreKey(booleanPreferencesKey(flowArticleListImage), Boolean::class.java), + flowArticleListDesc to DataStoreKey(booleanPreferencesKey(flowArticleListDesc), Boolean::class.java), + flowArticleListTime to DataStoreKey(booleanPreferencesKey(flowArticleListTime), Boolean::class.java), + flowArticleListDateStickyHeader to DataStoreKey(booleanPreferencesKey(flowArticleListDateStickyHeader), Boolean::class.java), + flowArticleListTonalElevation to DataStoreKey(intPreferencesKey(flowArticleListTonalElevation), Int::class.java), + flowArticleListReadIndicator to DataStoreKey(booleanPreferencesKey(flowArticleListReadIndicator), Boolean::class.java), + // Reading page + readingDarkTheme to DataStoreKey(intPreferencesKey(readingDarkTheme), Int::class.java), + readingPageTonalElevation to DataStoreKey(intPreferencesKey(readingPageTonalElevation), Int::class.java), + readingTextFontSize to DataStoreKey(intPreferencesKey(readingTextFontSize), Int::class.java), + readingTextLineHeight to DataStoreKey(floatPreferencesKey(readingTextLineHeight), Float::class.java), + readingTextLetterSpacing to DataStoreKey(floatPreferencesKey(readingTextLetterSpacing), Float::class.java), + readingTextHorizontalPadding to DataStoreKey(intPreferencesKey(readingTextHorizontalPadding), Int::class.java), + readingTextBold to DataStoreKey(booleanPreferencesKey(readingTextBold), Boolean::class.java), + readingTextAlign to DataStoreKey(intPreferencesKey(readingTextAlign), Int::class.java), + readingTitleAlign to DataStoreKey(intPreferencesKey(readingTitleAlign), Int::class.java), + readingSubheadAlign to DataStoreKey(intPreferencesKey(readingSubheadAlign), Int::class.java), + readingTheme to DataStoreKey(intPreferencesKey(readingTheme), Int::class.java), + readingFonts to DataStoreKey(intPreferencesKey(readingFonts), Int::class.java), + readingAutoHideToolbar to DataStoreKey(booleanPreferencesKey(readingAutoHideToolbar), Boolean::class.java), + readingTitleBold to DataStoreKey(booleanPreferencesKey(readingTitleBold), Boolean::class.java), + readingSubheadBold to DataStoreKey(booleanPreferencesKey(readingSubheadBold), Boolean::class.java), + readingTitleUpperCase to DataStoreKey(booleanPreferencesKey(readingTitleUpperCase), Boolean::class.java), + readingSubheadUpperCase to DataStoreKey(booleanPreferencesKey(readingSubheadUpperCase), Boolean::class.java), + readingImageMaximize to DataStoreKey(booleanPreferencesKey(readingImageMaximize), Boolean::class.java), + readingImageHorizontalPadding to DataStoreKey(intPreferencesKey(readingImageHorizontalPadding), Int::class.java), + readingImageRoundedCorners to DataStoreKey(intPreferencesKey(readingImageRoundedCorners), Int::class.java), + // Interaction + initialPage to DataStoreKey(intPreferencesKey(initialPage), Int::class.java), + initialFilter to DataStoreKey(intPreferencesKey(initialFilter), Int::class.java), + swipeStartAction to DataStoreKey(intPreferencesKey(swipeStartAction), Int::class.java), + swipeEndAction to DataStoreKey(intPreferencesKey(swipeEndAction), Int::class.java), + pullToSwitchArticle to DataStoreKey(booleanPreferencesKey(pullToSwitchArticle), Boolean::class.java), + openLink to DataStoreKey(intPreferencesKey(openLink), Int::class.java), + openLinkAppSpecificBrowser to DataStoreKey(stringPreferencesKey(openLinkAppSpecificBrowser), String::class.java), + sharedContent to DataStoreKey(intPreferencesKey(sharedContent), Int::class.java), + // Languages + languages to DataStoreKey(intPreferencesKey(languages), Int::class.java) + ) } +} - // Languages - object Languages : DataStoreKeys() { +val ignorePreferencesOnExportAndImport = listOf( + DataStoreKey.currentAccountId, + DataStoreKey.currentAccountType, + DataStoreKey.isFirstLaunch, +) + +suspend fun Context.fromDataStoreToJSONString(): String { + val preferences = dataStore.data.first() + val map: Map = + preferences.asMap().mapKeys { it.key.name }.filterKeys { it !in ignorePreferencesOnExportAndImport } + return Gson().toJson(map) +} - override val key: Preferences.Key - get() = intPreferencesKey("languages") +suspend fun String.fromJSONStringToDataStore(context: Context) { + val gson = Gson() + val type = object : TypeToken>() {}.type + val map: Map = gson.fromJson(this, type) + context.dataStore.edit { preferences -> + map.filterKeys { it !in ignorePreferencesOnExportAndImport }.forEach { (keyString, value) -> + val item = DataStoreKey.keys[keyString] + Log.d("RLog", "fromJSONStringToDataStore: ${item?.key?.name}, ${item?.type}") + if (item != null) { + when (item.type) { + String::class.java -> preferences[item.key as Preferences.Key] = value as String + Int::class.java -> preferences[item.key as Preferences.Key] = (value as Double).toInt() + Boolean::class.java -> preferences[item.key as Preferences.Key] = value as Boolean + Float::class.java -> preferences[item.key as Preferences.Key] = (value as Double).toFloat() + Long::class.java -> preferences[item.key as Preferences.Key] = (value as Double).toLong() + else -> throw IllegalArgumentException("Unsupported type") + } + } + } } } diff --git a/app/src/main/java/me/ash/reader/ui/page/settings/color/reading/ReadingTextPage.kt b/app/src/main/java/me/ash/reader/ui/page/settings/color/reading/ReadingTextPage.kt index 26bda4b98..f984063ad 100644 --- a/app/src/main/java/me/ash/reader/ui/page/settings/color/reading/ReadingTextPage.kt +++ b/app/src/main/java/me/ash/reader/ui/page/settings/color/reading/ReadingTextPage.kt @@ -2,13 +2,26 @@ package me.ash.reader.ui.page.settings.color.reading import androidx.compose.foundation.background import androidx.compose.foundation.clickable -import androidx.compose.foundation.layout.* +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.WindowInsets +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.navigationBars +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.windowInsetsBottomHeight import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.material.icons.Icons import androidx.compose.material.icons.automirrored.rounded.ArrowBack import androidx.compose.material3.MaterialTheme -import androidx.compose.runtime.* +import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.rememberCoroutineScope +import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.draw.clip @@ -17,9 +30,29 @@ import androidx.compose.ui.res.stringResource import androidx.compose.ui.unit.dp import androidx.navigation.NavHostController import me.ash.reader.R -import me.ash.reader.infrastructure.preference.* +import me.ash.reader.infrastructure.preference.LocalReadingTextLetterSpacing +import me.ash.reader.infrastructure.preference.LocalReadingTextAlign +import me.ash.reader.infrastructure.preference.LocalReadingTextBold +import me.ash.reader.infrastructure.preference.LocalReadingTextFontSize +import me.ash.reader.infrastructure.preference.LocalReadingTextHorizontalPadding +import me.ash.reader.infrastructure.preference.LocalReadingTextLineHeight +import me.ash.reader.infrastructure.preference.LocalReadingTheme +import me.ash.reader.infrastructure.preference.ReadingTextLetterSpacingPreference +import me.ash.reader.infrastructure.preference.ReadingTextAlignPreference +import me.ash.reader.infrastructure.preference.ReadingTextFontSizePreference +import me.ash.reader.infrastructure.preference.ReadingTextHorizontalPaddingPreference +import me.ash.reader.infrastructure.preference.ReadingTextLineHeightPreference import me.ash.reader.infrastructure.preference.ReadingTextLineHeightPreference.coerceToRange -import me.ash.reader.ui.component.base.* +import me.ash.reader.infrastructure.preference.ReadingThemePreference +import me.ash.reader.infrastructure.preference.not +import me.ash.reader.ui.component.base.DisplayText +import me.ash.reader.ui.component.base.FeedbackIconButton +import me.ash.reader.ui.component.base.RYScaffold +import me.ash.reader.ui.component.base.RYSwitch +import me.ash.reader.ui.component.base.RadioDialog +import me.ash.reader.ui.component.base.RadioDialogOption +import me.ash.reader.ui.component.base.Subtitle +import me.ash.reader.ui.component.base.TextFieldDialog import me.ash.reader.ui.page.settings.SettingItem import me.ash.reader.ui.theme.palette.onLight @@ -33,7 +66,7 @@ fun ReadingTextPage( val readingTheme = LocalReadingTheme.current val fontSize = LocalReadingTextFontSize.current val lineHeight = LocalReadingTextLineHeight.current - val letterSpacing = LocalReadingLetterSpacing.current + val letterSpacing = LocalReadingTextLetterSpacing.current val horizontalPadding = LocalReadingTextHorizontalPadding.current val align = LocalReadingTextAlign.current val bold = LocalReadingTextBold.current @@ -192,10 +225,10 @@ fun ReadingTextPage( letterSpacingDialogVisible = false }, onConfirm = { - ReadingLetterSpacingPreference.put( + ReadingTextLetterSpacingPreference.put( context, scope, - letterSpacingValue?.toDoubleOrNull() ?: 0.0 + letterSpacingValue?.toFloatOrNull() ?: 0F ) ReadingThemePreference.Custom.put(context, scope) letterSpacingDialogVisible = false diff --git a/app/src/main/java/me/ash/reader/ui/page/settings/tips/TipsAndSupportPage.kt b/app/src/main/java/me/ash/reader/ui/page/settings/tips/TipsAndSupportPage.kt index fdcaa7a47..da4944438 100644 --- a/app/src/main/java/me/ash/reader/ui/page/settings/tips/TipsAndSupportPage.kt +++ b/app/src/main/java/me/ash/reader/ui/page/settings/tips/TipsAndSupportPage.kt @@ -60,7 +60,7 @@ import me.ash.reader.infrastructure.preference.OpenLinkPreference import me.ash.reader.ui.component.base.CurlyCornerShape import me.ash.reader.ui.component.base.FeedbackIconButton import me.ash.reader.ui.component.base.RYScaffold -import me.ash.reader.ui.ext.DataStoreKeys +import me.ash.reader.ui.ext.DataStoreKey import me.ash.reader.ui.ext.dataStore import me.ash.reader.ui.ext.getCurrentVersion import me.ash.reader.ui.ext.openURL @@ -137,10 +137,7 @@ fun TipsAndSupportPage( updateViewModel.checkUpdate( { context.showToast(context.getString(R.string.checking_updates)) - context.dataStore.put( - DataStoreKeys.SkipVersionNumber, - "" - ) + context.dataStore.put(DataStoreKey.skipVersionNumber, "") }, { if (!it) { diff --git a/app/src/main/java/me/ash/reader/ui/page/settings/troubleshooting/TroubleshootingPage.kt b/app/src/main/java/me/ash/reader/ui/page/settings/troubleshooting/TroubleshootingPage.kt index 402b6703a..c0a70d9b3 100644 --- a/app/src/main/java/me/ash/reader/ui/page/settings/troubleshooting/TroubleshootingPage.kt +++ b/app/src/main/java/me/ash/reader/ui/page/settings/troubleshooting/TroubleshootingPage.kt @@ -62,7 +62,7 @@ fun TroubleshootingPage( var byteArray by remember { mutableStateOf(ByteArray(0)) } val exportLauncher = rememberLauncherForActivityResult( - ActivityResultContracts.CreateDocument(MimeType.ANY) + ActivityResultContracts.CreateDocument(MimeType.JSON) ) { result -> viewModel.exportPreferencesAsJSON(context) { byteArray -> result?.let { uri -> @@ -118,18 +118,19 @@ fun TroubleshootingPage( Spacer(modifier = Modifier.height(16.dp)) } item { + Spacer(modifier = Modifier.height(24.dp)) Subtitle( modifier = Modifier.padding(horizontal = 24.dp), text = stringResource(R.string.app_preferences), ) SettingItem( - title = stringResource(R.string.import_from_protobuf_file), + title = stringResource(R.string.import_from_json), onClick = { importLauncher.launch(arrayOf(MimeType.ANY)) }, ) {} SettingItem( - title = stringResource(R.string.export_as_protobuf_file), + title = stringResource(R.string.export_as_json), onClick = { preferenceFileLauncher(context, exportLauncher) }, @@ -150,14 +151,14 @@ fun TroubleshootingPage( icon = { Icon( imageVector = Icons.Outlined.ReportGmailerrorred, - contentDescription = stringResource(R.string.import_from_protobuf_file), + contentDescription = stringResource(R.string.import_from_json), ) }, title = { - Text(text = stringResource(R.string.import_from_protobuf_file)) + Text(text = stringResource(R.string.import_from_json)) }, text = { - Text(text = stringResource(R.string.invalid_protobuf_file_warning)) + Text(text = stringResource(R.string.invalid_json_file_warning)) }, confirmButton = { TextButton( @@ -183,5 +184,5 @@ private fun preferenceFileLauncher( ) { launcher.launch("Read-You-" + "${context.getCurrentVersion()}-settings-" + - "${Date().toString(DateFormat.YYYY_MM_DD_DASH_HH_MM_SS_DASH)}.preferences_pb") + "${Date().toString(DateFormat.YYYY_MM_DD_DASH_HH_MM_SS_DASH)}.json") } diff --git a/app/src/main/java/me/ash/reader/ui/page/settings/troubleshooting/TroubleshootingViewModel.kt b/app/src/main/java/me/ash/reader/ui/page/settings/troubleshooting/TroubleshootingViewModel.kt index 38ea28b34..2c4029af0 100644 --- a/app/src/main/java/me/ash/reader/ui/page/settings/troubleshooting/TroubleshootingViewModel.kt +++ b/app/src/main/java/me/ash/reader/ui/page/settings/troubleshooting/TroubleshootingViewModel.kt @@ -18,9 +18,9 @@ import me.ash.reader.infrastructure.di.ApplicationScope import me.ash.reader.infrastructure.di.DefaultDispatcher import me.ash.reader.infrastructure.di.IODispatcher import me.ash.reader.infrastructure.di.MainDispatcher -import me.ash.reader.ui.ext.getPreferencesFile +import me.ash.reader.ui.ext.fromDataStoreToJSONString +import me.ash.reader.ui.ext.fromJSONStringToDataStore import me.ash.reader.ui.ext.isProbableProtobuf -import me.ash.reader.ui.ext.restart import javax.inject.Inject @HiltViewModel @@ -60,17 +60,13 @@ class TroubleshootingViewModel @Inject constructor( fun importPreferencesFromJSON(context: Context, byteArray: ByteArray) { viewModelScope.launch(ioDispatcher) { - val file = context.getPreferencesFile() - if (file.exists()) file.delete() - if (file.createNewFile()) file.writeBytes(byteArray) - context.restart() + String(byteArray).fromJSONStringToDataStore(context) } } fun exportPreferencesAsJSON(context: Context, callback: (ByteArray) -> Unit = {}) { viewModelScope.launch(ioDispatcher) { - val file = context.getPreferencesFile() - callback(if (file.exists()) file.readBytes() else byteArrayOf()) + callback(context.fromDataStoreToJSONString().toByteArray()) } } } diff --git a/app/src/main/java/me/ash/reader/ui/page/startup/StartupPage.kt b/app/src/main/java/me/ash/reader/ui/page/startup/StartupPage.kt index cc8f0e56c..8a0cfd5f1 100644 --- a/app/src/main/java/me/ash/reader/ui/page/startup/StartupPage.kt +++ b/app/src/main/java/me/ash/reader/ui/page/startup/StartupPage.kt @@ -11,8 +11,17 @@ import androidx.compose.foundation.verticalScroll import androidx.compose.material.icons.Icons import androidx.compose.material.icons.rounded.Balance import androidx.compose.material.icons.rounded.CheckCircleOutline -import androidx.compose.material3.* -import androidx.compose.runtime.* +import androidx.compose.material3.ExtendedFloatingActionButton +import androidx.compose.material3.Icon +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Text +import androidx.compose.material3.TextButton +import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.rememberCoroutineScope +import androidx.compose.runtime.setValue import androidx.compose.ui.Modifier import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.res.stringResource @@ -21,8 +30,12 @@ import androidx.navigation.NavHostController import com.ireward.htmlcompose.HtmlText import kotlinx.coroutines.launch import me.ash.reader.R -import me.ash.reader.ui.component.base.* -import me.ash.reader.ui.ext.DataStoreKeys +import me.ash.reader.ui.component.base.DisplayText +import me.ash.reader.ui.component.base.DynamicSVGImage +import me.ash.reader.ui.component.base.RYDialog +import me.ash.reader.ui.component.base.RYScaffold +import me.ash.reader.ui.component.base.Tips +import me.ash.reader.ui.ext.DataStoreKey import me.ash.reader.ui.ext.dataStore import me.ash.reader.ui.ext.put import me.ash.reader.ui.page.common.RouteName @@ -85,7 +98,7 @@ fun StartupPage( launchSingleTop = true } scope.launch { - context.dataStore.put(DataStoreKeys.IsFirstLaunch, false) + context.dataStore.put(DataStoreKey.isFirstLaunch, false) } }, icon = { @@ -129,7 +142,7 @@ fun StartupPage( launchSingleTop = true } scope.launch { - context.dataStore.put(DataStoreKeys.IsFirstLaunch, false) + context.dataStore.put(DataStoreKey.isFirstLaunch, false) } } ) { diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 548c96b80..b15045e17 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -440,4 +440,7 @@ Import from protobuf file Export as protobuf file This file may not be a valid protobuf file. Importing it could potentially corrupt the app and result in the loss of current preferences. Are you sure you want to proceed? + Import from JSON + Export as JSON + This file may not be a valid JSON file. Importing it could potentially corrupt the app and result in the loss of current preferences. Are you sure you want to proceed?