diff --git a/api/agata/src/commonMain/kotlin/cz/lastaapps/menza/api/agata/api/StravnikWalletApi.kt b/api/agata/src/commonMain/kotlin/cz/lastaapps/menza/api/agata/api/StravnikWalletApi.kt index e12523c5..537127d7 100644 --- a/api/agata/src/commonMain/kotlin/cz/lastaapps/menza/api/agata/api/StravnikWalletApi.kt +++ b/api/agata/src/commonMain/kotlin/cz/lastaapps/menza/api/agata/api/StravnikWalletApi.kt @@ -144,7 +144,7 @@ internal class StravnikWalletApiImpl( return@repeat } } - delay(420.milliseconds) + delay(690.milliseconds) } getData() .bind() diff --git a/app/src/main/kotlin/cz/lastaapps/menza/features/settings/data/MainSettingsRepoImpl.kt b/app/src/main/kotlin/cz/lastaapps/menza/features/settings/data/MainSettingsRepoImpl.kt index 47027401..42e2b3f5 100644 --- a/app/src/main/kotlin/cz/lastaapps/menza/features/settings/data/MainSettingsRepoImpl.kt +++ b/app/src/main/kotlin/cz/lastaapps/menza/features/settings/data/MainSettingsRepoImpl.kt @@ -1,5 +1,5 @@ /* - * Copyright 2024, Petr Laštovička as Lasta apps, All rights reserved + * Copyright 2025, Petr Laštovička as Lasta apps, All rights reserved * * This file is part of Menza. * @@ -57,6 +57,7 @@ internal class MainSettingsRepoImpl( isOliverRow().distinctUntilChanged(), getBalanceWarningThreshold().distinctUntilChanged(), getAlternativeNavigation().distinctUntilChanged(), + isDishListModeChosen().distinctUntilChanged(), ) { arr -> AppSettings( initialMenzaMode = arr[0] as InitialSelectionBehaviour, @@ -74,6 +75,7 @@ internal class MainSettingsRepoImpl( useOliverRows = arr[12] as Boolean, balanceWarningThreshold = arr[13] as Int, alternativeNavigation = arr[14] as Boolean, + isDishListModeChosen = arr[15] as Boolean, ) }.distinctUntilChanged() @@ -119,34 +121,38 @@ internal class MainSettingsRepoImpl( override suspend fun setDishLanguage(language: DataLanguage) = general.setDishLanguage(language) - override fun getDishLanguage(): Flow = - general.getDishLanguage().map { it ?: defaults.defaultDishLanguage() } + override fun getDishLanguage(): Flow = general.getDishLanguage().map { it ?: defaults.defaultDishLanguage() } override suspend fun setCompactTodayView(mode: DishListMode) = general.setCompactTodayView(mode) override fun isCompactTodayView(): Flow = general .isCompactTodayView() - .map { it ?: DishListMode.CAROUSEL } + .map { it ?: AppSettings.default.todayViewMode } override suspend fun setOliverRows(useOliverRows: Boolean) = general.setOliverRow(useOliverRows) override fun isOliverRow(): Flow = general .isOliverRow() - .map { it ?: true } + .map { it ?: AppSettings.default.useOliverRows } override suspend fun setBalanceWarningThreshold(threshold: Int) = general.setBalanceWarningThreshold(threshold) override fun getBalanceWarningThreshold(): Flow = general .getBalanceWarningThreshold() - .map { it ?: 256 } + .map { it ?: AppSettings.default.balanceWarningThreshold } override suspend fun setAlternativeNavigation(enabled: Boolean) = general.setAlternativeNavigation(enabled) override fun getAlternativeNavigation(): Flow = general .getAlternativeNavigation() - .map { it ?: false } + .map { it ?: AppSettings.default.alternativeNavigation } + + override suspend fun dismissDishListModeChosen() = general.setDishListModeChosen(true) + + override fun isDishListModeChosen(): Flow = + general.getDishListModeChosen().map { it ?: AppSettings.default.isDishListModeChosen } } diff --git a/app/src/main/kotlin/cz/lastaapps/menza/features/settings/data/datasource/GeneralDataSource.kt b/app/src/main/kotlin/cz/lastaapps/menza/features/settings/data/datasource/GeneralDataSource.kt index 189252e7..fe2f2b6e 100644 --- a/app/src/main/kotlin/cz/lastaapps/menza/features/settings/data/datasource/GeneralDataSource.kt +++ b/app/src/main/kotlin/cz/lastaapps/menza/features/settings/data/datasource/GeneralDataSource.kt @@ -1,5 +1,5 @@ /* - * Copyright 2024, Petr Laštovička as Lasta apps, All rights reserved + * Copyright 2025, Petr Laštovička as Lasta apps, All rights reserved * * This file is part of Menza. * @@ -94,6 +94,10 @@ internal interface GeneralDataSource { suspend fun setAlternativeNavigation(enabled: Boolean) fun getAlternativeNavigation(): Flow + + suspend fun setDishListModeChosen(isChosen: Boolean) + + fun getDishListModeChosen(): Flow } @OptIn(ExperimentalSettingsApi::class) @@ -116,6 +120,7 @@ internal class GeneralDataSourceImpl( private const val oliverRowsKey = "oliver_row" private const val balanceWarningThresholdKey = "balance_warning_threshold" private const val alternativeNavigationKey = "alternative_navigation" + private const val dishListModeChosenKey = "dish_list_mode_chosen" } override suspend fun storeAppSetupFinished() = settings.putBoolean(appSetupFinishedKey, true) @@ -159,8 +164,7 @@ internal class GeneralDataSourceImpl( override fun getImagesOnMetered(): Flow = settings.getBooleanFlow(imagesOnMeteredKey, true) - override suspend fun setDishLanguage(language: DataLanguage) = - settings.putInt(dishLanguageKey, language.id) + override suspend fun setDishLanguage(language: DataLanguage) = settings.putInt(dishLanguageKey, language.id) override fun getDishLanguage(): Flow = settings.getIntOrNullFlow(dishLanguageKey).map { id -> @@ -187,4 +191,8 @@ internal class GeneralDataSourceImpl( override suspend fun setAlternativeNavigation(enabled: Boolean) = settings.putBoolean(alternativeNavigationKey, enabled) override fun getAlternativeNavigation(): Flow = settings.getBooleanOrNullFlow(alternativeNavigationKey) + + override suspend fun setDishListModeChosen(isChosen: Boolean) = settings.putBoolean(dishListModeChosenKey, isChosen) + + override fun getDishListModeChosen(): Flow = settings.getBooleanOrNullFlow(dishListModeChosenKey) } diff --git a/app/src/main/kotlin/cz/lastaapps/menza/features/settings/di/settingsModule.kt b/app/src/main/kotlin/cz/lastaapps/menza/features/settings/di/settingsModule.kt index 10ae488f..5703c860 100644 --- a/app/src/main/kotlin/cz/lastaapps/menza/features/settings/di/settingsModule.kt +++ b/app/src/main/kotlin/cz/lastaapps/menza/features/settings/di/settingsModule.kt @@ -1,5 +1,5 @@ /* - * Copyright 2024, Petr Laštovička as Lasta apps, All rights reserved + * Copyright 2025, Petr Laštovička as Lasta apps, All rights reserved * * This file is part of Menza. * @@ -47,6 +47,7 @@ import cz.lastaapps.menza.features.settings.domain.usecase.menzaorder.IsMenzaOrd import cz.lastaapps.menza.features.settings.domain.usecase.menzaorder.SetMenzaOrderFromTopUC import cz.lastaapps.menza.features.settings.domain.usecase.menzaorder.ToggleMenzaVisibilityUC import cz.lastaapps.menza.features.settings.domain.usecase.menzaorder.UpdateMenzaOrderUC +import cz.lastaapps.menza.features.settings.domain.usecase.settings.DismissDishListModeChooserUC import cz.lastaapps.menza.features.settings.domain.usecase.settings.GetAppSettingsUC import cz.lastaapps.menza.features.settings.domain.usecase.settings.GetBalanceWarningThresholdUC import cz.lastaapps.menza.features.settings.domain.usecase.settings.GetDishLanguageUC @@ -148,6 +149,7 @@ val settingsModule = factoryOf(::SetDishLanguageUC) factoryOf(::GetDishListModeUC) factoryOf(::SetDishListModeUC) + factoryOf(::DismissDishListModeChooserUC) // Menza order factoryOf(::ReorderMenzaViewModel) diff --git a/app/src/main/kotlin/cz/lastaapps/menza/features/settings/domain/MainSettingsRepo.kt b/app/src/main/kotlin/cz/lastaapps/menza/features/settings/domain/MainSettingsRepo.kt index b93d2758..d0de07c5 100644 --- a/app/src/main/kotlin/cz/lastaapps/menza/features/settings/domain/MainSettingsRepo.kt +++ b/app/src/main/kotlin/cz/lastaapps/menza/features/settings/domain/MainSettingsRepo.kt @@ -1,5 +1,5 @@ /* - * Copyright 2024, Petr Laštovička as Lasta apps, All rights reserved + * Copyright 2025, Petr Laštovička as Lasta apps, All rights reserved * * This file is part of Menza. * @@ -91,4 +91,8 @@ internal interface MainSettingsRepo { suspend fun setAlternativeNavigation(enabled: Boolean) fun getAlternativeNavigation(): Flow + + suspend fun dismissDishListModeChosen() + + fun isDishListModeChosen(): Flow } diff --git a/app/src/main/kotlin/cz/lastaapps/menza/features/settings/domain/model/AppSettings.kt b/app/src/main/kotlin/cz/lastaapps/menza/features/settings/domain/model/AppSettings.kt index 92ef9533..1e186787 100644 --- a/app/src/main/kotlin/cz/lastaapps/menza/features/settings/domain/model/AppSettings.kt +++ b/app/src/main/kotlin/cz/lastaapps/menza/features/settings/domain/model/AppSettings.kt @@ -1,5 +1,5 @@ /* - * Copyright 2024, Petr Laštovička as Lasta apps, All rights reserved + * Copyright 2025, Petr Laštovička as Lasta apps, All rights reserved * * This file is part of Menza. * @@ -40,10 +40,11 @@ internal data class AppSettings( val useOliverRows: Boolean, val balanceWarningThreshold: Int, val alternativeNavigation: Boolean, + val isDishListModeChosen: Boolean, ) { companion object { // Used for previews - fun default() = + val default = AppSettings( initialMenzaMode = InitialSelectionBehaviour.Specific, latestMenza = MenzaType.Testing.Kocourkov, @@ -59,7 +60,8 @@ internal data class AppSettings( todayViewMode = DishListMode.COMPACT, useOliverRows = true, balanceWarningThreshold = 256, - alternativeNavigation = false, + alternativeNavigation = true, + isDishListModeChosen = false, ) } } diff --git a/app/src/main/kotlin/cz/lastaapps/menza/features/settings/domain/usecase/settings/DismissDishListModeChooserUC.kt b/app/src/main/kotlin/cz/lastaapps/menza/features/settings/domain/usecase/settings/DismissDishListModeChooserUC.kt new file mode 100644 index 00000000..6e0c16d1 --- /dev/null +++ b/app/src/main/kotlin/cz/lastaapps/menza/features/settings/domain/usecase/settings/DismissDishListModeChooserUC.kt @@ -0,0 +1,34 @@ +/* + * Copyright 2025, Petr Laštovička as Lasta apps, All rights reserved + * + * This file is part of Menza. + * + * Menza is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Menza is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Menza. If not, see . + */ + +package cz.lastaapps.menza.features.settings.domain.usecase.settings + +import cz.lastaapps.core.domain.UCContext +import cz.lastaapps.core.domain.UseCase +import cz.lastaapps.menza.features.settings.domain.MainSettingsRepo + +class DismissDishListModeChooserUC internal constructor( + context: UCContext, + private val repo: MainSettingsRepo, +) : UseCase(context) { + suspend operator fun invoke() = + launch { + repo.dismissDishListModeChosen() + } +} diff --git a/app/src/main/kotlin/cz/lastaapps/menza/features/settings/domain/usecase/settings/GetAppSettingsUC.kt b/app/src/main/kotlin/cz/lastaapps/menza/features/settings/domain/usecase/settings/GetAppSettingsUC.kt index 46fdfc17..a27a55ce 100644 --- a/app/src/main/kotlin/cz/lastaapps/menza/features/settings/domain/usecase/settings/GetAppSettingsUC.kt +++ b/app/src/main/kotlin/cz/lastaapps/menza/features/settings/domain/usecase/settings/GetAppSettingsUC.kt @@ -1,5 +1,5 @@ /* - * Copyright 2024, Petr Laštovička as Lasta apps, All rights reserved + * Copyright 2025, Petr Laštovička as Lasta apps, All rights reserved * * This file is part of Menza. * @@ -22,10 +22,12 @@ package cz.lastaapps.menza.features.settings.domain.usecase.settings import cz.lastaapps.core.domain.UCContext import cz.lastaapps.core.domain.UseCase import cz.lastaapps.menza.features.settings.domain.MainSettingsRepo +import cz.lastaapps.menza.features.settings.domain.model.AppSettings +import kotlinx.coroutines.flow.Flow internal class GetAppSettingsUC internal constructor( context: UCContext, private val repo: MainSettingsRepo, ) : UseCase(context) { - operator fun invoke() = repo.getAllSettings() + operator fun invoke(): Flow = repo.getAllSettings() } diff --git a/app/src/main/kotlin/cz/lastaapps/menza/features/settings/ui/screens/SettingsScreen.kt b/app/src/main/kotlin/cz/lastaapps/menza/features/settings/ui/screens/SettingsScreen.kt index 5ec503ee..42a2c926 100644 --- a/app/src/main/kotlin/cz/lastaapps/menza/features/settings/ui/screens/SettingsScreen.kt +++ b/app/src/main/kotlin/cz/lastaapps/menza/features/settings/ui/screens/SettingsScreen.kt @@ -372,7 +372,7 @@ private fun IconAndText( private fun SettingsScreenPreview() = PreviewWrapper { SettingsScreen( - appSettings = AppSettings.default(), + appSettings = AppSettings.default, appTheme = Agata, onChooseTheme = {}, onChooseDishLanguage = {}, diff --git a/app/src/main/kotlin/cz/lastaapps/menza/features/today/domain/model/TodayUserSettings.kt b/app/src/main/kotlin/cz/lastaapps/menza/features/today/domain/model/TodayUserSettings.kt index a7e87a28..c843393d 100644 --- a/app/src/main/kotlin/cz/lastaapps/menza/features/today/domain/model/TodayUserSettings.kt +++ b/app/src/main/kotlin/cz/lastaapps/menza/features/today/domain/model/TodayUserSettings.kt @@ -1,5 +1,5 @@ /* - * Copyright 2024, Petr Laštovička as Lasta apps, All rights reserved + * Copyright 2025, Petr Laštovička as Lasta apps, All rights reserved * * This file is part of Menza. * @@ -31,4 +31,5 @@ internal data class TodayUserSettings( val downloadOnMetered: Boolean = false, val language: DataLanguage = DataLanguage.Czech, val imageScale: Float = 1f, + val isDishListModeChosen: Boolean = true, ) diff --git a/app/src/main/kotlin/cz/lastaapps/menza/features/today/domain/usecase/GetTodayUserSettingsUC.kt b/app/src/main/kotlin/cz/lastaapps/menza/features/today/domain/usecase/GetTodayUserSettingsUC.kt index 144b7e4e..5cd732c2 100644 --- a/app/src/main/kotlin/cz/lastaapps/menza/features/today/domain/usecase/GetTodayUserSettingsUC.kt +++ b/app/src/main/kotlin/cz/lastaapps/menza/features/today/domain/usecase/GetTodayUserSettingsUC.kt @@ -1,5 +1,5 @@ /* - * Copyright 2024, Petr Laštovička as Lasta apps, All rights reserved + * Copyright 2025, Petr Laštovička as Lasta apps, All rights reserved * * This file is part of Menza. * @@ -21,65 +21,27 @@ package cz.lastaapps.menza.features.today.domain.usecase import cz.lastaapps.core.domain.UCContext import cz.lastaapps.core.domain.UseCase -import cz.lastaapps.menza.features.settings.domain.usecase.settings.GetDishLanguageUC -import cz.lastaapps.menza.features.settings.domain.usecase.settings.GetDishListModeUC -import cz.lastaapps.menza.features.settings.domain.usecase.settings.GetImageScaleUC -import cz.lastaapps.menza.features.settings.domain.usecase.settings.GetImagesOnMeteredUC -import cz.lastaapps.menza.features.settings.domain.usecase.settings.GetOliverRowUC -import cz.lastaapps.menza.features.settings.domain.usecase.settings.GetPriceTypeUC +import cz.lastaapps.menza.features.settings.domain.usecase.settings.GetAppSettingsUC import cz.lastaapps.menza.features.today.domain.model.TodayUserSettings import kotlinx.coroutines.flow.Flow -import kotlinx.coroutines.flow.MutableStateFlow -import kotlinx.coroutines.flow.channelFlow -import kotlinx.coroutines.flow.launchIn -import kotlinx.coroutines.flow.onEach -import kotlinx.coroutines.flow.update +import kotlinx.coroutines.flow.distinctUntilChanged +import kotlinx.coroutines.flow.map internal class GetTodayUserSettingsUC( context: UCContext, - private val getOliverRowUC: GetOliverRowUC, - private val getPriceTypeUC: GetPriceTypeUC, - private val getImagesOnMeteredUC: GetImagesOnMeteredUC, - private val getImageScaleUC: GetImageScaleUC, - private val getDishLanguageUC: GetDishLanguageUC, - private val getDishListModeUC: GetDishListModeUC, + private val getAppSettingsUC: GetAppSettingsUC, ) : UseCase(context) { operator fun invoke(): Flow = - channelFlow { - val state = MutableStateFlow(TodayUserSettings()) - - fun updateState(block: TodayUserSettings.() -> TodayUserSettings) = state.update(block) - - getPriceTypeUC() - .onEach { - updateState { copy(priceType = it) } - }.launchIn(this) - - getImagesOnMeteredUC() - .onEach { - updateState { copy(downloadOnMetered = it) } - }.launchIn(this) - - getImageScaleUC() - .onEach { - updateState { copy(imageScale = it) } - }.launchIn(this) - - getDishLanguageUC() - .onEach { - updateState { copy(language = it) } - }.launchIn(this) - - getDishListModeUC() - .onEach { - updateState { copy(dishListMode = it) } - }.launchIn(this) - - getOliverRowUC() - .onEach { - updateState { copy(useOliverRow = it) } - }.launchIn(this) - - state.collect { send(it) } - } + getAppSettingsUC() + .map { + TodayUserSettings( + priceType = it.priceType, + downloadOnMetered = it.imagesOnMetered, + imageScale = it.imageScale, + language = it.dataLanguage, + dishListMode = it.todayViewMode, + useOliverRow = it.useOliverRows, + isDishListModeChosen = it.isDishListModeChosen, + ) + }.distinctUntilChanged() } diff --git a/app/src/main/kotlin/cz/lastaapps/menza/features/today/ui/screen/DishListScreen.kt b/app/src/main/kotlin/cz/lastaapps/menza/features/today/ui/screen/DishListScreen.kt index bb67e53b..11d6b9ab 100644 --- a/app/src/main/kotlin/cz/lastaapps/menza/features/today/ui/screen/DishListScreen.kt +++ b/app/src/main/kotlin/cz/lastaapps/menza/features/today/ui/screen/DishListScreen.kt @@ -20,7 +20,7 @@ package cz.lastaapps.menza.features.today.ui.screen import android.annotation.SuppressLint -import androidx.compose.animation.Crossfade +import androidx.compose.animation.AnimatedVisibility import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Spacer @@ -90,6 +90,7 @@ internal fun DishListScreen( onOliverRow = viewModel::setOliverRow, onDish = onDish, onRating = onRating, + onDismissDishListModeChooser = viewModel::dismissListModeChosen, panels = panels, onOsturak = onOsturak, scrollStates = scrollStates, @@ -118,6 +119,7 @@ private fun DishListContent( onOliverRow: (Boolean) -> Unit, onOsturak: () -> Unit, onRating: (Dish) -> Unit, + onDismissDishListModeChooser: () -> Unit, scrollStates: ScrollStates, scopes: AnimationScopes, modifier: Modifier = Modifier, @@ -144,6 +146,7 @@ private fun DishListContent( onViewMode = onViewMode, onImageScale = onImageScale, onOliverRow = onOliverRow, + onDismissDishListModeChooser = onDismissDishListModeChooser, scopes = scopes, ) } @@ -167,17 +170,22 @@ private fun DishListComposing( onDish: (Dish) -> Unit, onOliverRow: (Boolean) -> Unit, onRating: (Dish) -> Unit, + onDismissDishListModeChooser: () -> Unit, scrollStates: ScrollStates, scopes: AnimationScopes, modifier: Modifier = Modifier, ) = Column { val userSettings = state.userSettings - val gridSwitch: @Composable () -> Unit = { - DishListViewModeSwitch( - currentMode = userSettings.dishListMode, - onModeChange = onViewMode, - modifier = Modifier.fillMaxWidth(), - ) + val gridSwitch: @Composable (isInHeader: Boolean) -> Unit = { isInHeader -> + AnimatedVisibility(isInHeader != userSettings.isDishListModeChosen) { + DishListViewModeSwitch( + currentMode = userSettings.dishListMode, + onModeChange = onViewMode, + isDismissibleVisible = !userSettings.isDishListModeChosen, + onDismiss = onDismissDishListModeChooser, + modifier = Modifier.fillMaxWidth(), + ) + } } val imageSizeSetting: @Composable () -> Unit = { ImageSizeSetting( @@ -192,7 +200,7 @@ private fun DishListComposing( } } - val header: @Composable (Modifier) -> Unit = { modifier -> + val experimentalWarning: @Composable (Modifier) -> Unit = { modifier -> if (state.showExperimentalWarning) { Experimental( modifier @@ -202,10 +210,21 @@ private fun DishListComposing( } } - Crossfade( - targetState = userSettings.dishListMode, - label = "dish_list_mode_router", - ) { dishListMode -> + val header: @Composable (Modifier) -> Unit = { modifier: Modifier -> + Column( + verticalArrangement = Arrangement.spacedBy(Padding.MidSmall), + modifier = modifier.fillMaxWidth(), + ) { + experimentalWarning(Modifier) + gridSwitch(true) + } + } + +// Crossfade( +// targetState = userSettings.dishListMode, +// label = "dish_list_mode_router", +// ) { dishListMode -> + userSettings.dishListMode.let { dishListMode -> when (dishListMode) { COMPACT -> TodayDishList( @@ -223,7 +242,7 @@ private fun DishListComposing( verticalArrangement = Arrangement.spacedBy(Padding.MidSmall), modifier = modifier.fillMaxWidth(), ) { - gridSwitch() + gridSwitch(false) imageSizeSetting() @@ -248,7 +267,7 @@ private fun DishListComposing( header = header, footer = { Column { - gridSwitch() + gridSwitch(false) footerFabPadding() } }, @@ -270,7 +289,7 @@ private fun DishListComposing( header = header, footer = { Column { - gridSwitch() + gridSwitch(false) footerFabPadding() } }, @@ -292,7 +311,7 @@ private fun DishListComposing( header = header, footer = { Column { - gridSwitch() + gridSwitch(false) footerFabPadding() } }, diff --git a/app/src/main/kotlin/cz/lastaapps/menza/features/today/ui/vm/DishListViewModel.kt b/app/src/main/kotlin/cz/lastaapps/menza/features/today/ui/vm/DishListViewModel.kt index c55dbd60..1e9591c6 100644 --- a/app/src/main/kotlin/cz/lastaapps/menza/features/today/ui/vm/DishListViewModel.kt +++ b/app/src/main/kotlin/cz/lastaapps/menza/features/today/ui/vm/DishListViewModel.kt @@ -41,6 +41,7 @@ import cz.lastaapps.core.ui.vm.VMState import cz.lastaapps.core.util.extensions.localLogger import cz.lastaapps.menza.features.main.domain.usecase.GetSelectedMenzaUC import cz.lastaapps.menza.features.settings.domain.model.DishListMode +import cz.lastaapps.menza.features.settings.domain.usecase.settings.DismissDishListModeChooserUC import cz.lastaapps.menza.features.settings.domain.usecase.settings.SetDishListModeUC import cz.lastaapps.menza.features.settings.domain.usecase.settings.SetImageScaleUC import cz.lastaapps.menza.features.settings.domain.usecase.settings.SetOliverRow @@ -70,6 +71,7 @@ internal class DishListViewModel( private val setImageScaleUC: SetImageScaleUC, private val setDishListModeUC: SetDishListModeUC, private val isOnMeteredUC: IsOnMeteredUC, + private val dismissDishListModeChooserUC: DismissDishListModeChooserUC, private val getUserSettingsUC: GetTodayUserSettingsUC, private val openMenuLinkUC: OpenMenuUC, private val appInfoProvider: AppInfoProvider, @@ -165,6 +167,11 @@ internal class DishListViewModel( setOliverRowUC(used) } + fun dismissListModeChosen() = + launchVM { + dismissDishListModeChooserUC() + } + private suspend fun load( menza: Menza, isForced: Boolean, diff --git a/app/src/main/kotlin/cz/lastaapps/menza/features/today/ui/widget/DishListViewModeSwitch.kt b/app/src/main/kotlin/cz/lastaapps/menza/features/today/ui/widget/DishListViewModeSwitch.kt index ff633584..8189a0d8 100644 --- a/app/src/main/kotlin/cz/lastaapps/menza/features/today/ui/widget/DishListViewModeSwitch.kt +++ b/app/src/main/kotlin/cz/lastaapps/menza/features/today/ui/widget/DishListViewModeSwitch.kt @@ -22,12 +22,17 @@ package cz.lastaapps.menza.features.today.ui.widget import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.ExperimentalLayoutApi import androidx.compose.foundation.layout.FlowRow +import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.filled.ArrowDownward +import androidx.compose.material3.Button import androidx.compose.material3.Card import androidx.compose.material3.FilledTonalButton +import androidx.compose.material3.Icon import androidx.compose.material3.MaterialTheme import androidx.compose.material3.OutlinedButton import androidx.compose.material3.Text @@ -36,6 +41,7 @@ import androidx.compose.runtime.remember import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.res.stringResource +import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.tooling.preview.Preview import cz.lastaapps.menza.R import cz.lastaapps.menza.features.settings.domain.model.DishListMode @@ -48,6 +54,8 @@ import kotlinx.collections.immutable.persistentListOf internal fun DishListViewModeSwitch( currentMode: DishListMode?, onModeChange: (mode: DishListMode) -> Unit, + isDismissibleVisible: Boolean, + onDismiss: () -> Unit, modifier: Modifier = Modifier, ) { val buttons = @@ -64,12 +72,19 @@ internal fun DishListViewModeSwitch( modifier = modifier.fillMaxWidth(), ) { val padding = Padding.MidSmall + Spacer(Modifier.height(padding)) + + val text = + if (isDismissibleVisible) { + R.string.today_list_mode_title_chose + } else { + R.string.today_list_mode_title_normal + } Text( - stringResource(R.string.today_list_mode_title), + stringResource(text), style = MaterialTheme.typography.titleMedium, modifier = Modifier - .padding(top = padding) .padding(horizontal = padding) .align(Alignment.CenterHorizontally), ) @@ -79,7 +94,6 @@ internal fun DishListViewModeSwitch( FlowRow( modifier = Modifier - .padding(bottom = padding) .padding(horizontal = padding) .align(Alignment.CenterHorizontally), maxItemsInEachRow = 2, @@ -101,6 +115,30 @@ internal fun DishListViewModeSwitch( } } } + Spacer(Modifier.height(padding)) + + if (!isDismissibleVisible) { + return@Card + } + Button( + onClick = onDismiss, + modifier = + Modifier + .align(Alignment.CenterHorizontally) + .padding(horizontal = padding), + ) { + Row( + verticalAlignment = Alignment.CenterVertically, + horizontalArrangement = Arrangement.spacedBy(Padding.Smaller), + ) { + Icon(Icons.Default.ArrowDownward, null) + Text( + stringResource(R.string.today_list_mode_button_dismiss), + textAlign = TextAlign.Center, + ) + } + } + Spacer(Modifier.height(padding)) } } @@ -111,6 +149,15 @@ private fun DishListViewModeSwitchPreview() = DishListViewModeSwitch( currentMode = DishListMode.GRID, onModeChange = { }, + isDismissibleVisible = false, + onDismiss = {}, + modifier = Modifier, + ) + DishListViewModeSwitch( + currentMode = DishListMode.GRID, + onModeChange = { }, + isDismissibleVisible = true, + onDismiss = {}, modifier = Modifier, ) } diff --git a/app/src/main/kotlin/cz/lastaapps/menza/features/today/ui/widget/TodayDishCarousel.kt b/app/src/main/kotlin/cz/lastaapps/menza/features/today/ui/widget/TodayDishCarousel.kt index 02ece2fe..feb2d7ca 100644 --- a/app/src/main/kotlin/cz/lastaapps/menza/features/today/ui/widget/TodayDishCarousel.kt +++ b/app/src/main/kotlin/cz/lastaapps/menza/features/today/ui/widget/TodayDishCarousel.kt @@ -133,10 +133,7 @@ internal fun TodayDishCarousel( header = header, footer = footer, scopes = scopes, - modifier = - Modifier - .padding(top = Padding.Smaller) // so text is not cut off - .fillMaxSize(), + modifier = Modifier.fillMaxSize(), ) } } diff --git a/app/src/main/kotlin/cz/lastaapps/menza/features/today/ui/widget/TodayDishGrid.kt b/app/src/main/kotlin/cz/lastaapps/menza/features/today/ui/widget/TodayDishGrid.kt index 7bbee71b..6105d299 100644 --- a/app/src/main/kotlin/cz/lastaapps/menza/features/today/ui/widget/TodayDishGrid.kt +++ b/app/src/main/kotlin/cz/lastaapps/menza/features/today/ui/widget/TodayDishGrid.kt @@ -213,13 +213,13 @@ private fun DishItem( colors = appCardColors(MaterialTheme.colorScheme.primaryContainer), shape = MaterialTheme.shapes.large, modifier = - modifier - .clickable { onDish(dish) } - .sharedContainer( - scopes, - dishContainerKey(dish.id), - resizeMode = ResizeMode.RemeasureToBounds, - clipInOverlayDuringTransitionShape = MaterialTheme.shapes.large, + modifier + .clickable { onDish(dish) } + .sharedContainer( + scopes, + dishContainerKey(dish.id), + resizeMode = ResizeMode.RemeasureToBounds, + clipInOverlayDuringTransitionShape = MaterialTheme.shapes.large, ), ) { Column( @@ -240,7 +240,8 @@ private fun DishItem( DishNameRow( dish = dish, - modifier = Modifier + modifier = + Modifier .align(Alignment.Start) .sharedBounds(scopes, dishTitleKey(dish.id)), ) diff --git a/app/src/main/res/values-cs/strings.xml b/app/src/main/res/values-cs/strings.xml index 4c207aed..103eac0a 100644 --- a/app/src/main/res/values-cs/strings.xml +++ b/app/src/main/res/values-cs/strings.xml @@ -199,7 +199,9 @@ Otevřít web Nepodařilo se načíst obrázek Obrázek nebyl stažen, placená síť - Způsob zobrazení + Zvolte nejepší mód zobrazení + Způsob zobrazení + Mám vybráno, přesuň dolů Seznam Velké Řádky diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 62e64b97..1d3da097 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -215,7 +215,9 @@ Check website Failed to load the image The image not downloaded, metered network - List mode + Choose your favorite mode + List mode + I\'ve decided, move down Compact Large Rows