diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/chats/backups/RemoteBackupsSettingsViewModel.kt b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/chats/backups/RemoteBackupsSettingsViewModel.kt index 277349d260..56e986b11c 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/chats/backups/RemoteBackupsSettingsViewModel.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/chats/backups/RemoteBackupsSettingsViewModel.kt @@ -31,7 +31,7 @@ class RemoteBackupsSettingsViewModel : ViewModel() { val state: State = internalState fun setCanBackUpUsingCellular(canBackUpUsingCellular: Boolean) { - // TODO [message-backups] -- Update via repository? + SignalStore.backup().backupWithCellular = canBackUpUsingCellular internalState.value = state.value.copy(canBackUpUsingCellular = canBackUpUsingCellular) } diff --git a/app/src/main/java/org/thoughtcrime/securesms/jobmanager/impl/WifiConstraint.kt b/app/src/main/java/org/thoughtcrime/securesms/jobmanager/impl/WifiConstraint.kt new file mode 100644 index 0000000000..157c4967f9 --- /dev/null +++ b/app/src/main/java/org/thoughtcrime/securesms/jobmanager/impl/WifiConstraint.kt @@ -0,0 +1,35 @@ +/* + * Copyright 2024 Signal Messenger, LLC + * SPDX-License-Identifier: AGPL-3.0-only + */ + +package org.thoughtcrime.securesms.jobmanager.impl + +import android.app.Application +import android.app.job.JobInfo +import org.thoughtcrime.securesms.jobmanager.Constraint +import org.thoughtcrime.securesms.util.NetworkUtil + +/** + * Constraint that, when added, means that a job cannot be performed unless the user has Wifi + */ +class WifiConstraint(private val application: Application) : Constraint { + + companion object { + const val KEY = "WifiConstraint" + } + + override fun isMet(): Boolean { + return NetworkUtil.isConnectedWifi(application) + } + + override fun getFactoryKey(): String = KEY + + override fun applyToJobInfo(jobInfoBuilder: JobInfo.Builder) = Unit + + class Factory(val application: Application) : Constraint.Factory { + override fun create(): WifiConstraint { + return WifiConstraint(application) + } + } +} 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 3e469a054f..21b31ab0bb 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/jobs/BackupMessagesJob.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/jobs/BackupMessagesJob.kt @@ -15,6 +15,7 @@ import org.thoughtcrime.securesms.database.SignalDatabase import org.thoughtcrime.securesms.dependencies.ApplicationDependencies import org.thoughtcrime.securesms.jobmanager.Job import org.thoughtcrime.securesms.jobmanager.impl.NetworkConstraint +import org.thoughtcrime.securesms.jobmanager.impl.WifiConstraint import org.thoughtcrime.securesms.keyvalue.SignalStore import org.thoughtcrime.securesms.providers.BlobProvider import org.whispersystems.signalservice.api.NetworkResult @@ -43,7 +44,7 @@ class BackupMessagesJob private constructor(parameters: Parameters) : BaseJob(pa constructor() : this( Parameters.Builder() - .addConstraint(NetworkConstraint.KEY) + .addConstraint(if (SignalStore.backup().backupWithCellular) NetworkConstraint.KEY else WifiConstraint.KEY) .setMaxAttempts(3) .setMaxInstancesForFactory(1) .setQueue(QUEUE) diff --git a/app/src/main/java/org/thoughtcrime/securesms/jobs/JobManagerFactories.java b/app/src/main/java/org/thoughtcrime/securesms/jobs/JobManagerFactories.java index 9255aa3b11..061bb00e5b 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/jobs/JobManagerFactories.java +++ b/app/src/main/java/org/thoughtcrime/securesms/jobs/JobManagerFactories.java @@ -26,6 +26,7 @@ import org.thoughtcrime.securesms.jobmanager.impl.NotInCallConstraint; import org.thoughtcrime.securesms.jobmanager.impl.NotInCallConstraintObserver; import org.thoughtcrime.securesms.jobmanager.impl.SqlCipherMigrationConstraint; import org.thoughtcrime.securesms.jobmanager.impl.SqlCipherMigrationConstraintObserver; +import org.thoughtcrime.securesms.jobmanager.impl.WifiConstraint; import org.thoughtcrime.securesms.jobmanager.migrations.DonationReceiptRedemptionJobMigration; import org.thoughtcrime.securesms.jobmanager.migrations.PushDecryptMessageJobEnvelopeMigration; import org.thoughtcrime.securesms.jobmanager.migrations.PushProcessMessageJobMigration; @@ -340,6 +341,7 @@ public final class JobManagerFactories { put(NetworkOrCellServiceConstraint.LEGACY_KEY, new NetworkOrCellServiceConstraint.Factory(application)); put(NotInCallConstraint.KEY, new NotInCallConstraint.Factory()); put(SqlCipherMigrationConstraint.KEY, new SqlCipherMigrationConstraint.Factory(application)); + put(WifiConstraint.KEY, new WifiConstraint.Factory(application)); }}; } 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 3462852494..020934c781 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/keyvalue/BackupValues.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/keyvalue/BackupValues.kt @@ -31,6 +31,7 @@ internal class BackupValues(store: KeyValueStore) : SignalStoreValues(store) { private const val KEY_CDN_BACKUP_DIRECTORY = "backup.cdn.directory" private const val KEY_CDN_BACKUP_MEDIA_DIRECTORY = "backup.cdn.mediaDirectory" + private const val KEY_BACKUP_OVER_CELLULAR = "backup.useCellular" private const val KEY_OPTIMIZE_STORAGE = "backup.optimizeStorage" private const val KEY_BACKUPS_INITIALIZED = "backup.initialized" @@ -55,6 +56,7 @@ internal class BackupValues(store: KeyValueStore) : SignalStoreValues(store) { var canReadWriteToArchiveCdn: Boolean by booleanValue(KEY_CDN_CAN_READ_WRITE, false) var restoreState: RestoreState by enumValue(KEY_RESTORE_STATE, RestoreState.NONE, RestoreState.serializer) var optimizeStorage: Boolean by booleanValue(KEY_OPTIMIZE_STORAGE, false) + var backupWithCellular: Boolean by booleanValue(KEY_BACKUP_OVER_CELLULAR, false) var nextBackupTime: Long by longValue(KEY_NEXT_BACKUP_TIME, -1) var lastBackupTime: Long by longValue(KEY_LAST_BACKUP_TIME, -1)