From 67866dbe66395b519aed5d1ecc62fdd6f9894676 Mon Sep 17 00:00:00 2001 From: Torsten Grote Date: Thu, 27 Oct 2016 09:47:47 -0200 Subject: [PATCH 1/2] 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 afb0b642c..20ed6fc9f 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 14000ec25..da9ceed36 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(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 1a2fa951e..ffdc971fc 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 handler); + void isDissolved( + ResultExceptionHandler 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 df366c675..34ce9768f 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 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 76856f244..8be76289f 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 From 1147b8ffaff893136396fe87de3adfe8b9f5e066 Mon Sep 17 00:00:00 2001 From: Torsten Grote Date: Tue, 1 Nov 2016 08:26:40 -0200 Subject: [PATCH 2/2] Disable group before loading messages --- .../conversation/GroupActivity.java | 44 +++++++++---------- .../android/threaded/ThreadListActivity.java | 2 +- 2 files changed, 23 insertions(+), 23 deletions(-) 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 da9ceed36..5cd52de8d 100644 --- a/briar-android/src/org/briarproject/android/privategroup/conversation/GroupActivity.java +++ b/briar-android/src/org/briarproject/android/privategroup/conversation/GroupActivity.java @@ -55,17 +55,29 @@ public class GroupActivity extends if (groupName != null) setTitle(groupName); loadNamedGroup(); - list.setEmptyText(R.string.groups_no_messages); + setGroupEnabled(false); } @Override - public void onStart() { - super.onStart(); + @LayoutRes + protected int getLayout() { + return R.layout.activity_forum; + } + + @Override + protected GroupMessageAdapter createAdapter( + LinearLayoutManager layoutManager) { + return new GroupMessageAdapter(this, layoutManager); + } + + @Override + protected void loadItems() { controller.isDissolved( new UiResultExceptionHandler(this) { @Override public void onResultUi(Boolean isDissolved) { - if (isDissolved) disableGroup(); + setGroupEnabled(!isDissolved); + GroupActivity.super.loadItems(); } @Override @@ -101,18 +113,6 @@ public class GroupActivity extends }); } - @Override - @LayoutRes - protected int getLayout() { - return R.layout.activity_forum; - } - - @Override - protected GroupMessageAdapter createAdapter( - LinearLayoutManager layoutManager) { - return new GroupMessageAdapter(this, layoutManager); - } - @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu items for use in the action bar @@ -166,11 +166,11 @@ public class GroupActivity extends 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 setGroupEnabled(boolean enabled) { + isDissolved = !enabled; + if (writeMenuItem != null) writeMenuItem.setVisible(enabled); + textInput.setSendButtonEnabled(enabled); + list.getRecyclerView().setAlpha(enabled ? 1f : 0.5f); } private void showMenuItems() { @@ -182,7 +182,7 @@ public class GroupActivity extends leaveMenuItem.setVisible(true); dissolveMenuItem.setVisible(false); } - if (isDissolved) writeMenuItem.setVisible(false); + writeMenuItem.setVisible(!isDissolved); } private void showLeaveGroupDialog() { diff --git a/briar-android/src/org/briarproject/android/threaded/ThreadListActivity.java b/briar-android/src/org/briarproject/android/threaded/ThreadListActivity.java index eff17e175..babc166a5 100644 --- a/briar-android/src/org/briarproject/android/threaded/ThreadListActivity.java +++ b/briar-android/src/org/briarproject/android/threaded/ThreadListActivity.java @@ -110,7 +110,7 @@ public abstract class ThreadListActivity, DbException>(this) {