From a146447ed124cd66c4078e70eb522f4968874c40 Mon Sep 17 00:00:00 2001 From: Andrei Beriukhov Date: Thu, 24 Oct 2024 09:08:40 +0300 Subject: [PATCH] 135 fix widgets logic (#302) * Improve widget & preview layouts * Small widget opens current day list page * Widget logic --- .../beryukhov/coffeegram/data/CoffeeType.kt | 5 + .../ru/beryukhov/coffeegram/data/Const.kt | 11 +- app/src/main/AndroidManifest.xml | 25 ++- .../ru/beryukhov/coffeegram/Application.kt | 48 +++-- .../ru/beryukhov/coffeegram/MainActivity.kt | 21 +- .../coffeegram/model/NavigationStore.kt | 14 +- .../coffeegram/pages/AppWidgetViewModel.kt | 88 +++++++++ .../coffeegram/pages/CoffeeListPage.kt | 18 +- .../coffeegram/pages/CoffeeListViewModel.kt | 48 ++++- .../ru/beryukhov/coffeegram/pages/MapPage.kt | 1 - .../coffeegram/widget/FirstGlanceWidget.kt | 182 +++++++++++------- .../layout/widget_first_glance_preview.xml | 35 +--- .../main/res/layout/widget_preview_row.xml | 60 ++++++ .../beryukhov/coffeegram/wear/WearActivity.kt | 5 +- 14 files changed, 392 insertions(+), 169 deletions(-) create mode 100644 app/src/main/java/ru/beryukhov/coffeegram/pages/AppWidgetViewModel.kt create mode 100644 app/src/main/res/layout/widget_preview_row.xml diff --git a/app-wear-common/src/main/kotlin/ru/beryukhov/coffeegram/data/CoffeeType.kt b/app-wear-common/src/main/kotlin/ru/beryukhov/coffeegram/data/CoffeeType.kt index 85ff3185..4518aeaf 100644 --- a/app-wear-common/src/main/kotlin/ru/beryukhov/coffeegram/data/CoffeeType.kt +++ b/app-wear-common/src/main/kotlin/ru/beryukhov/coffeegram/data/CoffeeType.kt @@ -23,3 +23,8 @@ enum class CoffeeType( // icons from here: https://www.freepik.com/free-vector/list-different-types-coffee_951047.htm // app logo is here: https://www.flaticon.com/free-icon/coffee-cup_766408 } + +data class CoffeeTypeWithCount( + val coffee: CoffeeType, + val count: Int +) diff --git a/app-wear-common/src/main/kotlin/ru/beryukhov/coffeegram/data/Const.kt b/app-wear-common/src/main/kotlin/ru/beryukhov/coffeegram/data/Const.kt index 660fd734..b41f96b9 100644 --- a/app-wear-common/src/main/kotlin/ru/beryukhov/coffeegram/data/Const.kt +++ b/app-wear-common/src/main/kotlin/ru/beryukhov/coffeegram/data/Const.kt @@ -1,12 +1,13 @@ package ru.beryukhov.coffeegram.data -import androidx.annotation.VisibleForTesting - const val START_ACTIVITY_PATH = "/start-activity" const val DAY_COFFEE_PATH = "/coffee" -@VisibleForTesting -fun Map.withEmpty(): List> { +/** + * Map contains only non-zero values + * This function creates a list with all CoffeeTypes and their counts according to data from the map + */ +fun Map.withEmpty(): List { @Suppress("DataClassShouldBeImmutable") data class MutablePair(val ct: CoffeeType, var count: Int) @@ -15,5 +16,5 @@ fun Map.withEmpty(): List> { this.forEach { entry: Map.Entry -> emptyList.filter { it.ct == entry.key }.forEach { it.count = entry.value } } - return emptyList.map { it.ct to it.count } + return emptyList.map { CoffeeTypeWithCount(it.ct, it.count) } } diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 89afc293..cda96404 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -44,19 +44,18 @@ android:name="com.google.android.gms.version" android:value="@integer/google_play_services_version" /> - - - - - - - - - - - - - + + + + + + + diff --git a/app/src/main/java/ru/beryukhov/coffeegram/Application.kt b/app/src/main/java/ru/beryukhov/coffeegram/Application.kt index 2253731a..0f2b7876 100644 --- a/app/src/main/java/ru/beryukhov/coffeegram/Application.kt +++ b/app/src/main/java/ru/beryukhov/coffeegram/Application.kt @@ -1,12 +1,16 @@ package ru.beryukhov.coffeegram import android.app.Application +import android.util.Log import androidx.glance.appwidget.updateAll import kotlinx.coroutines.GlobalScope +import kotlinx.coroutines.flow.launchIn +import kotlinx.coroutines.flow.onEach import kotlinx.coroutines.launch +import org.koin.android.ext.android.get import org.koin.android.ext.koin.androidContext -import org.koin.androidx.viewmodel.dsl.viewModel import org.koin.core.context.startKoin +import org.koin.core.module.dsl.viewModel import org.koin.dsl.module import repository.CoffeeRepository import repository.RoomCoffeeRepository @@ -16,6 +20,7 @@ import ru.beryukhov.coffeegram.model.HeavyDaysCoffeesStore import ru.beryukhov.coffeegram.model.NavigationStore import ru.beryukhov.coffeegram.model.ThemeState import ru.beryukhov.coffeegram.model.ThemeStore +import ru.beryukhov.coffeegram.pages.AppWidgetViewModelImpl import ru.beryukhov.coffeegram.pages.CoffeeListViewModelImpl import ru.beryukhov.coffeegram.pages.MapPageViewModelImpl import ru.beryukhov.coffeegram.pages.TablePageViewModelImpl @@ -25,24 +30,6 @@ import ru.beryukhov.coffeegram.store_lib.Storage import ru.beryukhov.coffeegram.widget.FirstGlanceWidget class Application : Application() { - private val appModule = module { - single> { - // ThemeSharedPrefStorage(context = context) - // ThemeDataStorePrefStorage(context = context) - ThemeDataStoreProtoStorage(context = get()) - } - single { - ThemeStore(get()) - } - single { RoomCoffeeRepository(get()) } - single { CoffeeStorage(get()) } - single { HeavyDaysCoffeesStore(get()) } -// single { LightDaysCoffeesStore() } - single { NavigationStore() } - viewModel { CoffeeListViewModelImpl(daysCoffeesStore = get(), navigationStore = get()) } - viewModel { TablePageViewModelImpl(daysCoffeesStore = get(), navigationStore = get()) } - viewModel { MapPageViewModelImpl() } - } override fun onCreate() { super.onCreate() @@ -57,6 +44,29 @@ class Application : Application() { // or in a snapshot that has not yet been applied GlobalScope.launch { FirstGlanceWidget().updateAll(this@Application) + get().state.onEach { + Log.d("TEST||", "onCreate: $it") + FirstGlanceWidget().updateAll(this@Application) }.launchIn(this) } } } + +internal val appModule = module { + single> { + // ThemeSharedPrefStorage(context = context) + // ThemeDataStorePrefStorage(context = context) + ThemeDataStoreProtoStorage(context = get()) + } + single { + ThemeStore(get()) + } + single { RoomCoffeeRepository(get()) } + single { CoffeeStorage(get()) } + single { HeavyDaysCoffeesStore(get()) } +// single { LightDaysCoffeesStore() } + single { NavigationStore() } + viewModel { CoffeeListViewModelImpl(daysCoffeesStore = get(), navigationStore = get()) } + viewModel { TablePageViewModelImpl(daysCoffeesStore = get(), navigationStore = get()) } + viewModel { MapPageViewModelImpl() } + viewModel { AppWidgetViewModelImpl(daysCoffeesStore = get()) } +} diff --git a/app/src/main/java/ru/beryukhov/coffeegram/MainActivity.kt b/app/src/main/java/ru/beryukhov/coffeegram/MainActivity.kt index 5fa70c66..d1d6c963 100644 --- a/app/src/main/java/ru/beryukhov/coffeegram/MainActivity.kt +++ b/app/src/main/java/ru/beryukhov/coffeegram/MainActivity.kt @@ -1,4 +1,3 @@ - package ru.beryukhov.coffeegram import android.Manifest.permission.ACCESS_COARSE_LOCATION @@ -19,12 +18,20 @@ import kotlinx.coroutines.async import kotlinx.coroutines.awaitAll import kotlinx.coroutines.launch import kotlinx.coroutines.tasks.await +import kotlinx.datetime.Clock +import kotlinx.datetime.TimeZone +import kotlinx.datetime.toLocalDateTime +import org.koin.compose.koinInject import ru.beryukhov.coffeegram.animations.TransitionSlot import ru.beryukhov.coffeegram.data.CoffeeType import ru.beryukhov.coffeegram.data.DAY_COFFEE_PATH import ru.beryukhov.coffeegram.data.DayCoffee import ru.beryukhov.coffeegram.data.START_ACTIVITY_PATH import ru.beryukhov.coffeegram.data.toDataMap +import ru.beryukhov.coffeegram.model.NavigationIntent +import ru.beryukhov.coffeegram.model.NavigationState.Companion.NAVIGATION_STATE_KEY +import ru.beryukhov.coffeegram.model.NavigationState.Companion.TODAYS_COFFEE_LIST +import ru.beryukhov.coffeegram.model.NavigationStore import ru.beryukhov.coffeegram.pages.LandingPage class MainActivity : ComponentActivity() { @@ -39,6 +46,7 @@ class MainActivity : ComponentActivity() { var doAnimationState by rememberSaveable { mutableStateOf(true) } + val navigationStore: NavigationStore = koinInject() TransitionSlot( doAnimation = doAnimationState, StartPage = { modifier -> LandingPage(modifier = modifier) }, @@ -47,11 +55,20 @@ class MainActivity : ComponentActivity() { modifier = modifier, topPadding = topPadding, startWearableActivity = ::startWearableActivity, - showMap = checkCoarseLocationPermission() + showMap = checkCoarseLocationPermission(), + navigationStore = navigationStore ) }, ) { doAnimationState = false + if (intent.getStringExtra(NAVIGATION_STATE_KEY) == TODAYS_COFFEE_LIST) { + navigationStore.newIntent( + NavigationIntent.OpenCoffeeListPage( + dayOfMonth = Clock.System.now() + .toLocalDateTime(TimeZone.currentSystemDefault()).date.dayOfMonth + ) + ) + } } } } diff --git a/app/src/main/java/ru/beryukhov/coffeegram/model/NavigationStore.kt b/app/src/main/java/ru/beryukhov/coffeegram/model/NavigationStore.kt index e0771f42..438d7dd4 100644 --- a/app/src/main/java/ru/beryukhov/coffeegram/model/NavigationStore.kt +++ b/app/src/main/java/ru/beryukhov/coffeegram/model/NavigationStore.kt @@ -39,9 +39,9 @@ class NavigationStore(val yearMonth: YearMonth = nowYM()) : InMemoryStore + + fun currentDayIncrement(coffeeType: CoffeeType) + fun currentDayDecrement(coffeeType: CoffeeType) +} + +class AppWidgetViewModelStub : AppWidgetViewModel { + override fun getCurrentDayCupsCount(): Int = 0 + + override fun getCurrentDayMostPopularWithCount(): CoffeeTypeWithCount = + CoffeeTypeWithCount(CoffeeType.Cappuccino, 0) + + override fun getCurrentDayList(): PersistentList = + persistentListOf(CoffeeTypeWithCount(CoffeeType.Cappuccino, 0)) + + override fun currentDayIncrement(coffeeType: CoffeeType) = Unit + + override fun currentDayDecrement(coffeeType: CoffeeType) = Unit +} + +class AppWidgetViewModelImpl( + private val daysCoffeesStore: DaysCoffeesStore, +) : ViewModel(), AppWidgetViewModel { + + private fun getCurrentDay() = Clock.System.todayIn(TimeZone.currentSystemDefault()) + + override fun getCurrentDayCupsCount(): Int { + return getCurrentDayList().sumOf { it.count } + } + + override fun getCurrentDayMostPopularWithCount(): CoffeeTypeWithCount { + return getCurrentDayList().first() + } + + // coffee list does not contains 0 values and sorted by count + override fun getCurrentDayList(): PersistentList { + val dayCoffeeState: DaysCoffeesState = daysCoffeesStore.state.value + val dayCoffee = dayCoffeeState.value[getCurrentDay()] ?: DayCoffee() + val list = dayCoffee.coffeeCountMap.toList() + .sortedByDescending { it.second } + .map { CoffeeTypeWithCount(it.first, it.second) } + val emptyListMock = listOf(CoffeeTypeWithCount(CoffeeType.Cappuccino, 0)) + return list.ifEmpty { emptyListMock }.toPersistentList() + } + + override fun currentDayDecrement(coffeeType: CoffeeType) { + newIntent( + DaysCoffeesIntent.MinusCoffee( + localDate = getCurrentDay(), + coffeeType = coffeeType + ) + ) + } + + override fun currentDayIncrement(coffeeType: CoffeeType) { + Log.d("TEST||", "currentDayIncrement: coffeeType = $coffeeType") + newIntent( + DaysCoffeesIntent.PlusCoffee( + localDate = getCurrentDay(), + coffeeType = coffeeType + ) + ) + } + + private fun newIntent(intent: DaysCoffeesIntent) { + daysCoffeesStore.newIntent(intent) + } +} diff --git a/app/src/main/java/ru/beryukhov/coffeegram/pages/CoffeeListPage.kt b/app/src/main/java/ru/beryukhov/coffeegram/pages/CoffeeListPage.kt index 5f5cbef6..f6434a5b 100644 --- a/app/src/main/java/ru/beryukhov/coffeegram/pages/CoffeeListPage.kt +++ b/app/src/main/java/ru/beryukhov/coffeegram/pages/CoffeeListPage.kt @@ -23,7 +23,7 @@ import kotlinx.datetime.LocalDate import org.koin.androidx.compose.koinViewModel import ru.beryukhov.coffeegram.R import ru.beryukhov.coffeegram.data.CoffeeType -import ru.beryukhov.coffeegram.model.DaysCoffeesIntent +import ru.beryukhov.coffeegram.data.CoffeeTypeWithCount import ru.beryukhov.coffeegram.model.NavigationIntent import ru.beryukhov.coffeegram.view.CoffeeTypeItem import ru.beryukhov.date_time_utils.getFullMonthName @@ -63,22 +63,12 @@ fun CoffeeListPage( BackHandler { coffeeListViewModel.newIntent(NavigationIntent.ReturnToTablePage) } val onPlusClick = remember(localDate, coffeeListViewModel) { { coffeeType: CoffeeType -> - coffeeListViewModel.newIntent( - DaysCoffeesIntent.PlusCoffee( - localDate, - coffeeType - ) - ) + coffeeListViewModel.incrementCoffee(localDate, coffeeType) } } val onMinusClick = remember(localDate, coffeeListViewModel) { { coffeeType: CoffeeType -> - coffeeListViewModel.newIntent( - DaysCoffeesIntent.MinusCoffee( - localDate, - coffeeType - ) - ) + coffeeListViewModel.decrementCoffee(localDate, coffeeType) } } CoffeeList( @@ -91,7 +81,7 @@ fun CoffeeListPage( @Composable private fun CoffeeList( - coffeeItems: PersistentList>, + coffeeItems: PersistentList, onPlusClick: (coffeeType: CoffeeType) -> Unit, modifier: Modifier = Modifier, onMinusClick: (coffeeType: CoffeeType) -> Unit diff --git a/app/src/main/java/ru/beryukhov/coffeegram/pages/CoffeeListViewModel.kt b/app/src/main/java/ru/beryukhov/coffeegram/pages/CoffeeListViewModel.kt index ee38ef97..296c0235 100644 --- a/app/src/main/java/ru/beryukhov/coffeegram/pages/CoffeeListViewModel.kt +++ b/app/src/main/java/ru/beryukhov/coffeegram/pages/CoffeeListViewModel.kt @@ -8,6 +8,7 @@ import kotlinx.collections.immutable.PersistentList import kotlinx.collections.immutable.toPersistentList import kotlinx.datetime.LocalDate import ru.beryukhov.coffeegram.data.CoffeeType +import ru.beryukhov.coffeegram.data.CoffeeTypeWithCount import ru.beryukhov.coffeegram.data.DayCoffee import ru.beryukhov.coffeegram.data.withEmpty import ru.beryukhov.coffeegram.model.DaysCoffeesIntent @@ -19,18 +20,29 @@ import ru.beryukhov.date_time_utils.nowLD interface CoffeeListViewModel { @Composable - fun getDayCoffeesWithEmpty(localDate: LocalDate): PersistentList> + fun getDayCoffeesWithEmpty(localDate: LocalDate): PersistentList + + fun decrementCoffee( + localDate: LocalDate, + coffeeType: CoffeeType + ) + + fun incrementCoffee( + localDate: LocalDate, + coffeeType: CoffeeType + ) - fun newIntent(intent: DaysCoffeesIntent) fun newIntent(intent: NavigationIntent) } object CoffeeListViewModelStub : CoffeeListViewModel { - override fun newIntent(intent: DaysCoffeesIntent) = Unit override fun newIntent(intent: NavigationIntent) = Unit + override fun decrementCoffee(localDate: LocalDate, coffeeType: CoffeeType) = Unit + override fun incrementCoffee(localDate: LocalDate, coffeeType: CoffeeType) = Unit + @Composable - override fun getDayCoffeesWithEmpty(localDate: LocalDate): PersistentList> = + override fun getDayCoffeesWithEmpty(localDate: LocalDate): PersistentList = emptyMap().withEmpty().toPersistentList() } @@ -41,13 +53,37 @@ class CoffeeListViewModelImpl( private val navigationStore: NavigationStore ) : ViewModel(), CoffeeListViewModel { @Composable - override fun getDayCoffeesWithEmpty(localDate: LocalDate): PersistentList> { + override fun getDayCoffeesWithEmpty(localDate: LocalDate): PersistentList { val dayCoffeeState: DaysCoffeesState by daysCoffeesStore.state.collectAsState() val dayCoffee = dayCoffeeState.value[localDate] ?: DayCoffee() return dayCoffee.coffeeCountMap.withEmpty().toPersistentList() } - override fun newIntent(intent: DaysCoffeesIntent) { + override fun decrementCoffee( + localDate: LocalDate, + coffeeType: CoffeeType + ) { + newIntent( + DaysCoffeesIntent.MinusCoffee( + localDate = localDate, + coffeeType = coffeeType + ) + ) + } + + override fun incrementCoffee( + localDate: LocalDate, + coffeeType: CoffeeType + ) { + newIntent( + DaysCoffeesIntent.PlusCoffee( + localDate = localDate, + coffeeType = coffeeType + ) + ) + } + + private fun newIntent(intent: DaysCoffeesIntent) { daysCoffeesStore.newIntent(intent) } diff --git a/app/src/main/java/ru/beryukhov/coffeegram/pages/MapPage.kt b/app/src/main/java/ru/beryukhov/coffeegram/pages/MapPage.kt index 72f5acab..92b5e551 100644 --- a/app/src/main/java/ru/beryukhov/coffeegram/pages/MapPage.kt +++ b/app/src/main/java/ru/beryukhov/coffeegram/pages/MapPage.kt @@ -212,7 +212,6 @@ fun Marker( lineHeight = 18.sp, fontWeight = FontWeight(350), color = textColor, - ), maxLines = if (highlighted) 3 else 1, overflow = TextOverflow.Ellipsis diff --git a/app/src/main/java/ru/beryukhov/coffeegram/widget/FirstGlanceWidget.kt b/app/src/main/java/ru/beryukhov/coffeegram/widget/FirstGlanceWidget.kt index 2778d722..a8f18e28 100644 --- a/app/src/main/java/ru/beryukhov/coffeegram/widget/FirstGlanceWidget.kt +++ b/app/src/main/java/ru/beryukhov/coffeegram/widget/FirstGlanceWidget.kt @@ -7,6 +7,7 @@ import androidx.compose.ui.unit.DpSize import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import androidx.glance.Button +import androidx.glance.ButtonDefaults.buttonColors import androidx.glance.GlanceId import androidx.glance.GlanceModifier import androidx.glance.GlanceTheme @@ -14,6 +15,9 @@ import androidx.glance.Image import androidx.glance.ImageProvider import androidx.glance.LocalContext import androidx.glance.LocalSize +import androidx.glance.action.ActionParameters +import androidx.glance.action.action +import androidx.glance.action.actionParametersOf import androidx.glance.action.actionStartActivity import androidx.glance.action.clickable import androidx.glance.appwidget.GlanceAppWidget @@ -41,14 +45,24 @@ import androidx.glance.text.Text import androidx.glance.text.TextAlign import androidx.glance.text.TextStyle import androidx.glance.unit.ColorProvider +import kotlinx.collections.immutable.PersistentList +import kotlinx.collections.immutable.persistentListOf +import org.koin.core.component.KoinComponent +import org.koin.core.component.inject import ru.beryukhov.coffeegram.MainActivity import ru.beryukhov.coffeegram.R import ru.beryukhov.coffeegram.data.CoffeeType +import ru.beryukhov.coffeegram.data.CoffeeTypeWithCount +import ru.beryukhov.coffeegram.model.NavigationState.Companion.NAVIGATION_STATE_KEY +import ru.beryukhov.coffeegram.model.NavigationState.Companion.TODAYS_COFFEE_LIST +import ru.beryukhov.coffeegram.pages.AppWidgetViewModel +import ru.beryukhov.coffeegram.pages.AppWidgetViewModelImpl +import ru.beryukhov.coffeegram.pages.AppWidgetViewModelStub import ru.beryukhov.coffeegram.widget.FirstGlanceWidget.Companion.HORIZONTAL_RECTANGLE import ru.beryukhov.coffeegram.widget.FirstGlanceWidget.Companion.SMALL_SQUARE import ru.beryukhov.coffeegram.common.R as common_R -class FirstGlanceWidget : GlanceAppWidget(errorUiLayout = R.layout.layout_widget_custom_error) { +class FirstGlanceWidget : GlanceAppWidget(errorUiLayout = R.layout.layout_widget_custom_error), KoinComponent { // override val sizeMode: SizeMode = SizeMode.Exact // for Android 12 Responsive layouts feature @@ -56,8 +70,9 @@ class FirstGlanceWidget : GlanceAppWidget(errorUiLayout = R.layout.layout_widget SizeMode.Responsive(setOf(SMALL_SQUARE, HORIZONTAL_RECTANGLE, BIG_SQUARE)) override suspend fun provideGlance(context: Context, id: GlanceId) { + val viewModel: AppWidgetViewModelImpl by inject() provideContent { - WidgetContent() + WidgetContent(viewModel) } } @@ -80,7 +95,9 @@ class FirstGlanceWidget : GlanceAppWidget(errorUiLayout = R.layout.layout_widget @Preview(widthDp = 260, heightDp = 60) @Preview(widthDp = 280, heightDp = 150) @Composable -internal fun WidgetContent() { +internal fun WidgetContent( + viewModel: AppWidgetViewModel = AppWidgetViewModelStub(), +) { val size = LocalSize.current GlanceTheme { Scaffold( @@ -88,11 +105,23 @@ internal fun WidgetContent() { horizontalPadding = 0.dp, ) { when { - size.width <= SMALL_SQUARE.width && size.height <= SMALL_SQUARE.height -> SmallWidget() + size.width <= SMALL_SQUARE.width && size.height <= SMALL_SQUARE.height -> + SmallWidget( + count = viewModel.getCurrentDayCupsCount() + ) + size.width <= HORIZONTAL_RECTANGLE.width && size.height <= HORIZONTAL_RECTANGLE.height -> - HorizontalWidget() + HorizontalWidget( + coffeeTypeWithCount = viewModel.getCurrentDayMostPopularWithCount(), + increment = viewModel::currentDayIncrement, + decrement = viewModel::currentDayDecrement + ) - else -> BigWidget() + else -> BigWidget( + list = viewModel.getCurrentDayList(), + increment = viewModel::currentDayIncrement, + decrement = viewModel::currentDayDecrement + ) } } } @@ -109,7 +138,9 @@ private fun SmallWidget( .fillMaxSize() .clickable( actionStartActivity( - /*todo add parameters to open daycoffees list*/ + actionParametersOf( + ActionParameters.Key(NAVIGATION_STATE_KEY) to TODAYS_COFFEE_LIST + ) ) ) ) { @@ -121,7 +152,6 @@ private fun SmallWidget( .height(64.dp) .width(64.dp) ) - // workaround for aligning text in center by vertical Column( verticalAlignment = Alignment.CenterVertically, modifier = GlanceModifier @@ -145,89 +175,97 @@ private fun SmallWidget( @Composable private fun HorizontalWidget( modifier: GlanceModifier = GlanceModifier.padding(24.dp).fillMaxSize(), - coffeeType: CoffeeType = CoffeeType.Cappuccino, - count: Int = 5, + coffeeTypeWithCount: CoffeeTypeWithCount = CoffeeTypeWithCount(CoffeeType.Cappuccino, 5), + increment: (CoffeeType) -> Unit = {}, + decrement: (CoffeeType) -> Unit = {}, ) { val padding = 16.dp Row( - modifier = modifier + modifier = modifier, + verticalAlignment = Alignment.CenterVertically ) { - Column( - verticalAlignment = Alignment.CenterVertically, + + Image( + provider = ImageProvider(resId = coffeeTypeWithCount.coffee.iconId), + contentDescription = "", modifier = GlanceModifier .fillMaxHeight() - ) { - Image( - provider = ImageProvider(resId = coffeeType.iconId), - contentDescription = "", - modifier = GlanceModifier - .fillMaxHeight() - .size(48.dp) - ) - } + .size(48.dp) + ) Spacer(GlanceModifier.width(16.dp)) - // workaround for aligning text in center by vertical - Column( - verticalAlignment = Alignment.CenterVertically, + Text( + text = LocalContext.current.getString(coffeeTypeWithCount.coffee.nameId), + style = TextStyle( + fontSize = 16.sp, + textAlign = TextAlign.Center, + color = GlanceTheme.colors.primary, + ), modifier = GlanceModifier - .fillMaxSize() + .fillMaxWidth() .defaultWeight() - ) { - Text( - text = LocalContext.current.getString(coffeeType.nameId), - style = TextStyle( - fontSize = 16.sp, - textAlign = TextAlign.Center, - color = ColorProvider(Color.White), - ), - modifier = GlanceModifier - .fillMaxWidth() - ) - } - Column( - verticalAlignment = Alignment.CenterVertically, - modifier = GlanceModifier - .fillMaxHeight() - ) { - Row(verticalAlignment = Alignment.CenterVertically) { - Spacer(GlanceModifier.width(16.dp)) - val isReduceCountAllowed = count > 0 - Button( - text = "-", - enabled = isReduceCountAllowed, - modifier = GlanceModifier.width(32.dp).height(48.dp), - onClick = actionStartActivity() // todo replace action - ) - Spacer(GlanceModifier.width(padding)) + ) + Spacer(GlanceModifier.width(padding)) - Text( - "$count", - style = TextStyle( - fontSize = 20.sp, - color = ColorProvider(Color.White), - fontWeight = FontWeight.Bold, - textAlign = TextAlign.Center, - ), + val isReduceCountAllowed = coffeeTypeWithCount.count > 0 + val buttonColors = buttonColors( + backgroundColor = GlanceTheme.colors.background, + contentColor = GlanceTheme.colors.primary + ) + Button( + text = "-", + enabled = isReduceCountAllowed, + modifier = GlanceModifier.width(32.dp).height(48.dp).padding(0.dp), + colors = buttonColors, + onClick = action { + decrement(coffeeTypeWithCount.coffee) + } + ) + Spacer(GlanceModifier.width(padding)) - ) - Spacer(GlanceModifier.width(padding)) - Button( - text = "+", - modifier = GlanceModifier.width(32.dp).height(48.dp), - onClick = actionStartActivity() // todo replace action - ) + Text( + "${coffeeTypeWithCount.count}", + style = TextStyle( + fontSize = 20.sp, + color = GlanceTheme.colors.secondary, + fontWeight = FontWeight.Bold, + textAlign = TextAlign.Center, + ), + + ) + Spacer(GlanceModifier.width(padding)) + Button( + text = "+", + modifier = GlanceModifier.width(32.dp).height(48.dp).padding(0.dp), + colors = buttonColors, + onClick = action { + increment(coffeeTypeWithCount.coffee) } - } + ) } } +// todo actual data @Composable -private fun BigWidget(modifier: GlanceModifier = GlanceModifier) { +private fun BigWidget( + modifier: GlanceModifier = GlanceModifier, + list: PersistentList = mockList, + increment: (CoffeeType) -> Unit = {}, + decrement: (CoffeeType) -> Unit = {}, +) { LazyColumn(modifier = GlanceModifier.fillMaxSize()) { - items(listOf(Unit, Unit, Unit)) { + items(list) { HorizontalWidget( - modifier = GlanceModifier.padding(24.dp).fillMaxWidth().height(100.dp) + modifier = GlanceModifier.padding(24.dp).fillMaxWidth().height(100.dp), + coffeeTypeWithCount = it, + increment = increment, + decrement = decrement ) } } } + +private val mockList: PersistentList = persistentListOf( + CoffeeTypeWithCount(CoffeeType.Cappuccino, 5), + CoffeeTypeWithCount(CoffeeType.Espresso, 3), + CoffeeTypeWithCount(CoffeeType.Latte, 2), +) diff --git a/app/src/main/res/layout/widget_first_glance_preview.xml b/app/src/main/res/layout/widget_first_glance_preview.xml index 6649c79f..bf6639a2 100644 --- a/app/src/main/res/layout/widget_first_glance_preview.xml +++ b/app/src/main/res/layout/widget_first_glance_preview.xml @@ -1,36 +1,11 @@ - - - - -