From 84a27c7d7a18aeff1e9bc909d07d50934b70bc34 Mon Sep 17 00:00:00 2001 From: M66B Date: Thu, 16 May 2019 10:04:20 +0200 Subject: [PATCH] Support for notification channel per folder --- FAQ.md | 2 +- .../java/eu/faircode/email/AdapterFolder.java | 53 ++++++++++++++++++- app/src/main/java/eu/faircode/email/Core.java | 15 ++++-- .../java/eu/faircode/email/EntityFolder.java | 4 ++ .../java/eu/faircode/email/TupleFolderEx.java | 21 ++++++++ app/src/main/res/values/strings.xml | 3 ++ 6 files changed, 91 insertions(+), 7 deletions(-) diff --git a/FAQ.md b/FAQ.md index 4bafa03ed1..e556fe85c2 100644 --- a/FAQ.md +++ b/FAQ.md @@ -37,7 +37,7 @@ For authorizing: * ~~Semi-automatic encryption~~ * ~~Copy message~~ * ~~Colored stars~~ -* Notification settings per folder +* ~~Notification settings per folder~~ * Select local images for signatures Anything on this list is in random order and *might* be added in the near future. diff --git a/app/src/main/java/eu/faircode/email/AdapterFolder.java b/app/src/main/java/eu/faircode/email/AdapterFolder.java index 42b7f636bd..ffe6eb7fb4 100644 --- a/app/src/main/java/eu/faircode/email/AdapterFolder.java +++ b/app/src/main/java/eu/faircode/email/AdapterFolder.java @@ -19,6 +19,9 @@ package eu.faircode.email; Copyright 2018-2019 by Marcel Bokhorst (M66B) */ +import android.annotation.TargetApi; +import android.app.NotificationChannel; +import android.app.NotificationManager; import android.content.Context; import android.content.DialogInterface; import android.content.Intent; @@ -29,7 +32,9 @@ import android.graphics.Color; import android.graphics.Rect; import android.graphics.Typeface; import android.graphics.drawable.Drawable; +import android.os.Build; import android.os.Bundle; +import android.provider.Settings; import android.text.TextUtils; import android.util.TypedValue; import android.view.LayoutInflater; @@ -115,8 +120,11 @@ public class AdapterFolder extends RecyclerView.Adapter= Build.VERSION_CODES.O) { + String channelId = EntityFolder.getNotificationChannelId(folder.id); + NotificationManager nm = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE); + NotificationChannel channel = nm.getNotificationChannel(channelId); + if (channel == null) + popupMenu.getMenu().add(Menu.NONE, action_create_channel, 6, R.string.title_create_channel); + else { + popupMenu.getMenu().add(Menu.NONE, action_edit_channel, 7, R.string.title_edit_channel); + popupMenu.getMenu().add(Menu.NONE, action_delete_channel, 8, R.string.title_delete_channel); + } + } } popupMenu.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() { @@ -436,6 +456,18 @@ public class AdapterFolder extends RecyclerView.Adapter Build.VERSION_CODES.O && - message.from != null && message.from.length > 0) { - InternetAddress from = (InternetAddress) message.from[0]; - NotificationChannel channel = nm.getNotificationChannel("notification." + from.getAddress().toLowerCase()); + if (Build.VERSION.SDK_INT > Build.VERSION_CODES.O) { + NotificationChannel channel = null; + + if (message.from != null && message.from.length > 0) { + InternetAddress from = (InternetAddress) message.from[0]; + channel = nm.getNotificationChannel("notification." + from.getAddress().toLowerCase()); + } + + if (channel == null) + channel = nm.getNotificationChannel(EntityFolder.getNotificationChannelId(message.folder)); + if (channel != null) channelName = channel.getId(); } diff --git a/app/src/main/java/eu/faircode/email/EntityFolder.java b/app/src/main/java/eu/faircode/email/EntityFolder.java index ed4e29e0e1..351082308c 100644 --- a/app/src/main/java/eu/faircode/email/EntityFolder.java +++ b/app/src/main/java/eu/faircode/email/EntityFolder.java @@ -179,6 +179,10 @@ public class EntityFolder extends EntityOrder implements Serializable { public EntityFolder() { } + static String getNotificationChannelId(long id) { + return "notification.folder." + id; + } + JSONArray getSyncArgs() { int days = sync_days; if (last_sync != null) { diff --git a/app/src/main/java/eu/faircode/email/TupleFolderEx.java b/app/src/main/java/eu/faircode/email/TupleFolderEx.java index cf5facee83..44ea64c9f2 100644 --- a/app/src/main/java/eu/faircode/email/TupleFolderEx.java +++ b/app/src/main/java/eu/faircode/email/TupleFolderEx.java @@ -19,6 +19,9 @@ package eu.faircode.email; Copyright 2018-2019 by Marcel Bokhorst (M66B) */ +import android.app.Notification; +import android.app.NotificationChannel; +import android.app.NotificationManager; import android.content.Context; import java.io.Serializable; @@ -55,6 +58,24 @@ public class TupleFolderEx extends EntityFolder implements Serializable { return false; } + void createNotificationChannel(Context context) { + if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.O) { + NotificationManager nm = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE); + NotificationChannel channel = new NotificationChannel( + getNotificationChannelId(id), accountName + "/" + getDisplayName(context), + NotificationManager.IMPORTANCE_HIGH); + channel.setLockscreenVisibility(Notification.VISIBILITY_PRIVATE); + nm.createNotificationChannel(channel); + } + } + + void deleteNotificationChannel(Context context) { + if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.O) { + NotificationManager nm = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE); + nm.deleteNotificationChannel(getNotificationChannelId(id)); + } + } + @Override Comparator getComparator(final Context context) { final Collator collator = Collator.getInstance(Locale.getDefault()); diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index fdf7cae8b8..91ee8299f6 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -331,6 +331,9 @@ Empty trash Edit properties Edit rules + Create notification channel + Edit notification channel + Delete notification channel Delete all trashed messages permanently? Delete operations with an error message?