From 7440794da0609e1015718735e0e598f2da209ab0 Mon Sep 17 00:00:00 2001 From: Jannis Mattheis Date: Wed, 20 Jun 2018 19:33:39 +0200 Subject: [PATCH] Add ugly hacky oreo notification support --- .../src/main/java/de/gotify/PushService.java | 4 ++ ...yOreoNotificationCompatibilitySupport.java | 48 +++++++++++++++++++ 2 files changed, 52 insertions(+) create mode 100644 android/app/src/main/java/de/gotify/UglyHackyOreoNotificationCompatibilitySupport.java diff --git a/android/app/src/main/java/de/gotify/PushService.java b/android/app/src/main/java/de/gotify/PushService.java index c297999..ec4a843 100644 --- a/android/app/src/main/java/de/gotify/PushService.java +++ b/android/app/src/main/java/de/gotify/PushService.java @@ -108,6 +108,8 @@ public class PushService extends Service { handler = new Handler(); new Thread(pushService).start(); appPreferences().registerOnSharedPreferenceChangeListener(listener); + + UglyHackyOreoNotificationCompatibilitySupport.uglyInitializeNotificationChannel((NotificationManager) this.getSystemService(Context.NOTIFICATION_SERVICE)); } private void foregroundNotification(String message) { @@ -118,6 +120,7 @@ public class PushService extends Service { Notification notification = new NotificationCompat.Builder(this, "GOTIFY_CHANNEL") .setSmallIcon(R.mipmap.ic_launcher) .setContentTitle("Gotify") + .setChannelId(UglyHackyOreoNotificationCompatibilitySupport.CHANNEL_ID) .setOngoing(true) .setPriority(Notification.PRIORITY_MIN) .setStyle(new NotificationCompat.BigTextStyle().bigText(message)) @@ -286,6 +289,7 @@ public class PushService extends Service { .setContentText(message) .setStyle(new NotificationCompat.BigTextStyle().bigText(message)) .setDefaults(Notification.DEFAULT_LIGHTS | Notification.DEFAULT_SOUND) + .setChannelId(UglyHackyOreoNotificationCompatibilitySupport.CHANNEL_ID) .setContentIntent(contentIntent); NotificationManager notificationManager = (NotificationManager) this.getSystemService(Context.NOTIFICATION_SERVICE); diff --git a/android/app/src/main/java/de/gotify/UglyHackyOreoNotificationCompatibilitySupport.java b/android/app/src/main/java/de/gotify/UglyHackyOreoNotificationCompatibilitySupport.java new file mode 100644 index 0000000..5edb3ca --- /dev/null +++ b/android/app/src/main/java/de/gotify/UglyHackyOreoNotificationCompatibilitySupport.java @@ -0,0 +1,48 @@ +package de.gotify; + + +import android.app.NotificationManager; +import android.os.Build; + +import java.lang.reflect.Constructor; +import java.lang.reflect.Method; + +/** + * I hate reflections and android. + */ +public class UglyHackyOreoNotificationCompatibilitySupport { + public static final String CHANNEL_ID = "gotify"; + + /** + * @param notificationManager the notification manager + * @see Code by Elad Nava + */ + public static void uglyInitializeNotificationChannel(NotificationManager notificationManager) { + if (Build.VERSION.SDK_INT < 26) { + return; + } + + // Channel importance (3 means default importance) + int channelImportance = 3; + + try { + // Get NotificationChannel class via reflection (only available on devices running Android O or newer) + Class notificationChannelClass = Class.forName("android.app.NotificationChannel"); + + // Get NotificationChannel constructor + Constructor notificationChannelConstructor = notificationChannelClass.getDeclaredConstructor(String.class, CharSequence.class, int.class); + + // Instantiate new notification channel + Object notificationChannel = notificationChannelConstructor.newInstance(CHANNEL_ID, "Gotify", channelImportance); + + // Get notification channel creation method via reflection + Method createNotificationChannelMethod = notificationManager.getClass().getDeclaredMethod("createNotificationChannel", notificationChannelClass); + + // Invoke method on NotificationManager, passing in the channel object + createNotificationChannelMethod.invoke(notificationManager, notificationChannel); + + } catch (Exception e) { + Log.e("Creating notification channel failed.", e); + } + } +} \ No newline at end of file