compose: details: Build and show updateable version in compose manually

Works properly on RTL and LTR layouts

Signed-off-by: Aayush Gupta <aayushgupta219@gmail.com>
This commit is contained in:
Aayush Gupta
2026-01-12 17:31:17 +08:00
parent f9d5688adf
commit a35a6c18ce
2 changed files with 72 additions and 10 deletions

View File

@@ -14,16 +14,25 @@ import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.requiredSize import androidx.compose.foundation.layout.requiredSize
import androidx.compose.foundation.text.InlineTextContent
import androidx.compose.foundation.text.appendInlineContent
import androidx.compose.material3.Icon
import androidx.compose.material3.MaterialTheme import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Text import androidx.compose.material3.Text
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.platform.LocalLayoutDirection
import androidx.compose.ui.res.dimensionResource import androidx.compose.ui.res.dimensionResource
import androidx.compose.ui.res.painterResource
import androidx.compose.ui.res.stringResource import androidx.compose.ui.res.stringResource
import androidx.compose.ui.text.Placeholder
import androidx.compose.ui.text.PlaceholderVerticalAlign
import androidx.compose.ui.text.buildAnnotatedString
import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.text.style.TextOverflow
import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.tooling.preview.PreviewParameter import androidx.compose.ui.tooling.preview.PreviewParameter
import androidx.compose.ui.unit.LayoutDirection
import com.aurora.gplayapi.data.models.App import com.aurora.gplayapi.data.models.App
import com.aurora.store.R import com.aurora.store.R
import com.aurora.store.compose.composable.app.AnimatedAppIcon import com.aurora.store.compose.composable.app.AnimatedAppIcon
@@ -52,6 +61,49 @@ fun Details(
val speed = if (state is AppState.Downloading) state.speed else 0 val speed = if (state is AppState.Downloading) state.speed else 0
val timeRemaining = if (state is AppState.Downloading) state.timeRemaining else 0 val timeRemaining = if (state is AppState.Downloading) state.timeRemaining else 0
@Composable
fun UpdatableVersion() {
val updateVersion = stringResource(R.string.version, versionName, versionCode)
val localVersion = stringResource(
R.string.version,
PackageUtil.getInstalledVersionName(context, app.packageName),
PackageUtil.getInstalledVersionCode(context, app.packageName)
)
Text(
style = MaterialTheme.typography.bodySmall,
text = buildAnnotatedString {
when (LocalLayoutDirection.current) {
LayoutDirection.Ltr -> append(localVersion)
LayoutDirection.Rtl -> append(updateVersion)
}
append(" ")
appendInlineContent("iconId", "[arrow]")
append(" ")
when (LocalLayoutDirection.current) {
LayoutDirection.Ltr -> append(updateVersion)
LayoutDirection.Rtl -> append(localVersion)
}
},
inlineContent = mapOf(
"iconId" to InlineTextContent(
Placeholder(
width = MaterialTheme.typography.bodySmall.fontSize,
height = MaterialTheme.typography.bodySmall.fontSize,
placeholderVerticalAlign = PlaceholderVerticalAlign.TextCenter
)
) {
Icon(
painter = painterResource(R.drawable.ic_arrow_forward),
contentDescription = null
)
}
)
)
}
Row(modifier = Modifier.fillMaxWidth()) { Row(modifier = Modifier.fillMaxWidth()) {
AnimatedAppIcon( AnimatedAppIcon(
modifier = Modifier.requiredSize(dimensionResource(R.dimen.icon_size_large)), modifier = Modifier.requiredSize(dimensionResource(R.dimen.icon_size_large)),
@@ -76,6 +128,11 @@ fun Details(
color = MaterialTheme.colorScheme.primary color = MaterialTheme.colorScheme.primary
) )
AnimatedContent(targetState = state::class) { cState -> AnimatedContent(targetState = state::class) { cState ->
if (cState == AppState.Updatable::class) {
UpdatableVersion()
return@AnimatedContent
}
Text( Text(
style = MaterialTheme.typography.bodySmall, style = MaterialTheme.typography.bodySmall,
text = when (cState) { text = when (cState) {
@@ -85,16 +142,6 @@ fun Details(
", " + CommonUtil.getETAString(context, timeRemaining) ", " + CommonUtil.getETAString(context, timeRemaining)
} }
AppState.Updatable::class -> {
stringResource(
R.string.version_update,
PackageUtil.getInstalledVersionName(context, app.packageName),
PackageUtil.getInstalledVersionCode(context, app.packageName),
versionName,
versionCode
)
}
AppState.Queued::class -> stringResource(R.string.status_queued) AppState.Queued::class -> stringResource(R.string.status_queued)
AppState.Purchasing::class -> stringResource(R.string.preparing_to_install) AppState.Purchasing::class -> stringResource(R.string.preparing_to_install)

View File

@@ -0,0 +1,15 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
~ SPDX-FileCopyrightText: Material Design Authors / Google LLC
~ SPDX-License-Identifier: Apache-2.0
-->
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="960"
android:viewportHeight="960"
android:autoMirrored="true">
<path
android:fillColor="@android:color/white"
android:pathData="M647,520L160,520L160,440L647,440L423,216L480,160L800,480L480,800L423,744L647,520Z"/>
</vector>