From 47e4a6cf5a293632f2153600893b99ef96e3cc54 Mon Sep 17 00:00:00 2001 From: Clark Date: Mon, 24 Jun 2024 18:42:29 -0400 Subject: [PATCH] Regularly delete any archived media we don't know about. --- .../securesms/jobs/BackupMessagesJob.kt | 15 +++++++++++++-- .../securesms/jobs/SyncArchivedMediaJob.kt | 2 ++ .../securesms/keyvalue/BackupValues.kt | 2 ++ .../securesms/service/MessageBackupListener.kt | 4 +++- 4 files changed, 20 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/org/thoughtcrime/securesms/jobs/BackupMessagesJob.kt b/app/src/main/java/org/thoughtcrime/securesms/jobs/BackupMessagesJob.kt index 04a3aaeaf8..11e579d2b4 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/jobs/BackupMessagesJob.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/jobs/BackupMessagesJob.kt @@ -36,9 +36,20 @@ class BackupMessagesJob private constructor(parameters: Parameters) : BaseJob(pa const val QUEUE = "BackupMessagesQueue" - fun enqueue() { + /** + * Pruning abandoned remote media is relatively expensive, so we should + * not do this every time we backup. + */ + fun enqueue(pruneAbandonedRemoteMedia: Boolean = false) { val jobManager = AppDependencies.jobManager - jobManager.add(BackupMessagesJob()) + if (pruneAbandonedRemoteMedia) { + jobManager + .startChain(BackupMessagesJob()) + .then(SyncArchivedMediaJob()) + .enqueue() + } else { + jobManager.add(BackupMessagesJob()) + } } } diff --git a/app/src/main/java/org/thoughtcrime/securesms/jobs/SyncArchivedMediaJob.kt b/app/src/main/java/org/thoughtcrime/securesms/jobs/SyncArchivedMediaJob.kt index 45fd928d09..a32b4e39a9 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/jobs/SyncArchivedMediaJob.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/jobs/SyncArchivedMediaJob.kt @@ -12,6 +12,7 @@ import org.thoughtcrime.securesms.backup.v2.BackupRepository import org.thoughtcrime.securesms.database.SignalDatabase import org.thoughtcrime.securesms.jobmanager.Job import org.thoughtcrime.securesms.jobmanager.JsonJobData +import org.thoughtcrime.securesms.keyvalue.SignalStore import org.whispersystems.signalservice.api.archive.ArchiveGetMediaItemsResponse import org.whispersystems.signalservice.api.push.exceptions.NetworkFailureException import java.lang.Exception @@ -75,6 +76,7 @@ class SyncArchivedMediaJob private constructor( BackupRepository.deleteAbandonedMediaObjects(attachmentsToDelete) Log.i(TAG, "Deleted ${attachmentsToDelete.size} attachments off CDN") } + SignalStore.backup.lastMediaSyncTime = System.currentTimeMillis() } /** diff --git a/app/src/main/java/org/thoughtcrime/securesms/keyvalue/BackupValues.kt b/app/src/main/java/org/thoughtcrime/securesms/keyvalue/BackupValues.kt index b118a25c87..8609be2412 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/keyvalue/BackupValues.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/keyvalue/BackupValues.kt @@ -26,6 +26,7 @@ class BackupValues(store: KeyValueStore) : SignalStoreValues(store) { private const val KEY_NEXT_BACKUP_TIME = "backup.nextBackupTime" private const val KEY_LAST_BACKUP_TIME = "backup.lastBackupTime" + private const val KEY_LAST_BACKUP_MEDIA_SYNC_TIME = "backup.lastBackupMediaSyncTime" private const val KEY_BACKUP_FREQUENCY = "backup.backupFrequency" private const val KEY_CDN_BACKUP_DIRECTORY = "backup.cdn.directory" @@ -59,6 +60,7 @@ class BackupValues(store: KeyValueStore) : SignalStoreValues(store) { var nextBackupTime: Long by longValue(KEY_NEXT_BACKUP_TIME, -1) var lastBackupTime: Long by longValue(KEY_LAST_BACKUP_TIME, -1) + var lastMediaSyncTime: Long by longValue(KEY_LAST_BACKUP_MEDIA_SYNC_TIME, -1) var backupFrequency: BackupFrequency by enumValue(KEY_BACKUP_FREQUENCY, BackupFrequency.MANUAL, BackupFrequency.Serializer) var backupTier: MessageBackupTier? by enumValue(KEY_BACKUP_TIER, null, MessageBackupTier.Serializer) diff --git a/app/src/main/java/org/thoughtcrime/securesms/service/MessageBackupListener.kt b/app/src/main/java/org/thoughtcrime/securesms/service/MessageBackupListener.kt index 33663b2fb6..51f6c2a902 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/service/MessageBackupListener.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/service/MessageBackupListener.kt @@ -26,13 +26,15 @@ class MessageBackupListener : PersistentAlarmManagerListener() { override fun onAlarm(context: Context, scheduledTime: Long): Long { if (SignalStore.backup.areBackupsEnabled) { - BackupMessagesJob.enqueue() + val timeSinceLastSync = System.currentTimeMillis() - SignalStore.backup.lastMediaSyncTime + BackupMessagesJob.enqueue(pruneAbandonedRemoteMedia = timeSinceLastSync >= BACKUP_MEDIA_SYNC_INTERVAL || timeSinceLastSync < 0) } return setNextBackupTimeToIntervalFromNow() } companion object { private val BACKUP_JITTER_WINDOW_SECONDS = Math.toIntExact(TimeUnit.MINUTES.toSeconds(10)) + private val BACKUP_MEDIA_SYNC_INTERVAL = TimeUnit.DAYS.toMillis(7) @JvmStatic fun schedule(context: Context?) {