diff --git a/app/src/main/java/me/ash/reader/infrastructure/preference/FlowArticleListDateHeaderPreference.kt b/app/src/main/java/me/ash/reader/infrastructure/preference/FlowArticleListDateHeaderPreference.kt new file mode 100644 index 000000000..4a71df6e6 --- /dev/null +++ b/app/src/main/java/me/ash/reader/infrastructure/preference/FlowArticleListDateHeaderPreference.kt @@ -0,0 +1,54 @@ +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.flowArticleListDateHeader +import me.ash.reader.ui.ext.dataStore +import me.ash.reader.ui.ext.put + + +val LocalFlowArticleListDateHeader = + compositionLocalOf{ + FlowArticleListDateHeaderPreference.default + } + +sealed class FlowArticleListDateHeaderPreference(val value : Boolean) : Preference() { + + object ON : FlowArticleListDateHeaderPreference(true) + object OFF : FlowArticleListDateHeaderPreference(false) + override fun put( + context: Context, + scope: CoroutineScope + ) { + scope.launch { + context.dataStore.put( + DataStoreKey.flowArticleListDateHeader, + value + ) + } + } + + companion object { + + val default = ON + val values = listOf(ON, OFF) + + fun fromPreferences(preferences: Preferences) = + when (preferences[DataStoreKey.keys[flowArticleListDateHeader]?.key as + Preferences.Key]) { + true -> ON + false -> OFF + else -> default + } + } +} + +operator fun FlowArticleListDateHeaderPreference.not(): FlowArticleListDateHeaderPreference = + when (value) { + true -> FlowArticleListDateHeaderPreference.OFF + false -> FlowArticleListDateHeaderPreference.ON + } 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 bdc2c057d..a02995358 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 @@ -44,6 +44,7 @@ fun Preferences.toSettings(): Settings { flowArticleListImage = FlowArticleListImagePreference.fromPreferences(this), flowArticleListDesc = FlowArticleListDescPreference.fromPreferences(this), flowArticleListTime = FlowArticleListTimePreference.fromPreferences(this), + flowArticleListDateHeader = FlowArticleListDateHeaderPreference.fromPreferences(this), flowArticleListDateStickyHeader = FlowArticleListDateStickyHeaderPreference.fromPreferences( this ), 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 af4f01012..ac2ff4d1f 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 @@ -39,6 +39,7 @@ data class Settings( val flowArticleListImage: FlowArticleListImagePreference = FlowArticleListImagePreference.default, val flowArticleListDesc: FlowArticleListDescPreference = FlowArticleListDescPreference.default, val flowArticleListTime: FlowArticleListTimePreference = FlowArticleListTimePreference.default, + val flowArticleListDateHeader: FlowArticleListDateHeaderPreference = FlowArticleListDateHeaderPreference.default, val flowArticleListDateStickyHeader: FlowArticleListDateStickyHeaderPreference = FlowArticleListDateStickyHeaderPreference.default, val flowArticleListTonalElevation: FlowArticleListTonalElevationPreference = FlowArticleListTonalElevationPreference.default, val flowArticleListReadIndicator: FlowArticleReadIndicatorPreference = FlowArticleReadIndicatorPreference.default, diff --git a/app/src/main/java/me/ash/reader/infrastructure/preference/SettingsProvider.kt b/app/src/main/java/me/ash/reader/infrastructure/preference/SettingsProvider.kt index dd14b72d3..7563a2e22 100644 --- a/app/src/main/java/me/ash/reader/infrastructure/preference/SettingsProvider.kt +++ b/app/src/main/java/me/ash/reader/infrastructure/preference/SettingsProvider.kt @@ -95,6 +95,7 @@ class SettingsProvider @Inject constructor( LocalFlowArticleListImage provides settings.flowArticleListImage, LocalFlowArticleListDesc provides settings.flowArticleListDesc, LocalFlowArticleListTime provides settings.flowArticleListTime, + LocalFlowArticleListDateHeader provides settings.flowArticleListDateHeader, LocalFlowArticleListDateStickyHeader provides settings.flowArticleListDateStickyHeader, LocalFlowArticleListTonalElevation provides settings.flowArticleListTonalElevation, LocalFlowFilterBarStyle provides settings.flowFilterBarStyle, 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 7552b3d02..780c58385 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 @@ -157,6 +157,7 @@ sealed interface PreferencesKey { const val flowArticleListImage = "flowArticleListImage" const val flowArticleListDesc = "flowArticleListDescription" const val flowArticleListTime = "flowArticleListTime" + const val flowArticleListDateHeader = "flowArticleListDateHeader" const val flowArticleListDateStickyHeader = "flowArticleListDateStickyHeader" const val flowArticleListTonalElevation = "flowArticleListTonalElevation" const val flowArticleListReadIndicator = "flowArticleListReadStatusIndicator" @@ -235,6 +236,7 @@ sealed interface PreferencesKey { BooleanKey(flowArticleListImage), BooleanKey(flowArticleListDesc), BooleanKey(flowArticleListTime), + BooleanKey(flowArticleListDateHeader), BooleanKey(flowArticleListDateStickyHeader), IntKey(flowArticleListTonalElevation), IntKey(flowArticleListReadIndicator), @@ -319,6 +321,7 @@ data class DataStoreKey(val key: Preferences.Key, val type: Class) { const val flowArticleListImage = "flowArticleListImage" const val flowArticleListDesc = "flowArticleListDescription" const val flowArticleListTime = "flowArticleListTime" + const val flowArticleListDateHeader = "flowArticleListDateHeader" const val flowArticleListDateStickyHeader = "flowArticleListDateStickyHeader" const val flowArticleListTonalElevation = "flowArticleListTonalElevation" const val flowArticleListReadIndicator = "flowArticleListReadStatusIndicator" @@ -429,6 +432,13 @@ data class DataStoreKey(val key: Preferences.Key, val type: Class) { DataStoreKey(booleanPreferencesKey(flowArticleListDesc), Boolean::class.java), flowArticleListTime to DataStoreKey(booleanPreferencesKey(flowArticleListTime), Boolean::class.java), + + flowArticleListDateHeader to + DataStoreKey( + booleanPreferencesKey(flowArticleListDateHeader), + Boolean::class.java + ), + flowArticleListDateStickyHeader to DataStoreKey( booleanPreferencesKey(flowArticleListDateStickyHeader), diff --git a/app/src/main/java/me/ash/reader/ui/page/home/flow/ArticleList.kt b/app/src/main/java/me/ash/reader/ui/page/home/flow/ArticleList.kt index 723454074..8cd55a52e 100644 --- a/app/src/main/java/me/ash/reader/ui/page/home/flow/ArticleList.kt +++ b/app/src/main/java/me/ash/reader/ui/page/home/flow/ArticleList.kt @@ -20,6 +20,7 @@ fun LazyListScope.ArticleList( diffMap: Map, isShowFeedIcon: Boolean, isShowStickyHeader: Boolean, + isShowDateHeader: Boolean = true, articleListTonalElevation: Int, isSwipeEnabled: () -> Boolean = { false }, isMenuEnabled: Boolean = true, @@ -61,10 +62,12 @@ fun LazyListScope.ArticleList( } is ArticleFlowItem.Date -> { - if (item.showSpacer) { - Spacer(modifier = Modifier.height(32.dp)) + if (isShowDateHeader) { + if (item.showSpacer) { + Spacer(modifier = Modifier.height(32.dp)) + } + StickyHeader(item.date, isShowFeedIcon, articleListTonalElevation) } - StickyHeader(item.date, isShowFeedIcon, articleListTonalElevation) } else -> {} @@ -96,11 +99,13 @@ fun LazyListScope.ArticleList( } is ArticleFlowItem.Date -> { - if (item.showSpacer) { - item { Spacer(modifier = Modifier.height(32.dp)) } - } - stickyHeader(key = key(item), contentType = contentType(item)) { - StickyHeader(item.date, isShowFeedIcon, articleListTonalElevation) + if (isShowDateHeader) { + if (item.showSpacer) { + item { Spacer(modifier = Modifier.height(32.dp)) } + } + stickyHeader(key = key(item), contentType = contentType(item)) { + StickyHeader(item.date, isShowFeedIcon, articleListTonalElevation) + } } } diff --git a/app/src/main/java/me/ash/reader/ui/page/home/flow/FlowPage.kt b/app/src/main/java/me/ash/reader/ui/page/home/flow/FlowPage.kt index 602def14a..258211fb1 100644 --- a/app/src/main/java/me/ash/reader/ui/page/home/flow/FlowPage.kt +++ b/app/src/main/java/me/ash/reader/ui/page/home/flow/FlowPage.kt @@ -74,6 +74,7 @@ import me.ash.reader.R import me.ash.reader.domain.data.PagerData import me.ash.reader.domain.model.article.ArticleFlowItem import me.ash.reader.domain.model.article.ArticleWithFeed +import me.ash.reader.infrastructure.preference.LocalFlowArticleListDateHeader import me.ash.reader.infrastructure.preference.LocalFlowArticleListDateStickyHeader import me.ash.reader.infrastructure.preference.LocalFlowArticleListFeedIcon import me.ash.reader.infrastructure.preference.LocalFlowArticleListTonalElevation @@ -125,6 +126,7 @@ fun FlowPage( val keyboardController = LocalSoftwareKeyboardController.current val articleListTonalElevation = LocalFlowArticleListTonalElevation.current val articleListFeedIcon = LocalFlowArticleListFeedIcon.current + val articleListDateHeader = LocalFlowArticleListDateHeader.current val articleListDateStickyHeader = LocalFlowArticleListDateStickyHeader.current val topBarTonalElevation = LocalFlowTopBarTonalElevation.current val filterBarStyle = LocalFlowFilterBarStyle.current @@ -669,6 +671,7 @@ fun FlowPage( pagingItems = pagingItems, diffMap = viewModel.diffMapHolder.diffMap, isShowFeedIcon = articleListFeedIcon.value, + isShowDateHeader = articleListDateHeader.value, isShowStickyHeader = articleListDateStickyHeader.value, articleListTonalElevation = articleListTonalElevation.value, isSwipeEnabled = { listState.isScrollInProgress }, diff --git a/app/src/main/java/me/ash/reader/ui/page/settings/color/flow/FlowPageStylePage.kt b/app/src/main/java/me/ash/reader/ui/page/settings/color/flow/FlowPageStylePage.kt index fd7c6d475..c95bd2fea 100644 --- a/app/src/main/java/me/ash/reader/ui/page/settings/color/flow/FlowPageStylePage.kt +++ b/app/src/main/java/me/ash/reader/ui/page/settings/color/flow/FlowPageStylePage.kt @@ -35,6 +35,7 @@ fun FlowPageStylePage( val articleListImage = LocalFlowArticleListImage.current val articleListDesc = LocalFlowArticleListDesc.current val articleListTime = LocalFlowArticleListTime.current + val articleListDateHeader = LocalFlowArticleListDateHeader.current val articleListStickyDate = LocalFlowArticleListDateStickyHeader.current val articleListTonalElevation = LocalFlowArticleListTonalElevation.current val articleListReadIndicator = LocalFlowArticleListReadIndicator.current @@ -177,13 +178,27 @@ fun FlowPageStylePage( (!articleListTime).put(context, scope) } } + SettingItem( + title = stringResource(R.string.article_date_header), + onClick = { + (!articleListDateHeader).put(context, scope) + }, + ) { + RYSwitch(activated = articleListDateHeader.value) { + (!articleListDateHeader).put(context, scope) + } + } SettingItem( title = stringResource(R.string.article_date_sticky_header), + enabled = articleListDateHeader.value, onClick = { (!articleListStickyDate).put(context, scope) }, ) { - RYSwitch(activated = articleListStickyDate.value) { + RYSwitch( + activated = articleListStickyDate.value, + enable = articleListDateHeader.value, + ) { (!articleListStickyDate).put(context, scope) } } diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index f7f249f63..0f06cd91f 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -183,6 +183,7 @@ Article images Feed names Feed favicons + Publication date header Sticky publication date header Article list Group list