/** * The failure count increases if a non periodic {@link Job} was rescheduled or if a periodic * {@link Job} wasn't successful. * * @return How often the job already has failed. */ public int getFailureCount() { return mRequest.getFailureCount(); }
public static int getRescheduleCount(JobRequest request) { return request.getFailureCount(); }
public static long getStartMs(JobRequest request) { if (request.getFailureCount() > 0) { return request.getBackoffOffset(); } else { return request.getStartMs(); } }
public static long getEndMs(JobRequest request, boolean shiftEnd) { long endMs; if (request.getFailureCount() > 0) { endMs = request.getBackoffOffset(); } else { endMs = request.getEndMs(); } if (shiftEnd && request.requirementsEnforced() && request.hasRequirements()) { // move the end backwards if the API is smart with the requirements endMs = checkedMultiply(endMs, 100); } return endMs; }
@Test public void incrementPeriodicJobFailureCount() { int jobId = DummyJobs.createBuilder(DummyJobs.FailureJob.class) .setPeriodic(TimeUnit.MINUTES.toMillis(15)) .build() .schedule(); executeJob(jobId, Job.Result.FAILURE); assertThat(manager().getJobRequest(jobId).getFailureCount()).isEqualTo(1); resetJob(jobId); executeJob(jobId, Job.Result.FAILURE); assertThat(manager().getJobRequest(jobId).getFailureCount()).isEqualTo(2); }
@Test public void testUpdateDoesNotCrash() { JobRequest request = DummyJobs.createOneOff(); int jobId = request.schedule(); assertThat(request.getScheduledAt()).isGreaterThan(0L); assertThat(request.getFailureCount()).isEqualTo(0); assertThat(request.getLastRun()).isEqualTo(0); SQLiteDatabase database = mock(SQLiteDatabase.class); when(database.update(anyString(), any(ContentValues.class), nullable(String.class), any(String[].class))).thenThrow(SQLException.class); manager().getJobStorage().injectDatabase(database); request.updateStats(true, true); // updates the database value, but fails in this case assertThat(request.getFailureCount()).isEqualTo(1); // in memory value was updated, keep that assertThat(request.getLastRun()).isGreaterThan(0); // kinda hacky, this removes the request from the cache, but doesn't delete it in the database, // because we're using the mock at the moment manager().getJobStorage().remove(request); manager().getJobStorage().injectDatabase(null); // reset request = manager().getJobRequest(jobId); assertThat(request.getFailureCount()).isEqualTo(0); assertThat(request.getLastRun()).isEqualTo(0); }
@Override public void plantOneOff(JobRequest request) { PendingIntent pendingIntent = getPendingIntent(request, false); AlarmManager alarmManager = getAlarmManager(); if (alarmManager == null) { return; } try { if (request.isExact()) { if (request.getStartMs() == 1 && request.getFailureCount() <= 0) { // this job should start immediately PlatformAlarmService.start(mContext, request.getJobId(), request.getTransientExtras()); } else { plantOneOffExact(request, alarmManager, pendingIntent); } } else { plantOneOffInexact(request, alarmManager, pendingIntent); } } catch (Exception e) { // https://gist.github.com/vRallev/621b0b76a14ddde8691c mCat.e(e); } }
/** * The failure count increases if a non periodic {@link Job} was rescheduled or if a periodic * {@link Job} wasn't successful. * * @return How often the job already has failed. */ public int getFailureCount() { return mRequest.getFailureCount(); }
public static int getRescheduleCount(JobRequest request) { return request.getFailureCount(); }
public static long getStartMs(JobRequest request) { if (request.getFailureCount() > 0) { return request.getBackoffOffset(); } else { return request.getStartMs(); } }
public static long getEndMs(JobRequest request, boolean shiftEnd) { long endMs; if (request.getFailureCount() > 0) { endMs = request.getBackoffOffset(); } else { endMs = request.getEndMs(); } if (shiftEnd && request.requirementsEnforced() && request.hasRequirements()) { // move the end backwards if the API is smart with the requirements endMs = checkedMultiply(endMs, 100); } return endMs; }
@Override public void plantOneOff(JobRequest request) { PendingIntent pendingIntent = getPendingIntent(request, false); AlarmManager alarmManager = getAlarmManager(); if (alarmManager == null) { return; } try { if (request.isExact()) { if (request.getStartMs() == 1 && request.getFailureCount() <= 0) { // this job should start immediately PlatformAlarmService.start(mContext, request.getJobId(), request.getTransientExtras()); } else { plantOneOffExact(request, alarmManager, pendingIntent); } } else { plantOneOffInexact(request, alarmManager, pendingIntent); } } catch (Exception e) { // https://gist.github.com/vRallev/621b0b76a14ddde8691c mCat.e(e); } }