From 6fec77cca64fb3869959c1ba0d3b98a4035a6319 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marlon=20L=C3=B3pez?= Date: Tue, 5 Mar 2024 23:21:09 -0500 Subject: [PATCH] Feature/upgrade catalog list UI (#3) * Updated version catalog, added koin for di and guava dependencies * feat(mobile-app): Configured koin modules * feat(mobile-app): Renamed old files * feat(mobile-app): Updated welcome screen composables * feat(mobile-app): Updated main activity * feat(feat-core-catalog-src): Added catalog data in english for fetching * feat(mobile-app): Updated catalog data service dependency for dependency injection * feat(mobile-app): Updated string resource values * feat(mobile-app): Updated unit tests * feat(mobile-app): Renamed old files * feat(mobile-app): Removed viewmodel factory for usage in koin di module * feat(mobile-app): Updated catalog favorites route composable ui * feat(mobile-app): Updated catalog settings route composable ui and viewmodel * feat(mobile-app): Updated scaffold and navigation type * feat(mobile-app): Updated device posture ui feature * feat(mobile-app): Updated catalog search route composable ui * feat(mobile-app): Updated catalog list route composable ui * feat(mobile-app): Updated welcome route composable ui * feat(mobile-app): Updated app ui state * feat(mobile-app): Updated app scaffold content type classifier * feat(mobile-app): Updated string resources * feat(mobile-app): Updated catalog home banner image resources * Updated version catalog * feat(mobile-app): Updated string resources * feat(mobile-app): Added jv logo image resources * feat(mobile-app): Upgraded catalog list route ui * feat(database): Upgraded catalog item entity information * feat(mobile-app): Upgraded catalog list unit tests * feat(mobile-app): Updated mobile app unit tests * feat(mobile-app): Updated main activity * feat(mobile-app): Updated app ui state * feat(mobile-app): Organized opt-in annotations * codefactor: Fixed unnecessary parentheses --- apps/mobile-app/build.gradle.kts | 1 + .../catalog_list/CatalogListContent.kt | 70 +++++++ .../catalog_list/CatalogListRepository.kt | 10 +- .../features/catalog_list/CatalogListRoute.kt | 197 ++++++------------ ...alogListState.kt => CatalogListUiState.kt} | 14 +- .../catalog_list/CatalogListViewModel.kt | 2 +- .../catalog_list/parts/CatalogListHeadline.kt | 70 +++++++ .../catalog_list/parts/CatalogTupleRow.kt | 130 ++++++++++++ .../DefaultPortraitCatalogListScreen(.kt | 73 +++++++ .../LandscapeCompactCatalogListScreen.kt | 86 ++++++++ .../slots/CatalogCategoriesChipGroup.kt | 104 +++++++++ .../catalog_list/slots/CatalogListBanner.kt | 113 ++++++++++ .../slots/CatalogListTuplesSlot.kt | 71 +++++++ .../apps/cappajv/ui/main/AppContent.kt | 2 + .../apps/cappajv/ui/main/AppState.kt | 6 +- .../apps/cappajv/ui/main/MainActivity.kt | 6 +- .../cappajv/ui/main/scaffold/MainScaffold.kt | 2 + .../ui/main/scaffold/MainScaffoldContent.kt | 13 +- .../apps/cappajv/ui/navigation/MainNavHost.kt | 3 + .../drawable/img_catalog_home_banner_01.webp | Bin 0 -> 45528 bytes .../drawable/img_catalog_home_banner_02.webp | Bin 0 -> 29846 bytes .../drawable/img_catalog_home_banner_03.webp | Bin 0 -> 18172 bytes .../drawable/img_catalog_home_banner_04.webp | Bin 0 -> 27134 bytes .../drawable/img_catalog_home_banner_05.webp | Bin 0 -> 23524 bytes .../res/drawable/img_juan_valdez_logo.png | Bin 0 -> 4758 bytes .../src/main/res/values-es/strings.xml | 13 +- .../src/main/res/values/strings.xml | 12 +- .../core/database/FakeLocalDataSource.kt | 18 +- .../CatalogDetailRepositoryTest.kt | 2 + .../catalog_list/CatalogListRepositoryTest.kt | 4 +- .../catalog_list/CatalogListViewModelTest.kt | 6 +- .../database/CatalogFavoriteItemsDaoTest.kt | 8 + .../core/database/CatalogItemsDaoTest.kt | 14 +- .../cappajv/core/database/CappaDatabase.kt | 2 +- .../core/database/dao/CatalogItemsDao.kt | 2 +- .../cappajv/core/database/entities/model.kt | 18 ++ .../core/database/dao/FakeCatalogItemsDao.kt | 2 +- .../CatalogFavoritesLocalDataSourceTest.kt | 8 + .../CatalogItemsLocalDataSourceTest.kt | 14 +- .../CatalogPunctuationsLocalDataSourceTest.kt | 8 +- gradle/libs.versions.toml | 3 + 41 files changed, 929 insertions(+), 178 deletions(-) create mode 100644 apps/mobile-app/src/main/kotlin/dev/marlonlom/apps/cappajv/features/catalog_list/CatalogListContent.kt rename apps/mobile-app/src/main/kotlin/dev/marlonlom/apps/cappajv/features/catalog_list/{CatalogListState.kt => CatalogListUiState.kt} (58%) create mode 100644 apps/mobile-app/src/main/kotlin/dev/marlonlom/apps/cappajv/features/catalog_list/parts/CatalogListHeadline.kt create mode 100644 apps/mobile-app/src/main/kotlin/dev/marlonlom/apps/cappajv/features/catalog_list/parts/CatalogTupleRow.kt create mode 100644 apps/mobile-app/src/main/kotlin/dev/marlonlom/apps/cappajv/features/catalog_list/screens/DefaultPortraitCatalogListScreen(.kt create mode 100644 apps/mobile-app/src/main/kotlin/dev/marlonlom/apps/cappajv/features/catalog_list/screens/LandscapeCompactCatalogListScreen.kt create mode 100644 apps/mobile-app/src/main/kotlin/dev/marlonlom/apps/cappajv/features/catalog_list/slots/CatalogCategoriesChipGroup.kt create mode 100644 apps/mobile-app/src/main/kotlin/dev/marlonlom/apps/cappajv/features/catalog_list/slots/CatalogListBanner.kt create mode 100644 apps/mobile-app/src/main/kotlin/dev/marlonlom/apps/cappajv/features/catalog_list/slots/CatalogListTuplesSlot.kt create mode 100644 apps/mobile-app/src/main/res/drawable/img_catalog_home_banner_01.webp create mode 100644 apps/mobile-app/src/main/res/drawable/img_catalog_home_banner_02.webp create mode 100644 apps/mobile-app/src/main/res/drawable/img_catalog_home_banner_03.webp create mode 100644 apps/mobile-app/src/main/res/drawable/img_catalog_home_banner_04.webp create mode 100644 apps/mobile-app/src/main/res/drawable/img_catalog_home_banner_05.webp create mode 100644 apps/mobile-app/src/main/res/drawable/img_juan_valdez_logo.png diff --git a/apps/mobile-app/build.gradle.kts b/apps/mobile-app/build.gradle.kts index d2d22c3..acfe53d 100644 --- a/apps/mobile-app/build.gradle.kts +++ b/apps/mobile-app/build.gradle.kts @@ -99,6 +99,7 @@ dependencies { implementation(libs.kotlinx.coroutines.android) implementation(libs.kotlinx.coroutines.core) implementation(libs.bundles.database.room) + implementation(libs.bundles.mobileapp.google.accompanist.pager) testImplementation(libs.junit) testImplementation(libs.kotlinx.coroutines.test) diff --git a/apps/mobile-app/src/main/kotlin/dev/marlonlom/apps/cappajv/features/catalog_list/CatalogListContent.kt b/apps/mobile-app/src/main/kotlin/dev/marlonlom/apps/cappajv/features/catalog_list/CatalogListContent.kt new file mode 100644 index 0000000..7903ac9 --- /dev/null +++ b/apps/mobile-app/src/main/kotlin/dev/marlonlom/apps/cappajv/features/catalog_list/CatalogListContent.kt @@ -0,0 +1,70 @@ +/* + * Copyright 2024 Marlonlom + * SPDX-License-Identifier: Apache-2.0 + */ + +package dev.marlonlom.apps.cappajv.features.catalog_list + +import androidx.compose.foundation.ExperimentalFoundationApi +import androidx.compose.foundation.layout.ExperimentalLayoutApi +import androidx.compose.foundation.lazy.LazyListState +import androidx.compose.runtime.Composable +import com.google.accompanist.pager.ExperimentalPagerApi +import dev.marlonlom.apps.cappajv.core.database.entities.CatalogItemTuple +import dev.marlonlom.apps.cappajv.features.catalog_list.screens.DefaultPortraitCatalogListScreen +import dev.marlonlom.apps.cappajv.features.catalog_list.screens.LandscapeCompactCatalogListScreen +import dev.marlonlom.apps.cappajv.ui.layout.DevicePosture +import dev.marlonlom.apps.cappajv.ui.main.CappajvAppState + +/** + * Catalog list content composable ui, conditioned by application ui state. + * + * @author marlonlom + * + * @param appState Application ui state. + * @param catalogItemsListState Catalog items lazy list state. + * @param catalogItems Catalog items list. + * @param categories Categories list. + * @param selectedCategory Selected category name. + * @param onSelectedCategoryChanged Action for category selected. + * @param onCatalogItemSelected Action for catalog item selected. + */ +@ExperimentalFoundationApi +@ExperimentalPagerApi +@ExperimentalLayoutApi +@Composable +fun CatalogListContent( + appState: CappajvAppState, + catalogItemsListState: LazyListState, + catalogItems: List, + categories: List, + selectedCategory: String, + onSelectedCategoryChanged: (String) -> Unit, + onCatalogItemSelected: (Long) -> Unit, +) { + when { + appState.isLandscape.and(appState.devicePosture == DevicePosture.Normal) -> { + LandscapeCompactCatalogListScreen( + appState = appState, + catalogItemsListState = catalogItemsListState, + catalogItems = catalogItems, + categories = categories, + selectedCategory = selectedCategory, + onSelectedCategoryChanged = onSelectedCategoryChanged, + onCatalogItemSelected = onCatalogItemSelected, + ) + } + + else -> { + DefaultPortraitCatalogListScreen( + appState = appState, + catalogItemsListState = catalogItemsListState, + catalogItems = catalogItems, + categories = categories, + selectedCategory = selectedCategory, + onSelectedCategoryChanged = onSelectedCategoryChanged, + onCatalogItemSelected = onCatalogItemSelected, + ) + } + } +} diff --git a/apps/mobile-app/src/main/kotlin/dev/marlonlom/apps/cappajv/features/catalog_list/CatalogListRepository.kt b/apps/mobile-app/src/main/kotlin/dev/marlonlom/apps/cappajv/features/catalog_list/CatalogListRepository.kt index 7dd2bcc..34ec28d 100644 --- a/apps/mobile-app/src/main/kotlin/dev/marlonlom/apps/cappajv/features/catalog_list/CatalogListRepository.kt +++ b/apps/mobile-app/src/main/kotlin/dev/marlonlom/apps/cappajv/features/catalog_list/CatalogListRepository.kt @@ -36,11 +36,11 @@ class CatalogListRepository( ) { /** Catalog products list as flow. */ - val allProducts: Flow = localDataSource.getAllProducts() + val allProducts: Flow = localDataSource.getAllProducts() .transform { tuples -> when { - tuples.isNotEmpty() -> CatalogListState.Listing(tuples.groupBy { it.category }) - else -> CatalogListState.Empty + tuples.isNotEmpty() -> CatalogListUiState.Listing(tuples.groupBy { it.category }) + else -> CatalogListUiState.Empty }.also { state -> emit(state) } @@ -99,5 +99,7 @@ private val RemoteCatalogItem.toEntity: CatalogItem titleNormalized = title.toSentenceCase, picture = picture, category = category, - detail = detail + detail = detail, + samplePunctuation = punctuations.first().let { "${it.label}:${it.pointsQty} pts" }, + punctuationsCount = punctuations.count() ) diff --git a/apps/mobile-app/src/main/kotlin/dev/marlonlom/apps/cappajv/features/catalog_list/CatalogListRoute.kt b/apps/mobile-app/src/main/kotlin/dev/marlonlom/apps/cappajv/features/catalog_list/CatalogListRoute.kt index 76bbf24..0eda2b3 100644 --- a/apps/mobile-app/src/main/kotlin/dev/marlonlom/apps/cappajv/features/catalog_list/CatalogListRoute.kt +++ b/apps/mobile-app/src/main/kotlin/dev/marlonlom/apps/cappajv/features/catalog_list/CatalogListRoute.kt @@ -6,48 +6,38 @@ package dev.marlonlom.apps.cappajv.features.catalog_list import androidx.compose.foundation.ExperimentalFoundationApi -import androidx.compose.foundation.background -import androidx.compose.foundation.layout.Arrangement -import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.ExperimentalLayoutApi -import androidx.compose.foundation.layout.Row -import androidx.compose.foundation.layout.fillMaxWidth -import androidx.compose.foundation.layout.padding -import androidx.compose.foundation.layout.paddingFromBaseline -import androidx.compose.foundation.layout.safeContentPadding -import androidx.compose.foundation.layout.size -import androidx.compose.foundation.layout.width -import androidx.compose.foundation.lazy.LazyColumn -import androidx.compose.foundation.lazy.LazyRow -import androidx.compose.foundation.shape.RoundedCornerShape -import androidx.compose.material3.Card -import androidx.compose.material3.CardDefaults +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.lazy.rememberLazyListState +import androidx.compose.material3.CircularProgressIndicator import androidx.compose.material3.ExperimentalMaterial3Api -import androidx.compose.material3.MaterialTheme -import androidx.compose.material3.Text -import androidx.compose.material3.TextButton import androidx.compose.runtime.Composable import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.rememberCoroutineScope +import androidx.compose.runtime.saveable.rememberSaveable import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier -import androidx.compose.ui.draw.clip -import androidx.compose.ui.graphics.Color -import androidx.compose.ui.layout.ContentScale -import androidx.compose.ui.platform.LocalContext -import androidx.compose.ui.res.stringResource -import androidx.compose.ui.text.font.FontWeight -import androidx.compose.ui.text.style.TextAlign -import androidx.compose.ui.text.style.TextOverflow -import androidx.compose.ui.unit.dp +import androidx.compose.ui.res.stringArrayResource import androidx.lifecycle.compose.collectAsStateWithLifecycle -import coil.compose.AsyncImage -import coil.request.ImageRequest +import com.google.accompanist.pager.ExperimentalPagerApi import dev.marlonlom.apps.cappajv.R import dev.marlonlom.apps.cappajv.core.database.entities.CatalogItemTuple import dev.marlonlom.apps.cappajv.ui.main.CappajvAppState +import kotlinx.coroutines.launch import org.koin.androidx.compose.koinViewModel import timber.log.Timber +/** + * Catalog list route composable ui. + * + * @author marlonlom + * + * @param appState Application ui state + * @param viewModel Catalog list viewmodel. + */ +@ExperimentalPagerApi @ExperimentalFoundationApi @ExperimentalMaterial3Api @ExperimentalLayoutApi @@ -56,124 +46,57 @@ fun CatalogListRoute( appState: CappajvAppState, viewModel: CatalogListViewModel = koinViewModel(), ) { + val coroutineScope = rememberCoroutineScope() + val categoriesList = stringArrayResource(R.array.array_catalog_list_categories).toList() + val firstCategory = categoriesList.first() + val selectedCategory = rememberSaveable { mutableStateOf(firstCategory) } + val catalogListUiState: CatalogListUiState by viewModel.uiState.collectAsStateWithLifecycle() + val catalogListScrollState = rememberLazyListState() - val catalogListState: CatalogListState by viewModel.uiState.collectAsStateWithLifecycle() + when (catalogListUiState) { + CatalogListUiState.Empty -> Unit + CatalogListUiState.Loading -> { + Box( + modifier = Modifier.fillMaxSize(), + contentAlignment = Alignment.Center, + ) { + CircularProgressIndicator() + } + } - val contentHorizontalPadding = when { - appState.isLandscape.not().and(appState.isMediumWidth) -> 40.dp - appState.isLandscape.not().and(appState.isExpandedWidth) -> 80.dp - else -> 20.dp - } + is CatalogListUiState.Listing -> { - LazyColumn( - modifier = Modifier - .safeContentPadding() - .padding(bottom = 0.dp), - ) { - stickyHeader { - Text( - modifier = Modifier - .fillMaxWidth() - .background(MaterialTheme.colorScheme.background) - .paddingFromBaseline(top = 40.dp, bottom = 20.dp), - text = "Consigue Nuestros premios", - fontWeight = FontWeight.Bold, - color = MaterialTheme.colorScheme.onBackground, - style = MaterialTheme.typography.headlineMedium - ) - } + val originalCatalogList: List = (catalogListUiState as CatalogListUiState.Listing).catalogMap + .map { (_, tuples) -> tuples }.flatten() - when (catalogListState) { - CatalogListState.Empty -> { - item { - Text(" :( ") + val filteredCatalogByCategory: (String) -> List = { category -> + when (category) { + firstCategory -> originalCatalogList + else -> originalCatalogList.filter { it.category == category } } } - CatalogListState.Loading -> { - item { Text("...") } + val catalogItemsList = rememberSaveable { + mutableStateOf(filteredCatalogByCategory(firstCategory)) } - is CatalogListState.Listing -> { - val listingsData = catalogListState as CatalogListState.Listing - - listingsData.map.keys.sorted().forEach { category -> - item { - Row( - modifier = Modifier - .fillMaxWidth() - .padding(top = 20.dp, bottom = 10.dp), - verticalAlignment = Alignment.CenterVertically, - horizontalArrangement = Arrangement.SpaceBetween - ) { - Text( - text = category, - style = MaterialTheme.typography.titleMedium, - fontWeight = FontWeight.Bold - ) - TextButton(onClick = {}) { - Text(text = stringResource(R.string.text_catalog_list_see_all)) - } - } - } - - item { - val tuples: List = listingsData.map[category] - .orEmpty().shuffled().subList(0, 5) - LazyRow( - horizontalArrangement = Arrangement.spacedBy(20.dp), - ) { - items(tuples.size) { pos -> - val tuple = tuples[pos] - Card(modifier = Modifier - .width(160.dp), - shape = RoundedCornerShape(10.dp), - colors = CardDefaults.cardColors( - containerColor = MaterialTheme.colorScheme.secondaryContainer.copy( - alpha = 0.25f - ), - contentColor = MaterialTheme.colorScheme.onSecondaryContainer, - ), - onClick = { - Timber.d("[CatalogListRoute] tuple=${tuple.title}") - }) { - Column( - modifier = Modifier - .fillMaxWidth() - .padding(top = 10.dp), - horizontalAlignment = Alignment.CenterHorizontally, - verticalArrangement = Arrangement.SpaceBetween, - ) { - AsyncImage( - model = ImageRequest.Builder(LocalContext.current) - .data(tuple.picture) - .crossfade(true) - .build(), - contentDescription = tuple.title, - contentScale = ContentScale.Crop, - modifier = Modifier - .clip(RoundedCornerShape(10.dp)) - .size(140.dp) - .background(Color.White), - ) - Text( - modifier = Modifier - .fillMaxWidth() - .padding(10.dp), - text = tuple.title, - style = MaterialTheme.typography.bodyMedium, - minLines = 2, - overflow = TextOverflow.Ellipsis, - fontWeight = FontWeight.Bold, - textAlign = TextAlign.Center - ) - } - } - } - } + CatalogListContent( + appState = appState, + catalogItemsListState = catalogListScrollState, + catalogItems = catalogItemsList.value, + categories = categoriesList, + selectedCategory = selectedCategory.value, + onSelectedCategoryChanged = { category -> + selectedCategory.value = category + catalogItemsList.value = filteredCatalogByCategory(category) + coroutineScope.launch { + catalogListScrollState.animateScrollToItem(0) } - } - } + }, + onCatalogItemSelected = { itemId -> + Timber.d("[CatalogListRoute] CatalogItemTuple.id[$itemId]") + }, + ) } } } diff --git a/apps/mobile-app/src/main/kotlin/dev/marlonlom/apps/cappajv/features/catalog_list/CatalogListState.kt b/apps/mobile-app/src/main/kotlin/dev/marlonlom/apps/cappajv/features/catalog_list/CatalogListUiState.kt similarity index 58% rename from apps/mobile-app/src/main/kotlin/dev/marlonlom/apps/cappajv/features/catalog_list/CatalogListState.kt rename to apps/mobile-app/src/main/kotlin/dev/marlonlom/apps/cappajv/features/catalog_list/CatalogListUiState.kt index ad0d6ba..b86f760 100644 --- a/apps/mobile-app/src/main/kotlin/dev/marlonlom/apps/cappajv/features/catalog_list/CatalogListState.kt +++ b/apps/mobile-app/src/main/kotlin/dev/marlonlom/apps/cappajv/features/catalog_list/CatalogListUiState.kt @@ -8,25 +8,27 @@ package dev.marlonlom.apps.cappajv.features.catalog_list import dev.marlonlom.apps.cappajv.core.database.entities.CatalogItemTuple /** - * Catalog ui state sealed class. + * Catalog list ui state sealed class. * * @author marlonlom */ -sealed class CatalogListState { +sealed class CatalogListUiState { /** * Catalog ui state as loading state object. */ - data object Loading : CatalogListState() + data object Loading : CatalogListUiState() /** * Catalog ui state as empty results object. */ - data object Empty : CatalogListState() + data object Empty : CatalogListUiState() /** * Catalog ui state as non empty list results data class. * - * @property map Grouped catalog items map. + * @property catalogMap Grouped catalog items. */ - data class Listing(val map: Map>) : CatalogListState() + data class Listing( + val catalogMap: Map> + ) : CatalogListUiState() } diff --git a/apps/mobile-app/src/main/kotlin/dev/marlonlom/apps/cappajv/features/catalog_list/CatalogListViewModel.kt b/apps/mobile-app/src/main/kotlin/dev/marlonlom/apps/cappajv/features/catalog_list/CatalogListViewModel.kt index a0dde91..105bdd5 100644 --- a/apps/mobile-app/src/main/kotlin/dev/marlonlom/apps/cappajv/features/catalog_list/CatalogListViewModel.kt +++ b/apps/mobile-app/src/main/kotlin/dev/marlonlom/apps/cappajv/features/catalog_list/CatalogListViewModel.kt @@ -8,7 +8,7 @@ package dev.marlonlom.apps.cappajv.features.catalog_list import androidx.lifecycle.ViewModel import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.viewModelScope -import dev.marlonlom.apps.cappajv.features.catalog_list.CatalogListState.Loading +import dev.marlonlom.apps.cappajv.features.catalog_list.CatalogListUiState.Loading import kotlinx.coroutines.flow.SharingStarted import kotlinx.coroutines.flow.stateIn import kotlinx.coroutines.launch diff --git a/apps/mobile-app/src/main/kotlin/dev/marlonlom/apps/cappajv/features/catalog_list/parts/CatalogListHeadline.kt b/apps/mobile-app/src/main/kotlin/dev/marlonlom/apps/cappajv/features/catalog_list/parts/CatalogListHeadline.kt new file mode 100644 index 0000000..d200679 --- /dev/null +++ b/apps/mobile-app/src/main/kotlin/dev/marlonlom/apps/cappajv/features/catalog_list/parts/CatalogListHeadline.kt @@ -0,0 +1,70 @@ +/* + * Copyright 2024 Marlonlom + * SPDX-License-Identifier: Apache-2.0 + */ + +package dev.marlonlom.apps.cappajv.features.catalog_list.parts + +import androidx.compose.foundation.Image +import androidx.compose.foundation.background +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.PaddingValues +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.size +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.layout.ContentScale +import androidx.compose.ui.res.painterResource +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.text.font.FontWeight +import androidx.compose.ui.unit.dp +import dev.marlonlom.apps.cappajv.R +import dev.marlonlom.apps.cappajv.ui.main.CappajvAppState + +/** + * Catalog listing headline composable ui. + * + * @author marlonlom + * + * @param appState Application ui state. + * @param modifier Modifier for this composable. + */ +@Composable +fun CatalogListHeadline( + appState: CappajvAppState, + modifier: Modifier = Modifier, +) { + + val rowPaddingValues = when { + appState.isCompactHeight -> PaddingValues(vertical = 20.dp) + else -> PaddingValues(top = 40.dp, bottom = 20.dp) + } + + Row( + modifier = modifier + .background(MaterialTheme.colorScheme.surface) + .fillMaxWidth() + .padding(rowPaddingValues), + verticalAlignment = Alignment.Bottom, + horizontalArrangement = Arrangement.SpaceBetween + ) { + Text( + modifier = Modifier.fillMaxWidth(0.75f), + text = stringResource(R.string.text_catalog_list_title), + style = MaterialTheme.typography.headlineLarge, + fontWeight = FontWeight.Bold, + maxLines = 2 + ) + Image( + painter = painterResource(R.drawable.img_juan_valdez_logo), + contentDescription = null, + contentScale = ContentScale.FillBounds, + modifier = Modifier.size(64.dp) + ) + } +} diff --git a/apps/mobile-app/src/main/kotlin/dev/marlonlom/apps/cappajv/features/catalog_list/parts/CatalogTupleRow.kt b/apps/mobile-app/src/main/kotlin/dev/marlonlom/apps/cappajv/features/catalog_list/parts/CatalogTupleRow.kt new file mode 100644 index 0000000..8c32cc6 --- /dev/null +++ b/apps/mobile-app/src/main/kotlin/dev/marlonlom/apps/cappajv/features/catalog_list/parts/CatalogTupleRow.kt @@ -0,0 +1,130 @@ +/* + * Copyright 2024 Marlonlom + * SPDX-License-Identifier: Apache-2.0 + */ + +package dev.marlonlom.apps.cappajv.features.catalog_list.parts + +import androidx.compose.foundation.background +import androidx.compose.foundation.border +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.size +import androidx.compose.material3.Card +import androidx.compose.material3.CardDefaults +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.SuggestionChip +import androidx.compose.material3.SuggestionChipDefaults +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.draw.clip +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.layout.ContentScale +import androidx.compose.ui.platform.LocalContext +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.text.SpanStyle +import androidx.compose.ui.text.buildAnnotatedString +import androidx.compose.ui.text.font.FontWeight +import androidx.compose.ui.text.withStyle +import androidx.compose.ui.unit.dp +import coil.compose.AsyncImage +import coil.request.ImageRequest +import dev.marlonlom.apps.cappajv.R +import dev.marlonlom.apps.cappajv.core.database.entities.CatalogItemTuple + +/** + * Catalog tuple row composable ui. + * + * @author marlonlom + * + * @param tuple Catalog item. + * @param onCatalogItemTupleClicked Action for catalog item selected. + * @param modifier Modifier for this composable. + */ +@Composable +internal fun CatalogTupleRow( + tuple: CatalogItemTuple, + onCatalogItemTupleClicked: (Long) -> Unit, + modifier: Modifier = Modifier, +) { + Card( + modifier = modifier.fillMaxWidth(), + shape = CardDefaults.outlinedShape, + colors = CardDefaults.outlinedCardColors(), + onClick = { + onCatalogItemTupleClicked(tuple.id) + }, + ) { + Row( + modifier.padding(10.dp), + verticalAlignment = Alignment.CenterVertically, + horizontalArrangement = Arrangement.spacedBy(20.dp) + ) { + val imageRequest = ImageRequest.Builder(LocalContext.current) + .data(tuple.picture) + .crossfade(true) + .build() + + AsyncImage( + model = imageRequest, + contentDescription = tuple.title, + contentScale = ContentScale.Crop, + modifier = Modifier + .border( + width = 2.dp, + color = MaterialTheme.colorScheme.secondary, + shape = MaterialTheme.shapes.medium, + ) + .clip(MaterialTheme.shapes.medium) + .size(100.dp) + .background(Color.White), + ) + + Column { + Text( + text = tuple.title, + style = MaterialTheme.typography.titleLarge, + fontWeight = FontWeight.SemiBold + ) + Row( + verticalAlignment = Alignment.CenterVertically, + horizontalArrangement = Arrangement.spacedBy(10.dp) + ) { + SuggestionChip( + onClick = { }, + colors = SuggestionChipDefaults.suggestionChipColors( + containerColor = MaterialTheme.colorScheme.tertiaryContainer, + labelColor = MaterialTheme.colorScheme.onTertiaryContainer + ), + label = { + val samplePunctuationTxt = buildAnnotatedString { + val textParts = tuple.samplePunctuation.split(":") + withStyle(SpanStyle(fontWeight = FontWeight.SemiBold)) { + append(textParts[0]) + } + append(": ") + append(textParts[1].trim()) + } + Text(text = samplePunctuationTxt) + }, + shape = MaterialTheme.shapes.small, + ) + + if (tuple.punctuationsCount > 1) { + Text( + text = stringResource( + R.string.text_catalog_hint_more_punctuations, + tuple.punctuationsCount - 1 + ) + ) + } + } + } + } + } +} diff --git a/apps/mobile-app/src/main/kotlin/dev/marlonlom/apps/cappajv/features/catalog_list/screens/DefaultPortraitCatalogListScreen(.kt b/apps/mobile-app/src/main/kotlin/dev/marlonlom/apps/cappajv/features/catalog_list/screens/DefaultPortraitCatalogListScreen(.kt new file mode 100644 index 0000000..02f7f07 --- /dev/null +++ b/apps/mobile-app/src/main/kotlin/dev/marlonlom/apps/cappajv/features/catalog_list/screens/DefaultPortraitCatalogListScreen(.kt @@ -0,0 +1,73 @@ +/* + * Copyright 2024 Marlonlom + * SPDX-License-Identifier: Apache-2.0 + */ + +package dev.marlonlom.apps.cappajv.features.catalog_list.screens + +import androidx.compose.foundation.ExperimentalFoundationApi +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.ExperimentalLayoutApi +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.safeContentPadding +import androidx.compose.foundation.lazy.LazyListState +import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import com.google.accompanist.pager.ExperimentalPagerApi +import dev.marlonlom.apps.cappajv.core.database.entities.CatalogItemTuple +import dev.marlonlom.apps.cappajv.features.catalog_list.parts.CatalogListHeadline +import dev.marlonlom.apps.cappajv.features.catalog_list.slots.CatalogCategoriesChipGroup +import dev.marlonlom.apps.cappajv.features.catalog_list.slots.CatalogListBanner +import dev.marlonlom.apps.cappajv.features.catalog_list.slots.CatalogListTuplesSlot +import dev.marlonlom.apps.cappajv.ui.main.CappajvAppState + +/** + * Default portrait catalog list screen composable ui. + * + * @author marlonlom + * + * @param appState Application ui state. + * @param catalogItemsListState Catalog items lazy list state. + * @param catalogItems Catalog items list. + * @param categories Categories list. + * @param selectedCategory Selected category name. + * @param onSelectedCategoryChanged Action for category selected. + * @param onCatalogItemSelected Action for catalog item selected. + * @param modifier Modifier for this composable. + */ +@ExperimentalPagerApi +@ExperimentalLayoutApi +@ExperimentalFoundationApi +@Composable +fun DefaultPortraitCatalogListScreen( + appState: CappajvAppState, + catalogItemsListState: LazyListState, + catalogItems: List, + categories: List, + selectedCategory: String, + onSelectedCategoryChanged: (String) -> Unit, + onCatalogItemSelected: (Long) -> Unit, + modifier: Modifier = Modifier, +) { + Column( + modifier = modifier + .fillMaxWidth() + .safeContentPadding(), + horizontalAlignment = Alignment.CenterHorizontally + ) { + CatalogListHeadline(appState) + CatalogListBanner() + CatalogCategoriesChipGroup( + categories = categories, + selectedCategory = selectedCategory, + onCategoryChipSelected = { onSelectedCategoryChanged(it) }, + isScrollable = true, + ) + CatalogListTuplesSlot( + catalogItemsListState = catalogItemsListState, + catalogTuples = catalogItems, + onCatalogItemTupleClicked = { onCatalogItemSelected(it) }, + ) + } +} diff --git a/apps/mobile-app/src/main/kotlin/dev/marlonlom/apps/cappajv/features/catalog_list/screens/LandscapeCompactCatalogListScreen.kt b/apps/mobile-app/src/main/kotlin/dev/marlonlom/apps/cappajv/features/catalog_list/screens/LandscapeCompactCatalogListScreen.kt new file mode 100644 index 0000000..a02ff5e --- /dev/null +++ b/apps/mobile-app/src/main/kotlin/dev/marlonlom/apps/cappajv/features/catalog_list/screens/LandscapeCompactCatalogListScreen.kt @@ -0,0 +1,86 @@ +/* + * Copyright 2024 Marlonlom + * SPDX-License-Identifier: Apache-2.0 + */ + +package dev.marlonlom.apps.cappajv.features.catalog_list.screens + +import androidx.compose.foundation.ExperimentalFoundationApi +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.ExperimentalLayoutApi +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.safeContentPadding +import androidx.compose.foundation.lazy.LazyListState +import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.unit.dp +import com.google.accompanist.pager.ExperimentalPagerApi +import dev.marlonlom.apps.cappajv.core.database.entities.CatalogItemTuple +import dev.marlonlom.apps.cappajv.features.catalog_list.parts.CatalogListHeadline +import dev.marlonlom.apps.cappajv.features.catalog_list.slots.CatalogCategoriesChipGroup +import dev.marlonlom.apps.cappajv.features.catalog_list.slots.CatalogListBanner +import dev.marlonlom.apps.cappajv.features.catalog_list.slots.CatalogListTuplesSlot +import dev.marlonlom.apps.cappajv.ui.main.CappajvAppState +import dev.marlonlom.apps.cappajv.ui.main.scaffold.ScaffoldContentType + +/** + * Landscape compact catalog list screen composable ui. + * + * @author marlonlom + * + * @param appState Application ui state. + * @param catalogItemsListState Catalog items lazy list state. + * @param catalogItems Catalog items list. + * @param categories Categories list. + * @param selectedCategory Selected category name. + * @param onSelectedCategoryChanged Action for category selected. + * @param onCatalogItemSelected Action for catalog item selected. + * @param modifier Modifier for this composable. + */ +@ExperimentalLayoutApi +@ExperimentalPagerApi +@ExperimentalFoundationApi +@Composable +fun LandscapeCompactCatalogListScreen( + appState: CappajvAppState, + catalogItemsListState: LazyListState, + catalogItems: List, + categories: List, + selectedCategory: String, + onSelectedCategoryChanged: (String) -> Unit, + onCatalogItemSelected: (Long) -> Unit, + modifier: Modifier = Modifier, +) { + val splitRatio = when { + appState.scaffoldContentType is ScaffoldContentType.TwoPane -> + (appState.scaffoldContentType as ScaffoldContentType.TwoPane).hingeRatio + + else -> 0.45f + } + + Row( + modifier = modifier.fillMaxWidth(), + verticalAlignment = Alignment.CenterVertically, + horizontalArrangement = Arrangement.spacedBy(20.dp) + ) { + Column(modifier = modifier.fillMaxWidth(splitRatio)) { + CatalogListHeadline(appState) + CatalogListBanner() + CatalogCategoriesChipGroup( + categories = categories, + selectedCategory = selectedCategory, + onCategoryChipSelected = { onSelectedCategoryChanged(it) }, + ) + } + Column(modifier = modifier.safeContentPadding()) { + CatalogListTuplesSlot( + catalogItemsListState = catalogItemsListState, + catalogTuples = catalogItems, + onCatalogItemTupleClicked = onCatalogItemSelected, + ) + } + } +} diff --git a/apps/mobile-app/src/main/kotlin/dev/marlonlom/apps/cappajv/features/catalog_list/slots/CatalogCategoriesChipGroup.kt b/apps/mobile-app/src/main/kotlin/dev/marlonlom/apps/cappajv/features/catalog_list/slots/CatalogCategoriesChipGroup.kt new file mode 100644 index 0000000..f3d1985 --- /dev/null +++ b/apps/mobile-app/src/main/kotlin/dev/marlonlom/apps/cappajv/features/catalog_list/slots/CatalogCategoriesChipGroup.kt @@ -0,0 +1,104 @@ +/* + * Copyright 2024 Marlonlom + * SPDX-License-Identifier: Apache-2.0 + */ + +package dev.marlonlom.apps.cappajv.features.catalog_list.slots + +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.ExperimentalLayoutApi +import androidx.compose.foundation.layout.FlowRow +import androidx.compose.foundation.layout.size +import androidx.compose.foundation.lazy.LazyRow +import androidx.compose.foundation.lazy.items +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.twotone.Coffee +import androidx.compose.material.icons.twotone.CoffeeMaker +import androidx.compose.material.icons.twotone.Cookie +import androidx.compose.material.icons.twotone.FilterList +import androidx.compose.material3.FilterChip +import androidx.compose.material3.FilterChipDefaults +import androidx.compose.material3.Icon +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.vector.ImageVector +import androidx.compose.ui.unit.dp + +/** + * Catalog categories chip group slot composable ui. + * + * @author marlonlom + * + * @param selectedCategory Selected category. + * @param onCategoryChipSelected Action for category changed. + * @param isScrollable True/False if scroll is handled, default to false. + */ +@ExperimentalLayoutApi +@Composable +fun CatalogCategoriesChipGroup( + categories: List, + selectedCategory: String, + onCategoryChipSelected: (String) -> Unit, + isScrollable: Boolean = false, +) { + val list = categories.mapIndexed { index, category -> + Pair( + first = category, + second = when (index) { + 0 -> Icons.TwoTone.FilterList + 1 -> Icons.TwoTone.Coffee + 2 -> Icons.TwoTone.CoffeeMaker + else -> Icons.TwoTone.Cookie + } + ) + } + + val addCategoryFilterChip: @Composable (Pair) -> Unit = { category -> + FilterChip( + selected = selectedCategory == category.first, + onClick = { + onCategoryChipSelected(category.first) + }, + label = { + Text(category.first) + }, + leadingIcon = { + Icon( + imageVector = category.second, + contentDescription = "${category.first} icon", + modifier = Modifier.size(FilterChipDefaults.IconSize) + ) + }, + ) + } + + if (isScrollable) { + LazyRow( + horizontalArrangement = Arrangement.spacedBy( + space = 10.dp, + alignment = Alignment.Start, + ), + ) { + items( + items = list, + key = { it.first } + ) { category -> + addCategoryFilterChip(category) + } + } + } else { + FlowRow( + horizontalArrangement = Arrangement.spacedBy( + space = 10.dp, + alignment = Alignment.Start, + ), + verticalArrangement = Arrangement.spacedBy(4.dp), + ) { + list.forEach { category -> + addCategoryFilterChip(category) + } + } + } +} diff --git a/apps/mobile-app/src/main/kotlin/dev/marlonlom/apps/cappajv/features/catalog_list/slots/CatalogListBanner.kt b/apps/mobile-app/src/main/kotlin/dev/marlonlom/apps/cappajv/features/catalog_list/slots/CatalogListBanner.kt new file mode 100644 index 0000000..e678b26 --- /dev/null +++ b/apps/mobile-app/src/main/kotlin/dev/marlonlom/apps/cappajv/features/catalog_list/slots/CatalogListBanner.kt @@ -0,0 +1,113 @@ +/* + * Copyright 2024 Marlonlom + * SPDX-License-Identifier: Apache-2.0 + */ + +package dev.marlonlom.apps.cappajv.features.catalog_list.slots + +import androidx.compose.foundation.ExperimentalFoundationApi +import androidx.compose.foundation.Image +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.PaddingValues +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.padding +import androidx.compose.material3.Card +import androidx.compose.material3.MaterialTheme +import androidx.compose.runtime.Composable +import androidx.compose.runtime.LaunchedEffect +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.graphicsLayer +import androidx.compose.ui.layout.ContentScale +import androidx.compose.ui.res.painterResource +import androidx.compose.ui.unit.dp +import androidx.compose.ui.util.lerp +import com.google.accompanist.pager.ExperimentalPagerApi +import com.google.accompanist.pager.HorizontalPager +import com.google.accompanist.pager.HorizontalPagerIndicator +import com.google.accompanist.pager.calculateCurrentOffsetForPage +import com.google.accompanist.pager.rememberPagerState +import dev.marlonlom.apps.cappajv.R +import kotlinx.coroutines.delay +import kotlinx.coroutines.yield +import kotlin.math.absoluteValue + +/** + * Catalog list banner slot composable ui. + * + * @author marlonlom + * + * @param modifier + */ +@ExperimentalFoundationApi +@ExperimentalPagerApi +@Composable +fun CatalogListBanner( + modifier: Modifier = Modifier +) { + val pagerState = rememberPagerState(initialPage = 0) + val bannerImagesList = listOf( + painterResource(R.drawable.img_catalog_home_banner_01), + painterResource(R.drawable.img_catalog_home_banner_02), + painterResource(R.drawable.img_catalog_home_banner_03), + painterResource(R.drawable.img_catalog_home_banner_04), + painterResource(R.drawable.img_catalog_home_banner_05), + ) + + LaunchedEffect(Unit) { + while (true) { + yield() + delay(5000) + pagerState.animateScrollToPage( + page = pagerState.currentPage + 1 % pagerState.pageCount + ) + } + } + + Column { + HorizontalPager( + count = bannerImagesList.size, + state = pagerState, + contentPadding = PaddingValues(0.dp), + modifier = modifier + .height(160.dp) + .fillMaxWidth() + ) { page -> + Card(onClick = {}, shape = MaterialTheme.shapes.large, modifier = Modifier.graphicsLayer { + val pageOffset = calculateCurrentOffsetForPage(page).absoluteValue + + lerp( + start = 0.85f, + stop = 1f, + fraction = 1f - pageOffset.coerceIn(0f, 1f), + ).also { scale -> + scaleX = scale + scaleY = scale + } + + alpha = lerp( + start = 0.5f, + stop = 1f, + fraction = 1f - pageOffset.coerceIn(0f, 1f), + ) + }) { + Image( + painter = bannerImagesList[page], + contentDescription = null, + contentScale = ContentScale.FillBounds, + modifier = Modifier.fillMaxSize() + ) + } + } + HorizontalPagerIndicator( + pagerState = pagerState, + activeColor = MaterialTheme.colorScheme.primary, + modifier = Modifier + .align(Alignment.CenterHorizontally) + .padding(10.dp), + ) + } + +} diff --git a/apps/mobile-app/src/main/kotlin/dev/marlonlom/apps/cappajv/features/catalog_list/slots/CatalogListTuplesSlot.kt b/apps/mobile-app/src/main/kotlin/dev/marlonlom/apps/cappajv/features/catalog_list/slots/CatalogListTuplesSlot.kt new file mode 100644 index 0000000..b192382 --- /dev/null +++ b/apps/mobile-app/src/main/kotlin/dev/marlonlom/apps/cappajv/features/catalog_list/slots/CatalogListTuplesSlot.kt @@ -0,0 +1,71 @@ +/* + * Copyright 2024 Marlonlom + * SPDX-License-Identifier: Apache-2.0 + */ + +package dev.marlonlom.apps.cappajv.features.catalog_list.slots + +import androidx.compose.foundation.ExperimentalFoundationApi +import androidx.compose.foundation.background +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.paddingFromBaseline +import androidx.compose.foundation.lazy.LazyColumn +import androidx.compose.foundation.lazy.LazyListState +import androidx.compose.foundation.lazy.items +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.text.font.FontWeight +import androidx.compose.ui.unit.dp +import dev.marlonlom.apps.cappajv.R +import dev.marlonlom.apps.cappajv.core.database.entities.CatalogItemTuple +import dev.marlonlom.apps.cappajv.features.catalog_list.parts.CatalogTupleRow + +/** + * Catalog list tuples slot composable ui. + * + * @author marlonlom + * + * @param catalogItemsListState Catalog items lazy list state. + * @param catalogTuples Catalog tuples list. + * @param onCatalogItemTupleClicked Action for catalog tuple selected. + * @param modifier Modifier for this composable. + */ +@ExperimentalFoundationApi +@Composable +fun CatalogListTuplesSlot( + catalogItemsListState: LazyListState, + catalogTuples: List, + onCatalogItemTupleClicked: (Long) -> Unit, + modifier: Modifier = Modifier, +) { + LazyColumn( + state = catalogItemsListState, + modifier = modifier.fillMaxWidth(), + verticalArrangement = Arrangement.spacedBy(10.dp), + ) { + stickyHeader { + Text( + modifier = modifier + .background(MaterialTheme.colorScheme.surface) + .fillMaxWidth() + .paddingFromBaseline(top = 40.dp, bottom = 20.dp), + text = stringResource(R.string.text_catalog_subtitle_all_products), + fontWeight = FontWeight.Bold, + style = MaterialTheme.typography.titleLarge, + ) + } + items( + items = catalogTuples, + key = CatalogItemTuple::id, + ) { tuple -> + CatalogTupleRow( + tuple = tuple, + onCatalogItemTupleClicked = onCatalogItemTupleClicked, + ) + } + } +} diff --git a/apps/mobile-app/src/main/kotlin/dev/marlonlom/apps/cappajv/ui/main/AppContent.kt b/apps/mobile-app/src/main/kotlin/dev/marlonlom/apps/cappajv/ui/main/AppContent.kt index 245e788..8a753ce 100644 --- a/apps/mobile-app/src/main/kotlin/dev/marlonlom/apps/cappajv/ui/main/AppContent.kt +++ b/apps/mobile-app/src/main/kotlin/dev/marlonlom/apps/cappajv/ui/main/AppContent.kt @@ -10,6 +10,7 @@ import androidx.compose.foundation.isSystemInDarkTheme import androidx.compose.foundation.layout.ExperimentalLayoutApi import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.runtime.Composable +import com.google.accompanist.pager.ExperimentalPagerApi import dev.marlonlom.apps.cappajv.features.welcome.WelcomeRoute import dev.marlonlom.apps.cappajv.ui.main.scaffold.MainScaffold import dev.marlonlom.apps.cappajv.ui.theme.CappajvTheme @@ -56,6 +57,7 @@ private fun shouldUseDarkTheme( * @param appContentCallbacks Application content callbacks. * @param onOnboardingComplete Action for onboarding complete. */ +@ExperimentalPagerApi @ExperimentalFoundationApi @ExperimentalLayoutApi @ExperimentalMaterial3Api diff --git a/apps/mobile-app/src/main/kotlin/dev/marlonlom/apps/cappajv/ui/main/AppState.kt b/apps/mobile-app/src/main/kotlin/dev/marlonlom/apps/cappajv/ui/main/AppState.kt index 7db4534..da1e34f 100644 --- a/apps/mobile-app/src/main/kotlin/dev/marlonlom/apps/cappajv/ui/main/AppState.kt +++ b/apps/mobile-app/src/main/kotlin/dev/marlonlom/apps/cappajv/ui/main/AppState.kt @@ -33,11 +33,13 @@ fun rememberCappajvAppState( windowSizeClass: WindowSizeClass, devicePosture: DevicePosture, screenWidthDp: Int, + isLandscape: Boolean, navController: NavHostController = rememberNavController(), ): CappajvAppState = remember( windowSizeClass, devicePosture, screenWidthDp, + isLandscape, navController, ) { CappajvAppState( @@ -45,6 +47,7 @@ fun rememberCappajvAppState( windowSizeClass = windowSizeClass, devicePosture = devicePosture, screenWidthDp = screenWidthDp, + isLandscape = isLandscape ) } @@ -63,6 +66,7 @@ data class CappajvAppState( val windowSizeClass: WindowSizeClass, val devicePosture: DevicePosture, val screenWidthDp: Int, + val isLandscape: Boolean, ) { val isCompactWidth get() = windowSizeClass.widthSizeClass == WindowWidthSizeClass.Compact @@ -72,8 +76,6 @@ data class CappajvAppState( val isExpandedWidth get() = windowSizeClass.widthSizeClass == WindowWidthSizeClass.Expanded - val isLandscape get() = isMediumWidth.and(isCompactHeight).or(isExpandedWidth.and(isCompactHeight.not())) - val scaffoldContentType get() = ScaffoldContentClassifier.classify( devicePosture, isExpandedWidth, isMediumWidth, isCompactHeight diff --git a/apps/mobile-app/src/main/kotlin/dev/marlonlom/apps/cappajv/ui/main/MainActivity.kt b/apps/mobile-app/src/main/kotlin/dev/marlonlom/apps/cappajv/ui/main/MainActivity.kt index 1e1402d..67818b4 100644 --- a/apps/mobile-app/src/main/kotlin/dev/marlonlom/apps/cappajv/ui/main/MainActivity.kt +++ b/apps/mobile-app/src/main/kotlin/dev/marlonlom/apps/cappajv/ui/main/MainActivity.kt @@ -5,6 +5,7 @@ package dev.marlonlom.apps.cappajv.ui.main +import android.content.res.Configuration import android.os.Bundle import androidx.activity.ComponentActivity import androidx.activity.compose.setContent @@ -26,6 +27,7 @@ import androidx.lifecycle.lifecycleScope import androidx.lifecycle.repeatOnLifecycle import androidx.window.layout.FoldingFeature import androidx.window.layout.WindowInfoTracker +import com.google.accompanist.pager.ExperimentalPagerApi import dev.marlonlom.apps.cappajv.ui.layout.DevicePosture import dev.marlonlom.apps.cappajv.ui.layout.DevicePostureDetector import kotlinx.coroutines.ExperimentalCoroutinesApi @@ -43,6 +45,7 @@ import kotlin.contracts.ExperimentalContracts * * @author marlonlom */ +@ExperimentalPagerApi @ExperimentalContracts @ExperimentalFoundationApi @ExperimentalLayoutApi @@ -95,7 +98,8 @@ class MainActivity : ComponentActivity() { val appState = rememberCappajvAppState( windowSizeClass = calculateWindowSizeClass(this), devicePosture = devicePosture, - screenWidthDp = LocalConfiguration.current.smallestScreenWidthDp + screenWidthDp = LocalConfiguration.current.smallestScreenWidthDp, + isLandscape = LocalConfiguration.current.orientation == Configuration.ORIENTATION_LANDSCAPE ) AppContent( diff --git a/apps/mobile-app/src/main/kotlin/dev/marlonlom/apps/cappajv/ui/main/scaffold/MainScaffold.kt b/apps/mobile-app/src/main/kotlin/dev/marlonlom/apps/cappajv/ui/main/scaffold/MainScaffold.kt index 12335a2..604538a 100644 --- a/apps/mobile-app/src/main/kotlin/dev/marlonlom/apps/cappajv/ui/main/scaffold/MainScaffold.kt +++ b/apps/mobile-app/src/main/kotlin/dev/marlonlom/apps/cappajv/ui/main/scaffold/MainScaffold.kt @@ -17,6 +17,7 @@ import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.saveable.rememberSaveable import androidx.compose.runtime.setValue import androidx.navigation.compose.currentBackStackEntryAsState +import com.google.accompanist.pager.ExperimentalPagerApi import dev.marlonlom.apps.cappajv.features.settings.SettingsDialog import dev.marlonlom.apps.cappajv.ui.main.AppContentCallbacks import dev.marlonlom.apps.cappajv.ui.main.CappajvAppState @@ -33,6 +34,7 @@ import dev.marlonlom.apps.cappajv.ui.navigation.NavigationType * @param appState Main application ui state * @param appContentCallbacks Application content callbacks. */ +@ExperimentalPagerApi @ExperimentalFoundationApi @ExperimentalMaterial3Api @ExperimentalLayoutApi diff --git a/apps/mobile-app/src/main/kotlin/dev/marlonlom/apps/cappajv/ui/main/scaffold/MainScaffoldContent.kt b/apps/mobile-app/src/main/kotlin/dev/marlonlom/apps/cappajv/ui/main/scaffold/MainScaffoldContent.kt index 47620a1..d746d15 100644 --- a/apps/mobile-app/src/main/kotlin/dev/marlonlom/apps/cappajv/ui/main/scaffold/MainScaffoldContent.kt +++ b/apps/mobile-app/src/main/kotlin/dev/marlonlom/apps/cappajv/ui/main/scaffold/MainScaffoldContent.kt @@ -16,6 +16,7 @@ import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.runtime.Composable import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier +import com.google.accompanist.pager.ExperimentalPagerApi import dev.marlonlom.apps.cappajv.ui.main.AppContentCallbacks import dev.marlonlom.apps.cappajv.ui.main.CappajvAppState import dev.marlonlom.apps.cappajv.ui.navigation.MainNavHost @@ -34,6 +35,7 @@ import timber.log.Timber * @param selectedPosition * @param onSelectedPositionChanged */ +@ExperimentalPagerApi @ExperimentalFoundationApi @ExperimentalMaterial3Api @ExperimentalLayoutApi @@ -50,12 +52,13 @@ internal fun MainScaffoldContent( [MainScaffoldContent] scaffoldContentType=${appState.scaffoldContentType} devicePosture=${appState.devicePosture} + isLandscape=${appState.isLandscape} """.trimIndent() ) Box( modifier = Modifier - .safeDrawingPadding() - .padding(paddingValues), + .safeDrawingPadding() + .padding(paddingValues), contentAlignment = Alignment.Center, ) { when (appState.navigationType) { @@ -78,14 +81,16 @@ internal fun MainScaffoldContent( ) MainNavHost( - appState = appState, appContentCallbacks + appState = appState, + appContentCallbacks = appContentCallbacks, ) } } NavigationType.BOTTOM_NAV -> { MainNavHost( - appState = appState, appContentCallbacks + appState = appState, + appContentCallbacks = appContentCallbacks, ) } } diff --git a/apps/mobile-app/src/main/kotlin/dev/marlonlom/apps/cappajv/ui/navigation/MainNavHost.kt b/apps/mobile-app/src/main/kotlin/dev/marlonlom/apps/cappajv/ui/navigation/MainNavHost.kt index c7a6e73..a4c79e7 100644 --- a/apps/mobile-app/src/main/kotlin/dev/marlonlom/apps/cappajv/ui/navigation/MainNavHost.kt +++ b/apps/mobile-app/src/main/kotlin/dev/marlonlom/apps/cappajv/ui/navigation/MainNavHost.kt @@ -12,6 +12,7 @@ import androidx.compose.runtime.Composable import androidx.navigation.NavGraphBuilder import androidx.navigation.compose.NavHost import androidx.navigation.compose.composable +import com.google.accompanist.pager.ExperimentalPagerApi import dev.marlonlom.apps.cappajv.features.catalog_favorites.FavoriteProductsRoute import dev.marlonlom.apps.cappajv.features.catalog_list.CatalogListRoute import dev.marlonlom.apps.cappajv.features.catalog_search.SearchProductsRoute @@ -26,6 +27,7 @@ import dev.marlonlom.apps.cappajv.ui.main.CappajvAppState * @param appState Application ui state. * @param appContentCallbacks Application content callbacks. */ +@ExperimentalPagerApi @ExperimentalFoundationApi @ExperimentalMaterial3Api @ExperimentalLayoutApi @@ -51,6 +53,7 @@ fun MainNavHost( * * @param appState Application ui state. */ +@ExperimentalPagerApi @ExperimentalFoundationApi @ExperimentalMaterial3Api @ExperimentalLayoutApi diff --git a/apps/mobile-app/src/main/res/drawable/img_catalog_home_banner_01.webp b/apps/mobile-app/src/main/res/drawable/img_catalog_home_banner_01.webp new file mode 100644 index 0000000000000000000000000000000000000000..f72d9fb2de7248ec6b24a0e19fb73d530d86e204 GIT binary patch literal 45528 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 literal 0 HcmV?d00001 diff --git a/apps/mobile-app/src/main/res/drawable/img_catalog_home_banner_02.webp b/apps/mobile-app/src/main/res/drawable/img_catalog_home_banner_02.webp new file mode 100644 index 0000000000000000000000000000000000000000..ac26f1f0a24df73c531d28e068a0a906f9013300 GIT binary patch literal 29846 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ⅇ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 literal 0 HcmV?d00001 diff --git a/apps/mobile-app/src/main/res/drawable/img_catalog_home_banner_03.webp b/apps/mobile-app/src/main/res/drawable/img_catalog_home_banner_03.webp new file mode 100644 index 0000000000000000000000000000000000000000..d9b8dfa62baf4b08487c1cbc86ee53f45a227c89 GIT binary patch literal 18172 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 F0036x36}r> literal 0 HcmV?d00001 diff --git a/apps/mobile-app/src/main/res/drawable/img_catalog_home_banner_05.webp b/apps/mobile-app/src/main/res/drawable/img_catalog_home_banner_05.webp new file mode 100644 index 0000000000000000000000000000000000000000..15a28e60d390b03aa3464091dc9ece62ce3c6959 GIT binary patch literal 23524 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 j3iNlK^XphJa$o=e0000000000000000000000000h3)7@ literal 0 HcmV?d00001 diff --git a/apps/mobile-app/src/main/res/drawable/img_juan_valdez_logo.png b/apps/mobile-app/src/main/res/drawable/img_juan_valdez_logo.png new file mode 100644 index 0000000000000000000000000000000000000000..635418d27638f47de832283c33d0033b0cd6cec5 GIT binary patch literal 4758 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 Mnx1N-vd#Pd0gDJ!*8l(j literal 0 HcmV?d00001 diff --git a/apps/mobile-app/src/main/res/values-es/strings.xml b/apps/mobile-app/src/main/res/values-es/strings.xml index 8176b8b..f10d828 100644 --- a/apps/mobile-app/src/main/res/values-es/strings.xml +++ b/apps/mobile-app/src/main/res/values-es/strings.xml @@ -25,6 +25,16 @@ Bienvenidos A continuación podrás ver el catálogo de productos del programa Amigos Juan Valdez®, en el cual podrás vivir la experiencia única de visitar las tiendas Juan Valdez® Café utilizando tus puntos para canjearlos por alimentos, bebidas, premios y beneficios. Empezar + + Consigue nuestros premios + Nuestros productos + %1$s más + + Todos + Bebidas frías + Bebidas calientes + Pastelería + Tema oscuro Colores dinámicos @@ -32,7 +42,4 @@ Política de privacidad Términos y condiciones Software de terceros - - Todos - See all diff --git a/apps/mobile-app/src/main/res/values/strings.xml b/apps/mobile-app/src/main/res/values/strings.xml index 1822327..f160764 100644 --- a/apps/mobile-app/src/main/res/values/strings.xml +++ b/apps/mobile-app/src/main/res/values/strings.xml @@ -26,6 +26,16 @@ Welcome Below you will be able to see the product catalog of the Amigos Juan Valdez® program, in which you will be able to live the unique experience of visiting the Juan Valdez® Café stores using your points to exchange them for food, drinks, prizes and benefits. Get started + + Get our rewards + Our products + %1$s more + + All + Cold drinks + Hot drinks + Pastry + Dark theme Dynamic colors @@ -37,6 +47,4 @@ https://juanvaldez.com/politica-de-tratamiento-de-datos-personales-promotora-de-cafe-colombia-s-a https://juanvaldez.com/politica-de-tratamiento-de-datos-personales-promotora-de-cafe-colombia-s-a https://juanvaldez.com/amigosjuanvaldez/terminos-y-condiciones - All - See all diff --git a/apps/mobile-app/src/test/kotlin/dev/marlonlom/apps/cappajv/core/database/FakeLocalDataSource.kt b/apps/mobile-app/src/test/kotlin/dev/marlonlom/apps/cappajv/core/database/FakeLocalDataSource.kt index 47619e7..abf8252 100644 --- a/apps/mobile-app/src/test/kotlin/dev/marlonlom/apps/cappajv/core/database/FakeLocalDataSource.kt +++ b/apps/mobile-app/src/test/kotlin/dev/marlonlom/apps/cappajv/core/database/FakeLocalDataSource.kt @@ -30,6 +30,8 @@ internal class FakeLocalDataSource( title = it.title, picture = it.picture, category = "Category one", + samplePunctuation = "", + punctuationsCount = 0, ) }) } @@ -46,7 +48,9 @@ internal class FakeLocalDataSource( titleNormalized = it.title.lowercase(), picture = it.picture, category = "Category one", - detail = "Lorem ipsum" + detail = "Lorem ipsum", + samplePunctuation = "", + punctuationsCount = 0, ) else NONE } return flowOf(listResponse) @@ -90,6 +94,16 @@ internal class FakeLocalDataSource( override fun deleteAllPunctuations() = Unit companion object { - val NONE = CatalogItem(-1, "", "", "", "", "", "") + val NONE = CatalogItem( + id = -1, + title = "", + slug = "", + titleNormalized = "", + picture = "", + category = "", + detail = "", + samplePunctuation = "", + punctuationsCount = 0 + ) } } diff --git a/apps/mobile-app/src/test/kotlin/dev/marlonlom/apps/cappajv/features/catalog_detail/CatalogDetailRepositoryTest.kt b/apps/mobile-app/src/test/kotlin/dev/marlonlom/apps/cappajv/features/catalog_detail/CatalogDetailRepositoryTest.kt index 7de790a..5d82794 100644 --- a/apps/mobile-app/src/test/kotlin/dev/marlonlom/apps/cappajv/features/catalog_detail/CatalogDetailRepositoryTest.kt +++ b/apps/mobile-app/src/test/kotlin/dev/marlonlom/apps/cappajv/features/catalog_detail/CatalogDetailRepositoryTest.kt @@ -42,6 +42,8 @@ internal class CatalogDetailRepositoryTest { picture = "https://juanvaldez.com/wp-content/uploads/2022/10/Granizado-juan-Valdez.jpg", category = "Category one", detail = "Lorem ipsum", + samplePunctuation = "", + punctuationsCount = 0, ) val foundProduct = repository.find(expectedItem.id).first() assertNotNull(foundProduct) diff --git a/apps/mobile-app/src/test/kotlin/dev/marlonlom/apps/cappajv/features/catalog_list/CatalogListRepositoryTest.kt b/apps/mobile-app/src/test/kotlin/dev/marlonlom/apps/cappajv/features/catalog_list/CatalogListRepositoryTest.kt index edb37e8..b4f07fa 100644 --- a/apps/mobile-app/src/test/kotlin/dev/marlonlom/apps/cappajv/features/catalog_list/CatalogListRepositoryTest.kt +++ b/apps/mobile-app/src/test/kotlin/dev/marlonlom/apps/cappajv/features/catalog_list/CatalogListRepositoryTest.kt @@ -32,8 +32,8 @@ internal class CatalogListRepositoryTest { @Test fun `Should return non empty list`() = runTest { when (val catalogListState = repository.allProducts.first()) { - is CatalogListState.Listing -> { - assertTrue(catalogListState.map.isNotEmpty()) + is CatalogListUiState.Listing -> { + assertTrue(catalogListState.catalogMap.isNotEmpty()) } else -> fail() diff --git a/apps/mobile-app/src/test/kotlin/dev/marlonlom/apps/cappajv/features/catalog_list/CatalogListViewModelTest.kt b/apps/mobile-app/src/test/kotlin/dev/marlonlom/apps/cappajv/features/catalog_list/CatalogListViewModelTest.kt index 9501c24..024271b 100644 --- a/apps/mobile-app/src/test/kotlin/dev/marlonlom/apps/cappajv/features/catalog_list/CatalogListViewModelTest.kt +++ b/apps/mobile-app/src/test/kotlin/dev/marlonlom/apps/cappajv/features/catalog_list/CatalogListViewModelTest.kt @@ -34,9 +34,9 @@ internal class CatalogListViewModelTest { val uiState = viewModel.uiState Assert.assertNotNull(uiState) when (uiState.value) { - is CatalogListState.Listing -> { - val home = uiState.value as CatalogListState.Listing - Assert.assertTrue(home.map.isNotEmpty()) + is CatalogListUiState.Listing -> { + val home = uiState.value as CatalogListUiState.Listing + Assert.assertTrue(home.catalogMap.isNotEmpty()) } else -> Assert.fail() diff --git a/features/core/database/src/androidTest/kotlin/dev/marlonlom/apps/cappajv/core/database/CatalogFavoriteItemsDaoTest.kt b/features/core/database/src/androidTest/kotlin/dev/marlonlom/apps/cappajv/core/database/CatalogFavoriteItemsDaoTest.kt index f793160..329f966 100644 --- a/features/core/database/src/androidTest/kotlin/dev/marlonlom/apps/cappajv/core/database/CatalogFavoriteItemsDaoTest.kt +++ b/features/core/database/src/androidTest/kotlin/dev/marlonlom/apps/cappajv/core/database/CatalogFavoriteItemsDaoTest.kt @@ -56,6 +56,8 @@ internal class CatalogFavoriteItemsDaoTest { title = "Pod", picture = "https://noimage.no.com/no.png", category = "CategoryOne", + samplePunctuation = "", + punctuationsCount = 0, ) dao.insertAll(entity) val list = dao.getFavoriteItems().first() @@ -69,6 +71,8 @@ internal class CatalogFavoriteItemsDaoTest { title = "Pod", picture = "https://noimage.no.com/no.png", category = "CategoryOne", + samplePunctuation = "", + punctuationsCount = 0, ) dao.insertAll(entity) dao.deleteAll() @@ -83,6 +87,8 @@ internal class CatalogFavoriteItemsDaoTest { title = "Pod", picture = "https://noimage.no.com/no.png", category = "CategoryOne", + samplePunctuation = "", + punctuationsCount = 0, ) val entities = arrayOf( remainingItem, @@ -91,6 +97,8 @@ internal class CatalogFavoriteItemsDaoTest { title = "Tinto", picture = "https://noimage.no.com/no.png", category = "CategoryOne", + samplePunctuation = "", + punctuationsCount = 0, ) ) dao.insertAll(*entities) diff --git a/features/core/database/src/androidTest/kotlin/dev/marlonlom/apps/cappajv/core/database/CatalogItemsDaoTest.kt b/features/core/database/src/androidTest/kotlin/dev/marlonlom/apps/cappajv/core/database/CatalogItemsDaoTest.kt index 56a4efc..7ca2e35 100644 --- a/features/core/database/src/androidTest/kotlin/dev/marlonlom/apps/cappajv/core/database/CatalogItemsDaoTest.kt +++ b/features/core/database/src/androidTest/kotlin/dev/marlonlom/apps/cappajv/core/database/CatalogItemsDaoTest.kt @@ -54,13 +54,17 @@ internal class CatalogItemsDaoTest { titleNormalized = "pod", picture = "https://noimage.no.com/no.png", category = "CategoryOne", - detail = "Lorem ipsum" + detail = "Lorem ipsum", + samplePunctuation = "", + punctuationsCount = 0 ) val expectedTuple = CatalogItemTuple( id = 1L, title = "Pod", picture = "https://noimage.no.com/no.png", category = "CategoryOne", + samplePunctuation = "", + punctuationsCount = 0, ) dao.insertAll(entity) val list = dao.getProducts().first() @@ -76,7 +80,9 @@ internal class CatalogItemsDaoTest { titleNormalized = "pod", picture = "https://noimage.no.com/no.png", category = "CategoryOne", - detail = "Lorem ipsum" + detail = "Lorem ipsum", + samplePunctuation = "", + punctuationsCount = 0 ) dao.insertAll(entity) dao.deleteAll() @@ -93,7 +99,9 @@ internal class CatalogItemsDaoTest { titleNormalized = "pod", picture = "https://noimage.no.com/no.png", category = "CategoryOne", - detail = "Lorem ipsum" + detail = "Lorem ipsum", + samplePunctuation = "", + punctuationsCount = 0 ) dao.insertAll(product) diff --git a/features/core/database/src/main/kotlin/dev/marlonlom/apps/cappajv/core/database/CappaDatabase.kt b/features/core/database/src/main/kotlin/dev/marlonlom/apps/cappajv/core/database/CappaDatabase.kt index 3cf5e70..ecc9357 100644 --- a/features/core/database/src/main/kotlin/dev/marlonlom/apps/cappajv/core/database/CappaDatabase.kt +++ b/features/core/database/src/main/kotlin/dev/marlonlom/apps/cappajv/core/database/CappaDatabase.kt @@ -27,7 +27,7 @@ import dev.marlonlom.apps.cappajv.core.database.entities.CatalogPunctuation CatalogFavoriteItem::class, CatalogPunctuation::class ], - version = 4, + version = 5, exportSchema = false ) abstract class CappaDatabase : RoomDatabase() { diff --git a/features/core/database/src/main/kotlin/dev/marlonlom/apps/cappajv/core/database/dao/CatalogItemsDao.kt b/features/core/database/src/main/kotlin/dev/marlonlom/apps/cappajv/core/database/dao/CatalogItemsDao.kt index e233131..f6947e1 100644 --- a/features/core/database/src/main/kotlin/dev/marlonlom/apps/cappajv/core/database/dao/CatalogItemsDao.kt +++ b/features/core/database/src/main/kotlin/dev/marlonlom/apps/cappajv/core/database/dao/CatalogItemsDao.kt @@ -26,7 +26,7 @@ interface CatalogItemsDao { * * @return Product items list, or empty list, as Flow. */ - @Query("SELECT c.id, c.title, c.category, c.picture FROM catalog_item c") + @Query("SELECT c.id, c.title, c.category, c.picture, c.samplePunctuation, c.punctuationsCount FROM catalog_item c") fun getProducts(): Flow> /** diff --git a/features/core/database/src/main/kotlin/dev/marlonlom/apps/cappajv/core/database/entities/model.kt b/features/core/database/src/main/kotlin/dev/marlonlom/apps/cappajv/core/database/entities/model.kt index b494609..2f7d3de 100644 --- a/features/core/database/src/main/kotlin/dev/marlonlom/apps/cappajv/core/database/entities/model.kt +++ b/features/core/database/src/main/kotlin/dev/marlonlom/apps/cappajv/core/database/entities/model.kt @@ -20,6 +20,8 @@ import androidx.room.Entity * @property picture Product item picture url. * @property category Product item category. * @property detail Product item detail. + * @property samplePunctuation Sample punctuation text. + * @property punctuationsCount Punctuations count. */ @Entity( tableName = "catalog_item", @@ -40,6 +42,10 @@ data class CatalogItem( val category: String, @ColumnInfo val detail: String, + @ColumnInfo + val samplePunctuation: String, + @ColumnInfo + val punctuationsCount: Int, ) /** @@ -51,6 +57,8 @@ data class CatalogItem( * @property title Product item title. * @property picture Product item picture url. * @property category Product item category. + * @property samplePunctuation Sample punctuation text. + * @property punctuationsCount Punctuations count. */ @Entity( tableName = "catalog_item_favorite", @@ -65,6 +73,10 @@ data class CatalogFavoriteItem( val picture: String, @ColumnInfo val category: String, + @ColumnInfo + val samplePunctuation: String, + @ColumnInfo + val punctuationsCount: Int, ) /** @@ -101,6 +113,8 @@ data class CatalogPunctuation( * @property title Product item title. * @property picture Product item picture url. * @property category Product item category. + * @property samplePunctuation Sample punctuation text. + * @property punctuationsCount Punctuations count. */ data class CatalogItemTuple( @ColumnInfo @@ -111,4 +125,8 @@ data class CatalogItemTuple( val picture: String, @ColumnInfo val category: String, + @ColumnInfo + val samplePunctuation: String, + @ColumnInfo + val punctuationsCount: Int, ) diff --git a/features/core/database/src/test/kotlin/dev/marlonlom/apps/cappajv/core/database/dao/FakeCatalogItemsDao.kt b/features/core/database/src/test/kotlin/dev/marlonlom/apps/cappajv/core/database/dao/FakeCatalogItemsDao.kt index e5eeb3e..3556c88 100644 --- a/features/core/database/src/test/kotlin/dev/marlonlom/apps/cappajv/core/database/dao/FakeCatalogItemsDao.kt +++ b/features/core/database/src/test/kotlin/dev/marlonlom/apps/cappajv/core/database/dao/FakeCatalogItemsDao.kt @@ -23,7 +23,7 @@ internal class FakeCatalogItemsDao( override fun getProducts(): Flow> = flowOf(list.map { - CatalogItemTuple(it.id, it.title, it.picture, it.category) + CatalogItemTuple(it.id, it.title, it.picture, it.category, it.samplePunctuation, it.punctuationsCount) }) override fun findProduct(productId: Long): Flow = diff --git a/features/core/database/src/test/kotlin/dev/marlonlom/apps/cappajv/core/database/datasource/CatalogFavoritesLocalDataSourceTest.kt b/features/core/database/src/test/kotlin/dev/marlonlom/apps/cappajv/core/database/datasource/CatalogFavoritesLocalDataSourceTest.kt index 69bc01b..dd927ed 100644 --- a/features/core/database/src/test/kotlin/dev/marlonlom/apps/cappajv/core/database/datasource/CatalogFavoritesLocalDataSourceTest.kt +++ b/features/core/database/src/test/kotlin/dev/marlonlom/apps/cappajv/core/database/datasource/CatalogFavoritesLocalDataSourceTest.kt @@ -45,6 +45,8 @@ internal class CatalogFavoritesLocalDataSourceTest { title = "Pod", picture = "https://noimage.no.com/no.png", category = "CategoryOne", + samplePunctuation = "", + punctuationsCount = 0, ) dataSource.insertAllFavoriteProducts(product) dataSource.getFavorites().collect { items -> @@ -66,6 +68,8 @@ internal class CatalogFavoritesLocalDataSourceTest { title = "Pod", picture = "https://noimage.no.com/no.png", category = "CategoryOne", + samplePunctuation = "", + punctuationsCount = 0, ) dataSource.insertAllFavoriteProducts(product) dataSource.deleteAllFavorites() @@ -84,12 +88,16 @@ internal class CatalogFavoritesLocalDataSourceTest { title = "Pod", picture = "https://noimage.no.com/no.png", category = "CategoryOne", + samplePunctuation = "", + punctuationsCount = 0, ), CatalogFavoriteItem( id = 2L, title = "Tinto", picture = "https://noimage.no.com/no.png", category = "CategoryTwo", + samplePunctuation = "", + punctuationsCount = 0, ) ) dataSource.insertAllFavoriteProducts(*products) diff --git a/features/core/database/src/test/kotlin/dev/marlonlom/apps/cappajv/core/database/datasource/CatalogItemsLocalDataSourceTest.kt b/features/core/database/src/test/kotlin/dev/marlonlom/apps/cappajv/core/database/datasource/CatalogItemsLocalDataSourceTest.kt index 83eb2b5..5b5f145 100644 --- a/features/core/database/src/test/kotlin/dev/marlonlom/apps/cappajv/core/database/datasource/CatalogItemsLocalDataSourceTest.kt +++ b/features/core/database/src/test/kotlin/dev/marlonlom/apps/cappajv/core/database/datasource/CatalogItemsLocalDataSourceTest.kt @@ -49,7 +49,9 @@ internal class CatalogItemsLocalDataSourceTest { titleNormalized = "pod", picture = "https://noimage.no.com/no.png", category = "CategoryOne", - detail = "Lorem ipsum" + detail = "Lorem ipsum", + samplePunctuation = "", + punctuationsCount = 0 ) dataSource.insertAllProducts(product) dataSource.findProduct(product.id).collect { item: CatalogItem? -> @@ -79,7 +81,9 @@ internal class CatalogItemsLocalDataSourceTest { titleNormalized = "pod", picture = "https://noimage.no.com/no.png", category = "CategoryOne", - detail = "Lorem ipsum" + detail = "Lorem ipsum", + samplePunctuation = "Unit: 1234pts", + punctuationsCount = 1 ) dataSource.insertAllProducts(product) dataSource.getAllProducts() @@ -95,6 +99,8 @@ internal class CatalogItemsLocalDataSourceTest { assertEquals("Pod", tuple.title) assertEquals("CategoryOne", tuple.category) assertEquals("https://noimage.no.com/no.png", tuple.picture) + assertEquals("Unit: 1234pts", tuple.samplePunctuation) + assertEquals(1, tuple.punctuationsCount) } else -> fail() @@ -111,7 +117,9 @@ internal class CatalogItemsLocalDataSourceTest { titleNormalized = "pod", picture = "https://noimage.no.com/no.png", category = "CategoryOne", - detail = "Lorem ipsum" + detail = "Lorem ipsum", + samplePunctuation = "", + punctuationsCount = 0 ) dataSource.insertAllProducts(product) dataSource.deleteAllProducts() diff --git a/features/core/database/src/test/kotlin/dev/marlonlom/apps/cappajv/core/database/datasource/CatalogPunctuationsLocalDataSourceTest.kt b/features/core/database/src/test/kotlin/dev/marlonlom/apps/cappajv/core/database/datasource/CatalogPunctuationsLocalDataSourceTest.kt index 0cf17cb..a5f73fd 100644 --- a/features/core/database/src/test/kotlin/dev/marlonlom/apps/cappajv/core/database/datasource/CatalogPunctuationsLocalDataSourceTest.kt +++ b/features/core/database/src/test/kotlin/dev/marlonlom/apps/cappajv/core/database/datasource/CatalogPunctuationsLocalDataSourceTest.kt @@ -48,7 +48,9 @@ internal class CatalogPunctuationsLocalDataSourceTest { titleNormalized = "pod", picture = "https://noimage.no.com/no.png", category = "CategoryOne", - detail = "Lorem ipsum" + detail = "Lorem ipsum", + samplePunctuation = "", + punctuationsCount = 0 ) val productPoint = CatalogPunctuation( id = 11L, @@ -89,7 +91,9 @@ internal class CatalogPunctuationsLocalDataSourceTest { titleNormalized = "pod", picture = "https://noimage.no.com/no.png", category = "CategoryOne", - detail = "Lorem ipsum" + detail = "Lorem ipsum", + samplePunctuation = "", + punctuationsCount = 0 ) val productPoint = CatalogPunctuation( id = 11L, diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index e5d5389..66e831c 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -19,6 +19,8 @@ androidx-room-ktx = "androidx.room:room-ktx:2.6.1" androidx-room-runtime = "androidx.room:room-runtime:2.6.1" androidx-window = "androidx.window:window:1.2.0" coil-compose = "io.coil-kt:coil-compose:2.6.0" +google-accompanist-pager = "com.google.accompanist:accompanist-pager:0.28.0" +google-accompanist-pager-indicators = "com.google.accompanist:accompanist-pager-indicators:0.28.0" google-guava = "com.google.guava:guava:27.0.1-android" google-oss-licenses = "com.google.android.gms:play-services-oss-licenses:17.0.1" google-oss-licenses-plugin = "com.google.android.gms:oss-licenses-plugin:0.10.6" @@ -68,3 +70,4 @@ kotlin-serialization = { id = "org.jetbrains.kotlin.plugin.serialization", versi [bundles] database-room = ["androidx-room-ktx", "androidx-room-runtime"] +mobileapp-google-accompanist-pager = ["google-accompanist-pager", "google-accompanist-pager-indicators"]