@@ -63,6 +63,7 @@ class OneSignalSyncServiceUtils {
63
63
private static final long SYNC_AFTER_BG_DELAY_MS = OneSignal .MIN_ON_SESSION_TIME_MILLIS ;
64
64
65
65
private static Long nextScheduledSyncTimeMs = 0L ;
66
+ private static boolean needsJobReschedule = false ;
66
67
67
68
static void scheduleLocationUpdateTask (Context context , long delayMs ) {
68
69
OneSignal .Log (OneSignal .LOG_LEVEL .VERBOSE , "scheduleLocationUpdateTask:delayMs: " + delayMs );
@@ -120,14 +121,12 @@ private static synchronized void scheduleSyncTask(Context context, long delayMs)
120
121
if (delayMs < 5_000 )
121
122
delayMs = 5_000 ;
122
123
123
- boolean scheduled ;
124
124
if (useJob ())
125
- scheduled = scheduleSyncServiceAsJob (context , delayMs );
125
+ scheduleSyncServiceAsJob (context , delayMs );
126
126
else
127
- scheduled = scheduleSyncServiceAsAlarm (context , delayMs );
127
+ scheduleSyncServiceAsAlarm (context , delayMs );
128
128
129
- if (scheduled )
130
- nextScheduledSyncTimeMs = System .currentTimeMillis () + delayMs ;
129
+ nextScheduledSyncTimeMs = System .currentTimeMillis () + delayMs ;
131
130
}
132
131
133
132
private static boolean hasBootPermission (Context context ) {
@@ -142,20 +141,23 @@ private static boolean hasBootPermission(Context context) {
142
141
private static boolean isJobIdRunning (Context context ) {
143
142
final JobScheduler jobScheduler = (JobScheduler ) context .getSystemService (Context .JOB_SCHEDULER_SERVICE );
144
143
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 () ) {
146
145
return true ;
147
146
}
148
147
}
149
148
return false ;
150
149
}
151
150
152
151
@ RequiresApi (21 )
153
- private static boolean scheduleSyncServiceAsJob (Context context , long delayMs ) {
152
+ private static void scheduleSyncServiceAsJob (Context context , long delayMs ) {
154
153
OneSignal .Log (OneSignal .LOG_LEVEL .VERBOSE , "scheduleSyncServiceAsJob:atTime: " + delayMs );
155
154
156
155
if (isJobIdRunning (context )) {
157
156
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 ;
159
161
}
160
162
161
163
JobInfo .Builder jobBuilder = new JobInfo .Builder (
@@ -174,27 +176,22 @@ private static boolean scheduleSyncServiceAsJob(Context context, long delayMs) {
174
176
try {
175
177
int result = jobScheduler .schedule (jobBuilder .build ());
176
178
OneSignal .Log (OneSignal .LOG_LEVEL .INFO , "scheduleSyncServiceAsJob:result: " + result );
177
- return true ;
178
179
} catch (NullPointerException e ) {
179
180
// Catch for buggy Oppo devices
180
181
// https://github.com/OneSignal/OneSignal-Android-SDK/issues/487
181
182
OneSignal .Log (OneSignal .LOG_LEVEL .ERROR ,
182
183
"scheduleSyncServiceAsJob called JobScheduler.jobScheduler which " +
183
184
"triggered an internal null Android error. Skipping job." , e );
184
-
185
- return false ;
186
185
}
187
186
}
188
187
189
- private static boolean scheduleSyncServiceAsAlarm (Context context , long delayMs ) {
188
+ private static void scheduleSyncServiceAsAlarm (Context context , long delayMs ) {
190
189
OneSignal .Log (OneSignal .LOG_LEVEL .VERBOSE , "scheduleServiceSyncTask:atTime: " + delayMs );
191
190
192
191
PendingIntent pendingIntent = syncServicePendingIntent (context );
193
192
AlarmManager alarm = (AlarmManager )context .getSystemService (Context .ALARM_SERVICE );
194
193
long triggerAtMs = System .currentTimeMillis () + delayMs ;
195
194
alarm .set (AlarmManager .RTC_WAKEUP , triggerAtMs + delayMs , pendingIntent );
196
-
197
- return true ;
198
195
}
199
196
200
197
private static Thread syncBgThread ;
@@ -293,8 +290,11 @@ static class LollipopSyncRunnable extends SyncRunnable {
293
290
294
291
@ Override
295
292
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 );
298
298
}
299
299
}
300
300
0 commit comments