mirror of
https://code.briarproject.org/briar/briar.git
synced 2026-02-18 13:49:53 +01:00
Group Member List UI
This commit is contained in:
@@ -6,6 +6,8 @@ import android.content.Intent;
|
||||
import android.os.Bundle;
|
||||
import android.support.annotation.LayoutRes;
|
||||
import android.support.annotation.StringRes;
|
||||
import android.support.v4.app.ActivityCompat;
|
||||
import android.support.v4.app.ActivityOptionsCompat;
|
||||
import android.support.v7.app.ActionBar;
|
||||
import android.support.v7.app.AlertDialog;
|
||||
import android.support.v7.widget.LinearLayoutManager;
|
||||
@@ -16,6 +18,7 @@ import android.view.MenuItem;
|
||||
import org.briarproject.R;
|
||||
import org.briarproject.android.ActivityComponent;
|
||||
import org.briarproject.android.controller.handler.UiResultExceptionHandler;
|
||||
import org.briarproject.android.privategroup.memberlist.GroupMemberListActivity;
|
||||
import org.briarproject.android.threaded.ThreadListActivity;
|
||||
import org.briarproject.android.threaded.ThreadListController;
|
||||
import org.briarproject.api.db.DbException;
|
||||
@@ -24,6 +27,7 @@ import org.briarproject.api.privategroup.PrivateGroup;
|
||||
|
||||
import javax.inject.Inject;
|
||||
|
||||
import static android.support.v4.app.ActivityOptionsCompat.makeCustomAnimation;
|
||||
import static org.briarproject.api.privategroup.PrivateGroupConstants.MAX_GROUP_POST_BODY_LENGTH;
|
||||
|
||||
public class GroupActivity extends
|
||||
@@ -133,12 +137,20 @@ public class GroupActivity extends
|
||||
case R.id.action_group_compose_message:
|
||||
showTextInput(null);
|
||||
return true;
|
||||
case R.id.action_group_member_list:
|
||||
Intent i = new Intent(this, GroupMemberListActivity.class);
|
||||
i.putExtra(GROUP_ID, groupId.getBytes());
|
||||
i.putExtra(GROUP_NAME, getTitle());
|
||||
ActivityOptionsCompat options =
|
||||
makeCustomAnimation(this, android.R.anim.slide_in_left,
|
||||
android.R.anim.slide_out_right);
|
||||
ActivityCompat.startActivity(this, i, options.toBundle());
|
||||
return true;
|
||||
case R.id.action_group_leave:
|
||||
showLeaveGroupDialog();
|
||||
return true;
|
||||
case R.id.action_group_dissolve:
|
||||
showDissolveGroupDialog();
|
||||
return true;
|
||||
default:
|
||||
return super.onOptionsItemSelected(item);
|
||||
}
|
||||
|
||||
@@ -0,0 +1,91 @@
|
||||
package org.briarproject.android.privategroup.memberlist;
|
||||
|
||||
import android.content.Intent;
|
||||
import android.os.Bundle;
|
||||
import android.support.v7.widget.LinearLayoutManager;
|
||||
import android.view.MenuItem;
|
||||
|
||||
import org.briarproject.R;
|
||||
import org.briarproject.android.ActivityComponent;
|
||||
import org.briarproject.android.BriarActivity;
|
||||
import org.briarproject.android.controller.handler.UiResultExceptionHandler;
|
||||
import org.briarproject.android.view.BriarRecyclerView;
|
||||
import org.briarproject.api.db.DbException;
|
||||
import org.briarproject.api.sync.GroupId;
|
||||
|
||||
import java.util.Collection;
|
||||
|
||||
import javax.inject.Inject;
|
||||
|
||||
public class GroupMemberListActivity extends BriarActivity {
|
||||
|
||||
@Inject
|
||||
GroupMemberListController controller;
|
||||
|
||||
private MemberListAdapter adapter;
|
||||
private BriarRecyclerView list;
|
||||
private GroupId groupId;
|
||||
|
||||
@Override
|
||||
public void injectActivity(ActivityComponent component) {
|
||||
component.inject(this);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onCreate(final Bundle state) {
|
||||
super.onCreate(state);
|
||||
|
||||
setContentView(R.layout.list);
|
||||
|
||||
Intent i = getIntent();
|
||||
byte[] b = i.getByteArrayExtra(GROUP_ID);
|
||||
if (b == null) throw new IllegalStateException("No GroupId in intent.");
|
||||
groupId = new GroupId(b);
|
||||
String name = i.getStringExtra(GROUP_NAME);
|
||||
if (name == null) throw new IllegalStateException("No name in intent.");
|
||||
setTitle(name + " " + getString(R.string.groups_member_list));
|
||||
|
||||
list = (BriarRecyclerView) findViewById(R.id.list);
|
||||
LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this);
|
||||
list.setLayoutManager(linearLayoutManager);
|
||||
adapter = new MemberListAdapter(this);
|
||||
list.setAdapter(adapter);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onStart() {
|
||||
super.onStart();
|
||||
controller.loadMembers(groupId,
|
||||
new UiResultExceptionHandler<Collection<MemberListItem>, DbException>(this) {
|
||||
@Override
|
||||
public void onResultUi(Collection<MemberListItem> members) {
|
||||
adapter.addAll(members);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onExceptionUi(DbException exception) {
|
||||
// TODO proper error handling
|
||||
finish();
|
||||
}
|
||||
});
|
||||
list.startPeriodicUpdate();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onStop() {
|
||||
super.onStop();
|
||||
list.stopPeriodicUpdate();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean onOptionsItemSelected(MenuItem item) {
|
||||
switch (item.getItemId()) {
|
||||
case android.R.id.home:
|
||||
onBackPressed();
|
||||
return true;
|
||||
default:
|
||||
return super.onOptionsItemSelected(item);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,15 @@
|
||||
package org.briarproject.android.privategroup.memberlist;
|
||||
|
||||
import org.briarproject.android.controller.DbController;
|
||||
import org.briarproject.android.controller.handler.ResultExceptionHandler;
|
||||
import org.briarproject.api.db.DbException;
|
||||
import org.briarproject.api.sync.GroupId;
|
||||
|
||||
import java.util.Collection;
|
||||
|
||||
public interface GroupMemberListController extends DbController {
|
||||
|
||||
void loadMembers(GroupId groupId,
|
||||
ResultExceptionHandler<Collection<MemberListItem>, DbException> handler);
|
||||
|
||||
}
|
||||
@@ -0,0 +1,60 @@
|
||||
package org.briarproject.android.privategroup.memberlist;
|
||||
|
||||
import org.briarproject.android.controller.DbControllerImpl;
|
||||
import org.briarproject.android.controller.handler.ResultExceptionHandler;
|
||||
import org.briarproject.api.db.DatabaseExecutor;
|
||||
import org.briarproject.api.db.DbException;
|
||||
import org.briarproject.api.lifecycle.LifecycleManager;
|
||||
import org.briarproject.api.privategroup.GroupMember;
|
||||
import org.briarproject.api.privategroup.PrivateGroupManager;
|
||||
import org.briarproject.api.sync.GroupId;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collection;
|
||||
import java.util.concurrent.Executor;
|
||||
import java.util.logging.Logger;
|
||||
|
||||
import javax.inject.Inject;
|
||||
|
||||
import static java.util.logging.Level.WARNING;
|
||||
|
||||
public class GroupMemberListControllerImpl extends DbControllerImpl
|
||||
implements GroupMemberListController {
|
||||
|
||||
private static final Logger LOG =
|
||||
Logger.getLogger(GroupMemberListControllerImpl.class.getName());
|
||||
|
||||
private final PrivateGroupManager privateGroupManager;
|
||||
|
||||
@Inject
|
||||
GroupMemberListControllerImpl(@DatabaseExecutor Executor dbExecutor,
|
||||
LifecycleManager lifecycleManager,
|
||||
PrivateGroupManager privateGroupManager) {
|
||||
super(dbExecutor, lifecycleManager);
|
||||
this.privateGroupManager = privateGroupManager;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void loadMembers(final GroupId groupId, final
|
||||
ResultExceptionHandler<Collection<MemberListItem>, DbException> handler) {
|
||||
runOnDbThread(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
try {
|
||||
Collection<MemberListItem> items = new ArrayList<>();
|
||||
Collection<GroupMember> members =
|
||||
privateGroupManager.getMembers(groupId);
|
||||
for (GroupMember m : members) {
|
||||
items.add(new MemberListItem(m));
|
||||
}
|
||||
handler.onResult(items);
|
||||
} catch (DbException e) {
|
||||
if (LOG.isLoggable(WARNING))
|
||||
LOG.log(WARNING, e.toString(), e);
|
||||
handler.onException(e);
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,48 @@
|
||||
package org.briarproject.android.privategroup.memberlist;
|
||||
|
||||
import android.content.Context;
|
||||
import android.view.LayoutInflater;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
|
||||
import org.briarproject.R;
|
||||
import org.briarproject.android.util.BriarAdapter;
|
||||
|
||||
class MemberListAdapter extends
|
||||
BriarAdapter<MemberListItem, MemberListItemHolder> {
|
||||
|
||||
MemberListAdapter(Context context) {
|
||||
super(context, MemberListItem.class);
|
||||
}
|
||||
|
||||
@Override
|
||||
public MemberListItemHolder onCreateViewHolder(ViewGroup viewGroup,
|
||||
int i) {
|
||||
View v = LayoutInflater.from(ctx).inflate(
|
||||
R.layout.list_item_group_member, viewGroup, false);
|
||||
return new MemberListItemHolder(v);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onBindViewHolder(MemberListItemHolder ui, int position) {
|
||||
ui.bind(items.get(position));
|
||||
}
|
||||
|
||||
@Override
|
||||
public int compare(MemberListItem m1, MemberListItem m2) {
|
||||
return m1.getMember().getName().compareTo(m2.getMember().getName());
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean areContentsTheSame(MemberListItem m1, MemberListItem m2) {
|
||||
if (m1.isSharing() != m2.isSharing()) return false;
|
||||
if (m1.getStatus() != m2.getStatus()) return false;
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean areItemsTheSame(MemberListItem m1, MemberListItem m2) {
|
||||
return m1.getMember().equals(m2.getMember());
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,36 @@
|
||||
package org.briarproject.android.privategroup.memberlist;
|
||||
|
||||
import org.briarproject.api.identity.Author;
|
||||
import org.briarproject.api.identity.Author.Status;
|
||||
import org.briarproject.api.nullsafety.NotNullByDefault;
|
||||
import org.briarproject.api.privategroup.GroupMember;
|
||||
|
||||
import javax.annotation.concurrent.NotThreadSafe;
|
||||
|
||||
@NotThreadSafe
|
||||
@NotNullByDefault
|
||||
public class MemberListItem {
|
||||
|
||||
private final Author member;
|
||||
private Status status;
|
||||
private boolean sharing;
|
||||
|
||||
public MemberListItem(GroupMember groupMember) {
|
||||
this.member = groupMember.getAuthor();
|
||||
this.sharing = groupMember.isShared();
|
||||
this.status = groupMember.getStatus();
|
||||
}
|
||||
|
||||
public Author getMember() {
|
||||
return member;
|
||||
}
|
||||
|
||||
public boolean isSharing() {
|
||||
return sharing;
|
||||
}
|
||||
|
||||
public Status getStatus() {
|
||||
return status;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,38 @@
|
||||
package org.briarproject.android.privategroup.memberlist;
|
||||
|
||||
import android.support.annotation.UiThread;
|
||||
import android.support.v7.widget.RecyclerView;
|
||||
import android.view.View;
|
||||
import android.widget.ImageView;
|
||||
|
||||
import org.briarproject.R;
|
||||
import org.briarproject.android.view.AuthorView;
|
||||
import org.briarproject.api.nullsafety.NotNullByDefault;
|
||||
|
||||
import static android.view.View.INVISIBLE;
|
||||
import static android.view.View.VISIBLE;
|
||||
|
||||
@UiThread
|
||||
@NotNullByDefault
|
||||
class MemberListItemHolder extends RecyclerView.ViewHolder {
|
||||
|
||||
private final AuthorView author;
|
||||
private final ImageView sharing;
|
||||
|
||||
MemberListItemHolder(View v) {
|
||||
super(v);
|
||||
author = (AuthorView) v.findViewById(R.id.authorView);
|
||||
sharing = (ImageView) v.findViewById(R.id.sharingView);
|
||||
}
|
||||
|
||||
protected void bind(MemberListItem item) {
|
||||
author.setAuthor(item.getMember());
|
||||
author.setAuthorStatus(item.getStatus());
|
||||
if (item.isSharing()) {
|
||||
sharing.setVisibility(VISIBLE);
|
||||
} else {
|
||||
sharing.setVisibility(INVISIBLE);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user