diff --git a/src/cheogram/java/com/cheogram/android/ContextMenuRecyclerView.java b/src/cheogram/java/com/cheogram/android/ContextMenuRecyclerView.java new file mode 100644 index 0000000000000000000000000000000000000000..39ee1a3a411dcec4f0635f6f61fa0174b524c917 --- /dev/null +++ b/src/cheogram/java/com/cheogram/android/ContextMenuRecyclerView.java @@ -0,0 +1,38 @@ +package com.cheogram.android; + +import android.content.Context; +import android.util.AttributeSet; +import android.view.ContextMenu; +import android.view.View; +import android.widget.AdapterView.AdapterContextMenuInfo; + +public class ContextMenuRecyclerView extends androidx.recyclerview.widget.RecyclerView { + protected AdapterContextMenuInfo mAdapterContextMenuInfo = null; + + public ContextMenuRecyclerView(Context context) { + super(context); + } + + public ContextMenuRecyclerView(Context context, AttributeSet attrs) { + super(context, attrs); + } + + public ContextMenuRecyclerView(Context context, AttributeSet attrs, int defStyle) { + super(context, attrs, defStyle); + } + + @Override + protected ContextMenu.ContextMenuInfo getContextMenuInfo() { + return mAdapterContextMenuInfo; + } + + @Override + public boolean showContextMenuForChild(View originalView) { + mAdapterContextMenuInfo = new AdapterContextMenuInfo( + originalView, + getChildAdapterPosition(originalView), + getChildItemId(originalView) + ); + return super.showContextMenuForChild(originalView); + } +} diff --git a/src/cheogram/res/menu/conversations.xml b/src/cheogram/res/menu/conversations.xml new file mode 100644 index 0000000000000000000000000000000000000000..445c5d539ee6b90d4cc8d1f71e98a4fa95f6ada3 --- /dev/null +++ b/src/cheogram/res/menu/conversations.xml @@ -0,0 +1,41 @@ + + + + + + + + + + diff --git a/src/main/java/eu/siacs/conversations/ui/ConversationFragment.java b/src/main/java/eu/siacs/conversations/ui/ConversationFragment.java index ac86fbbaeab7a6fda16a7cb8511288294e8010df..481a216e4532c233fc7a86d70b4090d82de3acf6 100644 --- a/src/main/java/eu/siacs/conversations/ui/ConversationFragment.java +++ b/src/main/java/eu/siacs/conversations/ui/ConversationFragment.java @@ -1331,7 +1331,7 @@ public class ConversationFragment extends XmppFragment implements EditMessage.Ke final Optional ongoingRtpSession = activity.xmppConnectionService.getJingleConnectionManager().getOngoingRtpConnection(conversation.getContact()); if (ongoingRtpSession.isPresent()) { final OngoingRtpSession id = ongoingRtpSession.get(); - final Intent intent = new Intent(getActivity(), RtpSessionActivity.class); + final Intent intent = new Intent(activity, RtpSessionActivity.class); intent.putExtra(RtpSessionActivity.EXTRA_ACCOUNT, id.getAccount().getJid().asBareJid().toEscapedString()); intent.putExtra(RtpSessionActivity.EXTRA_WITH, id.getWith().toEscapedString()); if (id instanceof AbstractJingleConnection.Id) { @@ -1344,7 +1344,7 @@ public class ConversationFragment extends XmppFragment implements EditMessage.Ke intent.setAction(RtpSessionActivity.ACTION_MAKE_VOICE_CALL); } } - startActivity(intent); + activity.startActivity(intent); } } @@ -1652,13 +1652,13 @@ public class ConversationFragment extends XmppFragment implements EditMessage.Ke } protected void muteConversationDialog(final Conversation conversation) { - final AlertDialog.Builder builder = new AlertDialog.Builder(requireActivity()); + final AlertDialog.Builder builder = new AlertDialog.Builder(activity); builder.setTitle(R.string.disable_notifications); - final int[] durations = getResources().getIntArray(R.array.mute_options_durations); + final int[] durations = activity.getResources().getIntArray(R.array.mute_options_durations); final CharSequence[] labels = new CharSequence[durations.length]; for (int i = 0; i < durations.length; ++i) { if (durations[i] == -1) { - labels[i] = getString(R.string.until_further_notice); + labels[i] = activity.getString(R.string.until_further_notice); } else { labels[i] = TimeFrameUtils.resolve(activity, 1000L * durations[i]); } @@ -1674,7 +1674,7 @@ public class ConversationFragment extends XmppFragment implements EditMessage.Ke activity.xmppConnectionService.updateConversation(conversation); activity.onConversationsListItemUpdated(); refresh(); - requireActivity().invalidateOptionsMenu(); + activity.invalidateOptionsMenu(); }); builder.create().show(); } @@ -1706,7 +1706,7 @@ public class ConversationFragment extends XmppFragment implements EditMessage.Ke this.activity.xmppConnectionService.updateConversation(conversation); this.activity.onConversationsListItemUpdated(); refresh(); - requireActivity().invalidateOptionsMenu(); + this.activity.invalidateOptionsMenu(); } diff --git a/src/main/java/eu/siacs/conversations/ui/ConversationsOverviewFragment.java b/src/main/java/eu/siacs/conversations/ui/ConversationsOverviewFragment.java index eebd94df500256ce883a91ead1b0b66aae7a7ada..a5390618df4304d5ef17bb02de08da749d5986cc 100644 --- a/src/main/java/eu/siacs/conversations/ui/ConversationsOverviewFragment.java +++ b/src/main/java/eu/siacs/conversations/ui/ConversationsOverviewFragment.java @@ -37,12 +37,14 @@ import android.graphics.Canvas; import android.graphics.Paint; import android.os.Bundle; import android.util.Log; +import android.view.ContextMenu; import android.view.LayoutInflater; import android.view.Menu; import android.view.MenuInflater; import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; +import android.widget.AdapterView.AdapterContextMenuInfo; import android.widget.Toast; import androidx.databinding.DataBindingUtil; @@ -51,6 +53,7 @@ import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.RecyclerView; import com.google.android.material.snackbar.Snackbar; +import com.google.common.base.Optional; import com.google.common.collect.Collections2; import java.util.ArrayList; @@ -63,6 +66,7 @@ import eu.siacs.conversations.databinding.FragmentConversationsOverviewBinding; import eu.siacs.conversations.entities.Account; import eu.siacs.conversations.entities.Conversation; import eu.siacs.conversations.entities.Conversational; +import eu.siacs.conversations.services.XmppConnectionService; import eu.siacs.conversations.ui.adapter.ConversationAdapter; import eu.siacs.conversations.ui.interfaces.OnConversationArchived; import eu.siacs.conversations.ui.interfaces.OnConversationSelected; @@ -74,6 +78,7 @@ import eu.siacs.conversations.ui.util.StyledAttributes; import eu.siacs.conversations.utils.AccountUtils; import eu.siacs.conversations.utils.EasyOnboardingInvite; import eu.siacs.conversations.utils.ThemeHelper; +import eu.siacs.conversations.xmpp.jingle.OngoingRtpSession; import static androidx.recyclerview.widget.ItemTouchHelper.LEFT; import static androidx.recyclerview.widget.ItemTouchHelper.RIGHT; @@ -299,6 +304,7 @@ public class ConversationsOverviewFragment extends XmppFragment { }); this.binding.list.setAdapter(this.conversationsAdapter); this.binding.list.setLayoutManager(new LinearLayoutManager(getActivity(),LinearLayoutManager.VERTICAL,false)); + registerForContextMenu(this.binding.list); this.touchHelper = new ItemTouchHelper(this.callback); this.touchHelper.attachToRecyclerView(this.binding.list); return binding.getRoot(); @@ -312,6 +318,60 @@ public class ConversationsOverviewFragment extends XmppFragment { easyOnboardInvite.setVisible(EasyOnboardingInvite.anyHasSupport(activity == null ? null : activity.xmppConnectionService)); } + @Override + public void onCreateContextMenu(ContextMenu menu, View view, ContextMenu.ContextMenuInfo menuInfo) { + activity.getMenuInflater().inflate(R.menu.conversations, menu); + + final MenuItem menuMucDetails = menu.findItem(R.id.action_muc_details); + final MenuItem menuContactDetails = menu.findItem(R.id.action_contact_details); + final MenuItem menuMute = menu.findItem(R.id.action_mute); + final MenuItem menuUnmute = menu.findItem(R.id.action_unmute); + final MenuItem menuOngoingCall = menu.findItem(R.id.action_ongoing_call); + final MenuItem menuTogglePinned = menu.findItem(R.id.action_toggle_pinned); + + Conversation conversation = conversations.get(((AdapterContextMenuInfo) menuInfo).position); + if (conversation != null) { + if (conversation.getMode() == Conversation.MODE_MULTI) { + menuContactDetails.setVisible(false); + menuMucDetails.setTitle(conversation.getMucOptions().isPrivateAndNonAnonymous() ? R.string.action_muc_details : R.string.channel_details); + menuOngoingCall.setVisible(false); + } else { + final XmppConnectionService service = activity == null ? null : activity.xmppConnectionService; + final Optional ongoingRtpSession = service == null ? Optional.absent() : service.getJingleConnectionManager().getOngoingRtpConnection(conversation.getContact()); + if (ongoingRtpSession.isPresent()) { + menuOngoingCall.setVisible(true); + } else { + menuOngoingCall.setVisible(false); + } + menuContactDetails.setVisible(!conversation.withSelf()); + menuMucDetails.setVisible(false); + } + if (conversation.isMuted()) { + menuMute.setVisible(false); + } else { + menuUnmute.setVisible(false); + } + if (conversation.getBooleanAttribute(Conversation.ATTRIBUTE_PINNED_ON_TOP, false)) { + menuTogglePinned.setTitle(R.string.remove_from_favorites); + } else { + menuTogglePinned.setTitle(R.string.add_to_favorites); + } + } + super.onCreateContextMenu(menu, view, menuInfo); + } + + @Override + public boolean onContextItemSelected(MenuItem item) { + Conversation conversation = conversations.get(((AdapterContextMenuInfo) item.getMenuInfo()).position); + ConversationFragment fragment = new ConversationFragment(); + fragment.setHasOptionsMenu(false); + fragment.onAttach(activity); + fragment.reInit(conversation, null); + boolean r = fragment.onOptionsItemSelected(item); + refresh(); + return r; + } + @Override public void onBackendConnected() { refresh(); diff --git a/src/main/java/eu/siacs/conversations/ui/adapter/ConversationAdapter.java b/src/main/java/eu/siacs/conversations/ui/adapter/ConversationAdapter.java index 662120d8436b28206ad0d6f31abac5a26be3d5e2..46922db6e582b4828643f20c3faf00995ea45a4d 100644 --- a/src/main/java/eu/siacs/conversations/ui/adapter/ConversationAdapter.java +++ b/src/main/java/eu/siacs/conversations/ui/adapter/ConversationAdapter.java @@ -2,6 +2,7 @@ package eu.siacs.conversations.ui.adapter; import android.graphics.Typeface; import android.util.Pair; +import android.view.MenuItem; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; @@ -237,8 +238,8 @@ public class ConversationAdapter extends RecyclerView.Adapter - - \ No newline at end of file +