diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversationlist/ConversationListFragment.java b/app/src/main/java/org/thoughtcrime/securesms/conversationlist/ConversationListFragment.java index 135768e9fb..b33a6744f0 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversationlist/ConversationListFragment.java +++ b/app/src/main/java/org/thoughtcrime/securesms/conversationlist/ConversationListFragment.java @@ -137,6 +137,7 @@ import org.thoughtcrime.securesms.dependencies.ApplicationDependencies; import org.thoughtcrime.securesms.events.ReminderUpdateEvent; import org.thoughtcrime.securesms.exporter.flow.SmsExportDialogs; import org.thoughtcrime.securesms.groups.SelectionLimits; +import org.thoughtcrime.securesms.jobs.MessageFetchJob; import org.thoughtcrime.securesms.jobs.ServiceOutageDetectionJob; import org.thoughtcrime.securesms.keyvalue.SignalStore; import org.thoughtcrime.securesms.lock.v2.CreateSvrPinActivity; diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/JobDatabase.kt b/app/src/main/java/org/thoughtcrime/securesms/database/JobDatabase.kt index a5405222ce..0bead56308 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/JobDatabase.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/database/JobDatabase.kt @@ -213,12 +213,13 @@ class JobDatabase( } @Synchronized - fun updateJobAfterRetry(id: String, isRunning: Boolean, runAttempt: Int, nextBackoffInterval: Long, serializedData: ByteArray?) { + fun updateJobAfterRetry(id: String, currentTime: Long, runAttempt: Int, nextBackoffInterval: Long, serializedData: ByteArray?) { writableDatabase .update(Jobs.TABLE_NAME) .values( - Jobs.IS_RUNNING to if (isRunning) 1 else 0, + Jobs.IS_RUNNING to 0, Jobs.RUN_ATTEMPT to runAttempt, + Jobs.LAST_RUN_ATTEMPT_TIME to currentTime, Jobs.NEXT_BACKOFF_INTERVAL to nextBackoffInterval, Jobs.SERIALIZED_DATA to serializedData ) 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 fb2d22c69a..7f989e8be0 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/jobmanager/JobController.java +++ b/app/src/main/java/org/thoughtcrime/securesms/jobmanager/JobController.java @@ -253,7 +253,7 @@ class JobController { int nextRunAttempt = job.getRunAttempt() + 1; byte[] serializedData = job.serialize(); - jobStorage.updateJobAfterRetry(job.getId(), false, nextRunAttempt, backoffInterval, serializedData); + jobStorage.updateJobAfterRetry(job.getId(), System.currentTimeMillis(), nextRunAttempt, backoffInterval, serializedData); jobTracker.onStateChange(job, JobTracker.JobState.PENDING); List constraints = Stream.of(jobStorage.getConstraintSpecs(job.getId())) diff --git a/app/src/main/java/org/thoughtcrime/securesms/jobmanager/persistence/JobStorage.java b/app/src/main/java/org/thoughtcrime/securesms/jobmanager/persistence/JobStorage.java index d52bcef2bf..685e006d3c 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/jobmanager/persistence/JobStorage.java +++ b/app/src/main/java/org/thoughtcrime/securesms/jobmanager/persistence/JobStorage.java @@ -40,7 +40,7 @@ public interface JobStorage { void markJobAsRunning(@NonNull String id, long currentTime); @WorkerThread - void updateJobAfterRetry(@NonNull String id, boolean isRunning, int runAttempt, long nextRunAttemptTime, @Nullable byte[] serializedData); + void updateJobAfterRetry(@NonNull String id, long currentTime, int runAttempt, long nextBackoffInterval, @Nullable byte[] serializedData); @WorkerThread void updateAllJobsToBePending(); diff --git a/app/src/main/java/org/thoughtcrime/securesms/jobs/FastJobStorage.kt b/app/src/main/java/org/thoughtcrime/securesms/jobs/FastJobStorage.kt index 17f29e3a3e..ef8ffa3156 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/jobs/FastJobStorage.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/jobs/FastJobStorage.kt @@ -150,10 +150,10 @@ class FastJobStorage(private val jobDatabase: JobDatabase) : JobStorage { } @Synchronized - override fun updateJobAfterRetry(id: String, isRunning: Boolean, runAttempt: Int, nextBackoffInterval: Long, serializedData: ByteArray?) { + override fun updateJobAfterRetry(id: String, currentTime: Long, runAttempt: Int, nextBackoffInterval: Long, serializedData: ByteArray?) { val job = getJobById(id) if (job == null || !job.isMemoryOnly) { - jobDatabase.updateJobAfterRetry(id, isRunning, runAttempt, nextBackoffInterval, serializedData) + jobDatabase.updateJobAfterRetry(id, currentTime, runAttempt, nextBackoffInterval, serializedData) } val iter = jobs.listIterator() @@ -162,8 +162,9 @@ class FastJobStorage(private val jobDatabase: JobDatabase) : JobStorage { if (current.id == id) { iter.set( current.copy( - isRunning = isRunning, + isRunning = false, runAttempt = runAttempt, + lastRunAttemptTime = currentTime, nextBackoffInterval = nextBackoffInterval, serializedData = serializedData ) diff --git a/app/src/test/java/org/thoughtcrime/securesms/jobs/FastJobStorageTest.kt b/app/src/test/java/org/thoughtcrime/securesms/jobs/FastJobStorageTest.kt index 8c918ccff4..23c33b67b0 100644 --- a/app/src/test/java/org/thoughtcrime/securesms/jobs/FastJobStorageTest.kt +++ b/app/src/test/java/org/thoughtcrime/securesms/jobs/FastJobStorageTest.kt @@ -194,13 +194,13 @@ class FastJobStorageTest { subject.updateJobAfterRetry( id = "id1", - isRunning = true, + currentTime = 0, runAttempt = 1, nextBackoffInterval = 10, serializedData = "a".toByteArray() ) - Mockito.verify(database).updateJobAfterRetry(id = "id1", isRunning = true, runAttempt = 1, nextBackoffInterval = 10, serializedData = "a".toByteArray()) + Mockito.verify(database).updateJobAfterRetry(id = "id1", currentTime = 0, runAttempt = 1, nextBackoffInterval = 10, serializedData = "a".toByteArray()) } @Test @@ -212,13 +212,13 @@ class FastJobStorageTest { subject.updateJobAfterRetry( id = "id1", - isRunning = true, + currentTime = 0, runAttempt = 1, nextBackoffInterval = 10, serializedData = "a".toByteArray() ) - Mockito.verify(database, Mockito.times(0)).updateJobAfterRetry(id = "id1", isRunning = true, runAttempt = 1, nextBackoffInterval = 10, serializedData = "a".toByteArray()) + Mockito.verify(database, Mockito.times(0)).updateJobAfterRetry(id = "id1", currentTime = 0, runAttempt = 1, nextBackoffInterval = 10, serializedData = "a".toByteArray()) } @Test @@ -230,7 +230,7 @@ class FastJobStorageTest { subject.updateJobAfterRetry( id = "1", - isRunning = false, + currentTime = 3, runAttempt = 1, nextBackoffInterval = 10, serializedData = "a".toByteArray() @@ -239,6 +239,7 @@ class FastJobStorageTest { val job = subject.getJobSpec("1") check(job != null) job.isRunning assertIs false + job.lastRunAttemptTime assertIs 3 job.runAttempt assertIs 1 job.nextBackoffInterval assertIs 10 job.serializedData!!.toString(Charset.defaultCharset()) assertIs "a"