compose: details: Setup and use app state properly

Signed-off-by: Aayush Gupta <aayushgupta219@gmail.com>
This commit is contained in:
Aayush Gupta
2025-08-30 19:59:56 +08:00
parent 0dde304938
commit 10b9e5a182
3 changed files with 40 additions and 42 deletions

View File

@@ -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
)
}
}
}

View File

@@ -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

View File

@@ -72,10 +72,10 @@ class AppDetailsViewModel @Inject constructor(
private val TAG = AppDetailsViewModel::class.java.simpleName
private val _app = MutableStateFlow<App?>(App(""))
private val _app = MutableStateFlow<App?>(null)
val app = _app.asStateFlow()
private val _state = MutableStateFlow(defaultAppState)
private val _state = MutableStateFlow<AppState>(AppState.Loading)
val state = _state.asStateFlow()
private val _suggestions = MutableStateFlow<List<App>>(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