Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -6,27 +6,21 @@ 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.DataStoreKey
import me.ash.reader.ui.ext.DataStoreKey.Companion.darkTheme
import me.ash.reader.ui.ext.dataStore
import me.ash.reader.ui.ext.put
import me.ash.reader.ui.ext.PreferenceKey
import me.ash.reader.ui.ext.get

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

sealed class DarkThemePreference(override val value: Int) :
AppPreference.IntPreference {
override val key: PreferenceKey.IntKey = Companion.key

sealed class DarkThemePreference(val value: Int) : Preference() {
object UseDeviceTheme : DarkThemePreference(0)

object ON : DarkThemePreference(1)
object OFF : DarkThemePreference(2)

override fun put(context: Context, scope: CoroutineScope) {
scope.launch {
context.dataStore.put(darkTheme, value)
}
}
object OFF : DarkThemePreference(2)

fun toDesc(context: Context): String =
when (this) {
Expand All @@ -37,19 +31,21 @@ sealed class DarkThemePreference(val value: Int) : Preference() {

@Composable
@ReadOnlyComposable
fun isDarkTheme(): Boolean = when (this) {
UseDeviceTheme -> isSystemInDarkTheme()
ON -> true
OFF -> false
}
fun isDarkTheme(): Boolean =
when (this) {
UseDeviceTheme -> isSystemInDarkTheme()
ON -> true
OFF -> false
}

companion object {
companion object : AppPreference.PreferenceCompanion {
override val key: PreferenceKey.IntKey = PreferenceKey.DarkTheme

val default = UseDeviceTheme
val values = listOf(UseDeviceTheme, ON, OFF)
override val default = UseDeviceTheme
override val values = listOf(UseDeviceTheme, ON, OFF)

fun fromPreferences(preferences: Preferences) =
when (preferences[DataStoreKey.keys[darkTheme]?.key as Preferences.Key<Int>]) {
override fun fromPreferences(preferences: Preferences) =
when (preferences[key]) {
0 -> UseDeviceTheme
1 -> ON
2 -> OFF
Expand All @@ -61,11 +57,12 @@ sealed class DarkThemePreference(val value: Int) : Preference() {
@Composable
operator fun DarkThemePreference.not(): DarkThemePreference =
when (this) {
DarkThemePreference.UseDeviceTheme -> if (isSystemInDarkTheme()) {
DarkThemePreference.OFF
} else {
DarkThemePreference.ON
}
DarkThemePreference.UseDeviceTheme ->
if (isSystemInDarkTheme()) {
DarkThemePreference.OFF
} else {
DarkThemePreference.ON
}

DarkThemePreference.ON -> DarkThemePreference.OFF
DarkThemePreference.OFF -> DarkThemePreference.ON
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,74 @@ package me.ash.reader.infrastructure.preference

import android.content.Context
import androidx.datastore.preferences.core.Preferences
import androidx.datastore.preferences.core.edit
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.launch
import me.ash.reader.ui.ext.PreferenceKey
import me.ash.reader.ui.ext.dataStore
import me.ash.reader.ui.ext.set
import org.json.JSONObject

sealed interface AppPreference {
val value: Any
val key: PreferenceKey

interface IntPreference : AppPreference, Editable {
override val value: Int
override val key: PreferenceKey.IntKey

override suspend fun put(context: Context) {
context.dataStore.edit { it[key] = value }
}
}

interface LongPreference : AppPreference {
override val value: Long
override val key: PreferenceKey.LongKey
}

interface StringPreference : AppPreference {
override val value: String
override val key: PreferenceKey.StringKey
}

interface BooleanPreference : AppPreference {
override val value: Boolean
override val key: PreferenceKey.BooleanKey
}

interface FloatPreference : AppPreference {
override val value: Float
override val key: PreferenceKey.FloatKey
}

interface PreferenceCompanion {
val key: PreferenceKey
val default: AppPreference

fun fromPreferences(preferences: Preferences): AppPreference

val values: List<AppPreference>
}

sealed interface Editable {
suspend fun put(context: Context)

@Deprecated("Use the suspend function instead")
fun put(context: Context, coroutineScope: CoroutineScope) =
coroutineScope.launch { put(context) }
}
}

fun JSONObject.put(preference: AppPreference) {
when (preference) {
is AppPreference.BooleanPreference -> put(preference.key.name, preference.value)
is AppPreference.FloatPreference -> put(preference.key.name, preference.value)
is AppPreference.IntPreference -> put(preference.key.name, preference.value)
is AppPreference.LongPreference -> put(preference.key.name, preference.value)
is AppPreference.StringPreference -> put(preference.key.name, preference.value)
}
}

sealed class Preference {

Expand Down Expand Up @@ -44,11 +111,11 @@ fun Preferences.toSettings(): Settings {
flowArticleListImage = FlowArticleListImagePreference.fromPreferences(this),
flowArticleListDesc = FlowArticleListDescPreference.fromPreferences(this),
flowArticleListTime = FlowArticleListTimePreference.fromPreferences(this),
flowArticleListDateStickyHeader = FlowArticleListDateStickyHeaderPreference.fromPreferences(
this
),
flowArticleListDateStickyHeader =
FlowArticleListDateStickyHeaderPreference.fromPreferences(this),
flowArticleListReadIndicator = FlowArticleReadIndicatorPreference.fromPreferences(this),
flowArticleListTonalElevation = FlowArticleListTonalElevationPreference.fromPreferences(this),
flowArticleListTonalElevation =
FlowArticleListTonalElevationPreference.fromPreferences(this),
flowSortUnreadArticles = SortUnreadArticlesPreference.fromPreferences(this),

// Reading page
Expand All @@ -70,7 +137,8 @@ fun Preferences.toSettings(): Settings {
readingSubheadBold = ReadingSubheadBoldPreference.fromPreferences(this),
readingTitleUpperCase = ReadingTitleUpperCasePreference.fromPreferences(this),
readingSubheadUpperCase = ReadingSubheadUpperCasePreference.fromPreferences(this),
readingImageHorizontalPadding = ReadingImageHorizontalPaddingPreference.fromPreferences(this),
readingImageHorizontalPadding =
ReadingImageHorizontalPaddingPreference.fromPreferences(this),
readingImageRoundedCorners = ReadingImageRoundedCornersPreference.fromPreferences(this),
readingImageMaximize = ReadingImageMaximizePreference.fromPreferences(this),

Expand Down
Loading
Loading