compose: details: Setup and use app state properly
Signed-off-by: Aayush Gupta <aayushgupta219@gmail.com>
This commit is contained in:
@@ -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
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user