From 4a18c0150b281ce1c420358f4afe9eccc644c24e Mon Sep 17 00:00:00 2001 From: "B. Petersen" Date: Thu, 1 Aug 2024 18:04:02 +0200 Subject: [PATCH] make onContextItemSelected() being called --- .../accounts/AccountSelectionListAdapter.java | 15 +++++++++------ .../accounts/AccountSelectionListFragment.java | 14 ++++++++++++-- .../accounts/AccountSelectionListItem.java | 5 ++++- 3 files changed, 25 insertions(+), 9 deletions(-) diff --git a/src/main/java/org/thoughtcrime/securesms/accounts/AccountSelectionListAdapter.java b/src/main/java/org/thoughtcrime/securesms/accounts/AccountSelectionListAdapter.java index 3aac28084..4ceaba93f 100644 --- a/src/main/java/org/thoughtcrime/securesms/accounts/AccountSelectionListAdapter.java +++ b/src/main/java/org/thoughtcrime/securesms/accounts/AccountSelectionListAdapter.java @@ -1,5 +1,6 @@ package org.thoughtcrime.securesms.accounts; +import android.app.Activity; import android.content.Context; import android.text.TextUtils; import android.view.LayoutInflater; @@ -20,6 +21,7 @@ import org.thoughtcrime.securesms.mms.GlideRequests; public class AccountSelectionListAdapter extends RecyclerView.Adapter { + private final @NonNull AccountSelectionListFragment fragment; private final @NonNull Context context; private final @NonNull DcAccounts accounts; private @NonNull int[] accountList = new int[0]; @@ -39,7 +41,7 @@ public class AccountSelectionListAdapter extends RecyclerView.Adapter super(itemView); } - public abstract void bind(@NonNull GlideRequests glideRequests, int accountId, DcContact self, String name, String addr, int unreadCount, boolean selected, boolean isMuted); + public abstract void bind(@NonNull GlideRequests glideRequests, int accountId, DcContact self, String name, String addr, int unreadCount, boolean selected, boolean isMuted, AccountSelectionListFragment fragment); public abstract void unbind(@NonNull GlideRequests glideRequests); } @@ -59,8 +61,8 @@ public class AccountSelectionListAdapter extends RecyclerView.Adapter return (AccountSelectionListItem) itemView; } - public void bind(@NonNull GlideRequests glideRequests, int accountId, DcContact self, String name, String addr, int unreadCount, boolean selected, boolean isMuted) { - getView().bind(glideRequests, accountId, self, name, addr, unreadCount, selected, isMuted); + public void bind(@NonNull GlideRequests glideRequests, int accountId, DcContact self, String name, String addr, int unreadCount, boolean selected, boolean isMuted, AccountSelectionListFragment fragment) { + getView().bind(glideRequests, accountId, self, name, addr, unreadCount, selected, isMuted, fragment); } @Override @@ -69,12 +71,13 @@ public class AccountSelectionListAdapter extends RecyclerView.Adapter } } - public AccountSelectionListAdapter(@NonNull Context context, + public AccountSelectionListAdapter(@NonNull AccountSelectionListFragment fragment, @NonNull GlideRequests glideRequests, @Nullable ItemClickListener clickListener) { super(); - this.context = context; + this.fragment = fragment; + this.context = fragment.getActivity(); this.accounts = DcHelper.getAccounts(context); this.li = LayoutInflater.from(context); this.glideRequests = glideRequests; @@ -111,7 +114,7 @@ public class AccountSelectionListAdapter extends RecyclerView.Adapter ViewHolder holder = (ViewHolder) viewHolder; holder.unbind(glideRequests); - holder.bind(glideRequests, id, dcContact, name, addr, unreadCount, id == selectedAccountId, dcContext.isMuted()); + holder.bind(glideRequests, id, dcContact, name, addr, unreadCount, id == selectedAccountId, dcContext.isMuted(), fragment); } public interface ItemClickListener { diff --git a/src/main/java/org/thoughtcrime/securesms/accounts/AccountSelectionListFragment.java b/src/main/java/org/thoughtcrime/securesms/accounts/AccountSelectionListFragment.java index 8bc2c940f..f2ced4b21 100644 --- a/src/main/java/org/thoughtcrime/securesms/accounts/AccountSelectionListFragment.java +++ b/src/main/java/org/thoughtcrime/securesms/accounts/AccountSelectionListFragment.java @@ -34,11 +34,10 @@ public class AccountSelectionListFragment extends DialogFragment @Override public void onActivityCreated(Bundle icicle) { super.onActivityCreated(icicle); - AccountSelectionListAdapter adapter = new AccountSelectionListAdapter(getActivity(), + AccountSelectionListAdapter adapter = new AccountSelectionListAdapter(this, GlideApp.with(getActivity()), new ListClickListener()); recyclerView.setAdapter(adapter); - registerForContextMenu(recyclerView); DcAccounts accounts = DcHelper.getAccounts(getActivity()); int[] accountIds = accounts.getAll(); @@ -74,6 +73,17 @@ public class AccountSelectionListFragment extends DialogFragment public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) { super.onCreateContextMenu(menu, v, menuInfo); requireActivity().getMenuInflater().inflate(R.menu.account_item_context, menu); + + // hack to make onContextItemSelected() work with DialogFragment, + // see https://stackoverflow.com/questions/15929026/oncontextitemselected-does-not-get-called-in-a-dialogfragment + MenuItem.OnMenuItemClickListener listener = item -> { + onContextItemSelected(item); + return true; + }; + for (int i = 0, n = menu.size(); i < n; i++) { + menu.getItem(i).setOnMenuItemClickListener(listener); + } + // /hack } @Override diff --git a/src/main/java/org/thoughtcrime/securesms/accounts/AccountSelectionListItem.java b/src/main/java/org/thoughtcrime/securesms/accounts/AccountSelectionListItem.java index d0a58be4f..46d800cde 100644 --- a/src/main/java/org/thoughtcrime/securesms/accounts/AccountSelectionListItem.java +++ b/src/main/java/org/thoughtcrime/securesms/accounts/AccountSelectionListItem.java @@ -1,5 +1,6 @@ package org.thoughtcrime.securesms.accounts; +import android.app.Activity; import android.content.Context; import android.graphics.Color; import android.graphics.Typeface; @@ -55,7 +56,7 @@ public class AccountSelectionListItem extends LinearLayout { ViewUtil.setTextViewGravityStart(this.nameView, getContext()); } - public void bind(@NonNull GlideRequests glideRequests, int accountId, DcContact self, String name, String addr, int unreadCount, boolean selected, boolean isMuted) { + public void bind(@NonNull GlideRequests glideRequests, int accountId, DcContact self, String name, String addr, int unreadCount, boolean selected, boolean isMuted, AccountSelectionListFragment fragment) { this.accountId = accountId; Recipient recipient; @@ -80,6 +81,8 @@ public class AccountSelectionListItem extends LinearLayout { updateUnreadIndicator(unreadCount, isMuted); setText(name, addr); + + fragment.registerForContextMenu(this); } public void unbind(GlideRequests glideRequests) {