compose: Fix previews for every screen

Signed-off-by: Aayush Gupta <aayushgupta219@gmail.com>
This commit is contained in:
Aayush Gupta
2025-11-10 11:10:01 +08:00
parent b3f2d3ed9c
commit 1f69ecc9de
7 changed files with 75 additions and 9 deletions

View File

@@ -45,7 +45,8 @@ fun ScreenshotListItem(modifier: Modifier = Modifier, url: String) {
) )
val state by painter.state.collectAsStateWithLifecycle() val state by painter.state.collectAsStateWithLifecycle()
val aspectRatioModifier = state.painter?.intrinsicSize?.let { intrinsicSize -> 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( Image(

View File

@@ -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<Favourite> {
override val values: Sequence<Favourite>
get() = sequenceOf(
Favourite(
packageName = BuildConfig.APPLICATION_ID,
displayName = "Aurora Store",
iconURL = "",
added = 0L,
mode = Mode.MANUAL
)
)
}

View File

@@ -53,6 +53,7 @@ import com.aurora.extensions.requiresObbDir
import com.aurora.extensions.share import com.aurora.extensions.share
import com.aurora.extensions.toast import com.aurora.extensions.toast
import com.aurora.gplayapi.data.models.App import com.aurora.gplayapi.data.models.App
import com.aurora.gplayapi.data.models.Artwork
import com.aurora.gplayapi.data.models.Review import com.aurora.gplayapi.data.models.Review
import com.aurora.store.R import com.aurora.store.R
import com.aurora.store.compose.composable.Error import com.aurora.store.compose.composable.Error

View File

@@ -38,7 +38,7 @@ import com.aurora.store.compose.preview.AppPreviewProvider
import com.aurora.store.compose.preview.coilPreviewProvider import com.aurora.store.compose.preview.coilPreviewProvider
import com.aurora.store.viewmodel.details.DevProfileViewModel import com.aurora.store.viewmodel.details.DevProfileViewModel
import com.aurora.store.viewmodel.search.SearchViewModel import com.aurora.store.viewmodel.search.SearchViewModel
import kotlinx.coroutines.flow.flowOf import kotlinx.coroutines.flow.MutableStateFlow
import kotlin.random.Random import kotlin.random.Random
/** /**
@@ -132,7 +132,7 @@ private fun ScreenContent(
private fun DevProfileScreenPreview(@PreviewParameter(AppPreviewProvider::class) app: App) { private fun DevProfileScreenPreview(@PreviewParameter(AppPreviewProvider::class) app: App) {
CompositionLocalProvider(LocalAsyncImagePreviewHandler provides coilPreviewProvider) { CompositionLocalProvider(LocalAsyncImagePreviewHandler provides coilPreviewProvider) {
val apps = List(10) { app.copy(id = Random.nextInt()) } val apps = List(10) { app.copy(id = Random.nextInt()) }
val pagedApps = flowOf(PagingData.from(apps)).collectAsLazyPagingItems() val pagedApps = MutableStateFlow(PagingData.from(apps)).collectAsLazyPagingItems()
ScreenContent( ScreenContent(
topAppBarTitle = app.developerName, topAppBarTitle = app.developerName,

View File

@@ -13,6 +13,7 @@ import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.foundation.lazy.LazyColumn
import androidx.compose.material3.Scaffold import androidx.compose.material3.Scaffold
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.runtime.CompositionLocalProvider
import androidx.compose.runtime.getValue import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.saveable.rememberSaveable 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.painterResource
import androidx.compose.ui.res.stringResource import androidx.compose.ui.res.stringResource
import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.tooling.preview.PreviewParameter
import androidx.hilt.lifecycle.viewmodel.compose.hiltViewModel import androidx.hilt.lifecycle.viewmodel.compose.hiltViewModel
import androidx.paging.LoadState import androidx.paging.LoadState
import androidx.paging.PagingData
import androidx.paging.compose.LazyPagingItems import androidx.paging.compose.LazyPagingItems
import androidx.paging.compose.collectAsLazyPagingItems import androidx.paging.compose.collectAsLazyPagingItems
import androidx.paging.compose.itemKey import androidx.paging.compose.itemKey
import coil3.compose.LocalAsyncImagePreviewHandler
import com.aurora.extensions.toast import com.aurora.extensions.toast
import com.aurora.store.R import com.aurora.store.R
import com.aurora.store.compose.composable.DownloadListItem 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.ContainedLoadingIndicator
import com.aurora.store.compose.composable.TopAppBar import com.aurora.store.compose.composable.TopAppBar
import com.aurora.extensions.emptyPagingItems 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.DownloadsMenu
import com.aurora.store.compose.ui.downloads.menu.MenuItem 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.data.room.download.Download
import com.aurora.store.viewmodel.downloads.DownloadsViewModel import com.aurora.store.viewmodel.downloads.DownloadsViewModel
import kotlinx.coroutines.flow.MutableStateFlow
import kotlin.random.Random
@Composable @Composable
fun DownloadsScreen( fun DownloadsScreen(
@@ -171,6 +181,15 @@ private fun ScreenContent(
@Preview @Preview
@Composable @Composable
private fun DownloadsScreenPreview() { private fun DownloadsScreenPreview(@PreviewParameter(AppPreviewProvider::class) app: App) {
ScreenContent() 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)
}
} }

View File

@@ -13,6 +13,7 @@ import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.foundation.lazy.LazyColumn
import androidx.compose.material3.Scaffold import androidx.compose.material3.Scaffold
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.runtime.CompositionLocalProvider
import androidx.compose.runtime.getValue import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.saveable.rememberSaveable 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.painterResource
import androidx.compose.ui.res.stringResource import androidx.compose.ui.res.stringResource
import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.tooling.preview.PreviewParameter
import androidx.hilt.lifecycle.viewmodel.compose.hiltViewModel import androidx.hilt.lifecycle.viewmodel.compose.hiltViewModel
import androidx.paging.LoadState import androidx.paging.LoadState
import androidx.paging.PagingData
import androidx.paging.compose.LazyPagingItems import androidx.paging.compose.LazyPagingItems
import androidx.paging.compose.collectAsLazyPagingItems import androidx.paging.compose.collectAsLazyPagingItems
import androidx.paging.compose.itemKey import androidx.paging.compose.itemKey
import coil3.compose.LocalAsyncImagePreviewHandler
import com.aurora.Constants.JSON_MIME_TYPE import com.aurora.Constants.JSON_MIME_TYPE
import com.aurora.extensions.toast import com.aurora.extensions.toast
import com.aurora.store.R 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.ContainedLoadingIndicator
import com.aurora.store.compose.composable.TopAppBar import com.aurora.store.compose.composable.TopAppBar
import com.aurora.extensions.emptyPagingItems 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.FavouriteMenu
import com.aurora.store.compose.ui.favourite.menu.MenuItem import com.aurora.store.compose.ui.favourite.menu.MenuItem
import com.aurora.store.data.room.favourite.Favourite import com.aurora.store.data.room.favourite.Favourite
import com.aurora.store.viewmodel.all.FavouriteViewModel import com.aurora.store.viewmodel.all.FavouriteViewModel
import kotlinx.coroutines.flow.MutableStateFlow
import java.util.Calendar import java.util.Calendar
import kotlin.random.Random
@Composable @Composable
fun FavouriteScreen( fun FavouriteScreen(
@@ -172,6 +180,15 @@ private fun ScreenContent(
@Preview @Preview
@Composable @Composable
private fun FavouriteScreenPreview() { private fun FavouriteScreenPreview(
ScreenContent() @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)
}
} }

View File

@@ -76,8 +76,8 @@ import com.aurora.store.compose.ui.details.AppDetailsScreen
import com.aurora.store.data.model.SearchFilter import com.aurora.store.data.model.SearchFilter
import com.aurora.store.viewmodel.search.SearchViewModel import com.aurora.store.viewmodel.search.SearchViewModel
import kotlinx.coroutines.android.awaitFrame import kotlinx.coroutines.android.awaitFrame
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.collectLatest import kotlinx.coroutines.flow.collectLatest
import kotlinx.coroutines.flow.flowOf
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
import kotlin.random.Random import kotlin.random.Random
@@ -417,7 +417,7 @@ private fun FilterHeader(
@Composable @Composable
private fun SearchScreenPreview(@PreviewParameter(AppPreviewProvider::class) app: App) { private fun SearchScreenPreview(@PreviewParameter(AppPreviewProvider::class) app: App) {
val apps = List(10) { app.copy(id = Random.nextInt()) } 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) { CompositionLocalProvider(LocalAsyncImagePreviewHandler provides coilPreviewProvider) {
ScreenContent(results = results) ScreenContent(results = results)