From 6d764a650c7826b7d49661b653c92ff8cf2bbbc8 Mon Sep 17 00:00:00 2001 From: Thomas Zurkan Date: Mon, 22 Apr 2019 14:07:27 -0700 Subject: [PATCH 1/2] potential fix for multi scheduling of event work --- .../ab/android/event_handler/EventRescheduler.java | 6 ++++-- .../optimizely/ab/android/shared/ServiceScheduler.java | 8 ++++++++ 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/event-handler/src/main/java/com/optimizely/ab/android/event_handler/EventRescheduler.java b/event-handler/src/main/java/com/optimizely/ab/android/event_handler/EventRescheduler.java index fc051c207..5c4175ae8 100644 --- a/event-handler/src/main/java/com/optimizely/ab/android/event_handler/EventRescheduler.java +++ b/event-handler/src/main/java/com/optimizely/ab/android/event_handler/EventRescheduler.java @@ -101,8 +101,10 @@ void reschedule(@NonNull Context context, @NonNull Intent broadcastIntent, @NonN // with wifi the service will be rescheduled on the interval. // Wifi connection state changes all the time and starting services is expensive // so it's important to only do this if we have stored events. - ServiceScheduler.startService(context, EventIntentService.JOB_ID, eventServiceIntent); - logger.info("Preemptively flushing events since wifi became available"); + if (android.os.Build.VERSION.SDK_INT < Build.VERSION_CODES.O) { + ServiceScheduler.startService(context, EventIntentService.JOB_ID, eventServiceIntent); + logger.info("Preemptively flushing events since wifi became available"); + } } } else { logger.warn("Received unsupported broadcast action to event rescheduler"); diff --git a/shared/src/main/java/com/optimizely/ab/android/shared/ServiceScheduler.java b/shared/src/main/java/com/optimizely/ab/android/shared/ServiceScheduler.java index 1429c5980..490c9c96f 100644 --- a/shared/src/main/java/com/optimizely/ab/android/shared/ServiceScheduler.java +++ b/shared/src/main/java/com/optimizely/ab/android/shared/ServiceScheduler.java @@ -33,6 +33,8 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import java.util.stream.Collectors; + import static android.app.job.JobScheduler.RESULT_SUCCESS; /** @@ -273,6 +275,12 @@ public static void startService(Context context, Integer jobId, Intent intent) { .build(); JobScheduler jobScheduler = (JobScheduler) context.getSystemService(Context.JOB_SCHEDULER_SERVICE); + if (jobScheduler.getAllPendingJobs().stream().filter(job -> job.getId() == jobId && job.getExtras().equals(intent.getExtras())).count() > 0) { + // already pending job. don't run again + LoggerFactory.getLogger("ServiceScheduler").info("Job already pending"); + return; + } + JobWorkItem jobWorkItem = new JobWorkItem(intent); try { jobScheduler.enqueue(jobInfo, jobWorkItem); From 1ac501f489abca0699d8ce5bd97d0cc524f6522e Mon Sep 17 00:00:00 2001 From: Thomas Zurkan Date: Mon, 22 Apr 2019 15:35:14 -0700 Subject: [PATCH 2/2] add a comment why not restarting in event rescheduler --- .../optimizely/ab/android/event_handler/EventRescheduler.java | 1 + 1 file changed, 1 insertion(+) diff --git a/event-handler/src/main/java/com/optimizely/ab/android/event_handler/EventRescheduler.java b/event-handler/src/main/java/com/optimizely/ab/android/event_handler/EventRescheduler.java index 5c4175ae8..3fbb796ec 100644 --- a/event-handler/src/main/java/com/optimizely/ab/android/event_handler/EventRescheduler.java +++ b/event-handler/src/main/java/com/optimizely/ab/android/event_handler/EventRescheduler.java @@ -101,6 +101,7 @@ void reschedule(@NonNull Context context, @NonNull Intent broadcastIntent, @NonN // with wifi the service will be rescheduled on the interval. // Wifi connection state changes all the time and starting services is expensive // so it's important to only do this if we have stored events. + // In android O and higher, we use a persistent job so we do not need to restart. if (android.os.Build.VERSION.SDK_INT < Build.VERSION_CODES.O) { ServiceScheduler.startService(context, EventIntentService.JOB_ID, eventServiceIntent); logger.info("Preemptively flushing events since wifi became available");