diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/GBApplication.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/GBApplication.java
index 7ee81ed53..f406c2f9c 100644
--- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/GBApplication.java
+++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/GBApplication.java
@@ -19,6 +19,7 @@ package nodomain.freeyourgadget.gadgetbridge;
import android.annotation.TargetApi;
import android.app.Application;
+import android.app.NotificationChannel;
import android.app.NotificationManager;
import android.app.NotificationManager.Policy;
import android.content.Context;
@@ -64,6 +65,8 @@ import nodomain.freeyourgadget.gadgetbridge.util.GBPrefs;
import nodomain.freeyourgadget.gadgetbridge.util.LimitedQueue;
import nodomain.freeyourgadget.gadgetbridge.util.Prefs;
+import static nodomain.freeyourgadget.gadgetbridge.util.GB.NOTIFICATION_CHANNEL_ID;
+
/**
* Main Application class that initializes and provides access to certain things like
* logging and DB access.
@@ -172,6 +175,15 @@ public class GBApplication extends Application {
if (isRunningMarshmallowOrLater()) {
notificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
//the following will ensure the notification manager is kept alive
+ if(isRunningOreoOrLater()) {
+ NotificationChannel channel = notificationManager.getNotificationChannel(NOTIFICATION_CHANNEL_ID);
+ if(channel == null) {
+ channel = new NotificationChannel(NOTIFICATION_CHANNEL_ID,
+ getString(R.string.notification_channel_name),
+ NotificationManager.IMPORTANCE_LOW);
+ notificationManager.createNotificationChannel(channel);
+ }
+ }
startService(new Intent(this, NotificationCollectorMonitorService.class));
}
}
@@ -290,6 +302,10 @@ public class GBApplication extends Application {
return VERSION.SDK_INT >= Build.VERSION_CODES.M;
}
+ public static boolean isRunningOreoOrLater(){
+ return VERSION.SDK_INT >= Build.VERSION_CODES.O;
+ }
+
private static boolean isPrioritySender(int prioritySenders, String number) {
if (prioritySenders == Policy.PRIORITY_SENDERS_ANY) {
return true;
diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/DebugActivity.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/DebugActivity.java
index 70a9672d4..56e2be9fc 100644
--- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/DebugActivity.java
+++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/DebugActivity.java
@@ -52,6 +52,8 @@ import nodomain.freeyourgadget.gadgetbridge.model.NotificationSpec;
import nodomain.freeyourgadget.gadgetbridge.model.NotificationType;
import nodomain.freeyourgadget.gadgetbridge.util.GB;
+import static nodomain.freeyourgadget.gadgetbridge.util.GB.NOTIFICATION_CHANNEL_ID;
+
public class DebugActivity extends AbstractGBActivity {
private static final Logger LOG = LoggerFactory.getLogger(DebugActivity.class);
@@ -266,7 +268,7 @@ public class DebugActivity extends AbstractGBActivity {
NotificationCompat.WearableExtender wearableExtender = new NotificationCompat.WearableExtender().addAction(action);
- NotificationCompat.Builder ncomp = new NotificationCompat.Builder(this)
+ NotificationCompat.Builder ncomp = new NotificationCompat.Builder(this, NOTIFICATION_CHANNEL_ID)
.setContentTitle(getString(R.string.test_notification))
.setContentText(getString(R.string.this_is_a_test_notification_from_gadgetbridge))
.setTicker(getString(R.string.this_is_a_test_notification_from_gadgetbridge))
diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/AbstractDeviceSupport.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/AbstractDeviceSupport.java
index a17d8fc25..33667b29d 100644
--- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/AbstractDeviceSupport.java
+++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/AbstractDeviceSupport.java
@@ -66,6 +66,8 @@ import nodomain.freeyourgadget.gadgetbridge.service.receivers.GBMusicControlRece
import nodomain.freeyourgadget.gadgetbridge.util.GB;
import nodomain.freeyourgadget.gadgetbridge.util.Prefs;
+import static nodomain.freeyourgadget.gadgetbridge.util.GB.NOTIFICATION_CHANNEL_ID;
+
// TODO: support option for a single reminder notification when notifications could not be delivered?
// conditions: app was running and received notifications, but device was not connected.
// maybe need to check for "unread notifications" on device for that.
@@ -257,7 +259,7 @@ public abstract class AbstractDeviceSupport implements DeviceSupport {
NotificationCompat.Action action = new NotificationCompat.Action.Builder(android.R.drawable.ic_menu_share, "share", pendingShareIntent).build();
- Notification notif = new NotificationCompat.Builder(context)
+ Notification notif = new NotificationCompat.Builder(context, NOTIFICATION_CHANNEL_ID)
.setContentTitle("Screenshot taken")
.setTicker("Screenshot taken")
.setContentText(filename)
diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/util/GB.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/util/GB.java
index e45e77240..e4305c53b 100644
--- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/util/GB.java
+++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/util/GB.java
@@ -19,7 +19,6 @@ package nodomain.freeyourgadget.gadgetbridge.util;
import android.app.Activity;
import android.app.Notification;
-import android.app.NotificationManager;
import android.app.PendingIntent;
import android.bluetooth.BluetoothAdapter;
import android.content.Context;
@@ -29,6 +28,7 @@ import android.os.Handler;
import android.os.Looper;
import android.support.annotation.Nullable;
import android.support.v4.app.NotificationCompat;
+import android.support.v4.app.NotificationManagerCompat;
import android.widget.Toast;
import org.slf4j.Logger;
@@ -51,6 +51,9 @@ import nodomain.freeyourgadget.gadgetbridge.model.DeviceService;
import nodomain.freeyourgadget.gadgetbridge.service.DeviceCommunicationService;
public class GB {
+
+ public static final String NOTIFICATION_CHANNEL_ID = "gadgetbridge";
+
public static final int NOTIFICATION_ID = 1;
public static final int NOTIFICATION_ID_INSTALL = 2;
public static final int NOTIFICATION_ID_LOW_BATTERY = 3;
@@ -84,7 +87,7 @@ public class GB {
}
Boolean connected = device.isInitialized();
- NotificationCompat.Builder builder = new NotificationCompat.Builder(context);
+ NotificationCompat.Builder builder = new NotificationCompat.Builder(context, NOTIFICATION_CHANNEL_ID);
builder.setContentTitle(deviceName)
.setTicker(deviceName + " - " + text)
.setContentText(text)
@@ -119,7 +122,7 @@ public class GB {
}
public static Notification createNotification(String text, Context context) {
- NotificationCompat.Builder builder = new NotificationCompat.Builder(context);
+ NotificationCompat.Builder builder = new NotificationCompat.Builder(context, NOTIFICATION_CHANNEL_ID);
builder.setTicker(text)
.setContentText(text)
.setSmallIcon(R.drawable.ic_notification_disconnected)
@@ -150,12 +153,16 @@ public class GB {
if (notification == null) {
return;
}
- NotificationManager nm = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
+// TODO: I believe it's better do always use the NMC instead of the old call, but old code works
+ NotificationManagerCompat nm = NotificationManagerCompat.from(context);
+// NotificationManager nm = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
nm.notify(id, notification);
}
private static void removeNotification(int id, Context context) {
- NotificationManager nm = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
+// TODO: I believe it's better do always use the NMC instead of the old call, but old code works
+ NotificationManagerCompat nm = NotificationManagerCompat.from(context);
+// NotificationManager nm = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
nm.cancel(id);
}
@@ -324,7 +331,7 @@ public class GB {
PendingIntent pendingIntent = PendingIntent.getActivity(context, 0,
notificationIntent, 0);
- NotificationCompat.Builder nb = new NotificationCompat.Builder(context)
+ NotificationCompat.Builder nb = new NotificationCompat.Builder(context, NOTIFICATION_CHANNEL_ID)
.setVisibility(NotificationCompat.VISIBILITY_PUBLIC)
.setContentTitle(context.getString(R.string.app_name))
.setContentText(text)
@@ -365,7 +372,7 @@ public class GB {
PendingIntent pendingIntent = PendingIntent.getActivity(context, 0,
notificationIntent, 0);
- NotificationCompat.Builder nb = new NotificationCompat.Builder(context)
+ NotificationCompat.Builder nb = new NotificationCompat.Builder(context, NOTIFICATION_CHANNEL_ID)
.setContentTitle(context.getString(R.string.app_name))
.setContentText(text)
.setTicker(text)
@@ -395,7 +402,7 @@ public class GB {
PendingIntent pendingIntent = PendingIntent.getActivity(context, 0,
notificationIntent, 0);
- NotificationCompat.Builder nb = new NotificationCompat.Builder(context)
+ NotificationCompat.Builder nb = new NotificationCompat.Builder(context, NOTIFICATION_CHANNEL_ID)
.setContentTitle(context.getString(R.string.notif_battery_low_title))
.setContentText(text)
.setContentIntent(pendingIntent)
@@ -429,7 +436,7 @@ public class GB {
PendingIntent pendingIntent = PendingIntent.getActivity(context, 0,
notificationIntent, 0);
- NotificationCompat.Builder nb = new NotificationCompat.Builder(context)
+ NotificationCompat.Builder nb = new NotificationCompat.Builder(context, NOTIFICATION_CHANNEL_ID)
.setContentTitle(context.getString(R.string.notif_export_failed_title))
.setContentText(text)
.setContentIntent(pendingIntent)
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index 4bd05160d..6e3e3bacb 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -532,4 +532,5 @@
Teclast H30
Choose export location
+ Gadgetbridge notifications