diff --git a/app/src/main/java/org/thoughtcrime/securesms/jobmanager/impl/ChangeNumberConstraint.kt b/app/src/main/java/org/thoughtcrime/securesms/jobmanager/impl/ChangeNumberConstraint.kt new file mode 100644 index 0000000000..0f30bb708d --- /dev/null +++ b/app/src/main/java/org/thoughtcrime/securesms/jobmanager/impl/ChangeNumberConstraint.kt @@ -0,0 +1,27 @@ +package org.thoughtcrime.securesms.jobmanager.impl + +import android.app.job.JobInfo +import org.thoughtcrime.securesms.jobmanager.Constraint +import org.thoughtcrime.securesms.keyvalue.SignalStore + +/** + * Constraint that, when added, means that a job cannot be performed while a change number operation is in progress. + */ +object ChangeNumberConstraint : Constraint { + + const val KEY = "ChangeNumberConstraint" + + override fun isMet(): Boolean { + return !SignalStore.misc().isChangeNumberLocked + } + + override fun getFactoryKey(): String = KEY + + override fun applyToJobInfo(jobInfoBuilder: JobInfo.Builder) = Unit + + class Factory : Constraint.Factory { + override fun create(): ChangeNumberConstraint { + return ChangeNumberConstraint + } + } +} diff --git a/app/src/main/java/org/thoughtcrime/securesms/jobmanager/impl/ChangeNumberConstraintObserver.kt b/app/src/main/java/org/thoughtcrime/securesms/jobmanager/impl/ChangeNumberConstraintObserver.kt new file mode 100644 index 0000000000..1ac049ef57 --- /dev/null +++ b/app/src/main/java/org/thoughtcrime/securesms/jobmanager/impl/ChangeNumberConstraintObserver.kt @@ -0,0 +1,25 @@ +package org.thoughtcrime.securesms.jobmanager.impl + +import org.thoughtcrime.securesms.jobmanager.ConstraintObserver + +/** + * An observer for the [ChangeNumberConstraint]. This class expects to be told when a change happens, + * since the points at which it happens are triggered by application code. + */ +object ChangeNumberConstraintObserver : ConstraintObserver { + + private const val REASON = "ChangeNumberConstraint" + + private var notifier: ConstraintObserver.Notifier? = null + + override fun register(notifier: ConstraintObserver.Notifier) { + this.notifier = notifier + } + + /** + * Let the observer know that the change number state has changed. + */ + fun onChange() { + notifier?.onConstraintMet(REASON) + } +} 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 cca2057e06..66f8602d06 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/jobs/JobManagerFactories.java +++ b/app/src/main/java/org/thoughtcrime/securesms/jobs/JobManagerFactories.java @@ -11,6 +11,7 @@ import org.thoughtcrime.securesms.jobmanager.Job; import org.thoughtcrime.securesms.jobmanager.JobMigration; import org.thoughtcrime.securesms.jobmanager.impl.AutoDownloadEmojiConstraint; import org.thoughtcrime.securesms.jobmanager.impl.CellServiceConstraintObserver; +import org.thoughtcrime.securesms.jobmanager.impl.ChangeNumberConstraint; import org.thoughtcrime.securesms.jobmanager.impl.ChargingConstraint; import org.thoughtcrime.securesms.jobmanager.impl.ChargingConstraintObserver; import org.thoughtcrime.securesms.jobmanager.impl.DecryptionsDrainedConstraint; @@ -277,13 +278,14 @@ public final class JobManagerFactories { public static Map getConstraintFactories(@NonNull Application application) { return new HashMap() {{ put(AutoDownloadEmojiConstraint.KEY, new AutoDownloadEmojiConstraint.Factory(application)); + put(ChangeNumberConstraint.KEY, new ChangeNumberConstraint.Factory()); put(ChargingConstraint.KEY, new ChargingConstraint.Factory()); + put(DecryptionsDrainedConstraint.KEY, new DecryptionsDrainedConstraint.Factory()); put(NetworkConstraint.KEY, new NetworkConstraint.Factory(application)); put(NetworkOrCellServiceConstraint.KEY, new NetworkOrCellServiceConstraint.Factory(application)); put(NetworkOrCellServiceConstraint.LEGACY_KEY, new NetworkOrCellServiceConstraint.Factory(application)); - put(SqlCipherMigrationConstraint.KEY, new SqlCipherMigrationConstraint.Factory(application)); - put(DecryptionsDrainedConstraint.KEY, new DecryptionsDrainedConstraint.Factory()); put(NotInCallConstraint.KEY, new NotInCallConstraint.Factory()); + put(SqlCipherMigrationConstraint.KEY, new SqlCipherMigrationConstraint.Factory(application)); }}; } diff --git a/app/src/main/java/org/thoughtcrime/securesms/jobs/PushProcessMessageJob.java b/app/src/main/java/org/thoughtcrime/securesms/jobs/PushProcessMessageJob.java index 5514f633ce..7ea4ac2c7e 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/jobs/PushProcessMessageJob.java +++ b/app/src/main/java/org/thoughtcrime/securesms/jobs/PushProcessMessageJob.java @@ -13,6 +13,7 @@ import org.thoughtcrime.securesms.groups.GroupChangeBusyException; import org.thoughtcrime.securesms.groups.GroupId; import org.thoughtcrime.securesms.jobmanager.JsonJobData; import org.thoughtcrime.securesms.jobmanager.Job; +import org.thoughtcrime.securesms.jobmanager.impl.ChangeNumberConstraint; import org.thoughtcrime.securesms.jobmanager.impl.NetworkConstraint; import org.thoughtcrime.securesms.messages.MessageContentProcessor; import org.thoughtcrime.securesms.messages.MessageContentProcessor.ExceptionMetadata; @@ -91,7 +92,8 @@ public final class PushProcessMessageJob extends BaseJob { Context context = ApplicationDependencies.getApplication(); String queueName = QUEUE_PREFIX; Parameters.Builder builder = new Parameters.Builder() - .setMaxAttempts(Parameters.UNLIMITED); + .setMaxAttempts(Parameters.UNLIMITED) + .addConstraint(ChangeNumberConstraint.KEY); if (content != null) { SignalServiceGroupV2 signalServiceGroupContext = GroupUtil.getGroupContextIfPresent(content); diff --git a/app/src/main/java/org/thoughtcrime/securesms/jobs/PushProcessMessageJobV2.kt b/app/src/main/java/org/thoughtcrime/securesms/jobs/PushProcessMessageJobV2.kt index ca90e2be15..4b1c8ad7ae 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/jobs/PushProcessMessageJobV2.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/jobs/PushProcessMessageJobV2.kt @@ -7,6 +7,7 @@ import org.signal.core.util.logging.Log import org.thoughtcrime.securesms.database.SignalDatabase.Companion.groups import org.thoughtcrime.securesms.groups.GroupChangeBusyException import org.thoughtcrime.securesms.jobmanager.Job +import org.thoughtcrime.securesms.jobmanager.impl.ChangeNumberConstraint import org.thoughtcrime.securesms.jobmanager.impl.NetworkConstraint import org.thoughtcrime.securesms.messages.MessageContentProcessorV2 import org.thoughtcrime.securesms.messages.SignalServiceProtoUtil.groupId @@ -112,7 +113,10 @@ class PushProcessMessageJobV2 private constructor( @WorkerThread private fun createParameters(content: Content, metadata: EnvelopeMetadata): Parameters { val queueName: String - val builder = Parameters.Builder().setMaxAttempts(Parameters.UNLIMITED) + val builder = Parameters.Builder() + .setMaxAttempts(Parameters.UNLIMITED) + .addConstraint(ChangeNumberConstraint.KEY) + val groupContext = GroupUtil.getGroupContextIfPresent(content) val groupId = groupContext?.groupId diff --git a/app/src/main/java/org/thoughtcrime/securesms/keyvalue/MiscellaneousValues.java b/app/src/main/java/org/thoughtcrime/securesms/keyvalue/MiscellaneousValues.java index 7ff3c8d154..8615c696f3 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/keyvalue/MiscellaneousValues.java +++ b/app/src/main/java/org/thoughtcrime/securesms/keyvalue/MiscellaneousValues.java @@ -4,6 +4,7 @@ import androidx.annotation.NonNull; import androidx.annotation.Nullable; import org.thoughtcrime.securesms.database.model.databaseprotos.PendingChangeNumberMetadata; +import org.thoughtcrime.securesms.jobmanager.impl.ChangeNumberConstraintObserver; import java.util.Collections; import java.util.List; @@ -110,10 +111,12 @@ public final class MiscellaneousValues extends SignalStoreValues { public void lockChangeNumber() { putBoolean(CHANGE_NUMBER_LOCK, true); + ChangeNumberConstraintObserver.INSTANCE.onChange(); } public void unlockChangeNumber() { putBoolean(CHANGE_NUMBER_LOCK, false); + ChangeNumberConstraintObserver.INSTANCE.onChange(); } public @Nullable PendingChangeNumberMetadata getPendingChangeNumberMetadata() {