1 package org.robolectric.shadows; 2 3 import static android.os.Build.VERSION_CODES.LOLLIPOP; 4 import static android.os.Build.VERSION_CODES.N; 5 import static android.os.Build.VERSION_CODES.O; 6 7 import android.app.JobSchedulerImpl; 8 import android.app.job.JobInfo; 9 import android.app.job.JobScheduler; 10 import android.app.job.JobWorkItem; 11 import java.util.ArrayList; 12 import java.util.HashMap; 13 import java.util.HashSet; 14 import java.util.List; 15 import java.util.Map; 16 import java.util.Set; 17 import org.robolectric.annotation.Implementation; 18 import org.robolectric.annotation.Implements; 19 20 @Implements(value = JobScheduler.class, minSdk = LOLLIPOP) 21 public abstract class ShadowJobScheduler { 22 23 @Implementation 24 public abstract int schedule(JobInfo job); 25 26 @Implementation 27 public abstract void cancel(int jobId); 28 29 @Implementation 30 public abstract void cancelAll(); 31 32 @Implementation 33 public abstract List<JobInfo> getAllPendingJobs(); 34 35 @Implementation(minSdk = N) 36 public abstract JobInfo getPendingJob(int jobId); 37 38 @Implementation(minSdk = O) 39 public abstract int enqueue(JobInfo job, JobWorkItem work); 40 41 public abstract void failOnJob(int jobId); 42 43 @Implements(value = JobSchedulerImpl.class, isInAndroidSdk = false) 44 public static class ShadowJobSchedulerImpl extends ShadowJobScheduler { 45 46 private Map<Integer, JobInfo> scheduledJobs = new HashMap<>(); 47 private Set<Integer> jobsToFail = new HashSet<>(); 48 49 @Override @Implementation 50 public int schedule(JobInfo job) { 51 if (jobsToFail.contains(job.getId())) { 52 return JobScheduler.RESULT_FAILURE; 53 } 54 55 scheduledJobs.put(job.getId(), job); 56 return JobScheduler.RESULT_SUCCESS; 57 } 58 59 @Override @Implementation 60 public void cancel(int jobId) { 61 scheduledJobs.remove(jobId); 62 } 63 64 @Override @Implementation 65 public void cancelAll() { 66 scheduledJobs.clear(); 67 } 68 69 @Override @Implementation 70 public List<JobInfo> getAllPendingJobs() { 71 return new ArrayList<>(scheduledJobs.values()); 72 } 73 74 @Override @Implementation(minSdk = N) 75 public JobInfo getPendingJob(int jobId) { 76 return scheduledJobs.get(jobId); 77 } 78 79 @Override 80 @Implementation(minSdk = O) 81 public int enqueue(JobInfo job, JobWorkItem work) { 82 // Shadow-wise, enqueue and schedule are identical. 83 return schedule(job); 84 } 85 86 @Override 87 public void failOnJob(int jobId) { 88 jobsToFail.add(jobId); 89 } 90 } 91 } 92