Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
74 changes: 65 additions & 9 deletions app/src/main/java/com/github/gotify/NotificationSupport.java
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand All @@ -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.
*
* <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;
}
}
}
20 changes: 13 additions & 7 deletions app/src/main/java/com/github/gotify/service/WebSocketService.java
Original file line number Diff line number Diff line change
Expand Up @@ -117,25 +117,29 @@ private void notifyMissedNotifications() {
}

private void onGroupedMessages(List<Message> 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);
}
int size = messages.size();
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) {
if (lastReceivedMessage.get() < message.getId()) {
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) {
Expand Down Expand Up @@ -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)
Expand All @@ -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)
Expand Down