Remove backup frequency setting.

This commit is contained in:
Greyson Parrelli
2025-09-03 12:14:58 -04:00
parent 54b31514ba
commit 2572dac8a7
9 changed files with 13 additions and 194 deletions

View File

@@ -100,8 +100,6 @@ import org.thoughtcrime.securesms.dependencies.AppDependencies
import org.thoughtcrime.securesms.groups.GroupId
import org.thoughtcrime.securesms.jobmanager.Job
import org.thoughtcrime.securesms.jobmanager.impl.DataRestoreConstraint
import org.thoughtcrime.securesms.jobmanager.impl.NetworkConstraint
import org.thoughtcrime.securesms.jobmanager.impl.WifiConstraint
import org.thoughtcrime.securesms.jobs.ArchiveAttachmentBackfillJob
import org.thoughtcrime.securesms.jobs.AvatarGroupsV2DownloadJob
import org.thoughtcrime.securesms.jobs.BackupDeleteJob
@@ -381,29 +379,6 @@ object BackupRepository {
}
}
fun displayManualBackupNotCreatedInThresholdNotification() {
if (SignalStore.backup.lastBackupTime <= 0) {
return
}
val daysSinceLastBackup = (System.currentTimeMillis().milliseconds - SignalStore.backup.lastBackupTime.milliseconds).inWholeDays.toInt()
val context = AppDependencies.application
val pendingIntent = PendingIntent.getActivity(context, 0, AppSettingsActivity.remoteBackups(context), cancelCurrent())
val notification = NotificationCompat.Builder(context, NotificationChannels.getInstance().APP_ALERTS)
.setSmallIcon(R.drawable.ic_notification)
.setContentTitle(context.resources.getQuantityString(R.plurals.Notification_no_backup_for_d_days, daysSinceLastBackup, daysSinceLastBackup))
.setContentText(context.resources.getQuantityString(R.plurals.Notification_you_have_not_completed_a_backup, daysSinceLastBackup, daysSinceLastBackup))
.setContentIntent(pendingIntent)
.setAutoCancel(true)
.build()
ServiceUtil.getNotificationManager(context).notify(NotificationIds.MANUAL_BACKUP_NOT_CREATED, notification)
}
fun cancelManualBackupNotCreatedInThresholdNotification() {
ServiceUtil.getNotificationManager(AppDependencies.application).cancel(NotificationIds.MANUAL_BACKUP_NOT_CREATED)
}
@Discouraged("This is only public to allow internal settings to call it directly.")
fun displayInitialBackupFailureNotification() {
val context = AppDependencies.application
@@ -527,45 +502,6 @@ object BackupRepository {
SignalStore.backup.hasBackupAlreadyRedeemedError = false
}
/**
* Whether or not the "No backup" for manual backups should be displayed.
* This should only be displayed after a set threshold has passed and the user
* has set the MANUAL backups frequency.
*/
fun shouldDisplayNoManualBackupForTimeoutSheet(): Boolean {
if (shouldNotDisplayBackupFailedMessaging()) {
return false
}
if (SignalStore.backup.backupFrequency != BackupFrequency.MANUAL) {
return false
}
if (SignalStore.backup.lastBackupTime <= 0) {
return false
}
val isNetworkConstraintMet = if (SignalStore.backup.backupWithCellular) {
NetworkConstraint.isMet(AppDependencies.application)
} else {
WifiConstraint.isMet(AppDependencies.application)
}
if (!isNetworkConstraintMet) {
return false
}
val durationSinceLastBackup = System.currentTimeMillis().milliseconds - SignalStore.backup.lastBackupTime.milliseconds
if (durationSinceLastBackup < MANUAL_BACKUP_NOTIFICATION_THRESHOLD) {
return false
}
val display = !SignalStore.backup.isNoBackupForManualUploadNotified
SignalStore.backup.isNoBackupForManualUploadNotified = false
return display
}
/**
* Updates the watermark for the indicator display.
*/

View File

@@ -38,10 +38,6 @@ object BackupAlertDelegate {
} else if (BackupRepository.shouldDisplayBackupExpiredAndDowngradedSheet()) {
Log.d(TAG, "Displaying ExpiredAndDowngraded sheet.")
BackupAlertBottomSheet.create(BackupAlert.ExpiredAndDowngraded).show(fragmentManager, FRAGMENT_TAG)
} else if (BackupRepository.shouldDisplayNoManualBackupForTimeoutSheet()) {
Log.d(TAG, "Displaying NoManualBackupBottomSheet.")
NoManualBackupBottomSheet().show(fragmentManager, FRAGMENT_TAG)
BackupRepository.displayManualBackupNotCreatedInThresholdNotification()
} else if (BackupRepository.shouldDisplayOutOfRemoteStorageSpaceSheet()) {
Log.d(TAG, "Displaying NoRemoteStorageSpaceAvailableBottomSheet.")
NoRemoteStorageSpaceAvailableBottomSheet().show(fragmentManager, FRAGMENT_TAG)

View File

@@ -16,7 +16,6 @@ import androidx.compose.animation.core.tween
import androidx.compose.foundation.Image
import androidx.compose.foundation.background
import androidx.compose.foundation.border
import androidx.compose.foundation.clickable
import androidx.compose.foundation.layout.Arrangement.spacedBy
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.Column
@@ -30,7 +29,6 @@ import androidx.compose.foundation.lazy.LazyColumn
import androidx.compose.foundation.lazy.LazyListScope
import androidx.compose.foundation.shape.CircleShape
import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.material3.BasicAlertDialog
import androidx.compose.material3.ButtonDefaults
import androidx.compose.material3.CircularProgressIndicator
import androidx.compose.material3.ExperimentalMaterial3Api
@@ -40,7 +38,6 @@ import androidx.compose.material3.LinearProgressIndicator
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Scaffold
import androidx.compose.material3.SnackbarHostState
import androidx.compose.material3.Surface
import androidx.compose.material3.Text
import androidx.compose.material3.TextButton
import androidx.compose.material3.TopAppBarDefaults
@@ -191,7 +188,7 @@ class RemoteBackupsSettingsFragment : ComposeFragment() {
viewModel.requestDialog(RemoteBackupsSettingsState.Dialog.TURN_OFF_AND_DELETE_BACKUPS)
}
override fun onChangeBackupFrequencyClick() {
override fun onBackupFrequencyClick() {
viewModel.requestDialog(RemoteBackupsSettingsState.Dialog.BACKUP_FREQUENCY)
}
@@ -203,10 +200,6 @@ class RemoteBackupsSettingsFragment : ComposeFragment() {
viewModel.requestSnackbar(RemoteBackupsSettingsState.Snackbar.NONE)
}
override fun onSelectBackupsFrequencyChange(newFrequency: BackupFrequency) {
viewModel.setBackupsFrequency(newFrequency)
}
override fun onTurnOffAndDeleteBackupsConfirm() {
viewModel.turnOffAndDeleteBackups()
}
@@ -365,10 +358,9 @@ private interface ContentCallbacks {
fun onBackupNowClick() = Unit
fun onCancelUploadClick() = Unit
fun onTurnOffAndDeleteBackupsClick() = Unit
fun onChangeBackupFrequencyClick() = Unit
fun onBackupFrequencyClick() = Unit
fun onDialogDismissed() = Unit
fun onSnackbarDismissed() = Unit
fun onSelectBackupsFrequencyChange(newFrequency: BackupFrequency) = Unit
fun onTurnOffAndDeleteBackupsConfirm() = Unit
fun onViewBackupKeyClick() = Unit
fun onStartMediaRestore() = Unit
@@ -527,7 +519,6 @@ private fun RemoteBackupsSettingsContent(
canBackupMessagesRun = state.canBackupMessagesJobRun,
lastBackupTimestamp = state.lastBackupTimestamp,
backupMediaSize = state.backupMediaSize,
backupsFrequency = state.backupsFrequency,
canBackUpUsingCellular = state.canBackUpUsingCellular,
canRestoreUsingCellular = state.canRestoreUsingCellular,
canBackUpNow = !state.isOutOfStorageSpace,
@@ -581,10 +572,11 @@ private fun RemoteBackupsSettingsContent(
}
RemoteBackupsSettingsState.Dialog.BACKUP_FREQUENCY -> {
BackupFrequencyDialog(
selected = state.backupsFrequency,
onSelected = contentCallbacks::onSelectBackupsFrequencyChange,
onDismiss = contentCallbacks::onDialogDismissed
Dialogs.SimpleAlertDialog(
title = stringResource(R.string.RemoteBackupsSettingsFragment__backup_frequency),
body = stringResource(R.string.RemoteBackupsSettingsFragment__backup_frequency_dialog_body),
confirm = stringResource(android.R.string.ok),
onConfirm = contentCallbacks::onDialogDismissed
)
}
@@ -834,7 +826,6 @@ private fun LazyListScope.appendBackupDetailsItems(
canBackupMessagesRun: Boolean,
lastBackupTimestamp: Long,
backupMediaSize: Long,
backupsFrequency: BackupFrequency,
canBackUpUsingCellular: Boolean,
canRestoreUsingCellular: Boolean,
canBackUpNow: Boolean,
@@ -938,13 +929,13 @@ private fun LazyListScope.appendBackupDetailsItems(
color = MaterialTheme.colorScheme.onSurface
)
Text(
text = getTextForFrequency(backupsFrequency = backupsFrequency),
text = stringResource(id = R.string.RemoteBackupsSettingsFragment__daily),
style = MaterialTheme.typography.bodyMedium,
color = MaterialTheme.colorScheme.onSurfaceVariant
)
}
},
onClick = contentCallbacks::onChangeBackupFrequencyClick
onClick = contentCallbacks::onBackupFrequencyClick
)
}
@@ -1658,64 +1649,6 @@ private fun ResumeRestoreOverCellularDialog(
)
}
@OptIn(ExperimentalMaterial3Api::class)
@Composable
private fun BackupFrequencyDialog(
selected: BackupFrequency,
onSelected: (BackupFrequency) -> Unit,
onDismiss: () -> Unit
) {
BasicAlertDialog(
onDismissRequest = onDismiss
) {
Surface(
color = Dialogs.Defaults.containerColor,
shape = Dialogs.Defaults.shape,
shadowElevation = Dialogs.Defaults.TonalElevation
) {
Column(
modifier = Modifier.fillMaxWidth()
) {
Text(
text = stringResource(id = R.string.RemoteBackupsSettingsFragment__backup_frequency),
style = MaterialTheme.typography.headlineMedium,
color = MaterialTheme.colorScheme.onSurface,
modifier = Modifier.padding(24.dp)
)
BackupFrequency.entries.forEach {
Rows.RadioRow(
selected = selected == it,
text = getTextForFrequency(backupsFrequency = it),
label = when (it) {
BackupFrequency.MANUAL -> stringResource(id = R.string.RemoteBackupsSettingsFragment__by_tapping_back_up_now)
else -> null
},
modifier = Modifier
.padding(end = 24.dp)
.clickable(onClick = {
onSelected(it)
onDismiss()
})
)
}
Box(
contentAlignment = Alignment.CenterEnd,
modifier = Modifier
.fillMaxWidth()
.padding(horizontal = 24.dp)
.padding(bottom = 24.dp)
) {
TextButton(onClick = onDismiss) {
Text(text = stringResource(id = android.R.string.cancel))
}
}
}
}
}
}
@Composable
private fun BackupReadyToDownloadRow(
ready: BackupRestoreState.Ready,
@@ -1772,7 +1705,6 @@ private fun RemoteBackupsSettingsContentPreview() {
lastBackupTimestamp = -1,
canBackUpUsingCellular = false,
canRestoreUsingCellular = false,
backupsFrequency = BackupFrequency.MANUAL,
dialog = RemoteBackupsSettingsState.Dialog.NONE,
snackbar = RemoteBackupsSettingsState.Snackbar.NONE,
backupMediaSize = 2300000,
@@ -1801,7 +1733,6 @@ private fun RemoteBackupsSettingsInternalUserContentPreview() {
lastBackupTimestamp = -1,
canBackUpUsingCellular = false,
canRestoreUsingCellular = false,
backupsFrequency = BackupFrequency.MANUAL,
dialog = RemoteBackupsSettingsState.Dialog.NONE,
snackbar = RemoteBackupsSettingsState.Snackbar.NONE,
backupMediaSize = 2300000,
@@ -2108,18 +2039,6 @@ private fun SkipDownloadDialogPreview() {
}
}
@SignalPreview
@Composable
private fun BackupFrequencyDialogPreview() {
Previews.Preview {
BackupFrequencyDialog(
selected = BackupFrequency.DAILY,
onSelected = {},
onDismiss = {}
)
}
}
@SignalPreview
@Composable
private fun BackupDeletionCardPreview() {

View File

@@ -6,7 +6,6 @@
package org.thoughtcrime.securesms.components.settings.app.backups.remote
import org.signal.core.util.ByteSize
import org.thoughtcrime.securesms.backup.v2.BackupFrequency
import org.thoughtcrime.securesms.backup.v2.MessageBackupTier
import org.thoughtcrime.securesms.components.settings.app.backups.BackupState
@@ -24,7 +23,6 @@ data class RemoteBackupsSettingsState(
val totalAllowedStorageSpace: String = "",
val backupState: BackupState,
val backupMediaSize: Long = -1L,
val backupsFrequency: BackupFrequency = BackupFrequency.DAILY,
val lastBackupTimestamp: Long = 0,
val dialog: Dialog = Dialog.NONE,
val snackbar: Snackbar = Snackbar.NONE,

View File

@@ -30,7 +30,6 @@ import org.signal.core.util.throttleLatest
import org.signal.donations.InAppPaymentType
import org.thoughtcrime.securesms.backup.ArchiveUploadProgress
import org.thoughtcrime.securesms.backup.DeletionState
import org.thoughtcrime.securesms.backup.v2.BackupFrequency
import org.thoughtcrime.securesms.backup.v2.BackupRepository
import org.thoughtcrime.securesms.backup.v2.MessageBackupTier
import org.thoughtcrime.securesms.backup.v2.ui.status.BackupStatusData
@@ -45,7 +44,6 @@ import org.thoughtcrime.securesms.jobmanager.impl.BackupMessagesConstraint
import org.thoughtcrime.securesms.jobs.BackupMessagesJob
import org.thoughtcrime.securesms.keyvalue.SignalStore
import org.thoughtcrime.securesms.keyvalue.protos.ArchiveUploadProgressState
import org.thoughtcrime.securesms.service.MessageBackupListener
import org.thoughtcrime.securesms.util.Environment
import org.thoughtcrime.securesms.util.RemoteConfig
import org.thoughtcrime.securesms.util.TextSecurePreferences
@@ -70,7 +68,6 @@ class RemoteBackupsSettingsViewModel : ViewModel() {
canBackupMessagesJobRun = BackupMessagesConstraint.isMet(AppDependencies.application),
canViewBackupKey = !TextSecurePreferences.isUnauthorizedReceived(AppDependencies.application),
lastBackupTimestamp = SignalStore.backup.lastBackupTime,
backupsFrequency = SignalStore.backup.backupFrequency,
canBackUpUsingCellular = SignalStore.backup.backupWithCellular,
canRestoreUsingCellular = SignalStore.backup.restoreWithCellular,
includeDebuglog = SignalStore.internal.includeDebuglogInBackup.takeIf { RemoteConfig.internalUser }
@@ -185,13 +182,6 @@ class RemoteBackupsSettingsViewModel : ViewModel() {
_state.update { it.copy(canRestoreUsingCellular = true) }
}
fun setBackupsFrequency(backupsFrequency: BackupFrequency) {
SignalStore.backup.backupFrequency = backupsFrequency
_state.update { it.copy(backupsFrequency = backupsFrequency) }
MessageBackupListener.setNextBackupTimeToIntervalFromNow()
MessageBackupListener.schedule(AppDependencies.application)
}
fun beginMediaRestore() {
BackupRepository.resumeMediaRestore()
}
@@ -302,7 +292,6 @@ class RemoteBackupsSettingsViewModel : ViewModel() {
lastBackupTimestamp = SignalStore.backup.lastBackupTime,
canBackupMessagesJobRun = BackupMessagesConstraint.isMet(AppDependencies.application),
backupMediaSize = getBackupMediaSize(),
backupsFrequency = SignalStore.backup.backupFrequency,
canBackUpUsingCellular = SignalStore.backup.backupWithCellular,
canRestoreUsingCellular = SignalStore.backup.restoreWithCellular,
isOutOfStorageSpace = BackupRepository.shouldDisplayOutOfRemoteStorageSpaceUx(),

View File

@@ -6,8 +6,6 @@ import okio.withLock
import org.signal.core.util.logging.Log
import org.thoughtcrime.securesms.backup.DeletionState
import org.thoughtcrime.securesms.backup.RestoreState
import org.thoughtcrime.securesms.backup.v2.BackupFrequency
import org.thoughtcrime.securesms.backup.v2.BackupRepository
import org.thoughtcrime.securesms.backup.v2.MessageBackupTier
import org.thoughtcrime.securesms.components.settings.app.backups.BackupStateObserver
import org.thoughtcrime.securesms.jobmanager.impl.BackupMessagesConstraintObserver
@@ -53,7 +51,6 @@ class BackupValues(store: KeyValueStore) : SignalStoreValues(store) {
private const val KEY_LAST_BACKUP_TIME = "backup.lastBackupTime"
private const val KEY_LAST_ATTACHMENT_RECONCILIATION_TIME = "backup.lastBackupMediaSyncTime"
private const val KEY_TOTAL_RESTORABLE_ATTACHMENT_SIZE = "backup.totalRestorableAttachmentSize"
private const val KEY_BACKUP_FREQUENCY = "backup.backupFrequency"
private const val KEY_LAST_BACKUP_PROTO_VERSION = "backup.lastBackupProtoVersion"
private const val KEY_CDN_MEDIA_PATH = "backup.cdn.mediaPath"
@@ -143,8 +140,6 @@ class BackupValues(store: KeyValueStore) : SignalStoreValues(store) {
get() = getLong(KEY_LAST_BACKUP_TIME, -1)
set(value) {
putLong(KEY_LAST_BACKUP_TIME, value)
isNoBackupForManualUploadNotified = false
BackupRepository.cancelManualBackupNotCreatedInThresholdNotification()
clearMessageBackupFailureSheetWatermark()
}
@@ -154,7 +149,6 @@ class BackupValues(store: KeyValueStore) : SignalStoreValues(store) {
val daysSinceLastBackup: Int get() = (System.currentTimeMillis().milliseconds - lastBackupTime.milliseconds).inWholeDays.toInt()
var lastAttachmentReconciliationTime: Long by longValue(KEY_LAST_ATTACHMENT_RECONCILIATION_TIME, -1)
var backupFrequency: BackupFrequency by enumValue(KEY_BACKUP_FREQUENCY, BackupFrequency.DAILY, BackupFrequency.Serializer)
var userManuallySkippedMediaRestore: Boolean by booleanValue(KEY_USER_MANUALLY_SKIPPED_MEDIA_RESTORE, false)
@@ -479,14 +473,7 @@ class BackupValues(store: KeyValueStore) : SignalStoreValues(store) {
}
private fun getNextBackupFailureSheetSnoozeTime(previous: Duration): Duration {
val timeoutPerSnooze = when (SignalStore.backup.backupFrequency) {
BackupFrequency.DAILY -> 7.days
BackupFrequency.WEEKLY -> 14.days
BackupFrequency.MONTHLY -> 14.days
BackupFrequency.MANUAL -> Int.MAX_VALUE.days
}
return previous + timeoutPerSnooze
return previous + 7.days
}
class SerializedCredentials(

View File

@@ -36,7 +36,6 @@ class LogSectionRemoteBackups : LogSection {
output.append("Can backup with cellular: ${SignalStore.backup.backupWithCellular}\n")
output.append("Has backup been uploaded: ${SignalStore.backup.hasBackupBeenUploaded}\n")
output.append("Has backup failure: ${SignalStore.backup.hasBackupFailure}\n")
output.append("Backup frequency: ${SignalStore.backup.backupFrequency.name}\n")
output.append("Optimize storage: ${SignalStore.backup.optimizeStorage}\n")
output.append("Detected subscription state mismatch: ${SignalStore.backup.subscriptionStateMismatchDetected}\n")
output.append("Last verified key time: ${SignalStore.backup.lastVerifyKeyTime}\n")

View File

@@ -6,7 +6,6 @@
package org.thoughtcrime.securesms.service
import android.content.Context
import org.thoughtcrime.securesms.backup.v2.BackupFrequency
import org.thoughtcrime.securesms.jobs.BackupMessagesJob
import org.thoughtcrime.securesms.keyvalue.SignalStore
import org.thoughtcrime.securesms.util.RemoteConfig
@@ -58,13 +57,7 @@ class MessageBackupListener : PersistentAlarmManagerListener() {
val now = LocalDateTime.now()
val hour = SignalStore.settings.backupHour
val minute = SignalStore.settings.backupMinute
var next = getNextDailyBackupTimeFromNowWithJitter(now, hour, minute, maxJitterSeconds)
next = when (SignalStore.backup.backupFrequency) {
BackupFrequency.MANUAL -> next.plusDays(364)
BackupFrequency.MONTHLY -> next.plusDays(29)
BackupFrequency.WEEKLY -> next.plusDays(6)
else -> next
}
val next = getNextDailyBackupTimeFromNowWithJitter(now, hour, minute, maxJitterSeconds).plusDays(1)
val nextTime = next.toMillis()
SignalStore.backup.nextBackupTime = nextTime
return nextTime

View File

@@ -8142,6 +8142,8 @@
<string name="RemoteBackupsSettingsFragment__loading">Loading…</string>
<!-- Row label for backup frequency -->
<string name="RemoteBackupsSettingsFragment__backup_frequency">Backup frequency</string>
<!-- The body of a pop-up dialog explaining that backups are performed every day. -->
<string name="RemoteBackupsSettingsFragment__backup_frequency_dialog_body">New media and messages you receive are backed up daily.</string>
<!-- Toggle row label for allowing backups to occur while on cellular connection -->
<string name="RemoteBackupsSettingsFragment__back_up_using_cellular">Back up using cellular</string>
<!-- Row label for viewing recovery key -->