From 67866dbe66395b519aed5d1ecc62fdd6f9894676 Mon Sep 17 00:00:00 2001
From: Torsten Grote <t@grobox.de>
Date: Thu, 27 Oct 2016 09:47:47 -0200
Subject: [PATCH] Implement UX for when a group has been dissolved

---
 briar-android/res/layout/list_item_group.xml  |  2 +-
 .../conversation/GroupActivity.java           | 37 +++++++++++++++++--
 .../conversation/GroupController.java         |  3 ++
 .../conversation/GroupControllerImpl.java     | 19 ++++++++++
 .../list/GroupListControllerImpl.java         | 10 +----
 5 files changed, 58 insertions(+), 13 deletions(-)

diff --git a/briar-android/res/layout/list_item_group.xml b/briar-android/res/layout/list_item_group.xml
index afb0b642c1..20ed6fc9f6 100644
--- a/briar-android/res/layout/list_item_group.xml
+++ b/briar-android/res/layout/list_item_group.xml
@@ -80,6 +80,7 @@
 		android:layout_below="@+id/messageCountView"
 		android:layout_toEndOf="@+id/avatarView"
 		android:layout_toRightOf="@+id/avatarView"
+		android:layout_toLeftOf="@+id/removeButton"
 		android:paddingTop="@dimen/margin_small"
 		android:textColor="@color/briar_text_tertiary"
 		tools:text="@string/groups_group_is_empty"/>
@@ -91,7 +92,6 @@
 		android:layout_height="wrap_content"
 		android:layout_alignBottom="@+id/divider"
 		android:layout_alignParentRight="true"
-		android:layout_toRightOf="@+id/statusView"
 		android:text="@string/groups_remove"
 		tools:visibility="gone"/>
 
diff --git a/briar-android/src/org/briarproject/android/privategroup/conversation/GroupActivity.java b/briar-android/src/org/briarproject/android/privategroup/conversation/GroupActivity.java
index 14000ec25a..da9ceed369 100644
--- a/briar-android/src/org/briarproject/android/privategroup/conversation/GroupActivity.java
+++ b/briar-android/src/org/briarproject/android/privategroup/conversation/GroupActivity.java
@@ -33,9 +33,8 @@ public class GroupActivity extends
 	@Inject
 	GroupController controller;
 
-	private boolean isCreator;
-	private MenuItem leaveMenuItem;
-	private MenuItem dissolveMenuItem;
+	private boolean isCreator, isDissolved = false;
+	private MenuItem writeMenuItem, leaveMenuItem, dissolveMenuItem;
 
 	@Override
 	public void injectActivity(ActivityComponent component) {
@@ -59,6 +58,24 @@ public class GroupActivity extends
 		list.setEmptyText(R.string.groups_no_messages);
 	}
 
+	@Override
+	public void onStart() {
+		super.onStart();
+		controller.isDissolved(
+				new UiResultExceptionHandler<Boolean, DbException>(this) {
+					@Override
+					public void onResultUi(Boolean isDissolved) {
+						if (isDissolved) disableGroup();
+					}
+
+					@Override
+					public void onExceptionUi(DbException exception) {
+						// TODO proper error handling
+						finish();
+					}
+				});
+	}
+
 	@Override
 	protected void onNamedGroupLoaded(PrivateGroup group) {
 		setTitle(group.getName());
@@ -102,6 +119,7 @@ public class GroupActivity extends
 		MenuInflater inflater = getMenuInflater();
 		inflater.inflate(R.menu.group_actions, menu);
 
+		writeMenuItem = menu.findItem(R.id.action_group_compose_message);
 		leaveMenuItem = menu.findItem(R.id.action_group_leave);
 		dissolveMenuItem = menu.findItem(R.id.action_group_dissolve);
 		showMenuItems();
@@ -143,6 +161,18 @@ public class GroupActivity extends
 		return R.string.groups_message_received;
 	}
 
