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