diff --git a/briar-android/src/main/java/org/briarproject/briar/android/forum/ForumListAdapter.java b/briar-android/src/main/java/org/briarproject/briar/android/forum/ForumListAdapter.java index 65d15bc61..172810d2e 100644 --- a/briar-android/src/main/java/org/briarproject/briar/android/forum/ForumListAdapter.java +++ b/briar-android/src/main/java/org/briarproject/briar/android/forum/ForumListAdapter.java @@ -13,15 +13,18 @@ import androidx.recyclerview.widget.ListAdapter; @NotNullByDefault class ForumListAdapter extends ListAdapter { - ForumListAdapter() { + private final ForumListViewModel viewModel; + + ForumListAdapter(ForumListViewModel viewModel) { super(new ForumListCallback()); + this.viewModel = viewModel; } @Override public ForumViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { View v = LayoutInflater.from(parent.getContext()).inflate( R.layout.list_item_forum, parent, false); - return new ForumViewHolder(v); + return new ForumViewHolder(v, viewModel); } @Override diff --git a/briar-android/src/main/java/org/briarproject/briar/android/forum/ForumListFragment.java b/briar-android/src/main/java/org/briarproject/briar/android/forum/ForumListFragment.java index 3c8797371..a4664dc8a 100644 --- a/briar-android/src/main/java/org/briarproject/briar/android/forum/ForumListFragment.java +++ b/briar-android/src/main/java/org/briarproject/briar/android/forum/ForumListFragment.java @@ -40,7 +40,7 @@ public class ForumListFragment extends BaseFragment implements private ForumListViewModel viewModel; private BriarRecyclerView list; private Snackbar snackbar; - private final ForumListAdapter adapter = new ForumListAdapter(); + private ForumListAdapter adapter; @Inject ViewModelProvider.Factory viewModelFactory; @@ -54,6 +54,7 @@ public class ForumListFragment extends BaseFragment implements component.inject(this); viewModel = new ViewModelProvider(this, viewModelFactory) .get(ForumListViewModel.class); + adapter = new ForumListAdapter(viewModel); } @Nullable diff --git a/briar-android/src/main/java/org/briarproject/briar/android/forum/ForumListViewModel.java b/briar-android/src/main/java/org/briarproject/briar/android/forum/ForumListViewModel.java index d4da63301..b65bd1519 100644 --- a/briar-android/src/main/java/org/briarproject/briar/android/forum/ForumListViewModel.java +++ b/briar-android/src/main/java/org/briarproject/briar/android/forum/ForumListViewModel.java @@ -1,6 +1,7 @@ package org.briarproject.briar.android.forum; import android.app.Application; +import android.widget.Toast; import org.briarproject.bramble.api.contact.event.ContactRemovedEvent; import org.briarproject.bramble.api.db.DatabaseExecutor; @@ -15,6 +16,7 @@ import org.briarproject.bramble.api.sync.GroupId; import org.briarproject.bramble.api.sync.event.GroupAddedEvent; import org.briarproject.bramble.api.sync.event.GroupRemovedEvent; import org.briarproject.bramble.api.system.AndroidExecutor; +import org.briarproject.briar.R; import org.briarproject.briar.android.viewmodel.DbViewModel; import org.briarproject.briar.android.viewmodel.LiveResult; import org.briarproject.briar.api.android.AndroidNotificationManager; @@ -40,6 +42,7 @@ import androidx.annotation.UiThread; import androidx.lifecycle.LiveData; import androidx.lifecycle.MutableLiveData; +import static android.widget.Toast.LENGTH_SHORT; import static java.util.logging.Logger.getLogger; import static org.briarproject.bramble.util.LogUtils.logDuration; import static org.briarproject.bramble.util.LogUtils.now; @@ -180,4 +183,17 @@ class ForumListViewModel extends DbViewModel implements EventListener { return numInvitations; } + void deleteForum(GroupId groupId) { + runOnDbThread(() -> { + try { + Forum f = forumManager.getForum(groupId); + forumManager.removeForum(f); + androidExecutor.runOnUiThread(() -> Toast + .makeText(getApplication(), R.string.forum_left_toast, + LENGTH_SHORT).show()); + } catch (DbException e) { + handleException(e); + } + }); + } } diff --git a/briar-android/src/main/java/org/briarproject/briar/android/forum/ForumViewHolder.java b/briar-android/src/main/java/org/briarproject/briar/android/forum/ForumViewHolder.java index 78129ffb6..e7e4e65e1 100644 --- a/briar-android/src/main/java/org/briarproject/briar/android/forum/ForumViewHolder.java +++ b/briar-android/src/main/java/org/briarproject/briar/android/forum/ForumViewHolder.java @@ -4,6 +4,7 @@ import android.content.Context; import android.content.Intent; import android.view.View; import android.view.ViewGroup; +import android.widget.PopupMenu; import android.widget.TextView; import org.briarproject.briar.R; @@ -20,6 +21,7 @@ import static org.briarproject.briar.android.activity.BriarActivity.GROUP_NAME; class ForumViewHolder extends RecyclerView.ViewHolder { + private final ForumListViewModel viewModel; private final Context ctx; private final ViewGroup layout; private final TextAvatarView avatar; @@ -27,8 +29,9 @@ class ForumViewHolder extends RecyclerView.ViewHolder { private final TextView postCount; private final TextView date; - ForumViewHolder(View v) { + ForumViewHolder(View v, ForumListViewModel viewModel) { super(v); + this.viewModel = viewModel; ctx = v.getContext(); layout = (ViewGroup) v; avatar = v.findViewById(R.id.avatarView); @@ -64,6 +67,21 @@ class ForumViewHolder extends RecyclerView.ViewHolder { date.setVisibility(VISIBLE); } + // Open popup menu on long click + layout.setOnLongClickListener(v -> { + PopupMenu pm = new PopupMenu(ctx, v); + pm.getMenuInflater().inflate(R.menu.forum_list_item_actions, + pm.getMenu()); + pm.setOnMenuItemClickListener(it -> { + if (it.getItemId() == R.id.action_forum_delete) { + viewModel.deleteForum(item.getForum().getId()); + } + return true; + }); + pm.show(); + return true; + }); + // Open Forum on Click layout.setOnClickListener(v -> { Intent i = new Intent(ctx, ForumActivity.class); diff --git a/briar-android/src/main/res/layout/list_item_forum.xml b/briar-android/src/main/res/layout/list_item_forum.xml index c76ead606..3e3547a53 100644 --- a/briar-android/src/main/res/layout/list_item_forum.xml +++ b/briar-android/src/main/res/layout/list_item_forum.xml @@ -11,7 +11,6 @@ android:layout_width="@dimen/listitem_picture_frame_size" android:layout_height="@dimen/listitem_picture_frame_size" android:layout_marginStart="@dimen/listitem_horizontal_margin" - android:layout_marginLeft="@dimen/listitem_horizontal_margin" app:layout_constraintBottom_toTopOf="@+id/divider" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" /> @@ -38,7 +37,6 @@ android:layout_height="wrap_content" android:layout_marginTop="@dimen/margin_medium" android:layout_marginEnd="8dp" - android:layout_marginRight="8dp" android:textColor="?android:attr/textColorSecondary" android:textSize="@dimen/text_size_small" app:layout_constraintEnd_toStartOf="@+id/dateView" @@ -51,7 +49,6 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginEnd="@dimen/listitem_horizontal_margin" - android:layout_marginRight="@dimen/listitem_horizontal_margin" android:textColor="?android:attr/textColorSecondary" android:textSize="@dimen/text_size_small" app:layout_constraintBaseline_toBaselineOf="@+id/postCountView" @@ -63,7 +60,6 @@ style="@style/Divider.ThreadItem" android:layout_width="0dp" android:layout_marginStart="@dimen/margin_medium" - android:layout_marginLeft="@dimen/margin_medium" android:layout_marginTop="@dimen/listitem_horizontal_margin" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" diff --git a/briar-android/src/main/res/menu/forum_list_item_actions.xml b/briar-android/src/main/res/menu/forum_list_item_actions.xml new file mode 100644 index 000000000..7c9292c50 --- /dev/null +++ b/briar-android/src/main/res/menu/forum_list_item_actions.xml @@ -0,0 +1,8 @@ + + + + + + \ No newline at end of file