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
+