diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/GBApplication.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/GBApplication.java index 451a7c435..4d3c7ec49 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/GBApplication.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/GBApplication.java @@ -90,7 +90,7 @@ import static nodomain.freeyourgadget.gadgetbridge.model.DeviceType.MIBAND4; import static nodomain.freeyourgadget.gadgetbridge.model.DeviceType.ZETIME; import static nodomain.freeyourgadget.gadgetbridge.model.DeviceType.fromKey; import static nodomain.freeyourgadget.gadgetbridge.util.GB.NOTIFICATION_CHANNEL_ID; - +import static nodomain.freeyourgadget.gadgetbridge.util.GB.NOTIFICATION_CHANNEL_HIGH_PRIORITY_ID; /** * Main Application class that initializes and provides access to certain things like * logging and DB access. @@ -211,6 +211,14 @@ public class GBApplication extends Application { notificationManager.createNotificationChannel(channel); } + NotificationChannel channelHighPr = notificationManager.getNotificationChannel(NOTIFICATION_CHANNEL_HIGH_PRIORITY_ID ); + if (channelHighPr == null) { + channelHighPr = new NotificationChannel(NOTIFICATION_CHANNEL_HIGH_PRIORITY_ID, + getString(R.string.notification_channel_high_priority_name), + NotificationManager.IMPORTANCE_HIGH); + notificationManager.createNotificationChannel(channelHighPr); + } + bluetoothStateChangeReceiver = new BluetoothStateChangeReceiver(); registerReceiver(bluetoothStateChangeReceiver, new IntentFilter(BluetoothAdapter.ACTION_STATE_CHANGED)); } diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/FindPhoneActivity.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/FindPhoneActivity.java index 5b76a620e..cec7e72fe 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/FindPhoneActivity.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/FindPhoneActivity.java @@ -17,6 +17,7 @@ along with this program. If not, see . */ package nodomain.freeyourgadget.gadgetbridge.activities; +import android.app.NotificationManager; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; @@ -39,6 +40,7 @@ import java.io.IOException; import androidx.localbroadcastmanager.content.LocalBroadcastManager; import nodomain.freeyourgadget.gadgetbridge.R; +import nodomain.freeyourgadget.gadgetbridge.util.GB; public class FindPhoneActivity extends AbstractGBActivity { @@ -84,6 +86,9 @@ public class FindPhoneActivity extends AbstractGBActivity { } }); + NotificationManager notificationManager = (NotificationManager)getSystemService(Context.NOTIFICATION_SERVICE); + notificationManager.cancel( GB.NOTIFICATION_ID_PHONE_FIND ); + vibrate(); playRingtone(); } 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 0f91fe373..c3701fb5a 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/AbstractDeviceSupport.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/AbstractDeviceSupport.java @@ -26,6 +26,7 @@ import android.content.Intent; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.net.Uri; +import android.os.Build; import android.telephony.SmsManager; import org.slf4j.Logger; @@ -67,6 +68,7 @@ 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_HIGH_PRIORITY_ID; import static nodomain.freeyourgadget.gadgetbridge.util.GB.NOTIFICATION_CHANNEL_ID; // TODO: support option for a single reminder notification when notifications could not be delivered? @@ -86,6 +88,8 @@ public abstract class AbstractDeviceSupport implements DeviceSupport { private Context context; private boolean autoReconnect; + + @Override public void setContext(GBDevice gbDevice, BluetoothAdapter btAdapter, Context context) { this.gbDevice = gbDevice; @@ -170,9 +174,7 @@ public abstract class AbstractDeviceSupport implements DeviceSupport { LOG.info("Got GBDeviceEventFindPhone"); switch (deviceEvent.event) { case START: - Intent startIntent = new Intent(getContext(), FindPhoneActivity.class); - startIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); - context.startActivity(startIntent); + handleGBDeviceEventFindPhoneStart(); break; case STOP: Intent intent = new Intent(FindPhoneActivity.ACTION_FOUND); @@ -183,6 +185,38 @@ public abstract class AbstractDeviceSupport implements DeviceSupport { } } + private void handleGBDeviceEventFindPhoneStart() { + if ( Build.VERSION.SDK_INT < 29 ) { // this could be used if app in foreground + Intent startIntent = new Intent(getContext(), FindPhoneActivity.class); + startIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + context.startActivity(startIntent); + } + else { + handleGBDeviceEventFindPhoneStartNotification(); + } + } + + private void handleGBDeviceEventFindPhoneStartNotification() { + LOG.info("Got handleGBDeviceEventFindPhoneStartNotification"); + Intent intent = new Intent(context, FindPhoneActivity.class); + + PendingIntent pi = PendingIntent.getActivity(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT); + NotificationManager notificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE); + + NotificationCompat.Builder notification = new NotificationCompat.Builder(context, NOTIFICATION_CHANNEL_HIGH_PRIORITY_ID ); + notification + .setSmallIcon(R.drawable.ic_notification) + .setOngoing(false) + .setFullScreenIntent(pi, true) + .setPriority(NotificationCompat.PRIORITY_HIGH) + .setAutoCancel(true) + .setContentTitle( context.getString( R.string.find_my_phone_notification ) ); + notification.setGroup("BackgroundService"); + + notificationManager.notify( GB.NOTIFICATION_ID_PHONE_FIND, notification.build()); + } + + private void handleGBDeviceEvent(GBDeviceEventMusicControl musicEvent) { Context context = getContext(); LOG.info("Got event for MUSIC_CONTROL"); 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 9b69e6a3f..f77f07964 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/util/GB.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/util/GB.java @@ -59,6 +59,7 @@ import static nodomain.freeyourgadget.gadgetbridge.GBApplication.isRunningOreoOr public class GB { public static final String NOTIFICATION_CHANNEL_ID = "gadgetbridge"; + public static final String NOTIFICATION_CHANNEL_HIGH_PRIORITY_ID = "gadgetbridge_high_priority"; public static final String NOTIFICATION_CHANNEL_ID_TRANSFER = "gadgetbridge transfer"; public static final int NOTIFICATION_ID = 1; @@ -66,6 +67,7 @@ public class GB { public static final int NOTIFICATION_ID_LOW_BATTERY = 3; public static final int NOTIFICATION_ID_TRANSFER = 4; public static final int NOTIFICATION_ID_EXPORT_FAILED = 5; + public static final int NOTIFICATION_ID_PHONE_FIND = 6; private static final Logger LOG = LoggerFactory.getLogger(GB.class); public static final int INFO = 1; diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index f2028fb8b..4b9d64175 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -267,6 +267,7 @@ Test Test notification This is a test notification from Gadgetbridge + Find my phone Bluetooth is not supported. Bluetooth is disabled. Tap connected device for App manager @@ -700,6 +701,7 @@ Bangle.js Choose export location Gadgetbridge notifications + Gadgetbridge notifications high priority Amazfit GTS Alipay (Shortcut)