do not notify for messages from strangers by default

Daniel Gultsch created

Change summary

src/main/java/eu/siacs/conversations/entities/Conversation.java        | 20 
src/main/java/eu/siacs/conversations/services/NotificationService.java | 12 
src/main/res/values/defaults.xml                                       |  1 
src/main/res/values/strings.xml                                        |  2 
src/main/res/xml/preferences.xml                                       |  6 
5 files changed, 38 insertions(+), 3 deletions(-)

Detailed changes

src/main/java/eu/siacs/conversations/entities/Conversation.java 🔗

@@ -992,6 +992,26 @@ public class Conversation extends AbstractEntity implements Blockable, Comparabl
 		}
 	}
 
+	private int sentMessagesCount() {
+		int count = 0;
+		synchronized (this.messages) {
+			for(Message message : messages) {
+				if (message.getStatus() != Message.STATUS_RECEIVED) {
+					++count;
+				}
+			}
+		}
+		return count;
+	}
+
+	public boolean isWithStranger() {
+		if (mode == MODE_SINGLE) {
+			return !getContact().mutualPresenceSubscription() && sentMessagesCount() == 0;
+		} else {
+			return false;
+		}
+	}
+
 	public class Smp {
 		public static final int STATUS_NONE = 0;
 		public static final int STATUS_CONTACT_REQUESTED = 1;

src/main/java/eu/siacs/conversations/services/NotificationService.java 🔗

@@ -59,17 +59,23 @@ public class NotificationService {
 	}
 
 	public boolean notify(final Message message) {
-		return (message.getStatus() == Message.STATUS_RECEIVED)
+		return message.getStatus() == Message.STATUS_RECEIVED
 				&& notificationsEnabled()
 				&& !message.getConversation().isMuted()
-				&& (message.getConversation().alwaysNotify() || wasHighlightedOrPrivate(message)
-		);
+				&& (message.getConversation().alwaysNotify() || wasHighlightedOrPrivate(message))
+				&& (!message.getConversation().isWithStranger() || notificationsFromStrangers())
+		;
 	}
 
 	public boolean notificationsEnabled() {
 		return mXmppConnectionService.getPreferences().getBoolean("show_notification", true);
 	}
 
+	private boolean notificationsFromStrangers() {
+		return mXmppConnectionService.getPreferences().getBoolean("notifications_from_strangers",
+				mXmppConnectionService.getResources().getBoolean(R.bool.notifications_from_strangers));
+	}
+
 	public boolean isQuietHours() {
 		if (!mXmppConnectionService.getPreferences().getBoolean("enable_quiet_hours", false)) {
 			return false;

src/main/res/values/defaults.xml 🔗

@@ -3,4 +3,5 @@
     <string name="default_resource">Phone</string>
     <bool name="portrait_only">true</bool>
     <bool name="enter_is_send">false</bool>
+    <bool name="notifications_from_strangers">false</bool>
 </resources>

src/main/res/values/strings.xml 🔗

@@ -736,4 +736,6 @@
 	<string name="transcoding_video_progress">Compressing video (%s%% completed)</string>
 	<string name="corresponding_conversations_closed">Corresponding conversations closed.</string>
 	<string name="contact_blocked_past_tense">Contact blocked.</string>
+	<string name="pref_notifications_from_strangers">Notifications from strangers</string>
+	<string name="pref_notifications_from_strangers_summary">Notify for messages received from strangers.</string>
 </resources>

src/main/res/xml/preferences.xml 🔗

@@ -41,6 +41,12 @@
             android:key="show_notification"
             android:summary="@string/pref_notifications_summary"
             android:title="@string/pref_notifications"/>
+        <CheckBoxPreference
+            android:defaultValue="@bool/notifications_from_strangers"
+            android:key="notifications_from_strangers"
+            android:dependency="show_notification"
+            android:title="@string/pref_notifications_from_strangers"
+            android:summary="@string/pref_notifications_from_strangers_summary"/>
         <CheckBoxPreference
             android:defaultValue="true"
             android:dependency="show_notification"