From 1f69ecc9de47aa4f5961824e248ed42dbeb7a359 Mon Sep 17 00:00:00 2001 From: Aayush Gupta Date: Mon, 10 Nov 2025 11:10:01 +0800 Subject: [PATCH] compose: Fix previews for every screen Signed-off-by: Aayush Gupta --- .../composable/details/ScreenshotListItem.kt | 3 +- .../aurora/store/compose/preview/Favourite.kt | 28 +++++++++++++++++++ .../compose/ui/details/AppDetailsScreen.kt | 1 + .../store/compose/ui/dev/DevProfileScreen.kt | 4 +-- .../compose/ui/downloads/DownloadsScreen.kt | 23 +++++++++++++-- .../compose/ui/favourite/FavouriteScreen.kt | 21 ++++++++++++-- .../store/compose/ui/search/SearchScreen.kt | 4 +-- 7 files changed, 75 insertions(+), 9 deletions(-) create mode 100644 app/src/main/java/com/aurora/store/compose/preview/Favourite.kt diff --git a/app/src/main/java/com/aurora/store/compose/composable/details/ScreenshotListItem.kt b/app/src/main/java/com/aurora/store/compose/composable/details/ScreenshotListItem.kt index b261ee82b..f3e82e6b0 100644 --- a/app/src/main/java/com/aurora/store/compose/composable/details/ScreenshotListItem.kt +++ b/app/src/main/java/com/aurora/store/compose/composable/details/ScreenshotListItem.kt @@ -45,7 +45,8 @@ fun ScreenshotListItem(modifier: Modifier = Modifier, url: String) { ) val state by painter.state.collectAsStateWithLifecycle() val aspectRatioModifier = state.painter?.intrinsicSize?.let { intrinsicSize -> - Modifier.aspectRatio(ratio = intrinsicSize.width / intrinsicSize.height) + val ratio = intrinsicSize.width / intrinsicSize.height + if (ratio.isNaN()) null else Modifier.aspectRatio(ratio = ratio) } Image( diff --git a/app/src/main/java/com/aurora/store/compose/preview/Favourite.kt b/app/src/main/java/com/aurora/store/compose/preview/Favourite.kt new file mode 100644 index 000000000..104b0e3d4 --- /dev/null +++ b/app/src/main/java/com/aurora/store/compose/preview/Favourite.kt @@ -0,0 +1,28 @@ +/* + * SPDX-FileCopyrightText: 2025 The Calyx Institute + * SPDX-License-Identifier: GPL-3.0-or-later + */ + +package com.aurora.store.compose.preview + +import androidx.compose.ui.tooling.preview.PreviewParameterProvider +import com.aurora.store.BuildConfig +import com.aurora.store.data.room.favourite.Favourite +import com.aurora.store.data.room.favourite.Favourite.Mode + +/** + * Preview provider for composable working with [Favourite] + */ +class FavouritePreviewProvider() : PreviewParameterProvider { + + override val values: Sequence + get() = sequenceOf( + Favourite( + packageName = BuildConfig.APPLICATION_ID, + displayName = "Aurora Store", + iconURL = "", + added = 0L, + mode = Mode.MANUAL + ) + ) +} diff --git a/app/src/main/java/com/aurora/store/compose/ui/details/AppDetailsScreen.kt b/app/src/main/java/com/aurora/store/compose/ui/details/AppDetailsScreen.kt index 77872884d..d86adc5d8 100644 --- a/app/src/main/java/com/aurora/store/compose/ui/details/AppDetailsScreen.kt +++ b/app/src/main/java/com/aurora/store/compose/ui/details/AppDetailsScreen.kt @@ -53,6 +53,7 @@ import com.aurora.extensions.requiresObbDir import com.aurora.extensions.share import com.aurora.extensions.toast import com.aurora.gplayapi.data.models.App +import com.aurora.gplayapi.data.models.Artwork import com.aurora.gplayapi.data.models.Review import com.aurora.store.R import com.aurora.store.compose.composable.Error diff --git a/app/src/main/java/com/aurora/store/compose/ui/dev/DevProfileScreen.kt b/app/src/main/java/com/aurora/store/compose/ui/dev/DevProfileScreen.kt index 87d24d14e..80690cc86 100644 --- a/app/src/main/java/com/aurora/store/compose/ui/dev/DevProfileScreen.kt +++ b/app/src/main/java/com/aurora/store/compose/ui/dev/DevProfileScreen.kt @@ -38,7 +38,7 @@ import com.aurora.store.compose.preview.AppPreviewProvider import com.aurora.store.compose.preview.coilPreviewProvider import com.aurora.store.viewmodel.details.DevProfileViewModel import com.aurora.store.viewmodel.search.SearchViewModel -import kotlinx.coroutines.flow.flowOf +import kotlinx.coroutines.flow.MutableStateFlow import kotlin.random.Random /** @@ -132,7 +132,7 @@ private fun ScreenContent( private fun DevProfileScreenPreview(@PreviewParameter(AppPreviewProvider::class) app: App) { CompositionLocalProvider(LocalAsyncImagePreviewHandler provides coilPreviewProvider) { val apps = List(10) { app.copy(id = Random.nextInt()) } - val pagedApps = flowOf(PagingData.from(apps)).collectAsLazyPagingItems() + val pagedApps = MutableStateFlow(PagingData.from(apps)).collectAsLazyPagingItems() ScreenContent( topAppBarTitle = app.developerName, diff --git a/app/src/main/java/com/aurora/store/compose/ui/downloads/DownloadsScreen.kt b/app/src/main/java/com/aurora/store/compose/ui/downloads/DownloadsScreen.kt index 6d2144cb1..16b05131e 100644 --- a/app/src/main/java/com/aurora/store/compose/ui/downloads/DownloadsScreen.kt +++ b/app/src/main/java/com/aurora/store/compose/ui/downloads/DownloadsScreen.kt @@ -13,6 +13,7 @@ import androidx.compose.foundation.layout.padding import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.material3.Scaffold import androidx.compose.runtime.Composable +import androidx.compose.runtime.CompositionLocalProvider import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.saveable.rememberSaveable @@ -23,11 +24,14 @@ import androidx.compose.ui.res.dimensionResource import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.tooling.preview.PreviewParameter import androidx.hilt.lifecycle.viewmodel.compose.hiltViewModel import androidx.paging.LoadState +import androidx.paging.PagingData import androidx.paging.compose.LazyPagingItems import androidx.paging.compose.collectAsLazyPagingItems import androidx.paging.compose.itemKey +import coil3.compose.LocalAsyncImagePreviewHandler import com.aurora.extensions.toast import com.aurora.store.R import com.aurora.store.compose.composable.DownloadListItem @@ -35,10 +39,16 @@ import com.aurora.store.compose.composable.Error import com.aurora.store.compose.composable.ContainedLoadingIndicator import com.aurora.store.compose.composable.TopAppBar import com.aurora.extensions.emptyPagingItems +import com.aurora.gplayapi.data.models.App +import com.aurora.store.compose.preview.AppPreviewProvider +import com.aurora.store.compose.preview.coilPreviewProvider import com.aurora.store.compose.ui.downloads.menu.DownloadsMenu import com.aurora.store.compose.ui.downloads.menu.MenuItem +import com.aurora.store.data.model.DownloadStatus import com.aurora.store.data.room.download.Download import com.aurora.store.viewmodel.downloads.DownloadsViewModel +import kotlinx.coroutines.flow.MutableStateFlow +import kotlin.random.Random @Composable fun DownloadsScreen( @@ -171,6 +181,15 @@ private fun ScreenContent( @Preview @Composable -private fun DownloadsScreenPreview() { - ScreenContent() +private fun DownloadsScreenPreview(@PreviewParameter(AppPreviewProvider::class) app: App) { + CompositionLocalProvider(LocalAsyncImagePreviewHandler provides coilPreviewProvider) { + val downloads = List(10) { + Download.fromApp(app).copy( + packageName = Random.nextInt().toString(), + status = DownloadStatus.entries.random() + ) + } + val pagedDownloads = MutableStateFlow(PagingData.from(downloads)).collectAsLazyPagingItems() + ScreenContent(downloads = pagedDownloads) + } } diff --git a/app/src/main/java/com/aurora/store/compose/ui/favourite/FavouriteScreen.kt b/app/src/main/java/com/aurora/store/compose/ui/favourite/FavouriteScreen.kt index c27e4b4a4..549502e04 100644 --- a/app/src/main/java/com/aurora/store/compose/ui/favourite/FavouriteScreen.kt +++ b/app/src/main/java/com/aurora/store/compose/ui/favourite/FavouriteScreen.kt @@ -13,6 +13,7 @@ import androidx.compose.foundation.layout.padding import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.material3.Scaffold import androidx.compose.runtime.Composable +import androidx.compose.runtime.CompositionLocalProvider import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.saveable.rememberSaveable @@ -23,11 +24,14 @@ import androidx.compose.ui.res.dimensionResource import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.tooling.preview.PreviewParameter import androidx.hilt.lifecycle.viewmodel.compose.hiltViewModel import androidx.paging.LoadState +import androidx.paging.PagingData import androidx.paging.compose.LazyPagingItems import androidx.paging.compose.collectAsLazyPagingItems import androidx.paging.compose.itemKey +import coil3.compose.LocalAsyncImagePreviewHandler import com.aurora.Constants.JSON_MIME_TYPE import com.aurora.extensions.toast import com.aurora.store.R @@ -36,11 +40,15 @@ import com.aurora.store.compose.composable.FavouriteListItem import com.aurora.store.compose.composable.ContainedLoadingIndicator import com.aurora.store.compose.composable.TopAppBar import com.aurora.extensions.emptyPagingItems +import com.aurora.store.compose.preview.FavouritePreviewProvider +import com.aurora.store.compose.preview.coilPreviewProvider import com.aurora.store.compose.ui.favourite.menu.FavouriteMenu import com.aurora.store.compose.ui.favourite.menu.MenuItem import com.aurora.store.data.room.favourite.Favourite import com.aurora.store.viewmodel.all.FavouriteViewModel +import kotlinx.coroutines.flow.MutableStateFlow import java.util.Calendar +import kotlin.random.Random @Composable fun FavouriteScreen( @@ -172,6 +180,15 @@ private fun ScreenContent( @Preview @Composable -private fun FavouriteScreenPreview() { - ScreenContent() +private fun FavouriteScreenPreview( + @PreviewParameter(FavouritePreviewProvider ::class) favourite: Favourite +) { + CompositionLocalProvider(LocalAsyncImagePreviewHandler provides coilPreviewProvider) { + val favourites = List(10) { + favourite.copy(packageName = "${favourite.packageName}.${Random.nextInt()}") + } + val flow = MutableStateFlow(PagingData.from(favourites)).collectAsLazyPagingItems() + + ScreenContent(favourites = flow) + } } diff --git a/app/src/main/java/com/aurora/store/compose/ui/search/SearchScreen.kt b/app/src/main/java/com/aurora/store/compose/ui/search/SearchScreen.kt index 46278d190..db73f048e 100644 --- a/app/src/main/java/com/aurora/store/compose/ui/search/SearchScreen.kt +++ b/app/src/main/java/com/aurora/store/compose/ui/search/SearchScreen.kt @@ -76,8 +76,8 @@ import com.aurora.store.compose.ui.details.AppDetailsScreen import com.aurora.store.data.model.SearchFilter import com.aurora.store.viewmodel.search.SearchViewModel import kotlinx.coroutines.android.awaitFrame +import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.collectLatest -import kotlinx.coroutines.flow.flowOf import kotlinx.coroutines.launch import kotlin.random.Random @@ -417,7 +417,7 @@ private fun FilterHeader( @Composable private fun SearchScreenPreview(@PreviewParameter(AppPreviewProvider::class) app: App) { val apps = List(10) { app.copy(id = Random.nextInt()) } - val results = flowOf(PagingData.from(apps)).collectAsLazyPagingItems() + val results = MutableStateFlow(PagingData.from(apps)).collectAsLazyPagingItems() CompositionLocalProvider(LocalAsyncImagePreviewHandler provides coilPreviewProvider) { ScreenContent(results = results)