diff --git a/app/src/main/java/com/readrops/app/ComposeAppModule.kt b/app/src/main/java/com/readrops/app/ComposeAppModule.kt index 9bfb65bb..ded37d15 100644 --- a/app/src/main/java/com/readrops/app/ComposeAppModule.kt +++ b/app/src/main/java/com/readrops/app/ComposeAppModule.kt @@ -36,7 +36,7 @@ import org.koin.dsl.module val composeAppModule = module { - factory { TimelineScreenModel(get(), get()) } + factory { TimelineScreenModel(get(), get(), get()) } factory { FeedScreenModel(get(), get(), get(), androidContext()) } diff --git a/app/src/main/java/com/readrops/app/more/preferences/PreferencesScreen.kt b/app/src/main/java/com/readrops/app/more/preferences/PreferencesScreen.kt index 1d2001da..a35e2da1 100644 --- a/app/src/main/java/com/readrops/app/more/preferences/PreferencesScreen.kt +++ b/app/src/main/java/com/readrops/app/more/preferences/PreferencesScreen.kt @@ -98,6 +98,18 @@ class PreferencesScreen : AndroidScreen() { PreferenceHeader(text = stringResource(id = R.string.timeline)) + ListPreferenceWidget( + preference = loadedState.timelineItemSize.second, + selectedKey = loadedState.timelineItemSize.first, + entries = mapOf( + "compact" to stringResource(id = R.string.compact), + "regular" to stringResource(id = R.string.regular), + "large" to stringResource(id = R.string.large) + ), + title = stringResource(id = R.string.item_size), + onValueChange = {} + ) + SwitchPreferenceWidget( preference = loadedState.hideReadFeeds.second, isChecked = loadedState.hideReadFeeds.first, diff --git a/app/src/main/java/com/readrops/app/more/preferences/PreferencesScreenModel.kt b/app/src/main/java/com/readrops/app/more/preferences/PreferencesScreenModel.kt index f7b2eb72..3d043223 100644 --- a/app/src/main/java/com/readrops/app/more/preferences/PreferencesScreenModel.kt +++ b/app/src/main/java/com/readrops/app/more/preferences/PreferencesScreenModel.kt @@ -19,24 +19,29 @@ class PreferencesScreenModel( init { screenModelScope.launch(dispatcher) { - combine( + val flows = listOf( preferences.theme.flow, preferences.backgroundSynchronization.flow, preferences.scrollRead.flow, preferences.hideReadFeeds.flow, - preferences.openLinksWith.flow - ) { (theme, backgroundSync, scrollRead, hideReadFeeds, openLinksWith) -> + preferences.openLinksWith.flow, + preferences.timelineItemSize.flow + ) + + combine( + flows + ) { list -> PreferencesScreenState.Loaded( - themePref = (theme as String) to preferences.theme, - backgroundSyncPref = (backgroundSync as String) to preferences.backgroundSynchronization, - scrollReadPref = (scrollRead as Boolean) to preferences.scrollRead, - hideReadFeeds = (hideReadFeeds as Boolean) to preferences.hideReadFeeds, - openLinksWith = (openLinksWith as String) to preferences.openLinksWith + themePref = (list[0] as String) to preferences.theme, + backgroundSyncPref = (list[1] as String) to preferences.backgroundSynchronization, + scrollReadPref = (list[2] as Boolean) to preferences.scrollRead, + hideReadFeeds = (list[3] as Boolean) to preferences.hideReadFeeds, + openLinksWith = (list[4] as String) to preferences.openLinksWith, + timelineItemSize = (list[5] as String) to preferences.timelineItemSize ) }.collect { theme -> mutableState.update { theme } } - } } @@ -51,7 +56,8 @@ sealed class PreferencesScreenState { val backgroundSyncPref: PreferenceState, val scrollReadPref: PreferenceState, val hideReadFeeds: PreferenceState, - val openLinksWith: PreferenceState + val openLinksWith: PreferenceState, + val timelineItemSize: PreferenceState ) : PreferencesScreenState() } \ No newline at end of file diff --git a/app/src/main/java/com/readrops/app/timelime/TimelineScreenModel.kt b/app/src/main/java/com/readrops/app/timelime/TimelineScreenModel.kt index e738f741..c4fe2a8b 100644 --- a/app/src/main/java/com/readrops/app/timelime/TimelineScreenModel.kt +++ b/app/src/main/java/com/readrops/app/timelime/TimelineScreenModel.kt @@ -12,6 +12,7 @@ import com.readrops.app.base.TabScreenModel import com.readrops.app.repositories.ErrorResult import com.readrops.app.repositories.GetFoldersWithFeeds import com.readrops.app.sync.SyncWorker +import com.readrops.app.util.Preferences import com.readrops.db.Database import com.readrops.db.entities.Feed import com.readrops.db.entities.Folder @@ -40,6 +41,7 @@ import kotlinx.coroutines.launch class TimelineScreenModel( private val database: Database, private val getFoldersWithFeeds: GetFoldersWithFeeds, + private val preferences: Preferences, private val dispatcher: CoroutineDispatcher = Dispatchers.IO ) : TabScreenModel(database) { @@ -106,6 +108,20 @@ class TimelineScreenModel( } } } + + screenModelScope.launch(dispatcher) { + preferences.timelineItemSize.flow + .collect { itemSize -> + _timelineState.update { + it.copy( + itemSize = when (itemSize) { + "compact" -> TimelineItemSize.COMPACT + "regular" -> TimelineItemSize.REGULAR + else -> TimelineItemSize.LARGE + } + ) } + } + } } fun refreshTimeline(context: Context) { @@ -362,7 +378,8 @@ data class TimelineState( val itemState: Flow> = emptyFlow(), val dialog: DialogState? = null, val isAccountLocal: Boolean = false, - val hideReadAllFAB: Boolean = false + val hideReadAllFAB: Boolean = false, + val itemSize: TimelineItemSize = TimelineItemSize.LARGE ) { val showSubtitle = filters.subFilter != SubFilter.ALL diff --git a/app/src/main/java/com/readrops/app/timelime/TimelineTab.kt b/app/src/main/java/com/readrops/app/timelime/TimelineTab.kt index ff1fad75..e1d4a7f2 100644 --- a/app/src/main/java/com/readrops/app/timelime/TimelineTab.kt +++ b/app/src/main/java/com/readrops/app/timelime/TimelineTab.kt @@ -41,6 +41,7 @@ import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.style.TextOverflow +import androidx.compose.ui.unit.dp import androidx.lifecycle.compose.collectAsStateWithLifecycle import androidx.paging.LoadState import androidx.paging.compose.LazyPagingItems @@ -87,7 +88,8 @@ object TimelineTab : Tab { val lazyListState = rememberLazyListState() val pullToRefreshState = rememberPullToRefreshState() val snackbarHostState = remember { SnackbarHostState() } - val topAppBarScrollBehavior = TopAppBarDefaults.pinnedScrollBehavior(rememberTopAppBarState()) + val topAppBarScrollBehavior = + TopAppBarDefaults.pinnedScrollBehavior(rememberTopAppBarState()) LaunchedEffect(state.isRefreshing) { if (state.isRefreshing) { @@ -337,7 +339,12 @@ object TimelineTab : Tab { LazyColumn( state = lazyListState, contentPadding = PaddingValues(vertical = MaterialTheme.spacing.shortSpacing), - verticalArrangement = Arrangement.spacedBy(MaterialTheme.spacing.shortSpacing) + verticalArrangement = Arrangement.spacedBy( + if (state.itemSize == TimelineItemSize.COMPACT) { + 0.dp + } else + MaterialTheme.spacing.shortSpacing + ) ) { items( count = items.itemCount, @@ -358,7 +365,7 @@ object TimelineTab : Tab { onShare = { viewModel.shareItem(itemWithFeed.item, context) }, - size = TimelineItemSize.LARGE + size = state.itemSize ) } diff --git a/app/src/main/java/com/readrops/app/util/Preferences.kt b/app/src/main/java/com/readrops/app/util/Preferences.kt index 20123b85..5e3b5d55 100644 --- a/app/src/main/java/com/readrops/app/util/Preferences.kt +++ b/app/src/main/java/com/readrops/app/util/Preferences.kt @@ -54,6 +54,12 @@ class Preferences( key = stringPreferencesKey("open_links_with"), default = "navigator_view" ) + + val timelineItemSize = Preference( + dataStore = dataStore, + key = stringPreferencesKey("timeline_item_size"), + default = "large" + ) } diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index 19dda441..3d95dda2 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -180,4 +180,8 @@ Vue article Timeline Les flux sans nouveaux articles disparaîtront du menu tiroir + Compact + Normal + Large + Taille des items \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 75f7ea91..479d8067 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -189,4 +189,8 @@ Article view Timeline Feeds with no left unread items will be hidden in the drawer + Compact + Regular + Large + Item size \ No newline at end of file