Add new backups iconography and copy.

This commit is contained in:
Alex Hart
2024-10-08 15:51:48 -03:00
committed by Greyson Parrelli
parent ce6f0ca483
commit 3381d20bd7
22 changed files with 574 additions and 171 deletions

View File

@@ -5,19 +5,19 @@
package org.thoughtcrime.securesms.components.settings.app.backups.remote
import android.content.Intent
import android.net.Uri
import android.os.Bundle
import android.view.View
import android.widget.Toast
import androidx.activity.result.ActivityResultLauncher
import androidx.biometric.BiometricManager
import androidx.biometric.BiometricPrompt
import androidx.compose.foundation.Image
import androidx.compose.foundation.background
import androidx.compose.foundation.clickable
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.defaultMinSize
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.padding
@@ -47,6 +47,7 @@ import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.res.colorResource
import androidx.compose.ui.res.dimensionResource
import androidx.compose.ui.res.painterResource
import androidx.compose.ui.res.pluralStringResource
@@ -54,11 +55,8 @@ import androidx.compose.ui.res.stringResource
import androidx.compose.ui.text.buildAnnotatedString
import androidx.compose.ui.unit.dp
import androidx.compose.ui.window.DialogProperties
import androidx.lifecycle.lifecycleScope
import androidx.navigation.fragment.findNavController
import androidx.navigation.fragment.navArgs
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
import org.signal.core.ui.Buttons
import org.signal.core.ui.Dialogs
import org.signal.core.ui.Dividers
@@ -77,9 +75,9 @@ import org.thoughtcrime.securesms.backup.ArchiveUploadProgress
import org.thoughtcrime.securesms.backup.v2.BackupFrequency
import org.thoughtcrime.securesms.backup.v2.MessageBackupTier
import org.thoughtcrime.securesms.backup.v2.ui.subscription.MessageBackupsType
import org.thoughtcrime.securesms.billing.launchManageBackupsSubscription
import org.thoughtcrime.securesms.components.settings.app.subscription.MessageBackupsCheckoutLauncher.createBackupsCheckoutLauncher
import org.thoughtcrime.securesms.compose.ComposeFragment
import org.thoughtcrime.securesms.dependencies.GooglePlayBillingDependencies
import org.thoughtcrime.securesms.fonts.SignalSymbols
import org.thoughtcrime.securesms.fonts.SignalSymbols.SignalSymbol
import org.thoughtcrime.securesms.keyvalue.protos.ArchiveUploadProgressState
@@ -143,18 +141,7 @@ class RemoteBackupsSettingsFragment : ComposeFragment() {
override fun onBackupTypeActionClick(tier: MessageBackupTier) {
when (tier) {
MessageBackupTier.FREE -> checkoutLauncher.launch(MessageBackupTier.PAID)
MessageBackupTier.PAID -> lifecycleScope.launch(Dispatchers.Main) {
val uri = Uri.parse(
getString(
R.string.backup_subscription_management_url,
GooglePlayBillingDependencies.getProductId(),
requireContext().applicationInfo.packageName
)
)
val intent = Intent(Intent.ACTION_VIEW, uri)
startActivity(intent)
}
MessageBackupTier.PAID -> launchManageBackupsSubscription()
}
}
@@ -457,7 +444,7 @@ private fun BackupTypeRow(
.background(color = SignalTheme.colors.colorSurface2, shape = RoundedCornerShape(12.dp))
.padding(24.dp)
) {
Row {
Row(modifier = Modifier.fillMaxWidth()) {
Column {
val title = when (messageBackupsType) {
is MessageBackupsType.Paid -> stringResource(R.string.MessageBackupsTypeSelectionScreen__text_plus_all_your_media)
@@ -493,7 +480,13 @@ private fun BackupTypeRow(
}
}
// Icon
Spacer(modifier = Modifier.weight(1f))
Image(
painter = painterResource(R.drawable.image_signal_backups),
contentDescription = null,
modifier = Modifier.size(64.dp)
)
}
val buttonText = when (messageBackupsType) {
@@ -504,7 +497,8 @@ private fun BackupTypeRow(
Buttons.LargeTonal(
onClick = { onBackupTypeActionButtonClicked(messageBackupsType.tier) },
colors = ButtonDefaults.filledTonalButtonColors().copy(
containerColor = SignalTheme.colors.colorTransparent5
containerColor = SignalTheme.colors.colorTransparent5,
contentColor = colorResource(R.color.signal_light_colorOnSurface)
),
modifier = Modifier.padding(top = 12.dp)
) {

View File

@@ -8,20 +8,20 @@ package org.thoughtcrime.securesms.components.settings.app.storage
import android.os.Bundle
import android.view.View
import androidx.activity.result.ActivityResultLauncher
import androidx.compose.foundation.background
import androidx.compose.foundation.Image
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.size
import androidx.compose.foundation.shape.CircleShape
import androidx.compose.material3.Icon
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Text
import androidx.compose.material3.TextButton
import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue
import androidx.compose.runtime.remember
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.res.dimensionResource
import androidx.compose.ui.res.painterResource
import androidx.compose.ui.res.stringResource
@@ -34,12 +34,12 @@ import org.signal.core.ui.Previews
import org.signal.core.ui.SignalPreview
import org.thoughtcrime.securesms.R
import org.thoughtcrime.securesms.backup.v2.MessageBackupTier
import org.thoughtcrime.securesms.backup.v2.ui.BackupsIconColors
import org.thoughtcrime.securesms.backup.v2.ui.subscription.MessageBackupsType
import org.thoughtcrime.securesms.backup.v2.ui.subscription.MessageBackupsTypeBlock
import org.thoughtcrime.securesms.backup.v2.ui.subscription.testBackupTypes
import org.thoughtcrime.securesms.components.settings.app.subscription.MessageBackupsCheckoutLauncher.createBackupsCheckoutLauncher
import org.thoughtcrime.securesms.compose.ComposeBottomSheetDialogFragment
import org.thoughtcrime.securesms.payments.FiatMoneyUtil
/**
* Sheet describing how users must upgrade to enable optimized storage.
@@ -75,7 +75,7 @@ class UpgradeToEnableOptimizedStorageSheet : ComposeBottomSheetDialogFragment()
@Composable
private fun UpgradeToEnableOptimizedStorageSheetContent(
messageBackupsType: MessageBackupsType?,
messageBackupsType: MessageBackupsType.Paid?,
onUpgradeNowClick: () -> Unit = {},
onCancelClick: () -> Unit = {}
) {
@@ -90,18 +90,12 @@ private fun UpgradeToEnableOptimizedStorageSheetContent(
) {
BottomSheets.Handle()
Icon(
painter = painterResource(id = R.drawable.symbol_backup_light),
Image(
painter = painterResource(id = R.drawable.image_signal_backups),
contentDescription = null,
tint = BackupsIconColors.Normal.foreground,
modifier = Modifier
.padding(top = 8.dp, bottom = 12.dp)
.size(88.dp)
.background(
color = BackupsIconColors.Normal.background,
shape = CircleShape
)
.padding(20.dp)
.padding(top = 8.dp, bottom = 24.dp)
.size(80.dp)
)
Text(
@@ -140,8 +134,13 @@ private fun UpgradeToEnableOptimizedStorageSheetContent(
.padding(horizontal = dimensionResource(id = R.dimen.core_ui__gutter))
.padding(bottom = 8.dp)
) {
val resources = LocalContext.current.resources
val formattedPrice = remember(messageBackupsType.pricePerMonth) {
FiatMoneyUtil.format(resources, messageBackupsType.pricePerMonth, FiatMoneyUtil.formatOptions().trimZerosAfterDecimal())
}
Text(
text = stringResource(id = R.string.UpgradeToEnableOptimizedStorageSheet__upgrade_now)
text = stringResource(id = R.string.UpgradeToEnableOptimizedStorageSheet__subscribe_for_s_month, formattedPrice)
)
}
@@ -164,7 +163,7 @@ private fun UpgradeToEnableOptimizedStorageSheetContent(
private fun UpgradeToEnableOptimizedStorageSheetContentPreview() {
Previews.BottomSheetPreview {
UpgradeToEnableOptimizedStorageSheetContent(
messageBackupsType = testBackupTypes()[1]
messageBackupsType = testBackupTypes()[1] as MessageBackupsType.Paid?
)
}
}

View File

@@ -16,13 +16,13 @@ import org.thoughtcrime.securesms.backup.v2.MessageBackupTier
import org.thoughtcrime.securesms.backup.v2.ui.subscription.MessageBackupsType
class UpgradeToEnableOptimizedStorageViewModel : ViewModel() {
private val internalMessageBackupsType = mutableStateOf<MessageBackupsType?>(null)
val messageBackupsType: State<MessageBackupsType?> = internalMessageBackupsType
private val internalMessageBackupsType = mutableStateOf<MessageBackupsType.Paid?>(null)
val messageBackupsType: State<MessageBackupsType.Paid?> = internalMessageBackupsType
init {
viewModelScope.launch {
val backupsType = withContext(Dispatchers.IO) {
BackupRepository.getBackupsType(MessageBackupTier.PAID)
BackupRepository.getBackupsType(MessageBackupTier.PAID) as? MessageBackupsType.Paid
}
withContext(Dispatchers.Main) {