From 99a05742ff5687b254355122ffc596e1a6ef1c78 Mon Sep 17 00:00:00 2001 From: Daniele Gobbetti Date: Sat, 5 Jul 2025 18:39:15 +0200 Subject: [PATCH] Start NotificationCollectorMonitorService as foreground service --- .../gadgetbridge/GBApplication.java | 7 +++++- .../NotificationCollectorMonitorService.java | 23 ++++++++++++++++++- app/src/main/res/values/strings.xml | 2 ++ 3 files changed, 30 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/GBApplication.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/GBApplication.java index b3b9872f9a..1cf63cd3aa 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/GBApplication.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/GBApplication.java @@ -49,6 +49,7 @@ import android.util.TypedValue; import androidx.annotation.VisibleForTesting; import androidx.core.app.NotificationCompat; +import androidx.core.content.ContextCompat; import androidx.localbroadcastmanager.content.LocalBroadcastManager; import java.io.File; @@ -333,7 +334,11 @@ public class GBApplication extends Application { } try { //the following will ensure the notification manager is kept alive - startService(new Intent(this, NotificationCollectorMonitorService.class)); + Intent serviceIntent = new Intent(context, NotificationCollectorMonitorService.class); + + //ContextCompat starts a background service on android < O automatically despite the method name + ContextCompat.startForegroundService(context, serviceIntent); + } catch (IllegalStateException e) { String message = e.toString(); final Intent instructionsIntent = new Intent(Intent.ACTION_VIEW, Uri.parse("https://gadgetbridge.org/basics/topics/background-service/")); diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/NotificationCollectorMonitorService.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/NotificationCollectorMonitorService.java index 15a3734cd5..e02e1c7ae4 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/NotificationCollectorMonitorService.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/NotificationCollectorMonitorService.java @@ -17,6 +17,7 @@ package nodomain.freeyourgadget.gadgetbridge.service; import android.app.ActivityManager; +import android.app.Notification; import android.app.Service; import android.content.ComponentName; import android.content.Context; @@ -25,13 +26,19 @@ import android.content.pm.PackageManager; import android.os.IBinder; import android.os.Process; +import androidx.core.app.NotificationCompat; + import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.util.List; +import nodomain.freeyourgadget.gadgetbridge.GBApplication; +import nodomain.freeyourgadget.gadgetbridge.R; import nodomain.freeyourgadget.gadgetbridge.externalevents.NotificationListener; +import static nodomain.freeyourgadget.gadgetbridge.util.GB.NOTIFICATION_CHANNEL_ID; + /** * Original source by xinghui - see https://gist.github.com/xinghui/b2ddd8cffe55c4b62f5d8846d5545bf9 * NB: no license specified in the source code as of 2017-04-19 @@ -39,16 +46,30 @@ import nodomain.freeyourgadget.gadgetbridge.externalevents.NotificationListener; public class NotificationCollectorMonitorService extends Service { private static final Logger LOG = LoggerFactory.getLogger(NotificationCollectorMonitorService.class); + private static final int ONGOING_NOTIFICATION_ID = 1; @Override public void onCreate() { super.onCreate(); - ensureCollectorRunning(); } @Override public int onStartCommand(Intent intent, int flags, int startId) { + + if (GBApplication.isRunningOreoOrLater()) { + Notification notification = new NotificationCompat.Builder(this, NOTIFICATION_CHANNEL_ID) + .setContentTitle(getString(R.string.service_notification_collector_service_title)) + .setContentText(getString(R.string.service_notification_collector_service_text)) + .setSmallIcon(R.drawable.ic_notification) + .setPriority(NotificationCompat.PRIORITY_LOW) + .build(); + + startForeground(ONGOING_NOTIFICATION_ID, notification); + } + + ensureCollectorRunning(); + return START_STICKY; } diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 3d3d25c1ac..5733b48ae1 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -4107,4 +4107,6 @@ Apply Dithering Upscale image Print size (px): %1$d x %2$d + Gadgetbridge Notification Monitor + Monitoring notifications in background