From 138fa6f39d4cc0ce4caf6c62860f0a680e93acb3 Mon Sep 17 00:00:00 2001 From: akwizgran Date: Tue, 29 Apr 2025 09:43:44 +0100 Subject: [PATCH] Allow forums to be removed without opening them. --- .../briar/android/forum/ForumListAdapter.java | 7 +++-- .../android/forum/ForumListFragment.java | 3 +- .../android/forum/ForumListViewModel.java | 16 ++++++++++ .../briar/android/forum/ForumViewHolder.java | 30 ++++++++++++++++++- .../src/main/res/layout/list_item_forum.xml | 20 +++++++++---- .../main/res/menu/forum_list_item_actions.xml | 8 +++++ briar-android/src/main/res/values/strings.xml | 1 + 7 files changed, 76 insertions(+), 9 deletions(-) create mode 100644 briar-android/src/main/res/menu/forum_list_item_actions.xml 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..ba946cec5 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,8 @@ import android.content.Context; import android.content.Intent; import android.view.View; import android.view.ViewGroup; +import android.widget.ImageButton; +import android.widget.PopupMenu; import android.widget.TextView; import org.briarproject.briar.R; @@ -11,30 +13,40 @@ import org.briarproject.briar.android.util.UiUtils; import org.briarproject.briar.android.view.TextAvatarView; import org.briarproject.briar.api.forum.Forum; +import java.util.logging.Logger; + import androidx.recyclerview.widget.RecyclerView; import static android.view.View.GONE; import static android.view.View.VISIBLE; +import static java.util.logging.Logger.getLogger; import static org.briarproject.briar.android.activity.BriarActivity.GROUP_ID; import static org.briarproject.briar.android.activity.BriarActivity.GROUP_NAME; class ForumViewHolder extends RecyclerView.ViewHolder { + private static final Logger LOG = + getLogger(ForumViewHolder.class.getName()); + + private final ForumListViewModel viewModel; private final Context ctx; private final ViewGroup layout; private final TextAvatarView avatar; private final TextView name; private final TextView postCount; private final TextView date; + private final ImageButton menuButton; - 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); name = v.findViewById(R.id.forumNameView); postCount = v.findViewById(R.id.postCountView); date = v.findViewById(R.id.dateView); + menuButton = v.findViewById(R.id.menuButton); } void bind(ForumListItem item) { @@ -64,6 +76,22 @@ class ForumViewHolder extends RecyclerView.ViewHolder { date.setVisibility(VISIBLE); } + // Open popup menu + menuButton.setOnClickListener(v -> { + LOG.info("Menu click"); + PopupMenu pm = new PopupMenu(ctx, menuButton); + pm.getMenuInflater().inflate(R.menu.forum_list_item_actions, + pm.getMenu()); + pm.setOnMenuItemClickListener(it -> { + LOG.info("Menu item click"); + if (it.getItemId() == R.id.action_forum_delete) { + viewModel.deleteForum(item.getForum().getId()); + } + return true; + }); + pm.show(); + }); + // 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..d6eb36300 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" /> @@ -27,7 +26,7 @@ android:layout_marginRight="@dimen/listitem_horizontal_margin" android:textColor="?android:attr/textColorPrimary" android:textSize="@dimen/text_size_medium" - app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintEnd_toStartOf="@id/menuButton" app:layout_constraintStart_toEndOf="@+id/avatarView" app:layout_constraintTop_toTopOf="parent" tools:text="This is a name of a forum which can be long" /> @@ -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" @@ -46,16 +44,29 @@ app:layout_constraintTop_toBottomOf="@+id/forumNameView" tools:text="@string/no_forum_posts" /> + + + + + + + \ No newline at end of file diff --git a/briar-android/src/main/res/values/strings.xml b/briar-android/src/main/res/values/strings.xml index 383e13c77..f8216beea 100644 --- a/briar-android/src/main/res/values/strings.xml +++ b/briar-android/src/main/res/values/strings.xml @@ -936,5 +936,6 @@ Hi Alice! Thanks for telling me about Briar! No problem, hope you like it 😀 + Menu