diff --git a/app/src/main/java/com/github/gotify/NotificationSupport.java b/app/src/main/java/com/github/gotify/NotificationSupport.java index 9037cad7..fdd34df2 100644 --- a/app/src/main/java/com/github/gotify/NotificationSupport.java +++ b/app/src/main/java/com/github/gotify/NotificationSupport.java @@ -14,7 +14,11 @@ public static final class Group { public static final class Channel { public static final String FOREGROUND = "gotify_foreground"; - public static final String MESSAGES = "gotify_messages"; + public static final String MESSAGES_IMPORTANCE_MIN = "gotify_messages_min_importance"; + public static final String MESSAGES_IMPORTANCE_LOW = "gotify_messages_low_importance"; + public static final String MESSAGES_IMPORTANCE_DEFAULT = + "gotify_messages_default_importance"; + public static final String MESSAGES_IMPORTANCE_HIGH = "gotify_messages_high_importance"; } public static final class ID { @@ -32,19 +36,71 @@ public static void createChannels(NotificationManager notificationManager) { Channel.FOREGROUND, "Gotify foreground notification", NotificationManager.IMPORTANCE_LOW); - // High importance for message notifications so that they are shown as heads-up - // notifications and sorted towards the top of the notification shade - NotificationChannel messages = + + NotificationChannel messagesImportanceMin = + new NotificationChannel( + Channel.MESSAGES_IMPORTANCE_MIN, + "Min priority messages (<1)", + NotificationManager.IMPORTANCE_MIN); + + NotificationChannel messagesImportanceLow = + new NotificationChannel( + Channel.MESSAGES_IMPORTANCE_LOW, + "Low priority messages (1-3)", + NotificationManager.IMPORTANCE_LOW); + + NotificationChannel messagesImportanceDefault = new NotificationChannel( - Channel.MESSAGES, - "Gotify messages", + Channel.MESSAGES_IMPORTANCE_DEFAULT, + "Normal priority messages (4-7)", + NotificationManager.IMPORTANCE_DEFAULT); + messagesImportanceDefault.enableLights(true); + messagesImportanceDefault.setLightColor(Color.CYAN); + messagesImportanceDefault.enableVibration(true); + + NotificationChannel messagesImportanceHigh = + new NotificationChannel( + Channel.MESSAGES_IMPORTANCE_HIGH, + "High priority messages (>7)", NotificationManager.IMPORTANCE_HIGH); - messages.enableLights(true); - messages.setLightColor(Color.CYAN); + messagesImportanceHigh.enableLights(true); + messagesImportanceHigh.setLightColor(Color.CYAN); + messagesImportanceHigh.enableVibration(true); + notificationManager.createNotificationChannel(foreground); - notificationManager.createNotificationChannel(messages); + notificationManager.createNotificationChannel(messagesImportanceMin); + notificationManager.createNotificationChannel(messagesImportanceLow); + notificationManager.createNotificationChannel(messagesImportanceDefault); + notificationManager.createNotificationChannel(messagesImportanceHigh); } catch (Exception e) { Log.e("Could not create channel", e); } } + + /** + * Map {@link com.github.gotify.client.model.Message#getPriority() Gotify message priorities to + * Android channels. + * + *
+     * Gotify Priority  | Android Importance
+     * <= 0             | min
+     * 1-3              | low
+     * 4-7              | default
+     * >= 8             | high
+     * 
+ * + * @param priority the Gotify priority to convert to a notification channel as a long. + * @return the identifier of the notification channel as a String. + */ + public static String convertPriorityToChannel(long priority) { + if (priority < 1) { + return Channel.MESSAGES_IMPORTANCE_MIN; + } else if (priority < 4) { + return Channel.MESSAGES_IMPORTANCE_LOW; + } else if (priority < 8) { + return Channel.MESSAGES_IMPORTANCE_DEFAULT; + } else { + return Channel.MESSAGES_IMPORTANCE_HIGH; + } + } } diff --git a/app/src/main/java/com/github/gotify/service/WebSocketService.java b/app/src/main/java/com/github/gotify/service/WebSocketService.java index 92426f33..a08d805d 100644 --- a/app/src/main/java/com/github/gotify/service/WebSocketService.java +++ b/app/src/main/java/com/github/gotify/service/WebSocketService.java @@ -117,9 +117,11 @@ private void notifyMissedNotifications() { } private void onGroupedMessages(List messages) { + long highestPriority = 0; for (Message message : messages) { if (lastReceivedMessage.get() < message.getId()) { lastReceivedMessage.set(message.getId()); + highestPriority = Math.max(highestPriority, message.getPriority()); } broadcast(message); } @@ -127,7 +129,8 @@ private void onGroupedMessages(List messages) { showNotification( NotificationSupport.ID.GROUPED, getString(R.string.missed_messages), - getString(R.string.grouped_message, size)); + getString(R.string.grouped_message, size), + highestPriority); } private void onMessage(Message message) { @@ -135,7 +138,8 @@ private void onMessage(Message message) { lastReceivedMessage.set(message.getId()); } broadcast(message); - showNotification(message.getId(), message.getTitle(), message.getMessage()); + showNotification( + message.getId(), message.getTitle(), message.getMessage(), message.getPriority()); } private void broadcast(Message message) { @@ -172,16 +176,17 @@ private void foreground(String message) { startForeground(NotificationSupport.ID.FOREGROUND, notification); } - private void showNotification(int id, String title, String message) { + private void showNotification(int id, String title, String message, long priority) { Intent intent = new Intent(this, MessagesActivity.class); PendingIntent contentIntent = PendingIntent.getActivity(this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT); NotificationCompat.Builder b = - new NotificationCompat.Builder(this, NotificationSupport.Channel.MESSAGES); + new NotificationCompat.Builder( + this, NotificationSupport.convertPriorityToChannel(priority)); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { - showNotificationGroup(); + showNotificationGroup(priority); } b.setAutoCancel(true) @@ -204,13 +209,14 @@ private void showNotification(int id, String title, String message) { } @RequiresApi(Build.VERSION_CODES.N) - public void showNotificationGroup() { + public void showNotificationGroup(long priority) { Intent intent = new Intent(this, MessagesActivity.class); PendingIntent contentIntent = PendingIntent.getActivity(this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT); NotificationCompat.Builder b = - new NotificationCompat.Builder(this, NotificationSupport.Channel.MESSAGES); + new NotificationCompat.Builder( + this, NotificationSupport.convertPriorityToChannel(priority)); b.setAutoCancel(true) .setDefaults(Notification.DEFAULT_ALL)