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

@@ -7,7 +7,9 @@ package org.thoughtcrime.securesms.backup.v2.ui
import android.os.Parcelable
import androidx.annotation.StringRes
import androidx.compose.foundation.Image
import androidx.compose.foundation.background
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.defaultMinSize
@@ -20,10 +22,15 @@ import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Text
import androidx.compose.material3.TextButton
import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.Stable
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.setValue
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.pluralStringResource
@@ -39,12 +46,13 @@ import org.signal.core.ui.Buttons
import org.signal.core.ui.Previews
import org.signal.core.ui.SignalPreview
import org.thoughtcrime.securesms.R
import org.thoughtcrime.securesms.billing.launchManageBackupsSubscription
import org.thoughtcrime.securesms.components.settings.app.AppSettingsActivity
import org.thoughtcrime.securesms.compose.ComposeBottomSheetDialogFragment
import org.thoughtcrime.securesms.database.model.databaseprotos.InAppPaymentData
import org.thoughtcrime.securesms.dependencies.AppDependencies
import org.thoughtcrime.securesms.jobs.BackupMessagesJob
import org.thoughtcrime.securesms.jobs.BackupRestoreMediaJob
import org.thoughtcrime.securesms.payments.FiatMoneyUtil
/**
* Notifies the user of an issue with their backup.
@@ -67,6 +75,14 @@ class BackupAlertBottomSheet : ComposeBottomSheetDialogFragment() {
@Composable
override fun SheetContent() {
var pricePerMonth by remember { mutableStateOf("-") }
val resources = LocalContext.current.resources
LaunchedEffect(Unit) {
val price = AppDependencies.billingApi.queryProduct()?.price ?: return@LaunchedEffect
pricePerMonth = FiatMoneyUtil.format(resources, price, FiatMoneyUtil.formatOptions().trimZerosAfterDecimal())
}
BackupAlertSheetContent(
backupAlert = backupAlert,
onPrimaryActionClick = this::performPrimaryAction,
@@ -81,10 +97,12 @@ class BackupAlertBottomSheet : ComposeBottomSheetDialogFragment() {
BackupMessagesJob.enqueue()
startActivity(AppSettingsActivity.remoteBackups(requireContext()))
}
BackupAlert.PAYMENT_PROCESSING -> Unit
BackupAlert.PAYMENT_PROCESSING -> launchManageBackupsSubscription()
BackupAlert.MEDIA_BACKUPS_ARE_OFF, BackupAlert.MEDIA_WILL_BE_DELETED_TODAY -> {
performFullMediaDownload()
}
BackupAlert.DISK_FULL -> Unit
}
@@ -97,13 +115,16 @@ class BackupAlertBottomSheet : ComposeBottomSheetDialogFragment() {
BackupAlert.COULD_NOT_COMPLETE_BACKUP -> {
// TODO [message-backups] - Dismiss and notify later
}
BackupAlert.PAYMENT_PROCESSING -> error("PAYMENT_PROCESSING state does not support a secondary action.")
BackupAlert.PAYMENT_PROCESSING -> Unit
BackupAlert.MEDIA_BACKUPS_ARE_OFF -> {
// TODO [message-backups] - Silence and remind on last day
}
BackupAlert.MEDIA_WILL_BE_DELETED_TODAY -> {
displayLastChanceDialog()
}
BackupAlert.DISK_FULL -> Unit
}
@@ -130,8 +151,9 @@ class BackupAlertBottomSheet : ComposeBottomSheetDialogFragment() {
@Composable
private fun BackupAlertSheetContent(
backupAlert: BackupAlert,
onPrimaryActionClick: () -> Unit,
onSecondaryActionClick: () -> Unit
pricePerMonth: String = "",
onPrimaryActionClick: () -> Unit = {},
onSecondaryActionClick: () -> Unit = {}
) {
Column(
horizontalAlignment = Alignment.CenterHorizontally,
@@ -143,20 +165,43 @@ private fun BackupAlertSheetContent(
Spacer(modifier = Modifier.size(26.dp))
val iconColors = rememberBackupsIconColors(backupAlert = backupAlert)
Icon(
painter = painterResource(id = R.drawable.symbol_backup_light), // TODO [message-backups] final asset
contentDescription = null,
tint = iconColors.foreground,
modifier = Modifier
.size(88.dp)
.background(color = iconColors.background, shape = CircleShape)
.padding(20.dp)
)
when (backupAlert) {
BackupAlert.PAYMENT_PROCESSING, BackupAlert.MEDIA_BACKUPS_ARE_OFF -> {
Box {
Image(
painter = painterResource(id = R.drawable.image_signal_backups),
contentDescription = null,
modifier = Modifier
.size(80.dp)
.padding(2.dp)
)
Icon(
painter = painterResource(R.drawable.symbol_error_circle_fill_24),
contentDescription = null,
tint = MaterialTheme.colorScheme.error,
modifier = Modifier.align(Alignment.TopEnd)
)
}
}
else -> {
val iconColors = rememberBackupsIconColors(backupAlert = backupAlert)
Icon(
painter = painterResource(id = R.drawable.symbol_backup_light),
contentDescription = null,
tint = iconColors.foreground,
modifier = Modifier
.size(80.dp)
.background(color = iconColors.background, shape = CircleShape)
.padding(20.dp)
)
}
}
Text(
text = stringResource(id = rememberTitleResource(backupAlert = backupAlert)),
style = MaterialTheme.typography.titleLarge,
textAlign = TextAlign.Center,
modifier = Modifier.padding(top = 16.dp, bottom = 6.dp)
)
@@ -164,9 +209,8 @@ private fun BackupAlertSheetContent(
BackupAlert.COULD_NOT_COMPLETE_BACKUP -> CouldNotCompleteBackup(
daysSinceLastBackup = 7 // TODO [message-backups]
)
BackupAlert.PAYMENT_PROCESSING -> PaymentProcessingBody(
paymentMethodType = InAppPaymentData.PaymentMethodType.GOOGLE_PAY // TODO [message-backups] -- Get this data from elsewhere... The active subscription object?
)
BackupAlert.PAYMENT_PROCESSING -> PaymentProcessingBody()
BackupAlert.MEDIA_BACKUPS_ARE_OFF -> MediaBackupsAreOffBody(30) // TODO [message-backups] -- Get this value from backend
BackupAlert.MEDIA_WILL_BE_DELETED_TODAY -> MediaWillBeDeletedTodayBody()
BackupAlert.DISK_FULL -> DiskFullBody(
@@ -184,7 +228,7 @@ private fun BackupAlertSheetContent(
.defaultMinSize(minWidth = 220.dp)
.padding(bottom = padBottom)
) {
Text(text = stringResource(id = rememberPrimaryActionResource(backupAlert = backupAlert)))
Text(text = primaryActionString(backupAlert = backupAlert, pricePerMonth = pricePerMonth))
}
if (secondaryActionResource > 0) {
@@ -201,15 +245,18 @@ private fun CouldNotCompleteBackup(
) {
Text(
text = stringResource(id = R.string.BackupAlertBottomSheet__your_device_hasnt, daysSinceLastBackup),
textAlign = TextAlign.Center,
color = MaterialTheme.colorScheme.onSurfaceVariant,
modifier = Modifier.padding(bottom = 60.dp)
)
}
@Composable
private fun PaymentProcessingBody(paymentMethodType: InAppPaymentData.PaymentMethodType) {
private fun PaymentProcessingBody() {
Text(
text = stringResource(id = R.string.BackupAlertBottomSheet__were_having_trouble_collecting__google_pay),
text = stringResource(id = R.string.BackupAlertBottomSheet__check_to_make_sure_your_payment_method),
textAlign = TextAlign.Center,
color = MaterialTheme.colorScheme.onSurfaceVariant,
modifier = Modifier.padding(bottom = 60.dp)
)
}
@@ -219,14 +266,16 @@ private fun MediaBackupsAreOffBody(
daysUntilDeletion: Long
) {
Text(
text = pluralStringResource(id = R.plurals.BackupAlertBottomSheet__your_signal_media_backup_plan, daysUntilDeletion.toInt(), daysUntilDeletion),
text = pluralStringResource(id = R.plurals.BackupAlertBottomSheet__your_backup_plan_has_expired, daysUntilDeletion.toInt(), daysUntilDeletion),
textAlign = TextAlign.Center,
color = MaterialTheme.colorScheme.onSurfaceVariant,
modifier = Modifier.padding(bottom = 24.dp)
)
Text(
text = stringResource(id = R.string.BackupAlertBottomSheet__you_can_begin_paying_for_backups_again),
textAlign = TextAlign.Center,
color = MaterialTheme.colorScheme.onSurfaceVariant,
modifier = Modifier.padding(bottom = 36.dp)
)
}
@@ -236,12 +285,14 @@ private fun MediaWillBeDeletedTodayBody() {
Text(
text = stringResource(id = R.string.BackupAlertBottomSheet__your_signal_media_backup_plan_has_been),
textAlign = TextAlign.Center,
color = MaterialTheme.colorScheme.onSurfaceVariant,
modifier = Modifier.padding(bottom = 24.dp)
)
Text(
text = stringResource(id = R.string.BackupAlertBottomSheet__you_can_begin_paying_for_backups_again),
textAlign = TextAlign.Center,
color = MaterialTheme.colorScheme.onSurfaceVariant,
modifier = Modifier.padding(bottom = 36.dp)
)
}
@@ -254,12 +305,14 @@ private fun DiskFullBody(
Text(
text = stringResource(id = R.string.BackupAlertBottomSheet__your_device_does_not_have_enough_free_space, requiredSpace),
textAlign = TextAlign.Center,
color = MaterialTheme.colorScheme.onSurfaceVariant,
modifier = Modifier.padding(bottom = 24.dp)
)
Text(
text = pluralStringResource(id = R.plurals.BackupAlertBottomSheet__if_you_choose_skip, daysUntilDeletion.toInt(), daysUntilDeletion), // TODO [message-backups] Learn More link
textAlign = TextAlign.Center,
color = MaterialTheme.colorScheme.onSurfaceVariant,
modifier = Modifier.padding(bottom = 36.dp)
)
}
@@ -268,8 +321,9 @@ private fun DiskFullBody(
private fun rememberBackupsIconColors(backupAlert: BackupAlert): BackupsIconColors {
return remember(backupAlert) {
when (backupAlert) {
BackupAlert.COULD_NOT_COMPLETE_BACKUP, BackupAlert.PAYMENT_PROCESSING, BackupAlert.DISK_FULL -> BackupsIconColors.Warning
BackupAlert.MEDIA_BACKUPS_ARE_OFF, BackupAlert.MEDIA_WILL_BE_DELETED_TODAY -> BackupsIconColors.Error
BackupAlert.PAYMENT_PROCESSING, BackupAlert.MEDIA_BACKUPS_ARE_OFF -> error("Not icon-based options.")
BackupAlert.COULD_NOT_COMPLETE_BACKUP, BackupAlert.DISK_FULL -> BackupsIconColors.Warning
BackupAlert.MEDIA_WILL_BE_DELETED_TODAY -> BackupsIconColors.Error
}
}
}
@@ -280,8 +334,8 @@ private fun rememberTitleResource(backupAlert: BackupAlert): Int {
return remember(backupAlert) {
when (backupAlert) {
BackupAlert.COULD_NOT_COMPLETE_BACKUP -> R.string.BackupAlertBottomSheet__couldnt_complete_backup
BackupAlert.PAYMENT_PROCESSING -> R.string.BackupAlertBottomSheet__cant_process_backup_payment
BackupAlert.MEDIA_BACKUPS_ARE_OFF -> R.string.BackupAlertBottomSheet__media_backups_are_off
BackupAlert.PAYMENT_PROCESSING -> R.string.BackupAlertBottomSheet__your_backups_subscription_failed_to_renew
BackupAlert.MEDIA_BACKUPS_ARE_OFF -> R.string.BackupAlertBottomSheet__your_backups_subscription_expired
BackupAlert.MEDIA_WILL_BE_DELETED_TODAY -> R.string.BackupAlertBottomSheet__your_media_will_be_deleted_today
BackupAlert.DISK_FULL -> R.string.BackupAlertBottomSheet__cant_complete_download
}
@@ -289,15 +343,16 @@ private fun rememberTitleResource(backupAlert: BackupAlert): Int {
}
@Composable
private fun rememberPrimaryActionResource(backupAlert: BackupAlert): Int {
return remember(backupAlert) {
when (backupAlert) {
BackupAlert.COULD_NOT_COMPLETE_BACKUP -> android.R.string.ok // TODO [message-backups] -- Finalized copy
BackupAlert.PAYMENT_PROCESSING -> android.R.string.ok
BackupAlert.MEDIA_BACKUPS_ARE_OFF -> R.string.BackupAlertBottomSheet__download_media_now
BackupAlert.MEDIA_WILL_BE_DELETED_TODAY -> R.string.BackupAlertBottomSheet__download_media_now
BackupAlert.DISK_FULL -> android.R.string.ok
}
private fun primaryActionString(
backupAlert: BackupAlert,
pricePerMonth: String
): String {
return when (backupAlert) {
BackupAlert.COULD_NOT_COMPLETE_BACKUP -> stringResource(android.R.string.ok) // TODO [message-backups] -- Finalized copy
BackupAlert.PAYMENT_PROCESSING -> stringResource(R.string.BackupAlertBottomSheet__manage_subscription)
BackupAlert.MEDIA_BACKUPS_ARE_OFF -> stringResource(R.string.BackupAlertBottomSheet__subscribe_for_s_month, pricePerMonth)
BackupAlert.MEDIA_WILL_BE_DELETED_TODAY -> stringResource(R.string.BackupAlertBottomSheet__download_media_now)
BackupAlert.DISK_FULL -> stringResource(android.R.string.ok)
}
}
@@ -306,8 +361,8 @@ private fun rememberSecondaryActionResource(backupAlert: BackupAlert): Int {
return remember(backupAlert) {
when (backupAlert) {
BackupAlert.COULD_NOT_COMPLETE_BACKUP -> android.R.string.cancel // TODO [message-backups] -- Finalized copy
BackupAlert.PAYMENT_PROCESSING -> -1
BackupAlert.MEDIA_BACKUPS_ARE_OFF -> R.string.BackupAlertBottomSheet__download_later
BackupAlert.PAYMENT_PROCESSING -> R.string.BackupAlertBottomSheet__not_now
BackupAlert.MEDIA_BACKUPS_ARE_OFF -> R.string.BackupAlertBottomSheet__not_now
BackupAlert.MEDIA_WILL_BE_DELETED_TODAY -> R.string.BackupAlertBottomSheet__dont_download_media
BackupAlert.DISK_FULL -> R.string.BackupAlertBottomSheet__skip
}
@@ -319,9 +374,7 @@ private fun rememberSecondaryActionResource(backupAlert: BackupAlert): Int {
private fun BackupAlertSheetContentPreviewGeneric() {
Previews.BottomSheetPreview {
BackupAlertSheetContent(
backupAlert = BackupAlert.COULD_NOT_COMPLETE_BACKUP,
onPrimaryActionClick = {},
onSecondaryActionClick = {}
backupAlert = BackupAlert.COULD_NOT_COMPLETE_BACKUP
)
}
}
@@ -331,9 +384,7 @@ private fun BackupAlertSheetContentPreviewGeneric() {
private fun BackupAlertSheetContentPreviewPayment() {
Previews.BottomSheetPreview {
BackupAlertSheetContent(
backupAlert = BackupAlert.PAYMENT_PROCESSING,
onPrimaryActionClick = {},
onSecondaryActionClick = {}
backupAlert = BackupAlert.PAYMENT_PROCESSING
)
}
}
@@ -344,8 +395,7 @@ private fun BackupAlertSheetContentPreviewMedia() {
Previews.BottomSheetPreview {
BackupAlertSheetContent(
backupAlert = BackupAlert.MEDIA_BACKUPS_ARE_OFF,
onPrimaryActionClick = {},
onSecondaryActionClick = {}
pricePerMonth = "$2.99"
)
}
}
@@ -355,9 +405,7 @@ private fun BackupAlertSheetContentPreviewMedia() {
private fun BackupAlertSheetContentPreviewDelete() {
Previews.BottomSheetPreview {
BackupAlertSheetContent(
backupAlert = BackupAlert.MEDIA_WILL_BE_DELETED_TODAY,
onPrimaryActionClick = {},
onSecondaryActionClick = {}
backupAlert = BackupAlert.MEDIA_WILL_BE_DELETED_TODAY
)
}
}
@@ -367,9 +415,7 @@ private fun BackupAlertSheetContentPreviewDelete() {
private fun BackupAlertSheetContentPreviewDiskFull() {
Previews.BottomSheetPreview {
BackupAlertSheetContent(
backupAlert = BackupAlert.DISK_FULL,
onPrimaryActionClick = {},
onSecondaryActionClick = {}
backupAlert = BackupAlert.DISK_FULL
)
}
}

View File

@@ -16,6 +16,11 @@ sealed interface BackupsIconColors {
@get:Composable
val background: Color
data object None : BackupsIconColors {
override val foreground: Color @Composable get() = error("No coloring should be applied.")
override val background: Color @Composable get() = error("No coloring should be applied.")
}
data object Normal : BackupsIconColors {
override val foreground: Color @Composable get() = MaterialTheme.colorScheme.onSurface
override val background: Color @Composable get() = MaterialTheme.colorScheme.primaryContainer

View File

@@ -6,15 +6,12 @@
package org.thoughtcrime.securesms.backup.v2.ui
import android.content.DialogInterface
import androidx.compose.foundation.background
import androidx.compose.foundation.Image
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.Spacer
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.foundation.layout.widthIn
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Text
import androidx.compose.material3.TextButton
@@ -87,26 +84,24 @@ private fun CreateBackupBottomSheetContent(
Column(
horizontalAlignment = Alignment.CenterHorizontally,
modifier = Modifier.fillMaxWidth()
.padding(horizontal = dimensionResource(R.dimen.core_ui__gutter))
.padding(bottom = 24.dp)
) {
BottomSheets.Handle()
Icon(
painter = painterResource(id = R.drawable.symbol_backup_light),
tint = BackupsIconColors.Normal.foreground,
Image(
painter = painterResource(id = R.drawable.image_signal_backups),
contentDescription = null,
modifier = Modifier
.padding(top = 18.dp, bottom = 11.dp)
.size(88.dp)
.background(
color = BackupsIconColors.Normal.background,
shape = CircleShape
)
.padding(20.dp)
.size(80.dp)
.padding(4.dp)
)
Text(
text = stringResource(id = R.string.CreateBackupBottomSheet__create_backup),
style = MaterialTheme.typography.titleLarge
text = stringResource(id = R.string.CreateBackupBottomSheet__you_are_all_set),
style = MaterialTheme.typography.titleLarge,
textAlign = TextAlign.Center
)
Text(
@@ -116,33 +111,24 @@ private fun CreateBackupBottomSheetContent(
textAlign = TextAlign.Center,
modifier = Modifier
.padding(top = 8.dp, bottom = 64.dp)
.padding(horizontal = dimensionResource(id = R.dimen.core_ui__gutter))
)
Row(
modifier = Modifier
.fillMaxWidth()
.padding(bottom = 31.dp)
Buttons.LargeTonal(
onClick = onBackupNowClick,
modifier = Modifier.widthIn(min = 220.dp)
) {
TextButton(
onClick = onBackupLaterClick,
modifier = Modifier.padding(start = dimensionResource(id = R.dimen.core_ui__gutter))
) {
Text(
text = stringResource(id = R.string.CreateBackupBottomSheet__back_up_later)
)
}
Text(
text = stringResource(id = R.string.CreateBackupBottomSheet__back_up_now)
)
}
Spacer(modifier = Modifier.weight(1f))
Buttons.LargeTonal(
onClick = onBackupNowClick,
modifier = Modifier.padding(end = dimensionResource(id = R.dimen.core_ui__gutter))
) {
Text(
text = stringResource(id = R.string.CreateBackupBottomSheet__back_up_now)
)
}
TextButton(
onClick = onBackupLaterClick,
modifier = Modifier.widthIn(min = 220.dp).padding(top = 16.dp)
) {
Text(
text = stringResource(id = R.string.CreateBackupBottomSheet__back_up_later)
)
}
}
}

View File

@@ -6,7 +6,6 @@
package org.thoughtcrime.securesms.backup.v2.ui.subscription
import androidx.compose.foundation.Image
import androidx.compose.foundation.background
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Row
@@ -15,7 +14,6 @@ import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.size
import androidx.compose.foundation.lazy.LazyColumn
import androidx.compose.foundation.shape.CircleShape
import androidx.compose.material3.Icon
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Text
@@ -33,7 +31,6 @@ import androidx.compose.ui.unit.dp
import org.signal.core.ui.Buttons
import org.signal.core.ui.Previews
import org.signal.core.ui.Scaffolds
import org.signal.core.ui.theme.SignalTheme
import org.thoughtcrime.securesms.R
/**
@@ -65,11 +62,11 @@ fun MessageBackupsEducationScreen(
) {
item {
Image(
painter = painterResource(id = R.drawable.ic_signal_logo_large), // TODO [message-backups] Final image asset
painter = painterResource(id = R.drawable.image_signal_backups), // TODO [message-backups] Final image asset
contentDescription = null,
modifier = Modifier
.padding(top = 48.dp)
.size(88.dp)
.padding(top = 24.dp)
.size(80.dp)
)
}
@@ -175,7 +172,6 @@ private fun NotableFeatureRow(
modifier = Modifier
.padding(end = 8.dp)
.size(32.dp)
.background(color = SignalTheme.colors.colorSurface2, shape = CircleShape)
.padding(6.dp)
)

View File

@@ -5,15 +5,13 @@
package org.thoughtcrime.securesms.backup.v2.ui.subscription
import androidx.compose.foundation.background
import androidx.compose.foundation.Image
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.fillMaxSize
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.runtime.Composable
@@ -50,18 +48,12 @@ fun MessageBackupsKeyEducationScreen(
.fillMaxSize(),
horizontalAlignment = Alignment.CenterHorizontally
) {
Icon(
painter = painterResource(R.drawable.symbol_key_24),
Image(
painter = painterResource(R.drawable.image_signal_backups_key),
contentDescription = null,
tint = MaterialTheme.colorScheme.primary,
modifier = Modifier
.padding(top = 24.dp)
.size(80.dp)
.background(
color = MaterialTheme.colorScheme.primaryContainer,
shape = CircleShape
)
.padding(16.dp)
)
Text(

View File

@@ -5,6 +5,7 @@
package org.thoughtcrime.securesms.backup.v2.ui.subscription
import androidx.compose.foundation.Image
import androidx.compose.foundation.background
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.Column
@@ -13,11 +14,9 @@ import androidx.compose.foundation.layout.fillMaxSize
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.foundation.shape.RoundedCornerShape
import androidx.compose.material3.Checkbox
import androidx.compose.material3.ExperimentalMaterial3Api
import androidx.compose.material3.Icon
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.ModalBottomSheet
import androidx.compose.material3.Text
@@ -80,18 +79,12 @@ fun MessageBackupsKeyRecordScreen(
.fillMaxSize(),
horizontalAlignment = Alignment.CenterHorizontally
) {
Icon(
painter = painterResource(R.drawable.symbol_lock_24),
Image(
painter = painterResource(R.drawable.image_signal_backups_lock),
contentDescription = null,
tint = MaterialTheme.colorScheme.primary,
modifier = Modifier
.padding(top = 24.dp)
.size(80.dp)
.background(
color = MaterialTheme.colorScheme.primaryContainer,
shape = CircleShape
)
.padding(16.dp)
)
Text(

View File

@@ -93,7 +93,7 @@ fun MessageBackupsTypeSelectionScreen(
) {
item {
Image(
painter = painterResource(id = R.drawable.ic_signal_logo_large), // TODO [message-backups] Finalized art asset
painter = painterResource(id = R.drawable.image_signal_backups_plans),
contentDescription = null,
modifier = Modifier.size(88.dp)
)

View File

@@ -0,0 +1,36 @@
/*
* Copyright 2024 Signal Messenger, LLC
* SPDX-License-Identifier: AGPL-3.0-only
*/
package org.thoughtcrime.securesms.billing
import android.content.Intent
import android.net.Uri
import androidx.fragment.app.Fragment
import androidx.lifecycle.lifecycleScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext
import org.thoughtcrime.securesms.R
import org.thoughtcrime.securesms.dependencies.GooglePlayBillingDependencies
/**
* Launches user to the Google Play backups management screen.
*/
fun Fragment.launchManageBackupsSubscription() {
lifecycleScope.launch(Dispatchers.Main) {
val uri = withContext(Dispatchers.Default) {
Uri.parse(
getString(
R.string.backup_subscription_management_url,
GooglePlayBillingDependencies.getProductId(),
requireContext().applicationInfo.packageName
)
)
}
val intent = Intent(Intent.ACTION_VIEW, uri)
startActivity(intent)
}
}

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) {

View File

@@ -0,0 +1,33 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="80dp"
android:height="80dp"
android:viewportWidth="80"
android:viewportHeight="80">
<path
android:fillColor="#FF9CA4EF"
android:fillType="evenOdd"
android:pathData="M67 60.42c0.92 0.8 1.02 2.2 0.22 3.13-4.69 5.43-11.04 9.51-18.53 11.38-7.48 1.86-15 1.23-21.7-1.37-1.14-0.44-1.7-1.73-1.26-2.87 0.44-1.15 1.73-1.71 2.87-1.27 5.86 2.28 12.45 2.83 19.02 1.2 6.57-1.64 12.13-5.22 16.24-9.97 0.8-0.93 2.2-1.04 3.13-0.23Z"/>
<path
android:fillColor="#FFD2D8FE"
android:fillType="evenOdd"
android:pathData="M40 67.55c-5.15 0-9.98-1.41-14.1-3.88V59.1c0-2.95-2.39-5.33-5.33-5.33-1.38 0-2.64 0.52-3.59 1.38-2.86-4.35-4.53-9.55-4.53-15.15 0-15.21 12.33-27.55 27.55-27.55 15.21 0 27.55 12.34 27.55 27.55 0 15.22-12.34 27.55-27.55 27.55Z"/>
<path
android:fillColor="#FF666EE5"
android:pathData="M36.53 25.76l-0.6 21.43v0.13c0 1.44 1.1 2.6 2.44 2.6h0.16l14.37-0.64c0.98-0.04 1.76-0.91 1.76-1.96 0-1.06-0.78-1.92-1.76-1.97l-12.16-0.54-0.53-19.05c-0.03-1.06-0.85-1.9-1.84-1.9-1 0-1.8 0.84-1.84 1.9Z"/>
<path
android:fillColor="#FF666EE5"
android:fillType="evenOdd"
android:pathData="M63.55 12.78c5.43 4.69 9.51 11.04 11.38 18.53 1.86 7.48 1.23 15-1.37 21.7-0.44 1.14-1.73 1.7-2.87 1.26-1.15-0.44-1.71-1.73-1.27-2.87 2.28-5.86 2.83-12.45 1.2-19.02-1.64-6.57-5.22-12.13-9.97-16.24-0.93-0.8-1.04-2.2-0.23-3.13 0.8-0.93 2.2-1.03 3.13-0.23Z"/>
<path
android:fillColor="#FF9CA4EF"
android:fillType="evenOdd"
android:pathData="M54.27 9.31c-0.44 1.15-1.73 1.71-2.87 1.27-5.86-2.28-12.45-2.83-19.02-1.2-6.57 1.64-12.13 5.22-16.24 9.97-0.8 0.93-2.2 1.04-3.13 0.23-0.93-0.8-1.03-2.2-0.23-3.13 4.69-5.43 11.04-9.51 18.53-11.38 7.48-1.86 15-1.23 21.7 1.37 1.14 0.44 1.7 1.73 1.26 2.87Z"/>
<path
android:fillColor="#FF666EE5"
android:fillType="evenOdd"
android:pathData="M20.45 56.96c0.98 0 1.78 0.8 1.78 1.78v8.14c0 0.98-0.8 1.78-1.78 1.78h-8.96c-0.98 0-1.78-0.8-1.78-1.78s0.8-1.77 1.78-1.77h7.18v-6.37c0-0.98 0.8-1.78 1.78-1.78Z"/>
<path
android:fillColor="#FF666EE5"
android:fillType="evenOdd"
android:pathData="M9.31 25.73c1.15 0.44 1.71 1.73 1.27 2.87-2.28 5.86-2.83 12.45-1.2 19.02 1.64 6.57 5.22 12.13 9.97 16.24l1.69 1.45-2.9 3.36-1.69-1.45C11.02 62.53 6.94 56.18 5.07 48.7c-1.86-7.48-1.23-15 1.37-21.7 0.44-1.14 1.73-1.7 2.87-1.26Z"/>
</vector>

View File

@@ -0,0 +1,17 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="80dp"
android:height="80dp"
android:viewportWidth="80"
android:viewportHeight="80">
<path
android:fillColor="#FFD2D8FE"
android:pathData="M40 0A40 40 0 1 0 40 80 40 40 0 1 0 40 0z"/>
<path
android:fillColor="#FF505AF5"
android:fillType="evenOdd"
android:pathData="M33 49.75c0 1.66-1.34 3-3 3-1.65 0-3-1.34-3-3s1.35-3 3-3c1.66 0 3 1.34 3 3Z"/>
<path
android:fillColor="#FF505AF5"
android:fillType="evenOdd"
android:pathData="M51.41 20.25H57c1.52 0 2.75 1.23 2.75 2.75v8c0 1.52-1.23 2.75-2.75 2.75h-4.25V38c0 1.52-1.23 2.75-2.75 2.75h-2.77l-1.8 1.8c0.53 1.47 0.82 3.05 0.82 4.7C46.25 54.85 40.1 61 32.5 61c-6.09 0-11.25-3.96-13.06-9.45-0.45-1.35-0.69-2.8-0.69-4.3 0-1.69 0.3-3.31 0.87-4.81 1.95-5.22 6.98-8.94 12.88-8.94 1.38 0 2.7 0.2 3.96 0.58l13-13.02c0.52-0.52 1.22-0.81 1.95-0.81Zm-14.06 17.9l-1.07-0.43C35.11 37.25 33.84 37 32.5 37c-4.4 0-8.15 2.77-9.6 6.66-0.42 1.12-0.65 2.32-0.65 3.59 0 1.12 0.18 2.2 0.52 3.2 1.34 4.1 5.2 7.05 9.73 7.05 5.66 0 10.25-4.59 10.25-10.25 0-1.56-0.34-3.04-0.97-4.36l-0.52-1.1 3.7-3.73c0.52-0.52 1.22-0.81 1.96-0.81h2.33V33c0-1.52 1.23-2.75 2.75-2.75h4.25v-6.5h-4.52l-14.38 14.4Z"/>
</vector>

View File

@@ -0,0 +1,17 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="80dp"
android:height="80dp"
android:viewportWidth="80"
android:viewportHeight="80">
<path
android:fillColor="#FFD2D8FE"
android:pathData="M40 0A40 40 0 1 0 40 80 40 40 0 1 0 40 0z"/>
<path
android:fillColor="#FF505AF5"
android:fillType="evenOdd"
android:pathData="M38.25 48.99c-0.9-0.58-1.5-1.59-1.5-2.74 0-1.8 1.46-3.25 3.25-3.25 1.8 0 3.25 1.46 3.25 3.25 0 1.15-0.6 2.16-1.5 2.74v3.51c0 0.97-0.78 1.75-1.75 1.75s-1.75-0.78-1.75-1.75v-3.51Z"/>
<path
android:fillColor="#FF505AF5"
android:fillType="evenOdd"
android:pathData="M27.75 29.5c0-6.77 5.48-12.25 12.25-12.25s12.25 5.48 12.25 12.25v5.47l0.27 0.12c1.46 0.75 2.64 1.93 3.39 3.4 0.47 0.92 0.66 1.92 0.75 3.03 0.09 1.07 0.09 2.39 0.09 4v5.95c0 1.62 0 2.94-0.09 4.01-0.09 1.11-0.28 2.1-0.75 3.04-0.75 1.46-1.93 2.64-3.4 3.39-0.92 0.47-1.92 0.66-3.03 0.75-1.07 0.09-2.39 0.09-4 0.09H34.52c-1.62 0-2.94 0-4.01-0.09-1.11-0.09-2.1-0.28-3.04-0.75-1.46-0.75-2.64-1.93-3.39-3.4-0.47-0.92-0.66-1.92-0.75-3.03-0.09-1.07-0.09-2.39-0.09-4v-5.95c0-1.62 0-2.94 0.09-4.01 0.09-1.11 0.28-2.1 0.75-3.04 0.75-1.46 1.93-2.64 3.4-3.39l0.26-0.12V29.5Zm21 0v4.8c-0.93-0.05-2.01-0.05-3.28-0.05H34.53c-1.27 0-2.35 0-3.28 0.04V29.5c0-4.83 3.92-8.75 8.75-8.75s8.75 3.92 8.75 8.75Zm-19.68 8.71c0.35-0.18 0.84-0.31 1.73-0.38 0.91-0.08 2.1-0.08 3.8-0.08h10.8c1.7 0 2.89 0 3.8 0.08 0.9 0.07 1.38 0.2 1.73 0.38 0.8 0.41 1.45 1.06 1.86 1.86 0.18 0.35 0.31 0.84 0.38 1.73 0.08 0.91 0.08 2.1 0.08 3.8v5.8c0 1.7 0 2.89-0.08 3.8-0.07 0.9-0.2 1.38-0.38 1.73-0.41 0.8-1.06 1.45-1.86 1.86-0.35 0.18-0.84 0.31-1.73 0.38-0.91 0.08-2.1 0.08-3.8 0.08H34.6c-1.7 0-2.89 0-3.8-0.08-0.9-0.07-1.38-0.2-1.73-0.38-0.8-0.41-1.45-1.06-1.86-1.86-0.18-0.35-0.31-0.84-0.38-1.73-0.08-0.91-0.08-2.1-0.08-3.8v-5.8c0-1.7 0-2.89 0.08-3.8 0.07-0.9 0.2-1.38 0.38-1.73 0.41-0.8 1.06-1.45 1.86-1.86Z"/>
</vector>

View File

@@ -0,0 +1,73 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:aapt="http://schemas.android.com/aapt"
android:width="80dp"
android:height="80dp"
android:viewportWidth="80"
android:viewportHeight="80">
<path
android:pathData="M20 22.67c0-5.14 0-7.7 1-9.66 0.88-1.73 2.28-3.13 4-4.01 1.97-1 4.53-1 9.67-1h10.66c5.14 0 7.7 0 9.66 1 1.73 0.88 3.13 2.28 4.01 4 1 1.97 1 4.53 1 9.67v34.66c0 5.14 0 7.7-1 9.66-0.88 1.73-2.28 3.13-4 4.01-1.97 1-4.53 1-9.67 1H34.67c-5.14 0-7.7 0-9.66-1-1.73-0.88-3.13-2.28-4.01-4-1-1.97-1-4.53-1-9.67V22.67Z">
<aapt:attr name="android:fillColor">
<gradient
android:type="linear"
android:startX="40"
android:startY="8"
android:endX="40"
android:endY="72">
<item
android:color="#FFD2D8FE"
android:offset="0"/>
<item
android:color="#FFC1C7FE"
android:offset="1"/>
</gradient>
</aapt:attr>
</path>
<path
android:fillColor="#FF666EE5"
android:fillType="evenOdd"
android:pathData="M34.6 6.5h10.8c2.51 0 4.49 0 6.08 0.13 1.62 0.13 2.97 0.4 4.2 1.03 2 1.03 3.63 2.66 4.66 4.66 0.62 1.23 0.9 2.58 1.03 4.2 0.13 1.6 0.13 3.57 0.13 6.08v34.8c0 2.51 0 4.49-0.13 6.08-0.13 1.62-0.4 2.97-1.03 4.2-1.03 2-2.66 3.63-4.66 4.66-1.23 0.62-2.58 0.9-4.2 1.03-1.6 0.13-3.57 0.13-6.08 0.13H34.6c-2.51 0-4.49 0-6.08-0.13-1.62-0.13-2.97-0.4-4.2-1.03-2-1.03-3.63-2.66-4.66-4.66-0.62-1.23-0.9-2.58-1.03-4.2-0.13-1.6-0.13-3.57-0.13-6.08V22.6c0-2.51 0-4.49 0.13-6.08 0.13-1.62 0.4-2.97 1.03-4.2 1.03-2 2.66-3.63 4.66-4.66 1.23-0.62 2.58-0.9 4.2-1.03C30.12 6.5 32.1 6.5 34.6 6.5Zm-5.83 3.12c-1.44 0.12-2.35 0.34-3.08 0.72-1.45 0.73-2.62 1.9-3.35 3.35-0.38 0.73-0.6 1.64-0.72 3.08-0.12 1.45-0.12 3.3-0.12 5.9v34.66c0 2.6 0 4.45 0.12 5.9 0.12 1.44 0.34 2.35 0.72 3.08 0.73 1.45 1.9 2.62 3.35 3.35 0.73 0.38 1.64 0.6 3.08 0.72 1.45 0.12 3.3 0.12 5.9 0.12h10.66c2.6 0 4.45 0 5.9-0.12 1.44-0.12 2.35-0.34 3.08-0.72 1.45-0.73 2.62-1.9 3.35-3.35 0.38-0.73 0.6-1.64 0.72-3.08 0.12-1.45 0.12-3.3 0.12-5.9V22.67c0-2.6 0-4.45-0.12-5.9-0.12-1.44-0.34-2.35-0.72-3.08-0.73-1.45-1.9-2.62-3.35-3.35-0.73-0.38-1.64-0.6-3.08-0.72-1.45-0.12-3.3-0.12-5.9-0.12H34.67c-2.6 0-4.45 0-5.9 0.12Z"/>
<path
android:fillColor="#FFE3E8FE"
android:pathData="M19.37 40.66l-4.11 0.91-4.57 1.37-1.83 3.2-2.29 3.66-0.46 5.49 1.83 4.11-1.37 5.94 6.4-0.91L18 65.34l5.94-0.45c1.37-1.22 4.12-3.75 4.12-4.12 0-0.36 2.13-2.9 3.2-4.11l-0.46-5.49-0.91-4.57-5.95-4.57-4.57-1.37Z"/>
<path
android:fillColor="#FF666EE5"
android:fillType="evenOdd"
android:pathData="M4.17 53c0-7.64 6.19-13.83 13.83-13.83S31.83 45.36 31.83 53 25.64 66.83 18 66.83c-2.4 0-4.65-0.6-6.61-1.68l-5 1.8c-1.45 0.53-2.87-0.89-2.34-2.34l1.8-5C4.78 57.65 4.17 55.4 4.17 53ZM18 41.5c-6.35 0-11.5 5.15-11.5 11.5 0 2.06 0.54 3.98 1.48 5.65 0.26 0.46 0.33 1.02 0.14 1.54L6.6 64.4l4.2-1.5c0.53-0.2 1.1-0.13 1.55 0.13 1.67 0.94 3.6 1.48 5.65 1.48 6.35 0 11.5-5.15 11.5-11.5S24.35 41.5 18 41.5Z"/>
<path
android:strokeColor="#FF666EE5"
android:strokeWidth="1"
android:pathData="M19.37 40.66l-4.11 0.91-4.57 1.37-1.83 3.2-2.29 3.66-0.46 5.49 1.83 4.11-1.37 5.94 6.4-0.91L18 65.34l5.94-0.45c1.37-1.22 4.12-3.75 4.12-4.12 0-0.36 2.13-2.9 3.2-4.11l-0.46-5.49-0.91-4.57-5.95-4.57-4.57-1.37Z"/>
<path
android:strokeColor="#FF666EE5"
android:strokeWidth="1"
android:pathData="M4.17 53c0-7.64 6.19-13.83 13.83-13.83S31.83 45.36 31.83 53 25.64 66.83 18 66.83c-2.4 0-4.65-0.6-6.61-1.68l-5 1.8c-1.45 0.53-2.87-0.89-2.34-2.34l1.8-5C4.78 57.65 4.17 55.4 4.17 53ZM18 41.5c-6.35 0-11.5 5.15-11.5 11.5 0 2.06 0.54 3.98 1.48 5.65 0.26 0.46 0.33 1.02 0.14 1.54L6.6 64.4l4.2-1.5c0.53-0.2 1.1-0.13 1.55 0.13 1.67 0.94 3.6 1.48 5.65 1.48 6.35 0 11.5-5.15 11.5-11.5S24.35 41.5 18 41.5Z"/>
<path
android:fillColor="#FFE3E8FE"
android:pathData="M48.82 17.77c-0.14 4.61-0.43 14.08-0.43 15.12l1.3 2.16 6.04-5.18 4.32 2.59 8.2-6.48 7.35 5.61 0.43-12.09-3.45-3.45L52.7 15.6l-3.89 2.16Z"/>
<path
android:fillColor="#FFE3E8FE"
android:pathData="M55.41 30.2l-6.58 6.14v0.44l2.2 3.07 7.46 0.44 13.6-0.44 3.52-3.07 0.88-4.39-8.34-6.15-7.47 6.15-5.27-2.2Z"/>
<path
android:fillColor="#FF666EE5"
android:pathData="M53.38 23.13c0-1.45 1.17-2.63 2.62-2.63 1.45 0 2.63 1.18 2.63 2.63 0 1.44-1.18 2.62-2.63 2.62s-2.63-1.18-2.63-2.63Z"/>
<path
android:fillColor="#FF666EE5"
android:fillType="evenOdd"
android:pathData="M77.56 24.34v7.32c0 1.42 0 2.57-0.07 3.5-0.08 0.95-0.25 1.8-0.64 2.57-0.63 1.23-1.64 2.24-2.87 2.87-0.78 0.4-1.62 0.56-2.57 0.64-0.93 0.07-2.08 0.07-3.5 0.07H56.09c-1.42 0-2.57 0-3.5-0.07-0.95-0.08-1.8-0.25-2.57-0.64-1.23-0.63-2.24-1.64-2.87-2.87-0.4-0.78-0.56-1.62-0.64-2.57-0.07-0.93-0.07-2.08-0.07-3.5v-7.32c0-1.42 0-2.57 0.07-3.5 0.08-0.95 0.25-1.8 0.64-2.57 0.63-1.23 1.64-2.24 2.87-2.87 0.78-0.4 1.62-0.56 2.57-0.64 0.93-0.07 2.08-0.07 3.5-0.07h11.82c1.42 0 2.57 0 3.5 0.07 0.95 0.08 1.8 0.25 2.57 0.64 1.23 0.63 2.24 1.64 2.87 2.87 0.4 0.78 0.56 1.62 0.64 2.57 0.07 0.93 0.07 2.08 0.07 3.5Zm-2.69-3.28c-0.06-0.8-0.19-1.25-0.36-1.6-0.38-0.74-0.98-1.34-1.72-1.72-0.35-0.17-0.8-0.3-1.6-0.36-0.8-0.07-1.85-0.07-3.34-0.07h-11.7c-1.5 0-2.53 0-3.34 0.07-0.8 0.06-1.25 0.19-1.6 0.36-0.74 0.38-1.34 0.98-1.72 1.72-0.17 0.35-0.3 0.8-0.36 1.6-0.07 0.8-0.07 1.85-0.07 3.34v7.2c0 0.88 0 1.6 0.02 2.22l3.87-3.88c1.68-1.68 4.42-1.68 6.1 0l1.08 1.08 4.82-4.83c1.68-1.68 4.42-1.68 6.1 0l3.89 3.9V24.4c0-1.5 0-2.53-0.07-3.34Zm-23.66 17.2c-0.61-0.31-1.13-0.78-1.5-1.36l5.1-5.1c0.66-0.66 1.72-0.66 2.38 0l2 2c0.52 0.52 1.35 0.52 1.86 0l5.76-5.75c0.66-0.66 1.72-0.66 2.38 0l5.73 5.73c0 0.44-0.02 0.82-0.05 1.16-0.06 0.8-0.19 1.25-0.36 1.6-0.38 0.74-0.98 1.34-1.72 1.72-0.35 0.17-0.8 0.3-1.6 0.36-0.8 0.07-1.85 0.07-3.34 0.07h-11.7c-1.5 0-2.53 0-3.34-0.07-0.8-0.06-1.25-0.19-1.6-0.36Z"/>
<path
android:strokeColor="#FF666EE5"
android:strokeWidth="0.5"
android:pathData="M48.82 17.77c-0.14 4.61-0.43 14.08-0.43 15.12l1.3 2.16 6.04-5.18 4.32 2.59 8.2-6.48 7.35 5.61 0.43-12.09-3.45-3.45L52.7 15.6l-3.89 2.16Z"/>
<path
android:strokeColor="#FF666EE5"
android:strokeWidth="0.5"
android:pathData="M55.41 30.2l-6.58 6.14v0.44l2.2 3.07 7.46 0.44 13.6-0.44 3.52-3.07 0.88-4.39-8.34-6.15-7.47 6.15-5.27-2.2Z"/>
<path
android:strokeColor="#FF666EE5"
android:strokeWidth="0.5"
android:pathData="M53.38 23.13c0-1.45 1.17-2.63 2.62-2.63 1.45 0 2.63 1.18 2.63 2.63 0 1.44-1.18 2.62-2.63 2.62s-2.63-1.18-2.63-2.63Z"/>
<path
android:strokeColor="#FF666EE5"
android:strokeWidth="0.5"
android:pathData="M77.56 24.34v7.32c0 1.42 0 2.57-0.07 3.5-0.08 0.95-0.25 1.8-0.64 2.57-0.63 1.23-1.64 2.24-2.87 2.87-0.78 0.4-1.62 0.56-2.57 0.64-0.93 0.07-2.08 0.07-3.5 0.07H56.09c-1.42 0-2.57 0-3.5-0.07-0.95-0.08-1.8-0.25-2.57-0.64-1.23-0.63-2.24-1.64-2.87-2.87-0.4-0.78-0.56-1.62-0.64-2.57-0.07-0.93-0.07-2.08-0.07-3.5v-7.32c0-1.42 0-2.57 0.07-3.5 0.08-0.95 0.25-1.8 0.64-2.57 0.63-1.23 1.64-2.24 2.87-2.87 0.78-0.4 1.62-0.56 2.57-0.64 0.93-0.07 2.08-0.07 3.5-0.07h11.82c1.42 0 2.57 0 3.5 0.07 0.95 0.08 1.8 0.25 2.57 0.64 1.23 0.63 2.24 1.64 2.87 2.87 0.4 0.78 0.56 1.62 0.64 2.57 0.07 0.93 0.07 2.08 0.07 3.5Zm-2.69-3.28c-0.06-0.8-0.19-1.25-0.36-1.6-0.38-0.74-0.98-1.34-1.72-1.72-0.35-0.17-0.8-0.3-1.6-0.36-0.8-0.07-1.85-0.07-3.34-0.07h-11.7c-1.5 0-2.53 0-3.34 0.07-0.8 0.06-1.25 0.19-1.6 0.36-0.74 0.38-1.34 0.98-1.72 1.72-0.17 0.35-0.3 0.8-0.36 1.6-0.07 0.8-0.07 1.85-0.07 3.34v7.2c0 0.88 0 1.6 0.02 2.22l3.87-3.88c1.68-1.68 4.42-1.68 6.1 0l1.08 1.08 4.82-4.83c1.68-1.68 4.42-1.68 6.1 0l3.89 3.9V24.4c0-1.5 0-2.53-0.07-3.34Zm-23.66 17.2c-0.61-0.31-1.13-0.78-1.5-1.36l5.1-5.1c0.66-0.66 1.72-0.66 2.38 0l2 2c0.52 0.52 1.35 0.52 1.86 0l5.76-5.75c0.66-0.66 1.72-0.66 2.38 0l5.73 5.73c0 0.44-0.02 0.82-0.05 1.16-0.06 0.8-0.19 1.25-0.36 1.6-0.38 0.74-0.98 1.34-1.72 1.72-0.35 0.17-0.8 0.3-1.6 0.36-0.8 0.07-1.85 0.07-3.34 0.07h-11.7c-1.5 0-2.53 0-3.34-0.07-0.8-0.06-1.25-0.19-1.6-0.36Z"/>
</vector>

View File

@@ -0,0 +1,36 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="64dp"
android:height="64dp"
android:viewportWidth="64"
android:viewportHeight="64">
<group>
<path
android:fillColor="#FF9CA4EF"
android:fillType="evenOdd"
android:pathData="M55.55 50.29c0.8 0.7 0.9 1.92 0.2 2.72l-0.01 0.03c-4.07 4.78-9.6 8.37-16.1 10.01-6.5 1.65-13.03 1.1-18.84-1.2-1-0.39-1.5-1.5-1.1-2.5V59.3c0.39-0.99 1.5-1.48 2.5-1.1 5.08 2.01 10.81 2.5 16.51 1.06 5.7-1.44 10.54-4.6 14.1-8.78 0.7-0.81 1.94-0.9 2.74-0.2Z"/>
<path
android:fillColor="#FFD2D8FE"
android:fillType="evenOdd"
android:pathData="M32 56c-4.49 0-8.69-1.23-12.28-3.38v-3.98c0-2.57-2.08-4.65-4.65-4.65-1.2 0-2.3 0.46-3.12 1.2C9.45 41.42 8 36.88 8 32 8 18.75 18.75 8 32 8s24 10.75 24 24-10.75 24-24 24Z"/>
<path
android:fillColor="#FF666EE5"
android:fillType="evenOdd"
android:pathData="M38.65 22.56c0.52-0.82 1.6-1.05 2.42-0.53 0.81 0.52 1.05 1.6 0.53 2.41L31.2 40.7c-0.3 0.48-0.83 0.78-1.4 0.8-0.56 0.03-1.1-0.21-1.45-0.66l-5.85-7.48c-0.6-0.76-0.46-1.86 0.3-2.45 0.76-0.6 1.86-0.46 2.45 0.3l4.33 5.53 9.07-14.17Z"/>
<path
android:fillColor="#FF666EE5"
android:fillType="evenOdd"
android:pathData="M53.04 8.26c4.78 4.07 8.37 9.6 10.01 16.1 1.65 6.5 1.1 13.03-1.2 18.84-0.39 1-1.5 1.5-2.5 1.1H59.3c-0.99-0.39-1.48-1.5-1.1-2.5 2.01-5.08 2.5-10.81 1.06-16.51-1.44-5.7-4.6-10.54-8.78-14.1-0.81-0.7-0.9-1.94-0.2-2.74 0.7-0.8 1.93-0.9 2.73-0.2l0.03 0.01Z"/>
<path
android:fillColor="#FF9CA4EF"
android:fillType="evenOdd"
android:pathData="M44.3 4.7c-0.39 0.99-1.5 1.48-2.5 1.1C36.72 3.78 31 3.3 25.3 4.73c-5.7 1.44-10.54 4.6-14.1 8.78-0.7 0.81-1.94 0.9-2.74 0.2-0.8-0.7-0.9-1.93-0.2-2.73l0.01-0.03c4.07-4.78 9.6-8.37 16.1-10.01 6.5-1.65 13.03-1.1 18.84 1.2 1 0.39 1.5 1.5 1.1 2.5V4.7Z"/>
<path
android:fillColor="#FF666EE5"
android:fillType="evenOdd"
android:pathData="M14.44 46.67c0.86 0 1.56 0.7 1.56 1.57v7.18C16 56.3 15.3 57 14.44 57H6.57c-0.86 0-1.56-0.7-1.56-1.57 0-0.86 0.7-1.57 1.56-1.57h6.3v-5.61c0-0.87 0.7-1.57 1.57-1.57Z"/>
<path
android:fillColor="#FF666EE5"
android:fillType="evenOdd"
android:pathData="M4.66 19.13c1 0.4 1.5 1.53 1.12 2.54-2 5.16-2.49 10.98-1.05 16.77 1.43 5.79 4.57 10.7 8.75 14.31l1.48 1.28L12.4 57l-1.48-1.28c-4.77-4.13-8.35-9.74-9.99-16.34-1.63-6.6-1.08-13.23 1.2-19.13 0.39-1 1.52-1.5 2.52-1.12Z"/>
</group>
</vector>

View File

@@ -0,0 +1,33 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="80dp"
android:height="80dp"
android:viewportWidth="80"
android:viewportHeight="80">
<path
android:fillColor="#FFA0A7FE"
android:fillType="evenOdd"
android:pathData="M67 60.42c0.92 0.8 1.02 2.2 0.22 3.13-4.69 5.43-11.04 9.51-18.53 11.38-7.48 1.86-15 1.23-21.7-1.37-1.14-0.44-1.7-1.73-1.26-2.87 0.44-1.15 1.73-1.71 2.87-1.27 5.86 2.28 12.45 2.83 19.02 1.2 6.57-1.64 12.13-5.22 16.24-9.97 0.8-0.93 2.2-1.04 3.13-0.23Z"/>
<path
android:fillColor="#FFD2D8FE"
android:fillType="evenOdd"
android:pathData="M40 67.55c-5.15 0-9.98-1.41-14.1-3.88V59.1c0-2.95-2.39-5.33-5.33-5.33-1.38 0-2.64 0.52-3.59 1.38-2.86-4.35-4.53-9.55-4.53-15.15 0-15.21 12.33-27.55 27.55-27.55 15.21 0 27.55 12.34 27.55 27.55 0 15.22-12.34 27.55-27.55 27.55Z"/>
<path
android:fillColor="#FF3C46FE"
android:pathData="M36.53 25.76l-0.6 21.43v0.13c0 1.44 1.1 2.6 2.44 2.6h0.16l14.37-0.64c0.98-0.04 1.76-0.91 1.76-1.96 0-1.06-0.78-1.92-1.76-1.97l-12.16-0.54-0.53-19.05c-0.03-1.06-0.85-1.9-1.84-1.9-1 0-1.8 0.84-1.84 1.9Z"/>
<path
android:fillColor="#FF3B45FD"
android:fillType="evenOdd"
android:pathData="M63.55 12.78c5.43 4.69 9.51 11.04 11.38 18.53 1.86 7.48 1.23 15-1.37 21.7-0.44 1.14-1.73 1.7-2.87 1.26-1.15-0.44-1.71-1.73-1.27-2.87 2.28-5.86 2.83-12.45 1.2-19.02-1.64-6.57-5.22-12.13-9.97-16.24-0.93-0.8-1.04-2.2-0.23-3.13 0.8-0.93 2.2-1.03 3.13-0.23Z"/>
<path
android:fillColor="#FFA0A7FE"
android:fillType="evenOdd"
android:pathData="M54.27 9.31c-0.44 1.15-1.73 1.71-2.87 1.27-5.86-2.28-12.45-2.83-19.02-1.2-6.57 1.64-12.13 5.22-16.24 9.97-0.8 0.93-2.2 1.04-3.13 0.23-0.93-0.8-1.03-2.2-0.23-3.13 4.69-5.43 11.04-9.51 18.53-11.38 7.48-1.86 15-1.23 21.7 1.37 1.14 0.44 1.7 1.73 1.26 2.87Z"/>
<path
android:fillColor="#FF3B45FD"
android:fillType="evenOdd"
android:pathData="M20.45 56.96c0.98 0 1.78 0.8 1.78 1.78v8.14c0 0.98-0.8 1.78-1.78 1.78h-8.96c-0.98 0-1.78-0.8-1.78-1.78s0.8-1.77 1.78-1.77h7.18v-6.37c0-0.98 0.8-1.78 1.78-1.78Z"/>
<path
android:fillColor="#FF3B45FD"
android:fillType="evenOdd"
android:pathData="M9.31 25.73c1.15 0.44 1.71 1.73 1.27 2.87-2.28 5.86-2.83 12.45-1.2 19.02 1.64 6.57 5.22 12.13 9.97 16.24l1.69 1.45-2.9 3.36-1.69-1.45C11.02 62.53 6.94 56.18 5.07 48.7c-1.86-7.48-1.23-15 1.37-21.7 0.44-1.14 1.73-1.7 2.87-1.26Z"/>
</vector>

View File

@@ -0,0 +1,17 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="80dp"
android:height="80dp"
android:viewportWidth="80"
android:viewportHeight="80">
<path
android:fillColor="#FFE0E5FF"
android:pathData="M40 0A40 40 0 1 0 40 80 40 40 0 1 0 40 0z"/>
<path
android:fillColor="#FF3B45FD"
android:fillType="evenOdd"
android:pathData="M33 49.75c0 1.66-1.34 3-3 3-1.65 0-3-1.34-3-3s1.35-3 3-3c1.66 0 3 1.34 3 3Z"/>
<path
android:fillColor="#FF3B45FD"
android:fillType="evenOdd"
android:pathData="M51.41 20.25H57c1.52 0 2.75 1.23 2.75 2.75v8c0 1.52-1.23 2.75-2.75 2.75h-4.25V38c0 1.52-1.23 2.75-2.75 2.75h-2.77l-1.8 1.8c0.53 1.47 0.82 3.05 0.82 4.7C46.25 54.85 40.1 61 32.5 61c-6.09 0-11.25-3.96-13.06-9.45-0.45-1.35-0.69-2.8-0.69-4.3 0-1.69 0.3-3.31 0.87-4.81 1.95-5.22 6.98-8.94 12.88-8.94 1.38 0 2.7 0.2 3.96 0.58l13-13.02c0.52-0.52 1.22-0.81 1.95-0.81Zm-14.06 17.9l-1.07-0.43C35.11 37.25 33.84 37 32.5 37c-4.4 0-8.15 2.77-9.6 6.66-0.42 1.12-0.65 2.32-0.65 3.59 0 1.12 0.18 2.2 0.52 3.2 1.34 4.1 5.2 7.05 9.73 7.05 5.66 0 10.25-4.59 10.25-10.25 0-1.56-0.34-3.04-0.97-4.36l-0.52-1.1 3.7-3.73c0.52-0.52 1.22-0.81 1.96-0.81h2.33V33c0-1.52 1.23-2.75 2.75-2.75h4.25v-6.5h-4.52l-14.38 14.4Z"/>
</vector>

View File

@@ -0,0 +1,17 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="80dp"
android:height="80dp"
android:viewportWidth="80"
android:viewportHeight="80">
<path
android:fillColor="#FFE0E5FF"
android:pathData="M40 0A40 40 0 1 0 40 80 40 40 0 1 0 40 0z"/>
<path
android:fillColor="#FF3B45FD"
android:fillType="evenOdd"
android:pathData="M38.25 48.99c-0.9-0.58-1.5-1.59-1.5-2.74 0-1.8 1.46-3.25 3.25-3.25 1.8 0 3.25 1.46 3.25 3.25 0 1.15-0.6 2.16-1.5 2.74v3.51c0 0.97-0.78 1.75-1.75 1.75s-1.75-0.78-1.75-1.75v-3.51Z"/>
<path
android:fillColor="#FF3B45FD"
android:fillType="evenOdd"
android:pathData="M27.75 29.5c0-6.77 5.48-12.25 12.25-12.25s12.25 5.48 12.25 12.25v5.47l0.27 0.12c1.46 0.75 2.64 1.93 3.39 3.4 0.47 0.92 0.66 1.92 0.75 3.03 0.09 1.07 0.09 2.39 0.09 4v5.95c0 1.62 0 2.94-0.09 4.01-0.09 1.11-0.28 2.1-0.75 3.04-0.75 1.46-1.93 2.64-3.4 3.39-0.92 0.47-1.92 0.66-3.03 0.75-1.07 0.09-2.39 0.09-4 0.09H34.52c-1.62 0-2.94 0-4.01-0.09-1.11-0.09-2.1-0.28-3.04-0.75-1.46-0.75-2.64-1.93-3.39-3.4-0.47-0.92-0.66-1.92-0.75-3.03-0.09-1.07-0.09-2.39-0.09-4v-5.95c0-1.62 0-2.94 0.09-4.01 0.09-1.11 0.28-2.1 0.75-3.04 0.75-1.46 1.93-2.64 3.4-3.39l0.26-0.12V29.5Zm21 0v4.8c-0.93-0.05-2.01-0.05-3.28-0.05H34.53c-1.27 0-2.35 0-3.28 0.04V29.5c0-4.83 3.92-8.75 8.75-8.75s8.75 3.92 8.75 8.75Zm-19.68 8.71c0.35-0.18 0.84-0.31 1.73-0.38 0.91-0.08 2.1-0.08 3.8-0.08h10.8c1.7 0 2.89 0 3.8 0.08 0.9 0.07 1.38 0.2 1.73 0.38 0.8 0.41 1.45 1.06 1.86 1.86 0.18 0.35 0.31 0.84 0.38 1.73 0.08 0.91 0.08 2.1 0.08 3.8v5.8c0 1.7 0 2.89-0.08 3.8-0.07 0.9-0.2 1.38-0.38 1.73-0.41 0.8-1.06 1.45-1.86 1.86-0.35 0.18-0.84 0.31-1.73 0.38-0.91 0.08-2.1 0.08-3.8 0.08H34.6c-1.7 0-2.89 0-3.8-0.08-0.9-0.07-1.38-0.2-1.73-0.38-0.8-0.41-1.45-1.06-1.86-1.86-0.18-0.35-0.31-0.84-0.38-1.73-0.08-0.91-0.08-2.1-0.08-3.8v-5.8c0-1.7 0-2.89 0.08-3.8 0.07-0.9 0.2-1.38 0.38-1.73 0.41-0.8 1.06-1.45 1.86-1.86Z"/>
</vector>

View File

@@ -0,0 +1,73 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:aapt="http://schemas.android.com/aapt"
android:width="80dp"
android:height="80dp"
android:viewportWidth="80"
android:viewportHeight="80">
<path
android:pathData="M20 22.67c0-5.14 0-7.7 1-9.66 0.88-1.73 2.28-3.13 4-4.01 1.97-1 4.53-1 9.67-1h10.66c5.14 0 7.7 0 9.66 1 1.73 0.88 3.13 2.28 4.01 4 1 1.97 1 4.53 1 9.67v34.66c0 5.14 0 7.7-1 9.66-0.88 1.73-2.28 3.13-4 4.01-1.97 1-4.53 1-9.67 1H34.67c-5.14 0-7.7 0-9.66-1-1.73-0.88-3.13-2.28-4.01-4-1-1.97-1-4.53-1-9.67V22.67Z">
<aapt:attr name="android:fillColor">
<gradient
android:type="linear"
android:startX="42"
android:startY="6"
android:endX="44.87"
android:endY="71.88">
<item
android:color="#FFD2D8FE"
android:offset="0"/>
<item
android:color="#FFB0BCFC"
android:offset="1"/>
</gradient>
</aapt:attr>
</path>
<path
android:fillColor="#FF3B45FD"
android:fillType="evenOdd"
android:pathData="M34.6 6.5h10.8c2.51 0 4.49 0 6.08 0.13 1.62 0.13 2.97 0.4 4.2 1.03 2 1.03 3.63 2.66 4.66 4.66 0.62 1.23 0.9 2.58 1.03 4.2 0.13 1.6 0.13 3.57 0.13 6.08v34.8c0 2.51 0 4.49-0.13 6.08-0.13 1.62-0.4 2.97-1.03 4.2-1.03 2-2.66 3.63-4.66 4.66-1.23 0.62-2.58 0.9-4.2 1.03-1.6 0.13-3.57 0.13-6.08 0.13H34.6c-2.51 0-4.49 0-6.08-0.13-1.62-0.13-2.97-0.4-4.2-1.03-2-1.03-3.63-2.66-4.66-4.66-0.62-1.23-0.9-2.58-1.03-4.2-0.13-1.6-0.13-3.57-0.13-6.08V22.6c0-2.51 0-4.49 0.13-6.08 0.13-1.62 0.4-2.97 1.03-4.2 1.03-2 2.66-3.63 4.66-4.66 1.23-0.62 2.58-0.9 4.2-1.03C30.12 6.5 32.1 6.5 34.6 6.5Zm-5.83 3.12c-1.44 0.12-2.35 0.34-3.08 0.72-1.45 0.73-2.62 1.9-3.35 3.35-0.38 0.73-0.6 1.64-0.72 3.08-0.12 1.45-0.12 3.3-0.12 5.9v34.66c0 2.6 0 4.45 0.12 5.9 0.12 1.44 0.34 2.35 0.72 3.08 0.73 1.45 1.9 2.62 3.35 3.35 0.73 0.38 1.64 0.6 3.08 0.72 1.45 0.12 3.3 0.12 5.9 0.12h10.66c2.6 0 4.45 0 5.9-0.12 1.44-0.12 2.35-0.34 3.08-0.72 1.45-0.73 2.62-1.9 3.35-3.35 0.38-0.73 0.6-1.64 0.72-3.08 0.12-1.45 0.12-3.3 0.12-5.9V22.67c0-2.6 0-4.45-0.12-5.9-0.12-1.44-0.34-2.35-0.72-3.08-0.73-1.45-1.9-2.62-3.35-3.35-0.73-0.38-1.64-0.6-3.08-0.72-1.45-0.12-3.3-0.12-5.9-0.12H34.67c-2.6 0-4.45 0-5.9 0.12Z"/>
<path
android:fillColor="#FFE0E5FF"
android:pathData="M19.37 40.66l-4.11 0.91-4.57 1.37-1.83 3.2-2.29 3.66-0.46 5.49 1.83 4.11-1.37 5.94 6.4-0.91L18 65.34l5.94-0.45c1.37-1.22 4.12-3.75 4.12-4.12 0-0.36 2.13-2.9 3.2-4.11l-0.46-5.49-0.91-4.57-5.95-4.57-4.57-1.37Z"/>
<path
android:fillColor="#FF3B45FD"
android:fillType="evenOdd"
android:pathData="M4.17 53c0-7.64 6.19-13.83 13.83-13.83S31.83 45.36 31.83 53 25.64 66.83 18 66.83c-2.4 0-4.65-0.6-6.61-1.68l-5 1.8c-1.45 0.53-2.87-0.89-2.34-2.34l1.8-5C4.78 57.65 4.17 55.4 4.17 53ZM18 41.5c-6.35 0-11.5 5.15-11.5 11.5 0 2.06 0.54 3.98 1.48 5.65 0.26 0.46 0.33 1.02 0.14 1.54L6.6 64.4l4.2-1.5c0.53-0.2 1.1-0.13 1.55 0.13 1.67 0.94 3.6 1.48 5.65 1.48 6.35 0 11.5-5.15 11.5-11.5S24.35 41.5 18 41.5Z"/>
<path
android:strokeColor="#FF3B45FD"
android:strokeWidth="1"
android:pathData="M19.37 40.66l-4.11 0.91-4.57 1.37-1.83 3.2-2.29 3.66-0.46 5.49 1.83 4.11-1.37 5.94 6.4-0.91L18 65.34l5.94-0.45c1.37-1.22 4.12-3.75 4.12-4.12 0-0.36 2.13-2.9 3.2-4.11l-0.46-5.49-0.91-4.57-5.95-4.57-4.57-1.37Z"/>
<path
android:strokeColor="#FF3B45FD"
android:strokeWidth="1"
android:pathData="M4.17 53c0-7.64 6.19-13.83 13.83-13.83S31.83 45.36 31.83 53 25.64 66.83 18 66.83c-2.4 0-4.65-0.6-6.61-1.68l-5 1.8c-1.45 0.53-2.87-0.89-2.34-2.34l1.8-5C4.78 57.65 4.17 55.4 4.17 53ZM18 41.5c-6.35 0-11.5 5.15-11.5 11.5 0 2.06 0.54 3.98 1.48 5.65 0.26 0.46 0.33 1.02 0.14 1.54L6.6 64.4l4.2-1.5c0.53-0.2 1.1-0.13 1.55 0.13 1.67 0.94 3.6 1.48 5.65 1.48 6.35 0 11.5-5.15 11.5-11.5S24.35 41.5 18 41.5Z"/>
<path
android:fillColor="#FFE0E5FF"
android:pathData="M48.82 17.77c-0.14 4.61-0.43 14.08-0.43 15.12l1.3 2.16 6.04-5.18 4.32 2.59 8.2-6.48 7.35 5.61 0.43-12.09-3.45-3.45L52.7 15.6l-3.89 2.16Z"/>
<path
android:fillColor="#FFE0E5FF"
android:pathData="M55.41 30.2l-6.58 6.14v0.44l2.2 3.07 7.46 0.44 13.6-0.44 3.52-3.07 0.88-4.39-8.34-6.15-7.47 6.15-5.27-2.2Z"/>
<path
android:fillColor="#FF3B45FD"
android:pathData="M53.38 23.13c0-1.45 1.17-2.63 2.62-2.63 1.45 0 2.63 1.18 2.63 2.63 0 1.44-1.18 2.62-2.63 2.62s-2.63-1.18-2.63-2.63Z"/>
<path
android:fillColor="#FF3B45FD"
android:fillType="evenOdd"
android:pathData="M77.56 24.34v7.32c0 1.42 0 2.57-0.07 3.5-0.08 0.95-0.25 1.8-0.64 2.57-0.63 1.23-1.64 2.24-2.87 2.87-0.78 0.4-1.62 0.56-2.57 0.64-0.93 0.07-2.08 0.07-3.5 0.07H56.09c-1.42 0-2.57 0-3.5-0.07-0.95-0.08-1.8-0.25-2.57-0.64-1.23-0.63-2.24-1.64-2.87-2.87-0.4-0.78-0.56-1.62-0.64-2.57-0.07-0.93-0.07-2.08-0.07-3.5v-7.32c0-1.42 0-2.57 0.07-3.5 0.08-0.95 0.25-1.8 0.64-2.57 0.63-1.23 1.64-2.24 2.87-2.87 0.78-0.4 1.62-0.56 2.57-0.64 0.93-0.07 2.08-0.07 3.5-0.07h11.82c1.42 0 2.57 0 3.5 0.07 0.95 0.08 1.8 0.25 2.57 0.64 1.23 0.63 2.24 1.64 2.87 2.87 0.4 0.78 0.56 1.62 0.64 2.57 0.07 0.93 0.07 2.08 0.07 3.5Zm-2.69-3.28c-0.06-0.8-0.19-1.25-0.36-1.6-0.38-0.74-0.98-1.34-1.72-1.72-0.35-0.17-0.8-0.3-1.6-0.36-0.8-0.07-1.85-0.07-3.34-0.07h-11.7c-1.5 0-2.53 0-3.34 0.07-0.8 0.06-1.25 0.19-1.6 0.36-0.74 0.38-1.34 0.98-1.72 1.72-0.17 0.35-0.3 0.8-0.36 1.6-0.07 0.8-0.07 1.85-0.07 3.34v7.2c0 0.88 0 1.6 0.02 2.22l3.87-3.88c1.68-1.68 4.42-1.68 6.1 0l1.08 1.08 4.82-4.83c1.68-1.68 4.42-1.68 6.1 0l3.89 3.9V24.4c0-1.5 0-2.53-0.07-3.34Zm-23.66 17.2c-0.61-0.31-1.13-0.78-1.5-1.36l5.1-5.1c0.66-0.66 1.72-0.66 2.38 0l2 2c0.52 0.52 1.35 0.52 1.86 0l5.76-5.75c0.66-0.66 1.72-0.66 2.38 0l5.73 5.73c0 0.44-0.02 0.82-0.05 1.16-0.06 0.8-0.19 1.25-0.36 1.6-0.38 0.74-0.98 1.34-1.72 1.72-0.35 0.17-0.8 0.3-1.6 0.36-0.8 0.07-1.85 0.07-3.34 0.07h-11.7c-1.5 0-2.53 0-3.34-0.07-0.8-0.06-1.25-0.19-1.6-0.36Z"/>
<path
android:strokeColor="#FF3B45FD"
android:strokeWidth="0.5"
android:pathData="M48.82 17.77c-0.14 4.61-0.43 14.08-0.43 15.12l1.3 2.16 6.04-5.18 4.32 2.59 8.2-6.48 7.35 5.61 0.43-12.09-3.45-3.45L52.7 15.6l-3.89 2.16Z"/>
<path
android:strokeColor="#FF3B45FD"
android:strokeWidth="0.5"
android:pathData="M55.41 30.2l-6.58 6.14v0.44l2.2 3.07 7.46 0.44 13.6-0.44 3.52-3.07 0.88-4.39-8.34-6.15-7.47 6.15-5.27-2.2Z"/>
<path
android:strokeColor="#FF3B45FD"
android:strokeWidth="0.5"
android:pathData="M53.38 23.13c0-1.45 1.17-2.63 2.62-2.63 1.45 0 2.63 1.18 2.63 2.63 0 1.44-1.18 2.62-2.63 2.62s-2.63-1.18-2.63-2.63Z"/>
<path
android:strokeColor="#FF3B45FD"
android:strokeWidth="0.5"
android:pathData="M77.56 24.34v7.32c0 1.42 0 2.57-0.07 3.5-0.08 0.95-0.25 1.8-0.64 2.57-0.63 1.23-1.64 2.24-2.87 2.87-0.78 0.4-1.62 0.56-2.57 0.64-0.93 0.07-2.08 0.07-3.5 0.07H56.09c-1.42 0-2.57 0-3.5-0.07-0.95-0.08-1.8-0.25-2.57-0.64-1.23-0.63-2.24-1.64-2.87-2.87-0.4-0.78-0.56-1.62-0.64-2.57-0.07-0.93-0.07-2.08-0.07-3.5v-7.32c0-1.42 0-2.57 0.07-3.5 0.08-0.95 0.25-1.8 0.64-2.57 0.63-1.23 1.64-2.24 2.87-2.87 0.78-0.4 1.62-0.56 2.57-0.64 0.93-0.07 2.08-0.07 3.5-0.07h11.82c1.42 0 2.57 0 3.5 0.07 0.95 0.08 1.8 0.25 2.57 0.64 1.23 0.63 2.24 1.64 2.87 2.87 0.4 0.78 0.56 1.62 0.64 2.57 0.07 0.93 0.07 2.08 0.07 3.5Zm-2.69-3.28c-0.06-0.8-0.19-1.25-0.36-1.6-0.38-0.74-0.98-1.34-1.72-1.72-0.35-0.17-0.8-0.3-1.6-0.36-0.8-0.07-1.85-0.07-3.34-0.07h-11.7c-1.5 0-2.53 0-3.34 0.07-0.8 0.06-1.25 0.19-1.6 0.36-0.74 0.38-1.34 0.98-1.72 1.72-0.17 0.35-0.3 0.8-0.36 1.6-0.07 0.8-0.07 1.85-0.07 3.34v7.2c0 0.88 0 1.6 0.02 2.22l3.87-3.88c1.68-1.68 4.42-1.68 6.1 0l1.08 1.08 4.82-4.83c1.68-1.68 4.42-1.68 6.1 0l3.89 3.9V24.4c0-1.5 0-2.53-0.07-3.34Zm-23.66 17.2c-0.61-0.31-1.13-0.78-1.5-1.36l5.1-5.1c0.66-0.66 1.72-0.66 2.38 0l2 2c0.52 0.52 1.35 0.52 1.86 0l5.76-5.75c0.66-0.66 1.72-0.66 2.38 0l5.73 5.73c0 0.44-0.02 0.82-0.05 1.16-0.06 0.8-0.19 1.25-0.36 1.6-0.38 0.74-0.98 1.34-1.72 1.72-0.35 0.17-0.8 0.3-1.6 0.36-0.8 0.07-1.85 0.07-3.34 0.07h-11.7c-1.5 0-2.53 0-3.34-0.07-0.8-0.06-1.25-0.19-1.6-0.36Z"/>
</vector>

View File

@@ -0,0 +1,36 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="64dp"
android:height="64dp"
android:viewportWidth="64"
android:viewportHeight="64">
<group>
<path
android:fillColor="#FFA0A7FE"
android:fillType="evenOdd"
android:pathData="M55.55 50.29c0.8 0.7 0.9 1.92 0.2 2.72l-0.01 0.03c-4.07 4.78-9.6 8.37-16.1 10.01-6.5 1.65-13.03 1.1-18.84-1.2-1-0.39-1.5-1.5-1.1-2.5V59.3c0.39-0.99 1.5-1.48 2.5-1.1 5.08 2.01 10.81 2.5 16.51 1.06 5.7-1.44 10.54-4.6 14.1-8.78 0.7-0.81 1.94-0.9 2.74-0.2Z"/>
<path
android:fillColor="#FFD2D8FE"
android:fillType="evenOdd"
android:pathData="M32 56c-4.49 0-8.69-1.23-12.28-3.38v-3.98c0-2.57-2.08-4.65-4.65-4.65-1.2 0-2.3 0.46-3.12 1.2C9.45 41.42 8 36.88 8 32 8 18.75 18.75 8 32 8s24 10.75 24 24-10.75 24-24 24Z"/>
<path
android:fillColor="#FF3C46FE"
android:fillType="evenOdd"
android:pathData="M38.65 22.56c0.52-0.82 1.6-1.05 2.42-0.53 0.81 0.52 1.05 1.6 0.53 2.41L31.2 40.7c-0.3 0.48-0.83 0.78-1.4 0.8-0.56 0.03-1.1-0.21-1.45-0.66l-5.85-7.48c-0.6-0.76-0.46-1.86 0.3-2.45 0.76-0.6 1.86-0.46 2.45 0.3l4.33 5.53 9.07-14.17Z"/>
<path
android:fillColor="#FF3B45FD"
android:fillType="evenOdd"
android:pathData="M53.04 8.26c4.78 4.07 8.37 9.6 10.01 16.1 1.65 6.5 1.1 13.03-1.2 18.84-0.39 1-1.5 1.5-2.5 1.1H59.3c-0.99-0.39-1.48-1.5-1.1-2.5 2.01-5.08 2.5-10.81 1.06-16.51-1.44-5.7-4.6-10.54-8.78-14.1-0.81-0.7-0.9-1.94-0.2-2.74 0.7-0.8 1.93-0.9 2.73-0.2l0.03 0.01Z"/>
<path
android:fillColor="#FFA0A7FE"
android:fillType="evenOdd"
android:pathData="M44.3 4.7c-0.39 0.99-1.5 1.48-2.5 1.1C36.72 3.78 31 3.3 25.3 4.73c-5.7 1.44-10.54 4.6-14.1 8.78-0.7 0.81-1.94 0.9-2.74 0.2-0.8-0.7-0.9-1.93-0.2-2.73l0.01-0.03c4.07-4.78 9.6-8.37 16.1-10.01 6.5-1.65 13.03-1.1 18.84 1.2 1 0.39 1.5 1.5 1.1 2.5V4.7Z"/>
<path
android:fillColor="#FF3B45FD"
android:fillType="evenOdd"
android:pathData="M14.44 46.67c0.86 0 1.56 0.7 1.56 1.57v7.18C16 56.3 15.3 57 14.44 57H6.57c-0.86 0-1.56-0.7-1.56-1.57 0-0.86 0.7-1.57 1.56-1.57h6.3v-5.61c0-0.87 0.7-1.57 1.57-1.57Z"/>
<path
android:fillColor="#FF3B45FD"
android:fillType="evenOdd"
android:pathData="M4.66 19.13c1 0.4 1.5 1.53 1.12 2.54-2 5.16-2.49 10.98-1.05 16.77 1.43 5.79 4.57 10.7 8.75 14.31l1.48 1.28L12.4 57l-1.48-1.28c-4.77-4.13-8.35-9.74-9.99-16.34-1.63-6.6-1.08-13.23 1.2-19.13 0.39-1 1.52-1.5 2.52-1.12Z"/>
</group>
</vector>

View File

@@ -817,7 +817,7 @@
<!-- CreateBackupBottomSheet -->
<!-- Bottom sheet title -->
<string name="CreateBackupBottomSheet__create_backup">Create backup</string>
<string name="CreateBackupBottomSheet__you_are_all_set">You\'re all set. Start your backup now.</string>
<!-- Bottom sheet message -->
<string name="CreateBackupBottomSheet__depending_on_the_size">Depending on the size of your backup, this could take a long time. You can use your phone as you normally do while the backup takes place.</string>
<!-- Action button to dismiss sheet and back up later -->
@@ -7239,11 +7239,11 @@
<!-- BackupAlertBottomSheet -->
<!-- Sheet title when media backups have been disabled -->
<string name="BackupAlertBottomSheet__media_backups_are_off">Media backups are off</string>
<string name="BackupAlertBottomSheet__your_backups_subscription_expired">Your backups subscription expired</string>
<!-- Sheet body part 1 when media backups have been disabled. Placeholder is the number of days until deletion. -->
<plurals name="BackupAlertBottomSheet__your_signal_media_backup_plan">
<item quantity="one">Your Signal media backup plan has been canceled because we couldn\'t process your payment. You have %1$d day to download any media stored in your backup. After %1$d day, the media in your backup will be deleted.</item>
<item quantity="other">Your Signal media backup plan has been canceled because we couldn\'t process your payment. You have %1$d days to download any media stored in your backup. After %1$d days, the media in your backup will be deleted.</item>
<plurals name="BackupAlertBottomSheet__your_backup_plan_has_expired">
<item quantity="one">Your backup plan has expired because it couldn\'t be renewed with your current payment method. After %1$d day, the media in your backup will be deleted.</item>
<item quantity="other">Your backup plan has expired because it couldn\'t be renewed with your current payment method. After %1$d days, the media in your backup will be deleted.</item>
</plurals>
<!-- Sheet body part 2 when media backups have been disabled. -->
<string name="BackupAlertBottomSheet__you_can_begin_paying_for_backups_again">You can begin paying for backups again at any time to continue backing up all your media. </string>
@@ -7261,9 +7261,9 @@
<item quantity="other">If you choose \"Skip\" the media in your backup will be deleted in %1$d days.</item>
</plurals>
<!-- Sheet title when user payment failed to process -->
<string name="BackupAlertBottomSheet__cant_process_backup_payment">Can\'t process backup payment</string>
<string name="BackupAlertBottomSheet__your_backups_subscription_failed_to_renew">Your backups subscription failed to renew</string>
<!-- Sheet body when user payment failed to process -->
<string name="BackupAlertBottomSheet__were_having_trouble_collecting__google_pay">We\'re having trouble collecting your recurring monthly backup payment. Make sure your payment method is up to date. If it isn\'t, update it in Google Pay. Signal will try to process the payment again in a few days.</string>
<string name="BackupAlertBottomSheet__check_to_make_sure_your_payment_method">Check to make sure your payment method is up to date. Tap Manage subscription and under Payment methods tap Update.</string>
<!-- Sheet title for generic backup error -->
<string name="BackupAlertBottomSheet__couldnt_complete_backup">Couldn\'t complete backup</string>
<!-- Sheet body for generic backup error. Placeholder is days since last backup. -->
@@ -7272,12 +7272,16 @@
<string name="BackupAlertBottomSheet__learn_more">Learn more</string>
<!-- Secondary action button text when user does not have enough free space to download their backup. -->
<string name="BackupAlertBottomSheet__skip">Skip</string>
<!-- Primary action button to manage subscription in Google Play -->
<string name="BackupAlertBottomSheet__manage_subscription">Manage subscription</string>
<!-- Primary action button text prompting user to subscriber. Placeholder is formatted price -->
<string name="BackupAlertBottomSheet__subscribe_for_s_month">Subscribe for %1$s/month</string>
<!-- Primary action button text prompting user to download their media -->
<string name="BackupAlertBottomSheet__download_media_now">Download media now</string>
<!-- Secondary action button text to dismiss sheet, noting the user can download later -->
<string name="BackupAlertBottomSheet__download_later">Download later</string>
<!-- Secondary action button text to dismiss sheet, skipping media download -->
<string name="BackupAlertBottomSheet__dont_download_media">Don\'t download media</string>
<!-- Secondary generic action button to dismiss sheet without performing an action -->
<string name="BackupAlertBottomSheet__not_now">Not now</string>
<!-- Dialog title for last chance to download backup -->
<string name="BackupAlertBottomSheet__media_will_be_deleted">Media will be deleted</string>
<!-- Dialog message for last chance to download backup -->
@@ -7358,8 +7362,8 @@
<string name="UpgradeToEnableOptimizedStorageSheet__upgrade_to_enable_this_feature">Upgrade to enable this feature</string>
<!-- Subtitle of bottom sheet detailing that the user must upgrade to enable storage optimization -->
<string name="UpgradeToEnableOptimizedStorageSheet__storage_optimization_can_only_be_used">Storage optimization can only be used with the paid tier of Signal Backups. Upgrade your backup plan to start using this feature.</string>
<!-- Primary action to launch upgrade flow -->
<string name="UpgradeToEnableOptimizedStorageSheet__upgrade_now">Upgrade now</string>
<!-- Primary action to launch upgrade flow. Placeholder is formatted price. -->
<string name="UpgradeToEnableOptimizedStorageSheet__subscribe_for_s_month">Subscribe for %1$s/month</string>
<!-- Educational bottom sheet dialog title shown to notify about delete syncs causing deletes to happen across all devices -->
<string name="DeleteSyncEducation_title">Deleting is now synced across all of your devices</string>