Skip to content

Commit ece5005

Browse files
committed
Fix InterruptedException, email id log, and focus attribution
* InterruptedException was due to a circular initialization of the JobScheduler, this was making the job scheduler to stop and interrump the thread * Email id can be null, downgrade log to Info, keep Error lvl for User id * Focus attribution was being init as attributed by IAM, attribution in session can only be by notification * OSInfluence null ids weren't parsed, changed to empty string
1 parent 68f6ade commit ece5005

11 files changed

+69
-13
lines changed

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ void appForegrounded() {
5050
}
5151

5252
void appBackgrounded() {
53-
giveProcessorsValidFocusTime(OneSignal.getSessionManager().getInfluences(), FocusEventType.BACKGROUND);
53+
giveProcessorsValidFocusTime(OneSignal.getSessionManager().getSessionInfluences(), FocusEventType.BACKGROUND);
5454
timeFocusedAtMs = null;
5555
}
5656

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

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -115,6 +115,11 @@ List<OSInfluence> getInfluences() {
115115
return trackerFactory.getInfluences();
116116
}
117117

118+
@NonNull
119+
List<OSInfluence> getSessionInfluences() {
120+
return trackerFactory.getSessionInfluences();
121+
}
122+
118123
/**
119124
* Attempt to override the current session before the 30 second session minimum
120125
* This should only be done in a upward direction:

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -684,7 +684,8 @@ private static void init(OneSignal.Builder inBuilder) {
684684
if (sender_id != null && sender_id.length() > 4)
685685
sender_id = sender_id.substring(4);
686686

687-
OneSignal.init(context, sender_id, bundle.getString("onesignal_app_id"), mInitBuilder.mNotificationOpenedHandler, mInitBuilder.mNotificationReceivedHandler);
687+
String appId = bundle.getString("onesignal_app_id");
688+
OneSignal.init(context, sender_id, appId, mInitBuilder.mNotificationOpenedHandler, mInitBuilder.mNotificationReceivedHandler);
688689
} catch (Throwable t) {
689690
t.printStackTrace();
690691
}
@@ -2287,7 +2288,6 @@ static boolean hasUserId() {
22872288
static String getUserId() {
22882289
if (userId == null && appContext != null)
22892290
userId = getSavedUserId(appContext);
2290-
22912291
return userId;
22922292
}
22932293

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -115,6 +115,7 @@ public void run() {
115115

116116
// getResponseCode() can hang past it's timeout setting so join it's thread to ensure it is timing out.
117117
try {
118+
// Sequentially wait for connectionThread to execute
118119
connectionThread.join(getThreadTimeout(timeout));
119120
if (connectionThread.getState() != Thread.State.TERMINATED)
120121
connectionThread.interrupt();

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

Lines changed: 31 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -120,11 +120,14 @@ private static synchronized void scheduleSyncTask(Context context, long delayMs)
120120
if (delayMs < 5_000)
121121
delayMs = 5_000;
122122

123+
boolean scheduled;
123124
if (useJob())
124-
scheduleSyncServiceAsJob(context, delayMs);
125+
scheduled = scheduleSyncServiceAsJob(context, delayMs);
125126
else
126-
scheduleSyncServiceAsAlarm(context, delayMs);
127-
nextScheduledSyncTimeMs = System.currentTimeMillis() + delayMs;
127+
scheduled = scheduleSyncServiceAsAlarm(context, delayMs);
128+
129+
if (scheduled)
130+
nextScheduledSyncTimeMs = System.currentTimeMillis() + delayMs;
128131
}
129132

130133
private static boolean hasBootPermission(Context context) {
@@ -134,10 +137,27 @@ private static boolean hasBootPermission(Context context) {
134137
) == PackageManager.PERMISSION_GRANTED;
135138
}
136139

140+
141+
@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
142+
private static boolean isJobIdRunning(Context context) {
143+
final JobScheduler jobScheduler = (JobScheduler) context.getSystemService(Context.JOB_SCHEDULER_SERVICE);
144+
for (JobInfo jobInfo : jobScheduler.getAllPendingJobs()) {
145+
if (jobInfo.getId() == OneSignalSyncServiceUtils.SYNC_TASK_ID) {
146+
return true;
147+
}
148+
}
149+
return false;
150+
}
151+
137152
@RequiresApi(21)
138-
private static void scheduleSyncServiceAsJob(Context context, long delayMs) {
153+
private static boolean scheduleSyncServiceAsJob(Context context, long delayMs) {
139154
OneSignal.Log(OneSignal.LOG_LEVEL.VERBOSE, "scheduleSyncServiceAsJob:atTime: " + delayMs);
140155

156+
if (isJobIdRunning(context)) {
157+
OneSignal.Log(OneSignal.LOG_LEVEL.VERBOSE, "scheduleSyncServiceAsJob Scheduler already running!");
158+
return false;
159+
}
160+
141161
JobInfo.Builder jobBuilder = new JobInfo.Builder(
142162
SYNC_TASK_ID,
143163
new ComponentName(context, SyncJobService.class)
@@ -150,26 +170,31 @@ private static void scheduleSyncServiceAsJob(Context context, long delayMs) {
150170
if (hasBootPermission(context))
151171
jobBuilder.setPersisted(true);
152172

153-
JobScheduler jobScheduler = (JobScheduler)context.getSystemService(Context.JOB_SCHEDULER_SERVICE);
173+
JobScheduler jobScheduler = (JobScheduler) context.getSystemService(Context.JOB_SCHEDULER_SERVICE);
154174
try {
155175
int result = jobScheduler.schedule(jobBuilder.build());
156176
OneSignal.Log(OneSignal.LOG_LEVEL.INFO, "scheduleSyncServiceAsJob:result: " + result);
177+
return true;
157178
} catch (NullPointerException e) {
158179
// Catch for buggy Oppo devices
159180
// https://github.com/OneSignal/OneSignal-Android-SDK/issues/487
160181
OneSignal.Log(OneSignal.LOG_LEVEL.ERROR,
161182
"scheduleSyncServiceAsJob called JobScheduler.jobScheduler which " +
162183
"triggered an internal null Android error. Skipping job.", e);
184+
185+
return false;
163186
}
164187
}
165188

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

169192
PendingIntent pendingIntent = syncServicePendingIntent(context);
170193
AlarmManager alarm = (AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
171194
long triggerAtMs = System.currentTimeMillis() + delayMs;
172195
alarm.set(AlarmManager.RTC_WAKEUP, triggerAtMs + delayMs, pendingIntent);
196+
197+
return true;
173198
}
174199

175200
private static Thread syncBgThread;

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

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,8 @@
2929

3030
import android.app.job.JobParameters;
3131
import android.app.job.JobService;
32+
import android.content.Context;
33+
import android.net.ConnectivityManager;
3234
import android.os.Build;
3335
import android.support.annotation.RequiresApi;
3436

@@ -46,7 +48,8 @@ public boolean onStartJob(JobParameters jobParameters) {
4648

4749
@Override
4850
public boolean onStopJob(JobParameters jobParameters) {
51+
OneSignal.Log(OneSignal.LOG_LEVEL.DEBUG, "SyncJobService onStopJob called, system conditions not available");
4952
boolean reschedule = OneSignalSyncServiceUtils.stopSyncBgThread();
5053
return reschedule;
5154
}
52-
}
55+
}

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

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,11 @@ protected UserState newUserState(String inPersistKey, boolean load) {
1818
return new UserStateEmail(inPersistKey, load);
1919
}
2020

21+
@Override
22+
protected OneSignal.LOG_LEVEL getLogLevel() {
23+
return OneSignal.LOG_LEVEL.INFO;
24+
}
25+
2126
// Email subscription not readable from SDK
2227
@Override
2328
boolean getSubscribed() {

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

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,11 @@ protected UserState newUserState(String inPersistKey, boolean load) {
1818
return new UserStatePush(inPersistKey, load);
1919
}
2020

21+
@Override
22+
protected OneSignal.LOG_LEVEL getLogLevel() {
23+
return OneSignal.LOG_LEVEL.ERROR;
24+
}
25+
2126
@Override
2227
boolean getSubscribed() {
2328
return getToSyncUserState().isSubscribed();

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -197,6 +197,7 @@ boolean persist() {
197197
return false;
198198
}
199199

200+
protected abstract OneSignal.LOG_LEVEL getLogLevel();
200201
protected abstract String getId();
201202

202203
private boolean isSessionCall() {
@@ -306,7 +307,7 @@ private void logoutEmailSyncSuccess() {
306307

307308
private void doPutSync(String userId, final JSONObject jsonBody, final JSONObject dependDiff) {
308309
if (userId == null) {
309-
OneSignal.onesignalLog(OneSignal.LOG_LEVEL.ERROR, "Error updating the user record because of the null user id");
310+
OneSignal.onesignalLog(getLogLevel(), "Error updating the user record because of the null user id");
310311
sendTagsHandlersPerformOnFailure(new SendTagsError(-1, "Unable to update tags: the current user is not registered with OneSignal"));
311312
externalUserIdUpdateHandlersPerformOnFailure();
312313
return;

OneSignalSDK/onesignal/src/main/java/com/onesignal/influence/OSTrackerFactory.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,17 @@ public List<OSInfluence> getInfluences() {
5757
return influences;
5858
}
5959

60+
public List<OSInfluence> getSessionInfluences() {
61+
List<OSInfluence> influences = new ArrayList<>();
62+
for (OSChannelTracker tracker : trackers.values()) {
63+
// IAM doesn't influence session calls
64+
if (tracker instanceof OSInAppMessageTracker)
65+
continue;
66+
influences.add(tracker.getCurrentSessionInfluence());
67+
}
68+
return influences;
69+
}
70+
6071
public OSChannelTracker getIAMChannelTracker() {
6172
return trackers.get(OSInAppMessageTracker.TAG);
6273
}

0 commit comments

Comments
 (0)