added ability to disable notifications for specific conversations - fixed #322

iNPUTmice created

Change summary

res/menu/conversations.xml                              |  5 +
res/values/arrays.xml                                   | 14 ++++
res/values/strings.xml                                  |  4 +
src/eu/siacs/conversations/entities/Conversation.java   | 11 +++
src/eu/siacs/conversations/parser/MessageParser.java    |  1 
src/eu/siacs/conversations/ui/ConversationActivity.java | 31 +++++++++++
src/eu/siacs/conversations/ui/ConversationFragment.java | 10 +++
7 files changed, 76 insertions(+)

Detailed changes

res/menu/conversations.xml 🔗

@@ -44,6 +44,11 @@
         android:orderInCategory="60"
         android:showAsAction="never"
         android:title="@string/action_end_conversation"/>
+    <item
+        android:id="@+id/action_mute"
+        android:orderInCategory="70"
+        android:showAsAction="never"
+        android:title="@string/disable_notifications"/>
     <item
         android:id="@+id/action_accounts"
         android:orderInCategory="90"

res/values/arrays.xml 🔗

@@ -19,4 +19,18 @@
         <item>524288</item>
         <item>1048576</item>
     </string-array>
+    <string-array name="mute_options_descriptions">
+        <item>30 minutes</item>
+        <item>one hour</item>
+        <item>2 hours</item>
+        <item>8 hours</item>
+        <item>until further notice</item>
+    </string-array>
+    <integer-array name="mute_options_durations">
+        <item>1800</item>
+        <item>3600</item>
+        <item>7200</item>
+        <item>28800</item>
+        <item>-1</item>
+    </integer-array>
 </resources>

res/values/strings.xml 🔗

@@ -235,5 +235,9 @@
     <string name="server_info_session_established">Current session established</string>
     <string name="additional_information">Additional Information</string>
     <string name="skip">Skip</string>
+    <string name="disable_notifications">Disable notifications</string>
+    <string name="disable_notifications_for_this_conversation">Disable notifications for this conversation</string>
+    <string name="notifications_disabled">Notifications are disabled</string>
+    <string name="enable">Enable</string>
 
 </resources>

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

@@ -16,6 +16,7 @@ import android.content.ContentValues;
 import android.content.Context;
 import android.database.Cursor;
 import android.graphics.Bitmap;
+import android.os.SystemClock;
 
 public class Conversation extends AbstractEntity {
 	public static final String TABLENAME = "conversations";
@@ -42,6 +43,8 @@ public class Conversation extends AbstractEntity {
 	private int status;
 	private long created;
 	private int mode;
+	
+	private long mutedTill = 0;
 
 	private String nextPresence;
 
@@ -418,4 +421,12 @@ public class Conversation extends AbstractEntity {
 		}
 		return false;
 	}
+
+	public void setMutedTill(long mutedTill) {
+		this.mutedTill = mutedTill;
+	}
+	
+	public boolean isMuted() {
+		return SystemClock.elapsedRealtime() < this.mutedTill;
+	}
 }

src/eu/siacs/conversations/parser/MessageParser.java 🔗

@@ -435,6 +435,7 @@ public class MessageParser extends AbstractParser implements
 		if (packet.getType() != MessagePacket.TYPE_ERROR) {
 			mXmppConnectionService.databaseBackend.createMessage(message);
 		}
+		notify = notify && !conversation.isMuted();
 		mXmppConnectionService.notifyUi(conversation, notify);
 	}
 

src/eu/siacs/conversations/ui/ConversationActivity.java 🔗

@@ -13,6 +13,7 @@ import eu.siacs.conversations.utils.ExceptionHelper;
 import eu.siacs.conversations.utils.UIHelper;
 import android.net.Uri;
 import android.os.Bundle;
+import android.os.SystemClock;
 import android.provider.MediaStore;
 import android.app.ActionBar;
 import android.app.AlertDialog;
@@ -214,6 +215,7 @@ public class ConversationActivity extends XmppActivity {
 		MenuItem menuAdd = (MenuItem) menu.findItem(R.id.action_add);
 		MenuItem menuInviteContact = (MenuItem) menu
 				.findItem(R.id.action_invite);
+		MenuItem menuMute = (MenuItem) menu.findItem(R.id.action_mute);
 
 		if ((spl.isOpen() && (spl.isSlideable()))) {
 			menuArchive.setVisible(false);
@@ -223,6 +225,7 @@ public class ConversationActivity extends XmppActivity {
 			menuInviteContact.setVisible(false);
 			menuAttach.setVisible(false);
 			menuClearHistory.setVisible(false);
+			menuMute.setVisible(false);
 		} else {
 			menuAdd.setVisible(!spl.isSlideable());
 			if (this.getSelectedConversation() != null) {
@@ -463,6 +466,9 @@ public class ConversationActivity extends XmppActivity {
 		case R.id.action_clear_history:
 			clearHistoryDialog(getSelectedConversation());
 			break;
+		case R.id.action_mute:
+			muteConversationDialog(getSelectedConversation());
+			break;
 		default:
 			break;
 		}
@@ -504,6 +510,31 @@ public class ConversationActivity extends XmppActivity {
 				});
 		builder.create().show();
 	}
+	
+	protected void muteConversationDialog(final Conversation conversation) {
+		AlertDialog.Builder builder = new AlertDialog.Builder(this);
+		builder.setTitle(R.string.disable_notifications_for_this_conversation);
+		final int[] durations = getResources().getIntArray(R.array.mute_options_durations);
+		builder.setItems(R.array.mute_options_descriptions, new OnClickListener() {
+			
+			@Override
+			public void onClick(DialogInterface dialog, int which) {
+				long till;
+				if (durations[which]==-1) {
+					till = Long.MAX_VALUE;
+				} else {
+					till = SystemClock.elapsedRealtime() + (durations[which] * 1000);
+				}
+				conversation.setMutedTill(till);
+				ConversationFragment selectedFragment = (ConversationFragment) getFragmentManager()
+						.findFragmentByTag("conversation");
+				if (selectedFragment!=null) {
+					selectedFragment.updateMessages();
+				}
+			}
+		});
+		builder.create().show();
+	}
 
 	protected ConversationFragment swapConversationFragment() {
 		ConversationFragment selectedFragment = new ConversationFragment();

src/eu/siacs/conversations/ui/ConversationFragment.java 🔗

@@ -406,6 +406,16 @@ public class ConversationFragment extends Fragment {
 					break;
 				}
 			}
+			if (this.conversation.isMuted()) {
+				showSnackbar(R.string.notifications_disabled, R.string.enable, new OnClickListener() {
+					
+					@Override
+					public void onClick(View v) {
+						conversation.setMutedTill(0);
+						updateMessages();
+					}
+				});
+			}
 			if (this.conversation.getMessages().size() == 0) {
 				this.messageList.clear();
 				messagesLoaded = false;