Skip to content

Commit 98f06ad

Browse files
committed
Fixed vibration pattern handling and misc clean up
1 parent 8868ed6 commit 98f06ad

File tree

9 files changed

+70
-47
lines changed

9 files changed

+70
-47
lines changed

OneSignalSDK/gradle.properties

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,8 @@
1717
# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects
1818
# org.gradle.parallel=true
1919

20-
# Work around for robolectric-3.4-RC4 bug
20+
# Work around for robolectric-3.4 bug
2121
# https://github.com/robolectric/robolectric/issues/3169
2222
# org.robolectric.res.ResourceTableFactory.parseResourceFiles
23+
# Remove when creating an .aar build.
2324
android.enableAapt2=false

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,6 @@ public class BootUpReceiver extends WakefulBroadcastReceiver {
3535

3636
@Override
3737
public void onReceive(Context context, Intent intent) {
38-
NotificationRestorer.startRestoreTaskFromReceiver(this, context);
38+
NotificationRestorer.startRestoreTaskFromReceiver(context);
3939
}
4040
}

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

Lines changed: 20 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -228,35 +228,19 @@ private static OneSignalNotificationBuilder getBaseOneSignalNotificationBuilder(
228228
.setContentText(message)
229229
.setTicker(message);
230230

231-
if (notifJob.shownTimeStamp != null) {
232-
try {
233-
notifBuilder.setWhen(notifJob.shownTimeStamp * 1000L);
234-
} catch (Throwable t) {} // Can throw if an old android support lib is used.
235-
}
236-
237-
try {
238-
BigInteger accentColor = getAccentColor(gcmBundle);
239-
if (accentColor != null)
240-
notifBuilder.setColor(accentColor.intValue());
241-
} catch (Throwable t) {} // Can throw if an old android support lib is used.
242-
243231
int notificationDefaults = 0;
244232

245-
if (OneSignal.getVibrate(currentContext)) {
246-
if (gcmBundle.optBoolean("vib", true))
247-
notificationDefaults = Notification.DEFAULT_VIBRATE;
233+
if (OneSignal.getVibrate(currentContext) && gcmBundle.optInt("vib", 1) == 1) {
248234
if (gcmBundle.has("vib_pt")) {
249-
JSONArray json_vib_array = gcmBundle.optJSONArray("vib_pt");
250-
long[] long_array = new long[json_vib_array.length()];
251-
for (int i = 0; i < json_vib_array.length(); i++)
252-
long_array[i] = json_vib_array.optLong(i);
253-
254-
notificationDefaults = Notification.DEFAULT_VIBRATE;
255-
notifBuilder.setVibrate(long_array);
235+
long[] vibrationPattern = OSUtils.parseVibrationPattern(gcmBundle);
236+
if (vibrationPattern != null)
237+
notifBuilder.setVibrate(vibrationPattern);
256238
}
239+
else
240+
notificationDefaults = Notification.DEFAULT_VIBRATE;
257241
}
258-
259-
if (gcmBundle.has("ledc")) {
242+
243+
if (gcmBundle.has("ledc") && gcmBundle.optInt("led", 1) == 1) {
260244
try {
261245
BigInteger ledColor = new BigInteger(gcmBundle.optString("ledc"), 16);
262246
notifBuilder.setLights(ledColor.intValue(), 2000, 5000);
@@ -266,6 +250,18 @@ private static OneSignalNotificationBuilder getBaseOneSignalNotificationBuilder(
266250
}
267251
else
268252
notificationDefaults |= Notification.DEFAULT_LIGHTS;
253+
254+
if (notifJob.shownTimeStamp != null) {
255+
try {
256+
notifBuilder.setWhen(notifJob.shownTimeStamp * 1000L);
257+
} catch (Throwable t) {} // Can throw if an old android support lib is used.
258+
}
259+
260+
try {
261+
BigInteger accentColor = getAccentColor(gcmBundle);
262+
if (accentColor != null)
263+
notifBuilder.setColor(accentColor.intValue());
264+
} catch (Throwable t) {} // Can throw if an old android support lib is used.
269265

270266
try {
271267
int visibility = NotificationCompat.VISIBILITY_PUBLIC;

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -414,8 +414,9 @@ private static boolean startExtenderService(Context context, Bundle bundle, Proc
414414
intent.putExtra("timestamp", System.currentTimeMillis() / 1000L);
415415

416416
// Using Alarm for Android O compatibility
417+
Random random = new Random();
417418
long atTime = System.currentTimeMillis();
418-
PendingIntent pendingIntent = PendingIntent.getService(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
419+
PendingIntent pendingIntent = PendingIntent.getService(context, random.nextInt(), intent, PendingIntent.FLAG_UPDATE_CURRENT);
419420
AlarmManager alarm = (AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
420421
alarm.set(AlarmManager.RTC_WAKEUP, atTime, pendingIntent);
421422

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

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -134,11 +134,9 @@ private static String createChannel(Context context, NotificationManager notific
134134
channel.enableLights(payload.optInt("led", 1) == 1);
135135

136136
if (payload.has("vib_pt")) {
137-
JSONArray json_vib_array = payload.optJSONArray("vib_pt");
138-
long[] long_array = new long[json_vib_array.length()];
139-
for (int i = 0; i < json_vib_array.length(); i++)
140-
long_array[i] = json_vib_array.optLong(i);
141-
channel.setVibrationPattern(long_array);
137+
long[] vibrationPattern = OSUtils.parseVibrationPattern(payload);
138+
if (vibrationPattern != null)
139+
channel.setVibrationPattern(vibrationPattern);
142140
}
143141
channel.enableVibration(payload.optInt("vib", 1) == 1);
144142

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

Lines changed: 16 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,6 @@
3535
import android.database.Cursor;
3636
import android.database.sqlite.SQLiteDatabase;
3737
import android.os.Build;
38-
import android.os.PersistableBundle;
3938
import android.support.v4.content.WakefulBroadcastReceiver;
4039

4140
import com.onesignal.OneSignalDbContract.NotificationTable;
@@ -145,28 +144,32 @@ static void showNotifications(Context context, Cursor cursor) {
145144
}
146145
}
147146

148-
// TODO: Update method to support both Services and JobServices
147+
// Android O - Works when app is cold started but not from Boot or app update event.
148+
// AlarmManager is also restricted on those 2 events.
149+
// Due to NotificationExtenderService being a public class we can't just upgrade to a
150+
// JobScheduler.
149151
private static void startService(Context context, Intent intent) {
150152
context.startService(intent);
151153
}
152154

153-
static void startRestoreTaskFromReceiver(WakefulBroadcastReceiver receiver, Context context) {
155+
static void startRestoreTaskFromReceiver(Context context) {
154156
if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
155-
ComponentName componentName = new ComponentName(context.getPackageName(),
156-
NotificationRestoreJobService.class.getName());
157-
158-
Random random = new Random();
159-
JobInfo jobInfo = new JobInfo.Builder(random.nextInt(), componentName)
160-
.setOverrideDeadline(0)
161-
.build();
162-
JobScheduler jobScheduler = (JobScheduler)context.getSystemService(Context.JOB_SCHEDULER_SERVICE);
163-
jobScheduler.schedule(jobInfo);
157+
// Skipping for Android O due to startService note above.
158+
// ComponentName componentName = new ComponentName(context.getPackageName(),
159+
// NotificationRestoreJobService.class.getName());
160+
//
161+
// Random random = new Random();
162+
// JobInfo jobInfo = new JobInfo.Builder(random.nextInt(), componentName)
163+
// .setOverrideDeadline(0)
164+
// .build();
165+
// JobScheduler jobScheduler = (JobScheduler)context.getSystemService(Context.JOB_SCHEDULER_SERVICE);
166+
// jobScheduler.schedule(jobInfo);
164167
}
165168
else {
166169
Intent intentForService = new Intent();
167170
intentForService.setComponent(new ComponentName(context.getPackageName(),
168171
NotificationRestoreService.class.getName()));
169-
receiver.startWakefulService(context, intentForService);
172+
WakefulBroadcastReceiver.startWakefulService(context, intentForService);
170173
}
171174
}
172175
}

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

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,10 @@
4242
import android.support.v4.app.NotificationManagerCompat;
4343
import android.telephony.TelephonyManager;
4444

45+
import org.json.JSONArray;
46+
import org.json.JSONException;
47+
import org.json.JSONObject;
48+
4549
import java.util.Locale;
4650
import java.util.UUID;
4751
import java.util.regex.Pattern;
@@ -238,4 +242,23 @@ static Uri getSoundUri(Context context, String sound) {
238242

239243
return null;
240244
}
245+
246+
static long[] parseVibrationPattern(JSONObject gcmBundle) {
247+
try {
248+
Object patternObj = gcmBundle.opt("vib_pt");
249+
JSONArray jsonVibArray;
250+
if (patternObj instanceof String)
251+
jsonVibArray = new JSONArray((String)patternObj);
252+
else
253+
jsonVibArray = (JSONArray)patternObj;
254+
255+
long[] longArray = new long[jsonVibArray.length()];
256+
for (int i = 0; i < jsonVibArray.length(); i++)
257+
longArray[i] = jsonVibArray.optLong(i);
258+
259+
return longArray;
260+
} catch (JSONException e) {}
261+
262+
return null;
263+
}
241264
}

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -165,6 +165,7 @@ static void onTaskRemoved(Service service) {
165165
LocationGMS.scheduleUpdate(service);
166166
}
167167

168+
private static final int SYNC_SERVICE_REQUEST_CODE = 2071862119;
168169
static void scheduleServiceSyncTask(Context context, long atTime) {
169170
OneSignal.Log(OneSignal.LOG_LEVEL.VERBOSE, "scheduleServiceSyncTask:atTime: " + atTime);
170171

@@ -175,7 +176,7 @@ static void scheduleServiceSyncTask(Context context, long atTime) {
175176
// Some Samsung devices will throw the below exception otherwise.
176177
// "java.lang.SecurityException: !@Too many alarms (500) registered"
177178

178-
PendingIntent pendingIntent = PendingIntent.getService(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
179+
PendingIntent pendingIntent = PendingIntent.getService(context, SYNC_SERVICE_REQUEST_CODE, intent, PendingIntent.FLAG_UPDATE_CURRENT);
179180
AlarmManager alarm = (AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
180181
alarm.set(AlarmManager.RTC_WAKEUP, atTime, pendingIntent);
181182
}

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,6 @@ public class UpgradeReceiver extends WakefulBroadcastReceiver {
3535

3636
@Override
3737
public void onReceive(Context context, Intent intent) {
38-
NotificationRestorer.startRestoreTaskFromReceiver(this, context);
38+
NotificationRestorer.startRestoreTaskFromReceiver(context);
3939
}
4040
}

0 commit comments

Comments
 (0)