mirror of
https://codeberg.org/Freeyourgadget/Gadgetbridge
synced 2024-11-29 05:16:51 +01:00
Fixes to make the application run on Oreo
- tested on Oreo 8.1
this commit includes changes cherry picked from 3b6da66643
This commit is contained in:
parent
18cec2087f
commit
e28333fe6e
@ -19,6 +19,7 @@ package nodomain.freeyourgadget.gadgetbridge;
|
|||||||
|
|
||||||
import android.annotation.TargetApi;
|
import android.annotation.TargetApi;
|
||||||
import android.app.Application;
|
import android.app.Application;
|
||||||
|
import android.app.NotificationChannel;
|
||||||
import android.app.NotificationManager;
|
import android.app.NotificationManager;
|
||||||
import android.app.NotificationManager.Policy;
|
import android.app.NotificationManager.Policy;
|
||||||
import android.content.Context;
|
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.LimitedQueue;
|
||||||
import nodomain.freeyourgadget.gadgetbridge.util.Prefs;
|
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
|
* Main Application class that initializes and provides access to certain things like
|
||||||
* logging and DB access.
|
* logging and DB access.
|
||||||
@ -172,6 +175,15 @@ public class GBApplication extends Application {
|
|||||||
if (isRunningMarshmallowOrLater()) {
|
if (isRunningMarshmallowOrLater()) {
|
||||||
notificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
|
notificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
|
||||||
//the following will ensure the notification manager is kept alive
|
//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));
|
startService(new Intent(this, NotificationCollectorMonitorService.class));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -290,6 +302,10 @@ public class GBApplication extends Application {
|
|||||||
return VERSION.SDK_INT >= Build.VERSION_CODES.M;
|
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) {
|
private static boolean isPrioritySender(int prioritySenders, String number) {
|
||||||
if (prioritySenders == Policy.PRIORITY_SENDERS_ANY) {
|
if (prioritySenders == Policy.PRIORITY_SENDERS_ANY) {
|
||||||
return true;
|
return true;
|
||||||
|
@ -52,6 +52,8 @@ import nodomain.freeyourgadget.gadgetbridge.model.NotificationSpec;
|
|||||||
import nodomain.freeyourgadget.gadgetbridge.model.NotificationType;
|
import nodomain.freeyourgadget.gadgetbridge.model.NotificationType;
|
||||||
import nodomain.freeyourgadget.gadgetbridge.util.GB;
|
import nodomain.freeyourgadget.gadgetbridge.util.GB;
|
||||||
|
|
||||||
|
import static nodomain.freeyourgadget.gadgetbridge.util.GB.NOTIFICATION_CHANNEL_ID;
|
||||||
|
|
||||||
|
|
||||||
public class DebugActivity extends AbstractGBActivity {
|
public class DebugActivity extends AbstractGBActivity {
|
||||||
private static final Logger LOG = LoggerFactory.getLogger(DebugActivity.class);
|
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.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))
|
.setContentTitle(getString(R.string.test_notification))
|
||||||
.setContentText(getString(R.string.this_is_a_test_notification_from_gadgetbridge))
|
.setContentText(getString(R.string.this_is_a_test_notification_from_gadgetbridge))
|
||||||
.setTicker(getString(R.string.this_is_a_test_notification_from_gadgetbridge))
|
.setTicker(getString(R.string.this_is_a_test_notification_from_gadgetbridge))
|
||||||
|
@ -66,6 +66,8 @@ import nodomain.freeyourgadget.gadgetbridge.service.receivers.GBMusicControlRece
|
|||||||
import nodomain.freeyourgadget.gadgetbridge.util.GB;
|
import nodomain.freeyourgadget.gadgetbridge.util.GB;
|
||||||
import nodomain.freeyourgadget.gadgetbridge.util.Prefs;
|
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?
|
// 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.
|
// conditions: app was running and received notifications, but device was not connected.
|
||||||
// maybe need to check for "unread notifications" on device for that.
|
// 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();
|
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")
|
.setContentTitle("Screenshot taken")
|
||||||
.setTicker("Screenshot taken")
|
.setTicker("Screenshot taken")
|
||||||
.setContentText(filename)
|
.setContentText(filename)
|
||||||
|
@ -19,7 +19,6 @@ package nodomain.freeyourgadget.gadgetbridge.util;
|
|||||||
|
|
||||||
import android.app.Activity;
|
import android.app.Activity;
|
||||||
import android.app.Notification;
|
import android.app.Notification;
|
||||||
import android.app.NotificationManager;
|
|
||||||
import android.app.PendingIntent;
|
import android.app.PendingIntent;
|
||||||
import android.bluetooth.BluetoothAdapter;
|
import android.bluetooth.BluetoothAdapter;
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
@ -29,6 +28,7 @@ import android.os.Handler;
|
|||||||
import android.os.Looper;
|
import android.os.Looper;
|
||||||
import android.support.annotation.Nullable;
|
import android.support.annotation.Nullable;
|
||||||
import android.support.v4.app.NotificationCompat;
|
import android.support.v4.app.NotificationCompat;
|
||||||
|
import android.support.v4.app.NotificationManagerCompat;
|
||||||
import android.widget.Toast;
|
import android.widget.Toast;
|
||||||
|
|
||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
@ -51,6 +51,9 @@ import nodomain.freeyourgadget.gadgetbridge.model.DeviceService;
|
|||||||
import nodomain.freeyourgadget.gadgetbridge.service.DeviceCommunicationService;
|
import nodomain.freeyourgadget.gadgetbridge.service.DeviceCommunicationService;
|
||||||
|
|
||||||
public class GB {
|
public class GB {
|
||||||
|
|
||||||
|
public static final String NOTIFICATION_CHANNEL_ID = "gadgetbridge";
|
||||||
|
|
||||||
public static final int NOTIFICATION_ID = 1;
|
public static final int NOTIFICATION_ID = 1;
|
||||||
public static final int NOTIFICATION_ID_INSTALL = 2;
|
public static final int NOTIFICATION_ID_INSTALL = 2;
|
||||||
public static final int NOTIFICATION_ID_LOW_BATTERY = 3;
|
public static final int NOTIFICATION_ID_LOW_BATTERY = 3;
|
||||||
@ -84,7 +87,7 @@ public class GB {
|
|||||||
}
|
}
|
||||||
|
|
||||||
Boolean connected = device.isInitialized();
|
Boolean connected = device.isInitialized();
|
||||||
NotificationCompat.Builder builder = new NotificationCompat.Builder(context);
|
NotificationCompat.Builder builder = new NotificationCompat.Builder(context, NOTIFICATION_CHANNEL_ID);
|
||||||
builder.setContentTitle(deviceName)
|
builder.setContentTitle(deviceName)
|
||||||
.setTicker(deviceName + " - " + text)
|
.setTicker(deviceName + " - " + text)
|
||||||
.setContentText(text)
|
.setContentText(text)
|
||||||
@ -119,7 +122,7 @@ public class GB {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public static Notification createNotification(String text, Context context) {
|
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)
|
builder.setTicker(text)
|
||||||
.setContentText(text)
|
.setContentText(text)
|
||||||
.setSmallIcon(R.drawable.ic_notification_disconnected)
|
.setSmallIcon(R.drawable.ic_notification_disconnected)
|
||||||
@ -150,12 +153,16 @@ public class GB {
|
|||||||
if (notification == null) {
|
if (notification == null) {
|
||||||
return;
|
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);
|
nm.notify(id, notification);
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void removeNotification(int id, Context context) {
|
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);
|
nm.cancel(id);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -324,7 +331,7 @@ public class GB {
|
|||||||
PendingIntent pendingIntent = PendingIntent.getActivity(context, 0,
|
PendingIntent pendingIntent = PendingIntent.getActivity(context, 0,
|
||||||
notificationIntent, 0);
|
notificationIntent, 0);
|
||||||
|
|
||||||
NotificationCompat.Builder nb = new NotificationCompat.Builder(context)
|
NotificationCompat.Builder nb = new NotificationCompat.Builder(context, NOTIFICATION_CHANNEL_ID)
|
||||||
.setVisibility(NotificationCompat.VISIBILITY_PUBLIC)
|
.setVisibility(NotificationCompat.VISIBILITY_PUBLIC)
|
||||||
.setContentTitle(context.getString(R.string.app_name))
|
.setContentTitle(context.getString(R.string.app_name))
|
||||||
.setContentText(text)
|
.setContentText(text)
|
||||||
@ -365,7 +372,7 @@ public class GB {
|
|||||||
PendingIntent pendingIntent = PendingIntent.getActivity(context, 0,
|
PendingIntent pendingIntent = PendingIntent.getActivity(context, 0,
|
||||||
notificationIntent, 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))
|
.setContentTitle(context.getString(R.string.app_name))
|
||||||
.setContentText(text)
|
.setContentText(text)
|
||||||
.setTicker(text)
|
.setTicker(text)
|
||||||
@ -395,7 +402,7 @@ public class GB {
|
|||||||
PendingIntent pendingIntent = PendingIntent.getActivity(context, 0,
|
PendingIntent pendingIntent = PendingIntent.getActivity(context, 0,
|
||||||
notificationIntent, 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))
|
.setContentTitle(context.getString(R.string.notif_battery_low_title))
|
||||||
.setContentText(text)
|
.setContentText(text)
|
||||||
.setContentIntent(pendingIntent)
|
.setContentIntent(pendingIntent)
|
||||||
@ -429,7 +436,7 @@ public class GB {
|
|||||||
PendingIntent pendingIntent = PendingIntent.getActivity(context, 0,
|
PendingIntent pendingIntent = PendingIntent.getActivity(context, 0,
|
||||||
notificationIntent, 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))
|
.setContentTitle(context.getString(R.string.notif_export_failed_title))
|
||||||
.setContentText(text)
|
.setContentText(text)
|
||||||
.setContentIntent(pendingIntent)
|
.setContentIntent(pendingIntent)
|
||||||
|
@ -532,4 +532,5 @@
|
|||||||
<string name="devicetype_teclast_h30">Teclast H30</string>
|
<string name="devicetype_teclast_h30">Teclast H30</string>
|
||||||
|
|
||||||
<string name="choose_auto_export_location">Choose export location</string>
|
<string name="choose_auto_export_location">Choose export location</string>
|
||||||
|
<string name="notification_channel_name">Gadgetbridge notifications</string>
|
||||||
</resources>
|
</resources>
|
||||||
|
Loading…
Reference in New Issue
Block a user