+	@Override
+	public void onReplyClick(GroupMessageItem item) {
+		if (!isDissolved) super.onReplyClick(item);
+	}
+
+	private void disableGroup() {
+		isDissolved = true;
+		if (writeMenuItem != null) writeMenuItem.setVisible(false);
+		textInput.setSendButtonEnabled(false);
+		list.setAlpha(0.5f);
+	}
+
 	private void showMenuItems() {
 		if (leaveMenuItem == null || dissolveMenuItem == null) return;
 		if (isCreator) {
@@ -152,6 +182,7 @@ public class GroupActivity extends
 			leaveMenuItem.setVisible(true);
 			dissolveMenuItem.setVisible(false);
 		}
+		if (isDissolved) writeMenuItem.setVisible(false);
 	}
 
 	private void showLeaveGroupDialog() {
diff --git a/briar-android/src/org/briarproject/android/privategroup/conversation/GroupController.java b/briar-android/src/org/briarproject/android/privategroup/conversation/GroupController.java
index 1a2fa951e8..ffdc971fce 100644
--- a/briar-android/src/org/briarproject/android/privategroup/conversation/GroupController.java
+++ b/briar-android/src/org/briarproject/android/privategroup/conversation/GroupController.java
@@ -13,4 +13,7 @@ public interface GroupController
 	void isCreator(PrivateGroup group,
 			ResultExceptionHandler<Boolean, DbException> handler);
 
+	void isDissolved(
+			ResultExceptionHandler<Boolean, DbException> handler);
+
 }
diff --git a/briar-android/src/org/briarproject/android/privategroup/conversation/GroupControllerImpl.java b/briar-android/src/org/briarproject/android/privategroup/conversation/GroupControllerImpl.java
index df366c675c..34ce9768f9 100644
--- a/briar-android/src/org/briarproject/android/privategroup/conversation/GroupControllerImpl.java
+++ b/briar-android/src/org/briarproject/android/privategroup/conversation/GroupControllerImpl.java
@@ -195,4 +195,23 @@ public class GroupControllerImpl extends
 		});
 	}
 
+	@Override
+	public void isDissolved(final
+			ResultExceptionHandler<Boolean, DbException> handler) {
+		runOnDbThread(new Runnable() {
+			@Override
+			public void run() {
+				try {
+					boolean isDissolved =
+							privateGroupManager.isDissolved(getGroupId());
+					handler.onResult(isDissolved);
+				} catch (DbException e) {
+					if (LOG.isLoggable(WARNING))
+						LOG.log(WARNING, e.toString(), e);
+					handler.onException(e);
+				}
+			}
+		});
+	}
+
 }
diff --git a/briar-android/src/org/briarproject/android/privategroup/list/GroupListControllerImpl.java b/briar-android/src/org/briarproject/android/privategroup/list/GroupListControllerImpl.java
index 76856f244d..8be76289fe 100644
--- a/briar-android/src/org/briarproject/android/privategroup/list/GroupListControllerImpl.java
+++ b/briar-android/src/org/briarproject/android/privategroup/list/GroupListControllerImpl.java
@@ -2,7 +2,6 @@ package org.briarproject.android.privategroup.list;
 
 import android.support.annotation.CallSuper;
 
-import org.briarproject.android.api.AndroidNotificationManager;
 import org.briarproject.android.controller.DbControllerImpl;
 import org.briarproject.android.controller.handler.ResultExceptionHandler;
 import org.briarproject.api.clients.MessageTracker.GroupCount;
@@ -15,7 +14,6 @@ import org.briarproject.api.event.EventListener;
 import org.briarproject.api.event.GroupAddedEvent;
 import org.briarproject.api.event.GroupMessageAddedEvent;
 import org.briarproject.api.event.GroupRemovedEvent;
-import org.briarproject.api.identity.IdentityManager;
 import org.briarproject.api.lifecycle.LifecycleManager;
 import org.briarproject.api.privategroup.GroupMessageHeader;
 import org.briarproject.api.privategroup.PrivateGroup;
@@ -44,23 +42,17 @@ public class GroupListControllerImpl extends DbControllerImpl
 	private final PrivateGroupManager groupManager;
 	private final GroupInvitationManager groupInvitationManager;
 	private final EventBus eventBus;
-	private final AndroidNotificationManager notificationManager;
-	private final IdentityManager identityManager;
 
 	protected volatile GroupListListener listener;
 
 	@Inject
 	GroupListControllerImpl(@DatabaseExecutor Executor dbExecutor,
 			LifecycleManager lifecycleManager, PrivateGroupManager groupManager,
-			GroupInvitationManager groupInvitationManager, EventBus eventBus,
-			AndroidNotificationManager notificationManager,
-			IdentityManager identityManager) {
+			GroupInvitationManager groupInvitationManager, EventBus eventBus) {
 		super(dbExecutor, lifecycleManager);
 		this.groupManager = groupManager;
 		this.groupInvitationManager = groupInvitationManager;
 		this.eventBus = eventBus;
-		this.notificationManager = notificationManager;
-		this.identityManager = identityManager;
 	}
 
 	@Override
-- 
GitLab