Skip to content

Commit d25a672

Browse files
committed
Fix background location update
* Avoid reschedule an already scheduled or running service * If need to reschedule, reschedule under jobFinished
1 parent ece5005 commit d25a672

File tree

2 files changed

+17
-17
lines changed

2 files changed

+17
-17
lines changed

OneSignalSDK/onesignal/src/main/java/com/onesignal/OneSignalSyncServiceUtils.java

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,7 @@ class OneSignalSyncServiceUtils {
6363
private static final long SYNC_AFTER_BG_DELAY_MS = OneSignal.MIN_ON_SESSION_TIME_MILLIS;
6464

6565
private static Long nextScheduledSyncTimeMs = 0L;
66+
private static boolean needsJobReschedule = false;
6667

6768
static void scheduleLocationUpdateTask(Context context, long delayMs) {
6869
OneSignal.Log(OneSignal.LOG_LEVEL.VERBOSE, "scheduleLocationUpdateTask:delayMs: " + delayMs);
@@ -120,14 +121,12 @@ private static synchronized void scheduleSyncTask(Context context, long delayMs)
120121
if (delayMs < 5_000)
121122
delayMs = 5_000;
122123

123-
boolean scheduled;
124124
if (useJob())
125-
scheduled = scheduleSyncServiceAsJob(context, delayMs);
125+
scheduleSyncServiceAsJob(context, delayMs);
126126
else
127-
scheduled = scheduleSyncServiceAsAlarm(context, delayMs);
127+
scheduleSyncServiceAsAlarm(context, delayMs);
128128

129-
if (scheduled)
130-
nextScheduledSyncTimeMs = System.currentTimeMillis() + delayMs;
129+
nextScheduledSyncTimeMs = System.currentTimeMillis() + delayMs;
131130
}
132131

133132
private static boolean hasBootPermission(Context context) {
@@ -142,20 +141,23 @@ private static boolean hasBootPermission(Context context) {
142141
private static boolean isJobIdRunning(Context context) {
143142
final JobScheduler jobScheduler = (JobScheduler) context.getSystemService(Context.JOB_SCHEDULER_SERVICE);
144143
for (JobInfo jobInfo : jobScheduler.getAllPendingJobs()) {
145-
if (jobInfo.getId() == OneSignalSyncServiceUtils.SYNC_TASK_ID) {
144+
if (jobInfo.getId() == OneSignalSyncServiceUtils.SYNC_TASK_ID && syncBgThread != null && syncBgThread.isAlive()) {
146145
return true;
147146
}
148147
}
149148
return false;
150149
}
151150

152151
@RequiresApi(21)
153-
private static boolean scheduleSyncServiceAsJob(Context context, long delayMs) {
152+
private static void scheduleSyncServiceAsJob(Context context, long delayMs) {
154153
OneSignal.Log(OneSignal.LOG_LEVEL.VERBOSE, "scheduleSyncServiceAsJob:atTime: " + delayMs);
155154

156155
if (isJobIdRunning(context)) {
157156
OneSignal.Log(OneSignal.LOG_LEVEL.VERBOSE, "scheduleSyncServiceAsJob Scheduler already running!");
158-
return false;
157+
// If a JobScheduler is schedule again while running it will stop current job. We will schedule again when finished.
158+
// This will avoid InterruptionException due to thread.join() or queue.take() running.
159+
needsJobReschedule = true;
160+
return;
159161
}
160162

161163
JobInfo.Builder jobBuilder = new JobInfo.Builder(
@@ -174,27 +176,22 @@ private static boolean scheduleSyncServiceAsJob(Context context, long delayMs) {
174176
try {
175177
int result = jobScheduler.schedule(jobBuilder.build());
176178
OneSignal.Log(OneSignal.LOG_LEVEL.INFO, "scheduleSyncServiceAsJob:result: " + result);
177-
return true;
178179
} catch (NullPointerException e) {
179180
// Catch for buggy Oppo devices
180181
// https://github.com/OneSignal/OneSignal-Android-SDK/issues/487
181182
OneSignal.Log(OneSignal.LOG_LEVEL.ERROR,
182183
"scheduleSyncServiceAsJob called JobScheduler.jobScheduler which " +
183184
"triggered an internal null Android error. Skipping job.", e);
184-
185-
return false;
186185
}
187186
}
188187

189-
private static boolean scheduleSyncServiceAsAlarm(Context context, long delayMs) {
188+
private static void scheduleSyncServiceAsAlarm(Context context, long delayMs) {
190189
OneSignal.Log(OneSignal.LOG_LEVEL.VERBOSE, "scheduleServiceSyncTask:atTime: " + delayMs);
191190

192191
PendingIntent pendingIntent = syncServicePendingIntent(context);
193192
AlarmManager alarm = (AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
194193
long triggerAtMs = System.currentTimeMillis() + delayMs;
195194
alarm.set(AlarmManager.RTC_WAKEUP, triggerAtMs + delayMs, pendingIntent);
196-
197-
return true;
198195
}
199196

200197
private static Thread syncBgThread;
@@ -293,8 +290,11 @@ static class LollipopSyncRunnable extends SyncRunnable {
293290

294291
@Override
295292
protected void stopSync() {
296-
OneSignal.Log(OneSignal.LOG_LEVEL.DEBUG, "LollipopSyncRunnable:JobFinished");
297-
jobService.jobFinished(jobParameters, false);
293+
OneSignal.Log(OneSignal.LOG_LEVEL.DEBUG, "LollipopSyncRunnable:JobFinished needsJobReschedule: " + needsJobReschedule);
294+
// Reschedule if needed
295+
boolean reschedule = needsJobReschedule;
296+
needsJobReschedule = false;
297+
jobService.jobFinished(jobParameters, reschedule);
298298
}
299299
}
300300

OneSignalSDK/onesignal/src/main/java/com/onesignal/SyncJobService.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,8 +48,8 @@ public boolean onStartJob(JobParameters jobParameters) {
4848

4949
@Override
5050
public boolean onStopJob(JobParameters jobParameters) {
51-
OneSignal.Log(OneSignal.LOG_LEVEL.DEBUG, "SyncJobService onStopJob called, system conditions not available");
5251
boolean reschedule = OneSignalSyncServiceUtils.stopSyncBgThread();
52+
OneSignal.Log(OneSignal.LOG_LEVEL.DEBUG, "SyncJobService onStopJob called, system conditions not available reschedule: " + reschedule);
5353
return reschedule;
5454
}
5555
}

0 commit comments

Comments
 (0)