diff --git a/app/src/main/java/eu/faircode/email/FragmentOptionsNotifications.java b/app/src/main/java/eu/faircode/email/FragmentOptionsNotifications.java
index e3e327327f..ce94200fab 100644
--- a/app/src/main/java/eu/faircode/email/FragmentOptionsNotifications.java
+++ b/app/src/main/java/eu/faircode/email/FragmentOptionsNotifications.java
@@ -99,6 +99,7 @@ public class FragmentOptionsNotifications extends FragmentBase implements Shared
private SwitchCompat swUnseenIgnored;
private SwitchCompat swNotifyGrouping;
private SwitchCompat swNotifyPrivate;
+ private SwitchCompat swNotifyPublicActions;
private SwitchCompat swNotifyBackgroundOnly;
private SwitchCompat swNotifyKnownOnly;
private SwitchCompat swNotifySuppressInCall;
@@ -139,7 +140,7 @@ public class FragmentOptionsNotifications extends FragmentBase implements Shared
"notify_flag", "notify_seen", "notify_hide", "notify_snooze",
"light", "sound", "notify_screen_on",
"badge", "unseen_ignored",
- "notify_grouping", "notify_private", "notify_background_only", "notify_known", "notify_suppress_in_call", "notify_suppress_in_car",
+ "notify_grouping", "notify_private", "notify_public_actions", "notify_background_only", "notify_known", "notify_suppress_in_call", "notify_suppress_in_car",
"notify_remove", "notify_clear",
"notify_subtext", "notify_preview", "notify_preview_all", "notify_preview_only", "notify_transliterate", "notify_ascii",
"wearable_preview",
@@ -190,6 +191,7 @@ public class FragmentOptionsNotifications extends FragmentBase implements Shared
swUnseenIgnored = view.findViewById(R.id.swUnseenIgnored);
swNotifyGrouping = view.findViewById(R.id.swNotifyGrouping);
swNotifyPrivate = view.findViewById(R.id.swNotifyPrivate);
+ swNotifyPublicActions = view.findViewById(R.id.swNotifyPublicActions);
swNotifyBackgroundOnly = view.findViewById(R.id.swNotifyBackgroundOnly);
swNotifyKnownOnly = view.findViewById(R.id.swNotifyKnownOnly);
swNotifySuppressInCall = view.findViewById(R.id.swNotifySuppressInCall);
@@ -565,6 +567,14 @@ public class FragmentOptionsNotifications extends FragmentBase implements Shared
@Override
public void onCheckedChanged(CompoundButton compoundButton, boolean checked) {
prefs.edit().putBoolean("notify_private", checked).apply();
+ swNotifyPublicActions.setEnabled(!checked);
+ }
+ });
+
+ swNotifyPublicActions.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
+ @Override
+ public void onCheckedChanged(CompoundButton compoundButton, boolean checked) {
+ prefs.edit().putBoolean("notify_public_actions", checked).apply();
}
});
@@ -856,6 +866,8 @@ public class FragmentOptionsNotifications extends FragmentBase implements Shared
swUnseenIgnored.setChecked(prefs.getBoolean("unseen_ignored", false));
swNotifyGrouping.setChecked(prefs.getBoolean("notify_grouping", true));
swNotifyPrivate.setChecked(prefs.getBoolean("notify_private", true));
+ swNotifyPublicActions.setChecked(prefs.getBoolean("notify_public_actions", true));
+ swNotifyPublicActions.setEnabled(!swNotifyPrivate.isChecked());
swNotifyBackgroundOnly.setChecked(prefs.getBoolean("notify_background_only", false));
swNotifyKnownOnly.setChecked(prefs.getBoolean("notify_known", false));
swNotifySuppressInCall.setChecked(prefs.getBoolean("notify_suppress_in_call", false));
diff --git a/app/src/main/java/eu/faircode/email/NotificationHelper.java b/app/src/main/java/eu/faircode/email/NotificationHelper.java
index 63560f1ac4..ab07ca0a2d 100644
--- a/app/src/main/java/eu/faircode/email/NotificationHelper.java
+++ b/app/src/main/java/eu/faircode/email/NotificationHelper.java
@@ -652,6 +652,7 @@ class NotificationHelper {
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context);
boolean notify_grouping = prefs.getBoolean("notify_grouping", true);
boolean notify_private = prefs.getBoolean("notify_private", true);
+ boolean notify_public_actions = prefs.getBoolean("notify_public_actions", true);
boolean notify_newest_first = prefs.getBoolean("notify_newest_first", false);
MessageHelper.AddressFormat email_format = MessageHelper.getAddressFormat(context);
boolean prefer_contact = prefs.getBoolean("prefer_contact", false);
@@ -968,6 +969,84 @@ class NotificationHelper {
DB db = DB.getInstance(context);
+ if (message.content && notify_preview) {
+ // Android will truncate the text
+ String preview = message.preview;
+ if (notify_preview_all)
+ try {
+ File file = message.getFile(context);
+ preview = HtmlHelper.getFullText(file);
+ if (preview != null && preview.length() > MAX_PREVIEW)
+ preview = preview.substring(0, MAX_PREVIEW);
+ } catch (Throwable ex) {
+ Log.e(ex);
+ }
+
+ // Wearables
+ StringBuilder sb = new StringBuilder();
+ if (!TextUtils.isEmpty(message.subject))
+ sb.append(TextHelper.normalizeNotification(context, message.subject));
+ if (wearable_preview && !TextUtils.isEmpty(preview)) {
+ if (sb.length() > 0)
+ sb.append(" - ");
+ sb.append(TextHelper.normalizeNotification(context, preview));
+ }
+ if (sb.length() > 0)
+ mbuilder.setContentText(sb.toString());
+
+ // Device
+ if (!notify_messaging) {
+ StringBuilder sbm = new StringBuilder();
+
+ if (message.keywords != null && BuildConfig.DEBUG)
+ for (String keyword : message.keywords)
+ if (keyword.startsWith("!"))
+ sbm.append(Html.escapeHtml(keyword)).append(": ");
+
+ if (!TextUtils.isEmpty(message.subject))
+ sbm.append("").append(Html.escapeHtml(message.subject)).append("").append("
");
+
+ if (!TextUtils.isEmpty(preview))
+ sbm.append(Html.escapeHtml(preview));
+
+ if (sbm.length() > 0) {
+ NotificationCompat.BigTextStyle bigText = new NotificationCompat.BigTextStyle()
+ .bigText(HtmlHelper.fromHtml(sbm.toString(), context));
+ if (!TextUtils.isEmpty(message.subject))
+ bigText.setSummaryText(message.subject);
+
+ mbuilder.setStyle(bigText);
+ }
+ }
+ } else {
+ if (!TextUtils.isEmpty(message.subject))
+ mbuilder.setContentText(TextHelper.normalizeNotification(context, message.subject));
+ }
+
+ if (info[0].hasPhoto())
+ mbuilder.setLargeIcon(info[0].getPhotoBitmap());
+
+ if (info[0].hasLookupUri()) {
+ Person.Builder you = new Person.Builder()
+ .setUri(info[0].getLookupUri().toString());
+ mbuilder.addPerson(you.build());
+ }
+
+ if (pro) {
+ Integer color = getColor(message);
+ if (color != null) {
+ mbuilder.setColor(color);
+ mbuilder.setColorized(true);
+ }
+ }
+
+ if (!notify_private && !notify_public_actions) {
+ Notification pub = mbuilder.build();
+ mbuilder
+ .setVisibility(NotificationCompat.VISIBILITY_PRIVATE)
+ .setPublicVersion(pub);
+ }
+
List wactions = new ArrayList<>();
if (notify_trash &&
@@ -1202,77 +1281,6 @@ class NotificationHelper {
wactions.add(actionSnooze.build());
}
- if (message.content && notify_preview) {
- // Android will truncate the text
- String preview = message.preview;
- if (notify_preview_all)
- try {
- File file = message.getFile(context);
- preview = HtmlHelper.getFullText(file);
- if (preview != null && preview.length() > MAX_PREVIEW)
- preview = preview.substring(0, MAX_PREVIEW);
- } catch (Throwable ex) {
- Log.e(ex);
- }
-
- // Wearables
- StringBuilder sb = new StringBuilder();
- if (!TextUtils.isEmpty(message.subject))
- sb.append(TextHelper.normalizeNotification(context, message.subject));
- if (wearable_preview && !TextUtils.isEmpty(preview)) {
- if (sb.length() > 0)
- sb.append(" - ");
- sb.append(TextHelper.normalizeNotification(context, preview));
- }
- if (sb.length() > 0)
- mbuilder.setContentText(sb.toString());
-
- // Device
- if (!notify_messaging) {
- StringBuilder sbm = new StringBuilder();
-
- if (message.keywords != null && BuildConfig.DEBUG)
- for (String keyword : message.keywords)
- if (keyword.startsWith("!"))
- sbm.append(Html.escapeHtml(keyword)).append(": ");
-
- if (!TextUtils.isEmpty(message.subject))
- sbm.append("").append(Html.escapeHtml(message.subject)).append("").append("
");
-
- if (!TextUtils.isEmpty(preview))
- sbm.append(Html.escapeHtml(preview));
-
- if (sbm.length() > 0) {
- NotificationCompat.BigTextStyle bigText = new NotificationCompat.BigTextStyle()
- .bigText(HtmlHelper.fromHtml(sbm.toString(), context));
- if (!TextUtils.isEmpty(message.subject))
- bigText.setSummaryText(message.subject);
-
- mbuilder.setStyle(bigText);
- }
- }
- } else {
- if (!TextUtils.isEmpty(message.subject))
- mbuilder.setContentText(TextHelper.normalizeNotification(context, message.subject));
- }
-
- if (info[0].hasPhoto())
- mbuilder.setLargeIcon(info[0].getPhotoBitmap());
-
- if (info[0].hasLookupUri()) {
- Person.Builder you = new Person.Builder()
- .setUri(info[0].getLookupUri().toString());
- mbuilder.addPerson(you.build());
- }
-
- if (pro) {
- Integer color = getColor(message);
- if (color != null) {
- mbuilder.setColor(color);
- mbuilder.setColorized(true);
- }
- }
-
// https://developer.android.com/training/wearables/notifications
// https://developer.android.com/reference/androidx/core/app/NotificationCompat.Action.WearableExtender
mbuilder.extend(new NotificationCompat.WearableExtender()
diff --git a/app/src/main/res/layout/fragment_options_notifications.xml b/app/src/main/res/layout/fragment_options_notifications.xml
index 49f68af0cc..712cf05096 100644
--- a/app/src/main/res/layout/fragment_options_notifications.xml
+++ b/app/src/main/res/layout/fragment_options_notifications.xml
@@ -556,6 +556,19 @@
app:layout_constraintTop_toBottomOf="@id/swNotifyGrouping"
app:switchPadding="12dp" />
+
+
Let the number of new messages match the number of notifications
Group notifications
Keep notifications private when the device is locked
+ Show notification actions when the device is locked
Show notifications when in the background only
Show notifications for contacts only
Delay notifications while on a call