From 2190a4a58da5120821277e379c75d75e4d4aa56c Mon Sep 17 00:00:00 2001 From: Greyson Parrelli Date: Tue, 12 Aug 2025 13:00:06 -0400 Subject: [PATCH] Fix issue where we could enqueue unsatisfiable jobs during registration. --- .../securesms/jobmanager/JobController.java | 18 ++++++++++++++++++ .../registration/ui/RegistrationViewModel.kt | 2 +- 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/org/thoughtcrime/securesms/jobmanager/JobController.java b/app/src/main/java/org/thoughtcrime/securesms/jobmanager/JobController.java index 76be46f1de..53a345e6fd 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/jobmanager/JobController.java +++ b/app/src/main/java/org/thoughtcrime/securesms/jobmanager/JobController.java @@ -103,6 +103,10 @@ class JobController { return; } + if (chainContainsUnsatisfiableConditions(chain)) { + throw new AssertionError("Unsatisfiable conditions found in job chain!"); + } + insertJobChain(chain); scheduleJobs(chain.get(0)); } @@ -402,6 +406,20 @@ class JobController { } } + @WorkerThread + private boolean chainContainsUnsatisfiableConditions(@NonNull List> chain) { + int firstGlobalPriority = chain.get(0).get(0).getParameters().getGlobalPriority(); + for (List segment : chain) { + for (Job job : segment) { + if (job.getParameters().getGlobalPriority() > firstGlobalPriority) { + return true; + } + } + } + + return false; + } + @WorkerThread private boolean exceedsMaximumInstances(@NonNull Job job) { boolean exceedsFactory = job.getParameters().getMaxInstancesForFactory() != Job.Parameters.UNLIMITED && diff --git a/app/src/main/java/org/thoughtcrime/securesms/registration/ui/RegistrationViewModel.kt b/app/src/main/java/org/thoughtcrime/securesms/registration/ui/RegistrationViewModel.kt index fe2f65744f..4d248f841f 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/registration/ui/RegistrationViewModel.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/registration/ui/RegistrationViewModel.kt @@ -878,7 +878,7 @@ class RegistrationViewModel : ViewModel() { stopwatch.split("account-restore") AppDependencies.jobManager - .startChain(StorageSyncJob.forRemoteChange()) + .startChain(StorageSyncJob.forAccountRestore()) .then(ReclaimUsernameAndLinkJob()) .enqueueAndBlockUntilCompletion(TimeUnit.SECONDS.toMillis(10)) stopwatch.split("storage-sync")