Map Gotify message priorities to notification channels

This commit is contained in:
schwma
2018-11-11 02:37:39 +01:00
parent b306c319e7
commit 4c2902a39e
2 changed files with 72 additions and 16 deletions

View File

@@ -14,7 +14,10 @@ public class NotificationSupport {
public static final class Channel { public static final class Channel {
public static final String FOREGROUND = "gotify_foreground"; 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 { public static final class ID {
@@ -32,19 +35,69 @@ public class NotificationSupport {
Channel.FOREGROUND, Channel.FOREGROUND,
"Gotify foreground notification", "Gotify foreground notification",
NotificationManager.IMPORTANCE_LOW); 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 messagesImportanceMin =
NotificationChannel messages =
new NotificationChannel( new NotificationChannel(
Channel.MESSAGES, Channel.MESSAGES_IMPORTANCE_MIN,
"Gotify messages", "Min importance Gotify messages",
NotificationManager.IMPORTANCE_MIN);
NotificationChannel messagesImportanceLow =
new NotificationChannel(
Channel.MESSAGES_IMPORTANCE_LOW,
"Low importance Gotify messages",
NotificationManager.IMPORTANCE_LOW);
NotificationChannel messagesImportanceDefault =
new NotificationChannel(
Channel.MESSAGES_IMPORTANCE_DEFAULT,
"Default importance Gotify messages",
NotificationManager.IMPORTANCE_DEFAULT);
messagesImportanceDefault.enableLights(true);
messagesImportanceDefault.setLightColor(Color.CYAN);
NotificationChannel messagesImportanceHigh =
new NotificationChannel(
Channel.MESSAGES_IMPORTANCE_HIGH,
"High importance Gotify messages",
NotificationManager.IMPORTANCE_HIGH); NotificationManager.IMPORTANCE_HIGH);
messages.enableLights(true); messagesImportanceHigh.enableLights(true);
messages.setLightColor(Color.CYAN); messagesImportanceHigh.setLightColor(Color.CYAN);
notificationManager.createNotificationChannel(foreground); notificationManager.createNotificationChannel(foreground);
notificationManager.createNotificationChannel(messages); notificationManager.createNotificationChannel(messagesImportanceMin);
notificationManager.createNotificationChannel(messagesImportanceLow);
notificationManager.createNotificationChannel(messagesImportanceDefault);
notificationManager.createNotificationChannel(messagesImportanceHigh);
} catch (Exception e) { } catch (Exception e) {
Log.e("Could not create channel", e); Log.e("Could not create channel", e);
} }
} }
/**
* Map {@link com.github.gotify.client.model.Message#getPriority() Gotify message priorities}
* to Android channels.
*
* <pre>
* Gotify Priority | Android Importance
* <= 0 | min
* 1-3 | low
* 4-7 | default
* >= 8 | high
* </pre>
*
* @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;
}
}
} }

View File

@@ -117,9 +117,11 @@ public class WebSocketService extends Service {
} }
private void onGroupedMessages(List<Message> messages) { private void onGroupedMessages(List<Message> messages) {
long highestPriority = 0;
for (Message message : messages) { for (Message message : messages) {
if (lastReceivedMessage.get() < message.getId()) { if (lastReceivedMessage.get() < message.getId()) {
lastReceivedMessage.set(message.getId()); lastReceivedMessage.set(message.getId());
highestPriority = Math.max(highestPriority, message.getPriority());
} }
broadcast(message); broadcast(message);
} }
@@ -127,7 +129,8 @@ public class WebSocketService extends Service {
showNotification( showNotification(
NotificationSupport.ID.GROUPED, NotificationSupport.ID.GROUPED,
getString(R.string.missed_messages), getString(R.string.missed_messages),
getString(R.string.grouped_message, size)); getString(R.string.grouped_message, size),
highestPriority);
} }
private void onMessage(Message message) { private void onMessage(Message message) {
@@ -135,7 +138,7 @@ public class WebSocketService extends Service {
lastReceivedMessage.set(message.getId()); lastReceivedMessage.set(message.getId());
} }
broadcast(message); broadcast(message);
showNotification(message.getId(), message.getTitle(), message.getMessage()); showNotification(message.getId(), message.getTitle(), message.getMessage(), message.getPriority());
} }
private void broadcast(Message message) { private void broadcast(Message message) {
@@ -172,16 +175,16 @@ public class WebSocketService extends Service {
startForeground(NotificationSupport.ID.FOREGROUND, notification); 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); Intent intent = new Intent(this, MessagesActivity.class);
PendingIntent contentIntent = PendingIntent contentIntent =
PendingIntent.getActivity(this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT); PendingIntent.getActivity(this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
NotificationCompat.Builder b = 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) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
showNotificationGroup(); showNotificationGroup(priority);
} }
b.setAutoCancel(true) b.setAutoCancel(true)
@@ -204,13 +207,13 @@ public class WebSocketService extends Service {
} }
@RequiresApi(Build.VERSION_CODES.N) @RequiresApi(Build.VERSION_CODES.N)
public void showNotificationGroup() { public void showNotificationGroup(long priority) {
Intent intent = new Intent(this, MessagesActivity.class); Intent intent = new Intent(this, MessagesActivity.class);
PendingIntent contentIntent = PendingIntent contentIntent =
PendingIntent.getActivity(this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT); PendingIntent.getActivity(this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
NotificationCompat.Builder b = NotificationCompat.Builder b =
new NotificationCompat.Builder(this, NotificationSupport.Channel.MESSAGES); new NotificationCompat.Builder(this, NotificationSupport.convertPriorityToChannel(priority));
b.setAutoCancel(true) b.setAutoCancel(true)
.setDefaults(Notification.DEFAULT_ALL) .setDefaults(Notification.DEFAULT_ALL)