From 52d6c9ce5655701124d48f30bd43951a1825dbeb Mon Sep 17 00:00:00 2001 From: Aayush Gupta Date: Mon, 8 Sep 2025 15:08:24 +0800 Subject: [PATCH] compose: details: Show local app version name and code when installed and not updateable Signed-off-by: Aayush Gupta --- .../compose/ui/details/AppDetailsScreen.kt | 8 ++---- .../compose/ui/details/components/Details.kt | 28 ++++++++++--------- .../java/com/aurora/store/data/model/State.kt | 2 +- .../viewmodel/details/AppDetailsViewModel.kt | 14 +++++++++- 4 files changed, 31 insertions(+), 21 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 290f9883e..fd2cf33f8 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 @@ -322,12 +322,8 @@ private fun ScreenContentApp( ) { Details( app = app, - inProgress = state.inProgress(), - progress = state.progress(), - onNavigateToDetailsDevProfile = { showExtraPane(Screen.DevProfile(it)) }, - isUpdatable = state is AppState.Updatable, - speed = if (state is AppState.Downloading) state.speed else 0, - timeRemaining = if (state is AppState.Downloading) state.timeRemaining else 0 + state = state, + onNavigateToDetailsDevProfile = { showExtraPane(Screen.DevProfile(it)) } ) SetupActions() diff --git a/app/src/main/java/com/aurora/store/compose/ui/details/components/Details.kt b/app/src/main/java/com/aurora/store/compose/ui/details/components/Details.kt index a95e4e4a2..1adce70d1 100644 --- a/app/src/main/java/com/aurora/store/compose/ui/details/components/Details.kt +++ b/app/src/main/java/com/aurora/store/compose/ui/details/components/Details.kt @@ -30,6 +30,7 @@ import com.aurora.store.R import com.aurora.store.compose.composables.app.AnimatedAppIconComposable import com.aurora.store.compose.preview.AppPreviewProvider import com.aurora.store.compose.preview.coilPreviewProvider +import com.aurora.store.data.model.AppState import com.aurora.store.util.CommonUtil import com.aurora.store.util.PackageUtil @@ -37,29 +38,25 @@ import com.aurora.store.util.PackageUtil * Composable to display basic app details, supposed to be used as a part * of the Column with proper vertical arrangement spacing in the AppDetailsScreen. * @param app App to show details about - * @param progress Ongoing progress percentage out of 100, for e.g. 50.0 - * @param inProgress Whether there is some ongoing progress related to the app + * @param state State of the app * @param onNavigateToDetailsDevProfile Callback when the developer name is tapped - * @param isUpdatable Whether the app has a valid update available */ @Composable fun Details( app: App, - progress: Float = 0F, - inProgress: Boolean = false, + state: AppState = AppState.Unavailable, onNavigateToDetailsDevProfile: (developerName: String) -> Unit = {}, - isUpdatable: Boolean = false, - speed: Long = 0, - timeRemaining: Long = 0 ) { val context = LocalContext.current + val speed = if (state is AppState.Downloading) state.speed else 0 + val timeRemaining = if (state is AppState.Downloading) state.timeRemaining else 0 Row(modifier = Modifier.fillMaxWidth()) { AnimatedAppIconComposable( modifier = Modifier.requiredSize(dimensionResource(R.dimen.icon_size_large)), iconUrl = app.iconArtwork.url, - inProgress = inProgress, - progress = progress + inProgress = state.inProgress(), + progress = state.progress() ) Column(modifier = Modifier.padding(horizontal = dimensionResource(R.dimen.margin_small))) { Text( @@ -78,13 +75,14 @@ fun Details( color = MaterialTheme.colorScheme.primary ) Text( - text = when { - inProgress -> { + text = when (state) { + is AppState.Installing, + is AppState.Downloading -> { "${Formatter.formatShortFileSize(context, speed)}/s" + ", " + CommonUtil.getETAString(context, timeRemaining) } - isUpdatable -> { + is AppState.Updatable -> { stringResource( R.string.version_update, PackageUtil.getInstalledVersionName(context, app.packageName), @@ -94,6 +92,10 @@ fun Details( ) } + is AppState.Installed -> { + stringResource(R.string.version, state.versionName, state.versionCode) + } + else -> { stringResource(R.string.version, app.versionName, app.versionCode) } 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 c2087de1d..6e806fe30 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 @@ -57,7 +57,7 @@ sealed class AppState { data class Installing(val progress: Float) : AppState() data class Error(val message: String?) : AppState() - data object Installed : AppState() + data class Installed(val versionName: String, val versionCode: Long) : AppState() data object Archived : AppState() data object Updatable : AppState() data object Unavailable : AppState() 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 0452fb99e..57c5ed8ce 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 @@ -8,6 +8,7 @@ package com.aurora.store.viewmodel.details import android.content.Context import android.util.Log +import androidx.core.content.pm.PackageInfoCompat import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import com.aurora.Constants @@ -135,7 +136,18 @@ class AppDetailsViewModel @Inject constructor( private val defaultAppState: AppState get() = when { - isInstalled -> if (hasValidUpdate) AppState.Updatable else AppState.Installed + isInstalled -> { + if (hasValidUpdate) { + AppState.Updatable + } else { + val info = PackageUtil.getPackageInfo(context, app.value!!.packageName) + AppState.Installed( + versionName = info.versionName ?: String(), + versionCode = PackageInfoCompat.getLongVersionCode(info) + ) + } + } + else -> if (isArchived) AppState.Archived else AppState.Unavailable }