/*package*/ void setStarted(boolean started) { mStarted = started; ContentValues contentValues = new ContentValues(); contentValues.put(JobStorage.COLUMN_STARTED, mStarted); JobManager.instance().getJobStorage().update(this, contentValues); }
/*package*/ JobRequest getJobRequest(int jobId, boolean includeStarted) { JobRequest jobRequest = getJobStorage().get(jobId); if (!includeStarted && jobRequest != null && jobRequest.isStarted()) { return null; } else { return jobRequest; } }
/*package*/ void updateStats(boolean incFailureCount, boolean updateLastRun) { ContentValues contentValues = new ContentValues(); if (incFailureCount) { mFailureCount++; contentValues.put(JobStorage.COLUMN_NUM_FAILURES, mFailureCount); } if (updateLastRun) { mLastRun = JobConfig.getClock().currentTimeMillis(); contentValues.put(JobStorage.COLUMN_LAST_RUN, mLastRun); } JobManager.instance().getJobStorage().update(this, contentValues); }
/*package*/ Set<JobRequest> getAllJobRequests(@Nullable String tag, boolean includeStarted, boolean cleanUpTransient) { Set<JobRequest> requests = getJobStorage().getAllJobRequests(tag, includeStarted); if (cleanUpTransient) { Iterator<JobRequest> iterator = requests.iterator(); while (iterator.hasNext()) { JobRequest request = iterator.next(); if (request.isTransient() && !request.getJobApi().getProxy(mContext).isPlatformJobScheduled(request)) { getJobStorage().remove(request); iterator.remove(); } } } return requests; }
private boolean cancelInner(@Nullable JobRequest request) { if (request != null) { CAT.i("Found pending job %s, canceling", request); getJobProxy(request.getJobApi()).cancel(request.getJobId()); getJobStorage().remove(request); request.setScheduledAt(0); // reset value return true; } else { return false; } }
@Test(expected = SQLException.class) public void testInsertFails() { SQLiteDatabase database = mock(SQLiteDatabase.class); when(database.insert(anyString(), nullable(String.class), any(ContentValues.class))).thenReturn(-1L); when(database.insertWithOnConflict(anyString(), nullable(String.class), any(ContentValues.class), anyInt())).thenThrow(SQLException.class); manager().getJobStorage().injectDatabase(database); DummyJobs.createOneOff().schedule(); }
@Test public void testJobIdRollover() throws Exception { JobConfig.setJobIdOffset(10); context().getSharedPreferences(JobStorage.PREF_FILE_NAME, Context.MODE_PRIVATE).edit() .putInt(JobStorage.JOB_ID_COUNTER, JobIdsInternal.RESERVED_JOB_ID_RANGE_START - 2) .apply(); assertThat(manager().getJobStorage().nextJobId()).isEqualTo(JobIdsInternal.RESERVED_JOB_ID_RANGE_START - 1); assertThat(manager().getJobStorage().nextJobId()).isEqualTo(11); assertThat(manager().getJobStorage().nextJobId()).isEqualTo(12); }
/** * @param jobId The unique ID of the pending {@link JobRequest}. * @return The {@link JobRequest} if it's pending or {@code null} otherwise. */ public JobRequest getJobRequest(int jobId) { JobRequest request = getJobRequest(jobId, false); if (request != null && request.isTransient() && !request.getJobApi().getProxy(mContext).isPlatformJobScheduled(request)) { getJobStorage().remove(request); return null; } else { return request; } }
@Test public void verifyCloseDatabase() { assertThat(JobConfig.isCloseDatabase()).isFalse(); // default SQLiteDatabase database = mock(SQLiteDatabase.class); JobStorage storage = manager().getJobStorage(); storage.injectDatabase(database); storage.get(1); verify(database, times(1)).query(anyString(), nullable(String[].class), anyString(), any(String[].class), nullable(String.class), nullable(String.class), nullable(String.class)); verify(database, times(0)).close(); JobConfig.setCloseDatabase(true); storage.get(1); verify(database, times(2)).query(anyString(), nullable(String[].class), anyString(), any(String[].class), nullable(String.class), nullable(String.class), nullable(String.class)); verify(database, times(1)).close(); } }
builder.mId = JobManager.instance().getJobStorage().nextJobId(); JobPreconditions.checkArgumentNonnegative(builder.mId, "id can't be negative");
mJobManager.getJobStorage().remove(request); mJobManager.getJobStorage().remove(request); mJobManager.getJobStorage().remove(request); // remove, we store the new job in JobManager.schedule() request.reschedule(false, false);
getJobStorage().put(request); getJobStorage().remove(request); throw e; if (jobApi == JobApi.V_14 || jobApi == JobApi.V_19) { getJobStorage().remove(request); throw e; } else { } catch (Exception e) { getJobStorage().remove(request); throw e;
@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); }
@Test public void verifyTransientJobNotRescheduled() throws Exception { assertThat(manager().getAllJobRequests()).isEmpty(); Bundle bundle = new Bundle(); bundle.putString("key", "value"); ContentValues contentValues = new JobRequest.Builder("tag") .setExact(TimeUnit.HOURS.toMillis(1)) .setTransientExtras(bundle) .build() .toContentValues(); manager().getJobStorage().getDatabase() .insert(JobStorage.JOB_TABLE_NAME, null, contentValues); Set<JobRequest> requests = manager().getAllJobRequests(); assertThat(requests).isEmpty(); } }
@Test @Config(sdk = 21) public void verifyExactJobRescheduled() throws Exception { assertThat(manager().getAllJobRequests()).isEmpty(); ContentValues contentValues = new JobRequest.Builder("tag") .setExact(TimeUnit.HOURS.toMillis(1)) .build() .toContentValues(); manager().getJobStorage().getDatabase() .insert(JobStorage.JOB_TABLE_NAME, null, contentValues); Set<JobRequest> requests = manager().getAllJobRequests(); assertThat(requests).isNotEmpty(); final int jobId = 1; Intent intent = new Intent(context(), PlatformAlarmReceiver.class); assertThat(PendingIntent.getBroadcast(context(), jobId, intent, PendingIntent.FLAG_NO_CREATE)).isNull(); int rescheduledJobs = new JobRescheduleService().rescheduleJobs(manager()); assertThat(rescheduledJobs).isEqualTo(1); assertThat(PendingIntent.getBroadcast(context(), jobId, intent, PendingIntent.FLAG_NO_CREATE)).isNotNull(); }
@Test @Config(sdk = 21) public void verifyPeriodicJobRescheduled() throws Exception { assertThat(manager().getAllJobRequests()).isEmpty(); ContentValues contentValues = new JobRequest.Builder("tag") .setPeriodic(TimeUnit.HOURS.toMillis(1)) .build() .toContentValues(); manager().getJobStorage().getDatabase() .insert(JobStorage.JOB_TABLE_NAME, null, contentValues); Set<JobRequest> requests = manager().getAllJobRequests(); assertThat(requests).isNotEmpty(); JobScheduler scheduler = (JobScheduler) context().getSystemService(Context.JOB_SCHEDULER_SERVICE); assertThat(scheduler.getAllPendingJobs()).isEmpty(); int rescheduledJobs = new JobRescheduleService().rescheduleJobs(manager()); assertThat(rescheduledJobs).isEqualTo(1); }
/*package*/ void setStarted(boolean started) { mStarted = started; ContentValues contentValues = new ContentValues(); contentValues.put(JobStorage.COLUMN_STARTED, mStarted); JobManager.instance().getJobStorage().update(this, contentValues); }
/*package*/ void updateStats(boolean incFailureCount, boolean updateLastRun) { ContentValues contentValues = new ContentValues(); if (incFailureCount) { mFailureCount++; contentValues.put(JobStorage.COLUMN_NUM_FAILURES, mFailureCount); } if (updateLastRun) { mLastRun = JobConfig.getClock().currentTimeMillis(); contentValues.put(JobStorage.COLUMN_LAST_RUN, mLastRun); } JobManager.instance().getJobStorage().update(this, contentValues); }
private boolean cancelInner(@Nullable JobRequest request) { if (request != null) { CAT.i("Found pending job %s, canceling", request); getJobProxy(request.getJobApi()).cancel(request.getJobId()); getJobStorage().remove(request); request.setScheduledAt(0); // reset value return true; } else { return false; } }
/** * @param jobId The unique ID of the pending {@link JobRequest}. * @return The {@link JobRequest} if it's pending or {@code null} otherwise. */ public JobRequest getJobRequest(int jobId) { JobRequest request = getJobRequest(jobId, false); if (request != null && request.isTransient() && !request.getJobApi().getProxy(mContext).isPlatformJobScheduled(request)) { getJobStorage().remove(request); return null; } else { return request; } }