show per conference notification settings in details activity

Daniel Gultsch created

Change summary

src/main/java/eu/siacs/conversations/entities/Conversation.java          | 16 
src/main/java/eu/siacs/conversations/services/NotificationService.java   |  8 
src/main/java/eu/siacs/conversations/ui/ConferenceDetailsActivity.java   | 63 
src/main/java/eu/siacs/conversations/ui/adapter/ConversationAdapter.java |  5 
src/main/res/drawable-hdpi/ic_notifications_none_grey600_24dp.png        |  0 
src/main/res/drawable-mdpi/ic_notifications_none_grey600_24dp.png        |  0 
src/main/res/drawable-xhdpi/ic_notifications_none_grey600_24dp.png       |  0 
src/main/res/drawable-xxhdpi/ic_notifications_none_grey600_24dp.png      |  0 
src/main/res/drawable-xxxhdpi/ic_notifications_none_grey600_24dp.png     |  0 
src/main/res/layout/activity_muc_details.xml                             | 27 
src/main/res/values/strings.xml                                          |  6 
src/main/res/xml/preferences.xml                                         |  6 
12 files changed, 114 insertions(+), 17 deletions(-)

Detailed changes

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

@@ -47,6 +47,7 @@ public class Conversation extends AbstractEntity implements Blockable {
 	public static final String ATTRIBUTE_NEXT_ENCRYPTION = "next_encryption";
 	public static final String ATTRIBUTE_MUC_PASSWORD = "muc_password";
 	public static final String ATTRIBUTE_MUTED_TILL = "muted_till";
+	public static final String ATTRIBUTE_ALWAYS_NOTIFY = "always_notify";
 
 	private String name;
 	private String contactUuid;
@@ -546,7 +547,7 @@ public class Conversation extends AbstractEntity implements Blockable {
 	/**
 	 * short for is Private and Non-anonymous
 	 */
-	public boolean isPnNA() {
+	private boolean isPnNA() {
 		return mode == MODE_SINGLE || (getMucOptions().membersOnly() && getMucOptions().nonanonymous());
 	}
 
@@ -729,6 +730,10 @@ public class Conversation extends AbstractEntity implements Blockable {
 		return System.currentTimeMillis() < this.getLongAttribute(ATTRIBUTE_MUTED_TILL, 0);
 	}
 
+	public boolean alwaysNotify() {
+		return mode == MODE_SINGLE || getBooleanAttribute(ATTRIBUTE_ALWAYS_NOTIFY,isPnNA());
+	}
+
 	public boolean setAttribute(String key, String value) {
 		try {
 			this.attributes.put(key, value);
@@ -772,6 +777,15 @@ public class Conversation extends AbstractEntity implements Blockable {
 		}
 	}
 
+	public boolean getBooleanAttribute(String key, boolean defaultValue) {
+		String value = this.getAttribute(key);
+		if (value == null) {
+			return defaultValue;
+		} else {
+			return Boolean.parseBoolean(value);
+		}
+	}
+
 	public void add(Message message) {
 		message.setConversation(this);
 		synchronized (this.messages) {

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

@@ -62,9 +62,7 @@ public class NotificationService {
 		return (message.getStatus() == Message.STATUS_RECEIVED)
 				&& notificationsEnabled()
 				&& !message.getConversation().isMuted()
-				&& (message.getConversation().isPnNA()
-				|| conferenceNotificationsEnabled()
-				|| wasHighlightedOrPrivate(message)
+				&& (message.getConversation().alwaysNotify() || wasHighlightedOrPrivate(message)
 		);
 	}
 
@@ -109,10 +107,6 @@ public class NotificationService {
 		}
 	}
 
-	public boolean conferenceNotificationsEnabled() {
-		return mXmppConnectionService.getPreferences().getBoolean("always_notify_in_conference", false);
-	}
-
 	public void pushFromBacklog(final Message message) {
 		if (notify(message)) {
 			synchronized (notifications) {

src/main/java/eu/siacs/conversations/ui/ConferenceDetailsActivity.java 🔗

@@ -28,6 +28,7 @@ import org.openintents.openpgp.util.OpenPgpUtils;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.Comparator;
+import java.util.concurrent.atomic.AtomicInteger;
 
 import eu.siacs.conversations.Config;
 import eu.siacs.conversations.R;
@@ -64,7 +65,9 @@ public class ConferenceDetailsActivity extends XmppActivity implements OnConvers
 	private TextView mConferenceType;
 	private TableLayout mConferenceInfoTable;
 	private TextView mConferenceInfoMam;
+	private TextView mNotifyStatusText;
 	private ImageButton mChangeConferenceSettingsButton;
+	private ImageButton mNotifyStatusButton;
 	private Button mInviteButton;
 	private String uuid = null;
 	private User mSelectedUser = null;
@@ -99,6 +102,47 @@ public class ConferenceDetailsActivity extends XmppActivity implements OnConvers
 
 		}
 	};
+
+	private OnClickListener mNotifyStatusClickListener = new OnClickListener() {
+		@Override
+		public void onClick(View v) {
+			AlertDialog.Builder builder = new AlertDialog.Builder(ConferenceDetailsActivity.this);
+			builder.setTitle(R.string.pref_notification_settings);
+			String[] choices = {
+					getString(R.string.notify_on_all_messages),
+					getString(R.string.notify_only_when_highlighted),
+					getString(R.string.notify_never)
+			};
+			final AtomicInteger choice;
+			if (mConversation.getLongAttribute(Conversation.ATTRIBUTE_MUTED_TILL,0) == Long.MAX_VALUE) {
+				choice = new AtomicInteger(2);
+			} else {
+				choice = new AtomicInteger(mConversation.alwaysNotify() ? 0 : 1);
+			}
+			builder.setSingleChoiceItems(choices, choice.get(), new DialogInterface.OnClickListener() {
+				@Override
+				public void onClick(DialogInterface dialog, int which) {
+					choice.set(which);
+				}
+			});
+			builder.setNegativeButton(R.string.cancel, null);
+			builder.setPositiveButton(R.string.ok, new DialogInterface.OnClickListener() {
+				@Override
+				public void onClick(DialogInterface dialog, int which) {
+					if (choice.get() == 2) {
+						mConversation.setMutedTill(Long.MAX_VALUE);
+					} else {
+						mConversation.setMutedTill(0);
+						mConversation.setAttribute(Conversation.ATTRIBUTE_ALWAYS_NOTIFY,String.valueOf(choice.get() == 0));
+					}
+					xmppConnectionService.updateConversation(mConversation);
+					updateView();
+				}
+			});
+			builder.create().show();
+		}
+	};
+
 	private OnClickListener mChangeConferenceSettings = new OnClickListener() {
 		@Override
 		public void onClick(View v) {
@@ -222,6 +266,9 @@ public class ConferenceDetailsActivity extends XmppActivity implements OnConvers
 		this.mConferenceInfoTable = (TableLayout) findViewById(R.id.muc_info_more);
 		mConferenceInfoTable.setVisibility(this.mAdvancedMode ? View.VISIBLE : View.GONE);
 		this.mConferenceInfoMam = (TextView) findViewById(R.id.muc_info_mam);
+		this.mNotifyStatusButton = (ImageButton) findViewById(R.id.notification_status_button);
+		this.mNotifyStatusButton.setOnClickListener(this.mNotifyStatusClickListener);
+		this.mNotifyStatusText = (TextView) findViewById(R.id.notification_status_text);
 	}
 
 	@Override
@@ -493,6 +540,22 @@ public class ConferenceDetailsActivity extends XmppActivity implements OnConvers
 				mChangeConferenceSettingsButton.setVisibility(View.GONE);
 			}
 		}
+
+		long mutedTill = mConversation.getLongAttribute(Conversation.ATTRIBUTE_MUTED_TILL,0);
+		if (mutedTill == Long.MAX_VALUE) {
+			mNotifyStatusText.setText(R.string.notify_never);
+			mNotifyStatusButton.setImageResource(R.drawable.ic_notifications_off_grey600_24dp);
+		} else if (System.currentTimeMillis() < mutedTill) {
+			mNotifyStatusText.setText(R.string.notify_paused);
+			mNotifyStatusButton.setImageResource(R.drawable.ic_notifications_paused_grey600_24dp);
+		} else if (mConversation.alwaysNotify()) {
+			mNotifyStatusButton.setImageResource(R.drawable.ic_notifications_grey600_24dp);
+			mNotifyStatusText.setText(R.string.notify_on_all_messages);
+		} else {
+			mNotifyStatusButton.setImageResource(R.drawable.ic_notifications_none_grey600_24dp);
+			mNotifyStatusText.setText(R.string.notify_only_when_highlighted);
+		}
+
 		LayoutInflater inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
 		membersView.removeAllViews();
 		final ArrayList<User> users = mucOptions.getUsers();

src/main/java/eu/siacs/conversations/ui/adapter/ConversationAdapter.java 🔗

@@ -102,8 +102,11 @@ public class ConversationAdapter extends ArrayAdapter<Conversation> {
 		} else if (muted_till >= System.currentTimeMillis()) {
 			notificationStatus.setVisibility(View.VISIBLE);
 			notificationStatus.setImageResource(R.drawable.ic_notifications_paused_grey600_24dp);
-		} else {
+		} else if (conversation.alwaysNotify()) {
 			notificationStatus.setVisibility(View.GONE);
+		} else {
+			notificationStatus.setVisibility(View.VISIBLE);
+			notificationStatus.setImageResource(R.drawable.ic_notifications_none_grey600_24dp);
 		}
 
 		mTimestamp.setText(UIHelper.readableTimeDifference(activity,conversation.getLatestMessage().getTimeSent()));

src/main/res/layout/activity_muc_details.xml 🔗

@@ -108,6 +108,33 @@
 				android:src="?attr/icon_settings"/>
 				</RelativeLayout>
 
+			<RelativeLayout
+				android:layout_width="fill_parent"
+				android:layout_height="wrap_content">
+				<TextView
+					android:id="@+id/notification_status_text"
+					android:layout_width="wrap_content"
+					android:layout_height="wrap_content"
+					android:text="@string/notify_on_all_messages"
+					android:layout_centerVertical="true"
+					android:textColor="@color/black87"
+					android:textSize="?attr/TextSizeBody"
+					android:layout_alignParentLeft="true"
+					android:layout_toLeftOf="@+id/notification_status_button"
+					/>
+				<ImageButton
+					android:id="@+id/notification_status_button"
+					style="?android:attr/buttonStyleSmall"
+					android:layout_width="wrap_content"
+					android:layout_height="wrap_content"
+					android:layout_gravity="center_horizontal"
+					android:layout_alignParentRight="true"
+					android:layout_centerVertical="true"
+					android:background="?android:selectableItemBackground"
+					android:padding="@dimen/image_button_padding"
+					android:src="@drawable/ic_notifications_grey600_24dp"/>
+			</RelativeLayout>
+
 			<TableLayout
 				android:layout_width="match_parent"
 				android:layout_height="wrap_content"

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

@@ -111,8 +111,6 @@
 	<string name="pref_vibrate_summary">Also vibrate when a new message arrives</string>
 	<string name="pref_sound">Sound</string>
 	<string name="pref_sound_summary">Play ringtone with notification</string>
-	<string name="pref_conference_notifications">Notifications in Public Conferences</string>
-	<string name="pref_conference_notifications_summary">Always notify when a message arrives in a public conference instead of only when highlighted</string>
 	<string name="pref_notification_grace_period">Notification grace period</string>
 	<string name="pref_notification_grace_period_summary">Disable notifications for a short time after a carbon copy was received</string>
 	<string name="pref_advanced_options">Advanced Options</string>
@@ -570,4 +568,8 @@
 	<string name="certificate_sha1">SHA1</string>
 	<string name="certicate_info_not_available">(Not available)</string>
 	<string name="certificate_not_found">No certificate found</string>
+	<string name="notify_on_all_messages">Notify on all messages</string>
+	<string name="notify_only_when_highlighted">Notify only when highlighted</string>
+	<string name="notify_never">Notifications disabled</string>
+	<string name="notify_paused">Notifications paused</string>
 </resources>

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

@@ -82,12 +82,6 @@
             android:summary="@string/pref_sound_summary"
             android:title="@string/pref_sound"/>
 
-        <CheckBoxPreference
-            android:defaultValue="false"
-            android:dependency="show_notification"
-            android:key="always_notify_in_conference"
-            android:summary="@string/pref_conference_notifications_summary"
-            android:title="@string/pref_conference_notifications"/>
     </PreferenceCategory>
     <PreferenceCategory android:title="@string/pref_ui_options">
         <CheckBoxPreference