compose: downloads: Rework expanded options a bit
No need for sharing option as we have removed the ability to copy direct download link for file long time ago. Make the remaining buttons as TextButton too. Signed-off-by: Aayush Gupta <aayushgupta219@gmail.com>
This commit is contained in:
@@ -17,20 +17,26 @@ import androidx.compose.foundation.clickable
|
|||||||
import androidx.compose.foundation.layout.Arrangement
|
import androidx.compose.foundation.layout.Arrangement
|
||||||
import androidx.compose.foundation.layout.Column
|
import androidx.compose.foundation.layout.Column
|
||||||
import androidx.compose.foundation.layout.Row
|
import androidx.compose.foundation.layout.Row
|
||||||
|
import androidx.compose.foundation.layout.Spacer
|
||||||
import androidx.compose.foundation.layout.fillMaxWidth
|
import androidx.compose.foundation.layout.fillMaxWidth
|
||||||
|
import androidx.compose.foundation.layout.height
|
||||||
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.layout.width
|
||||||
import androidx.compose.material3.Icon
|
import androidx.compose.material3.Icon
|
||||||
import androidx.compose.material3.MaterialTheme
|
import androidx.compose.material3.MaterialTheme
|
||||||
import androidx.compose.material3.SplitButtonDefaults
|
import androidx.compose.material3.SplitButtonDefaults
|
||||||
import androidx.compose.material3.SplitButtonLayout
|
import androidx.compose.material3.SplitButtonLayout
|
||||||
import androidx.compose.material3.Text
|
import androidx.compose.material3.Text
|
||||||
|
import androidx.compose.material3.TextButton
|
||||||
|
import androidx.compose.material3.VerticalDivider
|
||||||
import androidx.compose.runtime.Composable
|
import androidx.compose.runtime.Composable
|
||||||
import androidx.compose.runtime.CompositionLocalProvider
|
import androidx.compose.runtime.CompositionLocalProvider
|
||||||
import androidx.compose.runtime.getValue
|
import androidx.compose.runtime.getValue
|
||||||
import androidx.compose.runtime.mutableStateOf
|
import androidx.compose.runtime.mutableStateOf
|
||||||
import androidx.compose.runtime.saveable.rememberSaveable
|
import androidx.compose.runtime.saveable.rememberSaveable
|
||||||
import androidx.compose.runtime.setValue
|
import androidx.compose.runtime.setValue
|
||||||
|
import androidx.compose.ui.Alignment
|
||||||
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.res.dimensionResource
|
import androidx.compose.ui.res.dimensionResource
|
||||||
@@ -62,9 +68,9 @@ fun DownloadComposable(
|
|||||||
onClear: () -> Unit = {},
|
onClear: () -> Unit = {},
|
||||||
onCancel: () -> Unit = {},
|
onCancel: () -> Unit = {},
|
||||||
onExport: () -> Unit = {},
|
onExport: () -> Unit = {},
|
||||||
onInstall: () -> Unit = {},
|
onInstall: () -> Unit = {}
|
||||||
onShare: () -> Unit = {}
|
|
||||||
) {
|
) {
|
||||||
|
val context = LocalContext.current
|
||||||
val progress = "${download.progress}%"
|
val progress = "${download.progress}%"
|
||||||
val speed = "${Formatter.formatShortFileSize(LocalContext.current, download.speed)}/s"
|
val speed = "${Formatter.formatShortFileSize(LocalContext.current, download.speed)}/s"
|
||||||
val eta = getETAString(LocalContext.current, download.timeRemaining)
|
val eta = getETAString(LocalContext.current, download.timeRemaining)
|
||||||
@@ -152,25 +158,36 @@ fun DownloadComposable(
|
|||||||
) {
|
) {
|
||||||
Row(
|
Row(
|
||||||
modifier = Modifier.fillMaxWidth(),
|
modifier = Modifier.fillMaxWidth(),
|
||||||
|
verticalAlignment = Alignment.CenterVertically,
|
||||||
horizontalArrangement = Arrangement.SpaceEvenly
|
horizontalArrangement = Arrangement.SpaceEvenly
|
||||||
) {
|
) {
|
||||||
VerticalButtonComposable(
|
TextButton(onClick = onInstall, enabled = download.canInstall(context)) {
|
||||||
painter = painterResource(R.drawable.ic_share),
|
Icon(
|
||||||
text = stringResource(R.string.action_share),
|
painter = painterResource(R.drawable.ic_install),
|
||||||
onClick = onShare
|
contentDescription = null
|
||||||
|
)
|
||||||
|
Spacer(modifier = Modifier.width(dimensionResource(R.dimen.padding_xsmall)))
|
||||||
|
Text(
|
||||||
|
text = stringResource(R.string.action_install),
|
||||||
|
style = MaterialTheme.typography.bodySmall
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
VerticalDivider(
|
||||||
|
modifier = Modifier.height(dimensionResource(R.dimen.margin_large))
|
||||||
)
|
)
|
||||||
|
|
||||||
VerticalButtonComposable(
|
TextButton(onClick = onExport, enabled = download.canInstall(context)) {
|
||||||
painter = painterResource(R.drawable.ic_install),
|
Icon(
|
||||||
text = stringResource(R.string.action_install),
|
painter = painterResource(R.drawable.ic_file_copy),
|
||||||
onClick = onInstall
|
contentDescription = null
|
||||||
)
|
)
|
||||||
|
Spacer(modifier = Modifier.width(dimensionResource(R.dimen.padding_xsmall)))
|
||||||
VerticalButtonComposable(
|
Text(
|
||||||
painter = painterResource(R.drawable.ic_file_copy),
|
text = stringResource(R.string.action_export),
|
||||||
text = stringResource(R.string.action_export),
|
style = MaterialTheme.typography.bodySmall
|
||||||
onClick = onExport
|
)
|
||||||
)
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,66 +0,0 @@
|
|||||||
/*
|
|
||||||
* SPDX-FileCopyrightText: 2025 The Calyx Institute
|
|
||||||
* SPDX-License-Identifier: GPL-3.0-or-later
|
|
||||||
*/
|
|
||||||
|
|
||||||
package com.aurora.store.compose.composables
|
|
||||||
|
|
||||||
import androidx.compose.foundation.clickable
|
|
||||||
import androidx.compose.foundation.layout.Column
|
|
||||||
import androidx.compose.foundation.layout.padding
|
|
||||||
import androidx.compose.foundation.shape.RoundedCornerShape
|
|
||||||
import androidx.compose.material3.Icon
|
|
||||||
import androidx.compose.material3.MaterialTheme
|
|
||||||
import androidx.compose.material3.Text
|
|
||||||
import androidx.compose.runtime.Composable
|
|
||||||
import androidx.compose.ui.Alignment
|
|
||||||
import androidx.compose.ui.Modifier
|
|
||||||
import androidx.compose.ui.draw.clip
|
|
||||||
import androidx.compose.ui.graphics.painter.Painter
|
|
||||||
import androidx.compose.ui.res.dimensionResource
|
|
||||||
import androidx.compose.ui.res.painterResource
|
|
||||||
import androidx.compose.ui.res.stringResource
|
|
||||||
import androidx.compose.ui.tooling.preview.Preview
|
|
||||||
import com.aurora.store.R
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Composable with an icon and text placed vertically to function as a button
|
|
||||||
* @param modifier Modifier
|
|
||||||
* @param painter Icon for the button
|
|
||||||
* @param text Text describing the button's action
|
|
||||||
* @param onClick Callback when this composable is clicked
|
|
||||||
*/
|
|
||||||
@Composable
|
|
||||||
fun VerticalButtonComposable(
|
|
||||||
modifier: Modifier = Modifier,
|
|
||||||
painter: Painter,
|
|
||||||
text: String,
|
|
||||||
onClick: (() -> Unit)? = null
|
|
||||||
) {
|
|
||||||
Column(
|
|
||||||
modifier = modifier
|
|
||||||
.padding(dimensionResource(R.dimen.padding_xsmall))
|
|
||||||
.clip(RoundedCornerShape(dimensionResource(R.dimen.icon_size_default)))
|
|
||||||
.clickable(onClick = { if (onClick != null) onClick() }, enabled = onClick != null)
|
|
||||||
.padding(dimensionResource(R.dimen.padding_medium)),
|
|
||||||
horizontalAlignment = Alignment.CenterHorizontally
|
|
||||||
) {
|
|
||||||
Icon(
|
|
||||||
painter = painter,
|
|
||||||
contentDescription = text
|
|
||||||
)
|
|
||||||
Text(
|
|
||||||
text = text,
|
|
||||||
style = MaterialTheme.typography.bodySmall
|
|
||||||
)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Preview(showBackground = true)
|
|
||||||
@Composable
|
|
||||||
private fun VerticalButtonComposablePreview() {
|
|
||||||
VerticalButtonComposable(
|
|
||||||
painter = painterResource(R.drawable.ic_file_copy),
|
|
||||||
text = stringResource(R.string.action_export)
|
|
||||||
)
|
|
||||||
}
|
|
||||||
@@ -29,7 +29,6 @@ import androidx.paging.PagingData
|
|||||||
import androidx.paging.compose.LazyPagingItems
|
import androidx.paging.compose.LazyPagingItems
|
||||||
import androidx.paging.compose.collectAsLazyPagingItems
|
import androidx.paging.compose.collectAsLazyPagingItems
|
||||||
import androidx.paging.compose.itemKey
|
import androidx.paging.compose.itemKey
|
||||||
import com.aurora.extensions.share
|
|
||||||
import com.aurora.extensions.toast
|
import com.aurora.extensions.toast
|
||||||
import com.aurora.store.R
|
import com.aurora.store.R
|
||||||
import com.aurora.store.compose.composables.DownloadComposable
|
import com.aurora.store.compose.composables.DownloadComposable
|
||||||
@@ -73,7 +72,6 @@ fun DownloadsScreen(
|
|||||||
onForceClearAll = { viewModel.clearAll() },
|
onForceClearAll = { viewModel.clearAll() },
|
||||||
onClearFinished = { viewModel.clearFinished() },
|
onClearFinished = { viewModel.clearFinished() },
|
||||||
onCancel = { packageName -> viewModel.cancel(packageName) },
|
onCancel = { packageName -> viewModel.cancel(packageName) },
|
||||||
onShare = { download -> context.share(download.displayName, download.packageName) },
|
|
||||||
onInstall = { download -> viewModel.install(download) },
|
onInstall = { download -> viewModel.install(download) },
|
||||||
onClear = { download ->
|
onClear = { download ->
|
||||||
viewModel.clear(download.packageName, download.versionCode)
|
viewModel.clear(download.packageName, download.versionCode)
|
||||||
@@ -94,7 +92,6 @@ private fun ScreenContent(
|
|||||||
onClear: (download: Download) -> Unit = {},
|
onClear: (download: Download) -> Unit = {},
|
||||||
onExport: (download: Download) -> Unit = {},
|
onExport: (download: Download) -> Unit = {},
|
||||||
onInstall: (download: Download) -> Unit = {},
|
onInstall: (download: Download) -> Unit = {},
|
||||||
onShare: (download: Download) -> Unit = {},
|
|
||||||
onCancelAll: () -> Unit = {},
|
onCancelAll: () -> Unit = {},
|
||||||
onForceClearAll: () -> Unit = {},
|
onForceClearAll: () -> Unit = {},
|
||||||
onClearFinished: () -> Unit = {}
|
onClearFinished: () -> Unit = {}
|
||||||
@@ -106,7 +103,6 @@ private fun ScreenContent(
|
|||||||
* Save the initial loading state to make sure we don't replay the loading animation again.
|
* Save the initial loading state to make sure we don't replay the loading animation again.
|
||||||
*/
|
*/
|
||||||
var initialLoad by rememberSaveable { mutableStateOf(true) }
|
var initialLoad by rememberSaveable { mutableStateOf(true) }
|
||||||
val context = LocalContext.current
|
|
||||||
|
|
||||||
@Composable
|
@Composable
|
||||||
fun SetupMenu() {
|
fun SetupMenu() {
|
||||||
@@ -159,20 +155,9 @@ private fun ScreenContent(
|
|||||||
download = download,
|
download = download,
|
||||||
onClick = { onNavigateToAppDetails(download.packageName) },
|
onClick = { onNavigateToAppDetails(download.packageName) },
|
||||||
onClear = { onClear(download) },
|
onClear = { onClear(download) },
|
||||||
onShare = { onShare(download) },
|
|
||||||
onCancel = { onCancel(download.packageName) },
|
onCancel = { onCancel(download.packageName) },
|
||||||
onExport = {
|
onExport = { onExport(download) },
|
||||||
when {
|
onInstall = { onInstall(download) }
|
||||||
download.canInstall(context) -> onExport(download)
|
|
||||||
else -> context.toast(R.string.purchase_no_file)
|
|
||||||
}
|
|
||||||
},
|
|
||||||
onInstall = {
|
|
||||||
when {
|
|
||||||
download.isSuccessful -> onInstall(download)
|
|
||||||
else -> context.toast(R.string.purchase_no_file)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -38,7 +38,7 @@ data class Download(
|
|||||||
) : Parcelable {
|
) : Parcelable {
|
||||||
val isFinished get() = downloadStatus in DownloadStatus.finished
|
val isFinished get() = downloadStatus in DownloadStatus.finished
|
||||||
val isRunning get() = downloadStatus in DownloadStatus.running
|
val isRunning get() = downloadStatus in DownloadStatus.running
|
||||||
val isSuccessful get() = downloadStatus == DownloadStatus.COMPLETED
|
private val isSuccessful get() = downloadStatus == DownloadStatus.COMPLETED
|
||||||
|
|
||||||
companion object {
|
companion object {
|
||||||
fun fromApp(app: App): Download {
|
fun fromApp(app: App): Download {
|
||||||
|
|||||||
Reference in New Issue
Block a user