From 10b9e5a18267c8283a1d57d07775d5a7304ef3f1 Mon Sep 17 00:00:00 2001 From: Aayush Gupta Date: Sat, 30 Aug 2025 19:59:56 +0800 Subject: [PATCH] compose: details: Setup and use app state properly Signed-off-by: Aayush Gupta --- .../compose/ui/details/AppDetailsScreen.kt | 74 +++++++++---------- .../java/com/aurora/store/data/model/State.kt | 2 + .../viewmodel/details/AppDetailsViewModel.kt | 6 +- 3 files changed, 40 insertions(+), 42 deletions(-) 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 5b53c4b5f..ceef54074 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 @@ -109,47 +109,41 @@ fun AppDetailsScreen( LaunchedEffect(key1 = packageName) { viewModel.fetchAppDetails(packageName) } - with(app) { - when { - this != null -> { - if (this.packageName.isBlank()) { - ScreenContentLoading(onNavigateUp = onNavigateUp) - } else { - ScreenContentApp( - app = this, - featuredReviews = featuredReviews, - suggestions = suggestions, - isFavorite = favorite, - isAnonymous = viewModel.authProvider.isAnonymous, - state = state, - plexusScores = plexusScores, - dataSafetyReport = dataSafetyReport, - exodusReport = exodusReport, - onNavigateUp = onNavigateUp, - onNavigateToAppDetails = onNavigateToAppDetails, - onDownload = { viewModel.purchase(this) }, - onFavorite = { viewModel.toggleFavourite(this) }, - onCancelDownload = { viewModel.cancelDownload(this) }, - onUninstall = { AppInstaller.uninstall(context, packageName) }, - onOpen = { - try { - context.startActivity( - PackageUtil.getLaunchIntent(context, packageName) - ) - } catch (_: ActivityNotFoundException) { - context.toast(context.getString(R.string.unable_to_open)) - } - }, - onTestingSubscriptionChange = { subscribe -> - viewModel.updateTestingProgramStatus(packageName, subscribe) - }, - forceSinglePane = forceSinglePane - ) - } - } + when (state) { + is AppState.Loading -> ScreenContentLoading(onNavigateUp = onNavigateUp) + is AppState.Error -> ScreenContentError(onNavigateUp = onNavigateUp) - // TODO: Deal with different kind of errors - else -> ScreenContentError(onNavigateUp = onNavigateUp) + else -> { + ScreenContentApp( + app = app!!, + featuredReviews = featuredReviews, + suggestions = suggestions, + isFavorite = favorite, + isAnonymous = viewModel.authProvider.isAnonymous, + state = state, + plexusScores = plexusScores, + dataSafetyReport = dataSafetyReport, + exodusReport = exodusReport, + onNavigateUp = onNavigateUp, + onNavigateToAppDetails = onNavigateToAppDetails, + onDownload = { viewModel.purchase(app!!) }, + onFavorite = { viewModel.toggleFavourite(app!!) }, + onCancelDownload = { viewModel.cancelDownload(app!!) }, + onUninstall = { AppInstaller.uninstall(context, packageName) }, + onOpen = { + try { + context.startActivity( + PackageUtil.getLaunchIntent(context, packageName) + ) + } catch (_: ActivityNotFoundException) { + context.toast(context.getString(R.string.unable_to_open)) + } + }, + onTestingSubscriptionChange = { subscribe -> + viewModel.updateTestingProgramStatus(packageName, subscribe) + }, + forceSinglePane = forceSinglePane + ) } } } diff --git a/app/src/main/java/com/aurora/store/data/model/State.kt b/app/src/main/java/com/aurora/store/data/model/State.kt index 350609cd4..cf07c5a59 100644 --- a/app/src/main/java/com/aurora/store/data/model/State.kt +++ b/app/src/main/java/com/aurora/store/data/model/State.kt @@ -60,6 +60,8 @@ sealed class AppState { data object Archived : AppState() data object Updatable : AppState() data object Unavailable : AppState() + data object Loading : AppState() + data object Error : AppState() /** * Whether there is some sort of ongoing process related to the app diff --git a/app/src/main/java/com/aurora/store/viewmodel/details/AppDetailsViewModel.kt b/app/src/main/java/com/aurora/store/viewmodel/details/AppDetailsViewModel.kt index 15b830d7a..cd3d8621d 100644 --- a/app/src/main/java/com/aurora/store/viewmodel/details/AppDetailsViewModel.kt +++ b/app/src/main/java/com/aurora/store/viewmodel/details/AppDetailsViewModel.kt @@ -72,10 +72,10 @@ class AppDetailsViewModel @Inject constructor( private val TAG = AppDetailsViewModel::class.java.simpleName - private val _app = MutableStateFlow(App("")) + private val _app = MutableStateFlow(null) val app = _app.asStateFlow() - private val _state = MutableStateFlow(defaultAppState) + private val _state = MutableStateFlow(AppState.Loading) val state = _state.asStateFlow() private val _suggestions = MutableStateFlow>(emptyList()) @@ -149,9 +149,11 @@ class AppDetailsViewModel @Inject constructor( _app.value = appDetailsHelper.getAppByPackageName(packageName).copy( isInstalled = PackageUtil.isInstalled(context, packageName) ) + _state.value = defaultAppState } catch (exception: Exception) { Log.e(TAG, "Failed to fetch app details", exception) _app.value = null + _state.value = AppState.Error } }.invokeOnCompletion { throwable -> // Only proceed if there was no error while fetching the app details