mirror of
https://github.com/signalapp/Signal-Android.git
synced 2026-04-22 18:00:02 +01:00
Add restore type check and download specific messaging.
This commit is contained in:
committed by
Cody Henthorne
parent
ac9f6c0b4a
commit
c0f3189a5b
@@ -9,7 +9,6 @@ import androidx.compose.foundation.background
|
||||
import androidx.compose.foundation.layout.Box
|
||||
import androidx.compose.foundation.layout.Column
|
||||
import androidx.compose.foundation.layout.Row
|
||||
import androidx.compose.foundation.layout.defaultMinSize
|
||||
import androidx.compose.foundation.layout.padding
|
||||
import androidx.compose.foundation.layout.size
|
||||
import androidx.compose.foundation.shape.CircleShape
|
||||
@@ -21,12 +20,14 @@ import androidx.compose.material3.LinearProgressIndicator
|
||||
import androidx.compose.material3.MaterialTheme
|
||||
import androidx.compose.material3.Text
|
||||
import androidx.compose.runtime.Composable
|
||||
import androidx.compose.runtime.remember
|
||||
import androidx.compose.ui.Alignment
|
||||
import androidx.compose.ui.Modifier
|
||||
import androidx.compose.ui.graphics.Color
|
||||
import androidx.compose.ui.res.dimensionResource
|
||||
import androidx.compose.ui.res.painterResource
|
||||
import androidx.compose.ui.res.stringResource
|
||||
import androidx.compose.ui.text.AnnotatedString
|
||||
import androidx.compose.ui.text.LinkAnnotation
|
||||
import androidx.compose.ui.text.Placeholder
|
||||
import androidx.compose.ui.text.PlaceholderVerticalAlign
|
||||
@@ -46,28 +47,48 @@ import org.signal.core.ui.R as CoreUiR
|
||||
|
||||
private val YELLOW_DOT = Color(0xFFFFCC00)
|
||||
|
||||
/**
|
||||
* Specifies what kind of restore this is. Slightly different messaging
|
||||
* is utilized for downloads.
|
||||
*/
|
||||
enum class RestoreType {
|
||||
/**
|
||||
* Restoring, when the user has downloads enabled but is restoring optimized media.
|
||||
*/
|
||||
RESTORE,
|
||||
|
||||
/**
|
||||
* Downloading, when the user has opted to turn off and delete download, and we are
|
||||
* downloading optimized media.
|
||||
*/
|
||||
DOWNLOAD
|
||||
}
|
||||
|
||||
/**
|
||||
* Backup status displayable as a row on a settings page.
|
||||
*/
|
||||
@Composable
|
||||
fun BackupStatusRow(
|
||||
backupStatusData: BackupStatusData,
|
||||
restoreType: RestoreType = RestoreType.RESTORE,
|
||||
onSkipClick: () -> Unit = {},
|
||||
onCancelClick: (() -> Unit)? = null,
|
||||
onLearnMoreClick: () -> Unit = {}
|
||||
) {
|
||||
Column {
|
||||
Column(
|
||||
modifier = Modifier.padding(top = 8.dp, bottom = 12.dp)
|
||||
) {
|
||||
if (backupStatusData !is BackupStatusData.CouldNotCompleteBackup &&
|
||||
backupStatusData !is BackupStatusData.BackupFailed
|
||||
) {
|
||||
Row(
|
||||
verticalAlignment = Alignment.CenterVertically,
|
||||
modifier = Modifier.padding(horizontal = dimensionResource(CoreUiR.dimen.gutter)).defaultMinSize(minHeight = 48.dp)
|
||||
modifier = Modifier.padding(horizontal = dimensionResource(CoreUiR.dimen.gutter))
|
||||
) {
|
||||
LinearProgressIndicator(
|
||||
color = progressColor(backupStatusData),
|
||||
progress = { backupStatusData.progress },
|
||||
modifier = Modifier.weight(1f)
|
||||
modifier = Modifier.weight(1f).padding(vertical = 12.dp)
|
||||
)
|
||||
|
||||
if (onCancelClick != null) {
|
||||
@@ -85,21 +106,21 @@ fun BackupStatusRow(
|
||||
|
||||
when (backupStatusData) {
|
||||
is BackupStatusData.RestoringMedia -> {
|
||||
Text(
|
||||
text = getRestoringMediaString(backupStatusData),
|
||||
color = MaterialTheme.colorScheme.onSurfaceVariant,
|
||||
modifier = Modifier.padding(horizontal = dimensionResource(CoreUiR.dimen.gutter))
|
||||
)
|
||||
val string = when (restoreType) {
|
||||
RestoreType.RESTORE -> getRestoringMediaString(backupStatusData)
|
||||
RestoreType.DOWNLOAD -> getDownloadingMediaString(backupStatusData)
|
||||
}
|
||||
|
||||
BackupAlertText(text = string)
|
||||
}
|
||||
|
||||
is BackupStatusData.NotEnoughFreeSpace -> {
|
||||
Text(
|
||||
BackupAlertText(
|
||||
text = stringResource(
|
||||
R.string.BackupStatusRow__not_enough_space,
|
||||
backupStatusData.requiredSpace,
|
||||
"%d".format((backupStatusData.progress * 100).roundToInt())
|
||||
),
|
||||
modifier = Modifier.padding(horizontal = dimensionResource(CoreUiR.dimen.gutter))
|
||||
)
|
||||
)
|
||||
|
||||
Rows.TextRow(
|
||||
@@ -121,14 +142,13 @@ fun BackupStatusRow(
|
||||
}
|
||||
)
|
||||
|
||||
Text(
|
||||
BackupAlertText(
|
||||
text = buildAnnotatedString {
|
||||
appendInlineContent("yellow_bullet")
|
||||
append(" ")
|
||||
append(stringResource(R.string.BackupStatusRow__your_last_backup))
|
||||
},
|
||||
inlineContent = inlineContentMap,
|
||||
modifier = Modifier.padding(horizontal = dimensionResource(CoreUiR.dimen.gutter))
|
||||
inlineContent = inlineContentMap
|
||||
)
|
||||
}
|
||||
BackupStatusData.BackupFailed -> {
|
||||
@@ -144,7 +164,7 @@ fun BackupStatusRow(
|
||||
}
|
||||
)
|
||||
|
||||
Text(
|
||||
BackupAlertText(
|
||||
text = buildAnnotatedString {
|
||||
appendInlineContent("yellow_bullet")
|
||||
append(" ")
|
||||
@@ -161,14 +181,32 @@ fun BackupStatusRow(
|
||||
append(stringResource(R.string.BackupStatusRow__learn_more))
|
||||
}
|
||||
},
|
||||
inlineContent = inlineContentMap,
|
||||
modifier = Modifier.padding(horizontal = dimensionResource(CoreUiR.dimen.gutter))
|
||||
inlineContent = inlineContentMap
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Composable
|
||||
private fun BackupAlertText(text: String) {
|
||||
BackupAlertText(
|
||||
text = remember(text) { AnnotatedString(text) },
|
||||
inlineContent = emptyMap()
|
||||
)
|
||||
}
|
||||
|
||||
@Composable
|
||||
private fun BackupAlertText(text: AnnotatedString, inlineContent: Map<String, InlineTextContent>) {
|
||||
Text(
|
||||
text = text,
|
||||
color = MaterialTheme.colorScheme.onSurfaceVariant,
|
||||
style = MaterialTheme.typography.bodyMedium,
|
||||
modifier = Modifier.padding(horizontal = dimensionResource(CoreUiR.dimen.gutter)),
|
||||
inlineContent = inlineContent
|
||||
)
|
||||
}
|
||||
|
||||
@Composable
|
||||
private fun getRestoringMediaString(backupStatusData: BackupStatusData.RestoringMedia): String {
|
||||
return when (backupStatusData.restoreStatus) {
|
||||
@@ -187,6 +225,24 @@ private fun getRestoringMediaString(backupStatusData: BackupStatusData.Restoring
|
||||
}
|
||||
}
|
||||
|
||||
@Composable
|
||||
private fun getDownloadingMediaString(backupStatusData: BackupStatusData.RestoringMedia): String {
|
||||
return when (backupStatusData.restoreStatus) {
|
||||
BackupStatusData.RestoreStatus.NORMAL -> {
|
||||
stringResource(
|
||||
R.string.BackupStatusRow__downloading_s_of_s_s,
|
||||
backupStatusData.bytesDownloaded.toUnitString(2),
|
||||
backupStatusData.bytesTotal.toUnitString(2),
|
||||
"%d".format((backupStatusData.progress * 100).roundToInt())
|
||||
)
|
||||
}
|
||||
BackupStatusData.RestoreStatus.LOW_BATTERY -> stringResource(R.string.BackupStatusRow__download_device_has_low_battery)
|
||||
BackupStatusData.RestoreStatus.WAITING_FOR_INTERNET -> stringResource(R.string.BackupStatusRow__download_no_internet)
|
||||
BackupStatusData.RestoreStatus.WAITING_FOR_WIFI -> stringResource(R.string.BackupStatusRow__download_waiting_for_wifi)
|
||||
BackupStatusData.RestoreStatus.FINISHED -> stringResource(R.string.BackupStatus__restore_complete)
|
||||
}
|
||||
}
|
||||
|
||||
@Composable
|
||||
private fun progressColor(backupStatusData: BackupStatusData): Color {
|
||||
return if (backupStatusData is BackupStatusData.RestoringMedia && backupStatusData.restoreStatus == BackupStatusData.RestoreStatus.NORMAL) {
|
||||
|
||||
@@ -99,6 +99,7 @@ import org.thoughtcrime.securesms.backup.v2.ui.BackupAlert
|
||||
import org.thoughtcrime.securesms.backup.v2.ui.BackupAlertBottomSheet
|
||||
import org.thoughtcrime.securesms.backup.v2.ui.status.BackupStatusData
|
||||
import org.thoughtcrime.securesms.backup.v2.ui.status.BackupStatusRow
|
||||
import org.thoughtcrime.securesms.backup.v2.ui.status.RestoreType
|
||||
import org.thoughtcrime.securesms.backup.v2.ui.subscription.MessageBackupsType
|
||||
import org.thoughtcrime.securesms.billing.launchManageBackupsSubscription
|
||||
import org.thoughtcrime.securesms.components.compose.BetaHeader
|
||||
@@ -402,7 +403,7 @@ private fun RemoteBackupsSettingsContent(
|
||||
if (backupDeleteState != DeletionState.NONE && backupDeleteState != DeletionState.CLEAR_LOCAL_STATE) {
|
||||
contentCallbacks.onDialogDismissed()
|
||||
}
|
||||
|
||||
|
||||
if (backupDeleteState == DeletionState.AWAITING_MEDIA_DOWNLOAD) {
|
||||
contentCallbacks.onDisplayDownloadingBackupDialog()
|
||||
}
|
||||
@@ -655,6 +656,7 @@ private fun LazyListScope.appendRestoreFromBackupStatusData(
|
||||
item {
|
||||
BackupStatusRow(
|
||||
backupStatusData = backupRestoreState.backupStatusData,
|
||||
restoreType = RestoreType.DOWNLOAD,
|
||||
onCancelClick = if (isCancelable) contentCallbacks::onCancelMediaRestore else null,
|
||||
onSkipClick = contentCallbacks::onDisplaySkipMediaRestoreProtectionDialog,
|
||||
onLearnMoreClick = contentCallbacks::onLearnMoreAboutBackupFailure
|
||||
|
||||
Reference in New Issue
Block a user