long tap on conversation
This commit is contained in:
parent
8ea335501b
commit
bd6b316ab6
|
@ -126,6 +126,7 @@ public class ManageAccountActivity extends XmppActivity implements OnAccountUpda
|
||||||
R.menu.manageaccounts_context, menu);
|
R.menu.manageaccounts_context, menu);
|
||||||
AdapterContextMenuInfo acmi = (AdapterContextMenuInfo) menuInfo;
|
AdapterContextMenuInfo acmi = (AdapterContextMenuInfo) menuInfo;
|
||||||
this.selectedAccount = accountList.get(acmi.position);
|
this.selectedAccount = accountList.get(acmi.position);
|
||||||
|
|
||||||
if (this.selectedAccount.isEnabled()) {
|
if (this.selectedAccount.isEnabled()) {
|
||||||
menu.findItem(R.id.mgmt_account_enable).setVisible(false);
|
menu.findItem(R.id.mgmt_account_enable).setVisible(false);
|
||||||
menu.findItem(R.id.mgmt_account_announce_pgp).setVisible(Config.supportOpenPgp());
|
menu.findItem(R.id.mgmt_account_announce_pgp).setVisible(Config.supportOpenPgp());
|
||||||
|
@ -134,6 +135,15 @@ public class ManageAccountActivity extends XmppActivity implements OnAccountUpda
|
||||||
menu.findItem(R.id.mgmt_account_announce_pgp).setVisible(false);
|
menu.findItem(R.id.mgmt_account_announce_pgp).setVisible(false);
|
||||||
menu.findItem(R.id.mgmt_account_publish_avatar).setVisible(false);
|
menu.findItem(R.id.mgmt_account_publish_avatar).setVisible(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (selectedAccount.isOnlineAndConnected()) {
|
||||||
|
if (!selectedAccount.getXmppConnection().getFeatures().register()) {
|
||||||
|
menu.findItem(R.id.action_change_password_on_server).setVisible(false);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
menu.findItem(R.id.action_change_password_on_server).setVisible(false);
|
||||||
|
}
|
||||||
|
|
||||||
menu.setHeaderTitle(this.selectedAccount.getJid().asBareJid().toEscapedString());
|
menu.setHeaderTitle(this.selectedAccount.getJid().asBareJid().toEscapedString());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -187,6 +197,9 @@ public class ManageAccountActivity extends XmppActivity implements OnAccountUpda
|
||||||
case R.id.mgmt_account_enable:
|
case R.id.mgmt_account_enable:
|
||||||
enableAccount(selectedAccount);
|
enableAccount(selectedAccount);
|
||||||
return true;
|
return true;
|
||||||
|
case R.id.action_change_password_on_server:
|
||||||
|
gotoChangePassword(selectedAccount);
|
||||||
|
return true;
|
||||||
case R.id.mgmt_account_delete:
|
case R.id.mgmt_account_delete:
|
||||||
deleteAccount(selectedAccount);
|
deleteAccount(selectedAccount);
|
||||||
return true;
|
return true;
|
||||||
|
@ -376,6 +389,11 @@ public class ManageAccountActivity extends XmppActivity implements OnAccountUpda
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void gotoChangePassword(Account selectedAccount) {
|
||||||
|
final Intent changePasswordIntent = new Intent(this, ChangePasswordActivity.class);
|
||||||
|
changePasswordIntent.putExtra(EXTRA_ACCOUNT, selectedAccount.getJid().toEscapedString());
|
||||||
|
startActivity(changePasswordIntent);
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
|
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
|
||||||
|
|
|
@ -37,12 +37,14 @@ import android.graphics.Canvas;
|
||||||
import android.graphics.Paint;
|
import android.graphics.Paint;
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
import android.util.Log;
|
import android.util.Log;
|
||||||
|
import android.view.ContextMenu;
|
||||||
import android.view.LayoutInflater;
|
import android.view.LayoutInflater;
|
||||||
import android.view.Menu;
|
import android.view.Menu;
|
||||||
import android.view.MenuInflater;
|
import android.view.MenuInflater;
|
||||||
import android.view.MenuItem;
|
import android.view.MenuItem;
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
import android.view.ViewGroup;
|
import android.view.ViewGroup;
|
||||||
|
import android.widget.AdapterView;
|
||||||
import android.widget.Toast;
|
import android.widget.Toast;
|
||||||
|
|
||||||
import androidx.databinding.DataBindingUtil;
|
import androidx.databinding.DataBindingUtil;
|
||||||
|
@ -51,6 +53,7 @@ import androidx.recyclerview.widget.LinearLayoutManager;
|
||||||
import androidx.recyclerview.widget.RecyclerView;
|
import androidx.recyclerview.widget.RecyclerView;
|
||||||
|
|
||||||
import com.google.android.material.snackbar.Snackbar;
|
import com.google.android.material.snackbar.Snackbar;
|
||||||
|
import com.google.common.base.Optional;
|
||||||
import com.google.common.collect.Collections2;
|
import com.google.common.collect.Collections2;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
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.Account;
|
||||||
import eu.siacs.conversations.entities.Conversation;
|
import eu.siacs.conversations.entities.Conversation;
|
||||||
import eu.siacs.conversations.entities.Conversational;
|
import eu.siacs.conversations.entities.Conversational;
|
||||||
|
import eu.siacs.conversations.services.XmppConnectionService;
|
||||||
import eu.siacs.conversations.ui.adapter.ConversationAdapter;
|
import eu.siacs.conversations.ui.adapter.ConversationAdapter;
|
||||||
import eu.siacs.conversations.ui.interfaces.OnConversationArchived;
|
import eu.siacs.conversations.ui.interfaces.OnConversationArchived;
|
||||||
import eu.siacs.conversations.ui.interfaces.OnConversationSelected;
|
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.AccountUtils;
|
||||||
import eu.siacs.conversations.utils.EasyOnboardingInvite;
|
import eu.siacs.conversations.utils.EasyOnboardingInvite;
|
||||||
import eu.siacs.conversations.utils.ThemeHelper;
|
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.LEFT;
|
||||||
import static androidx.recyclerview.widget.ItemTouchHelper.RIGHT;
|
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.setAdapter(this.conversationsAdapter);
|
||||||
this.binding.list.setLayoutManager(new LinearLayoutManager(getActivity(),LinearLayoutManager.VERTICAL,false));
|
this.binding.list.setLayoutManager(new LinearLayoutManager(getActivity(),LinearLayoutManager.VERTICAL,false));
|
||||||
|
registerForContextMenu(this.binding.list);
|
||||||
this.touchHelper = new ItemTouchHelper(this.callback);
|
this.touchHelper = new ItemTouchHelper(this.callback);
|
||||||
this.touchHelper.attachToRecyclerView(this.binding.list);
|
this.touchHelper.attachToRecyclerView(this.binding.list);
|
||||||
return binding.getRoot();
|
return binding.getRoot();
|
||||||
|
@ -312,6 +318,60 @@ public class ConversationsOverviewFragment extends XmppFragment {
|
||||||
easyOnboardInvite.setVisible(EasyOnboardingInvite.anyHasSupport(activity == null ? null : activity.xmppConnectionService));
|
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(((AdapterView.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> 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(((AdapterView.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
|
@Override
|
||||||
public void onBackendConnected() {
|
public void onBackendConnected() {
|
||||||
refresh();
|
refresh();
|
||||||
|
|
|
@ -312,6 +312,7 @@ public class ConversationAdapter
|
||||||
private ConversationViewHolder(ConversationListRowBinding binding) {
|
private ConversationViewHolder(ConversationListRowBinding binding) {
|
||||||
super(binding.getRoot());
|
super(binding.getRoot());
|
||||||
this.binding = binding;
|
this.binding = binding;
|
||||||
|
binding.getRoot().setLongClickable(true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,34 @@
|
||||||
|
package eu.siacs.conversations.ui.widget
|
||||||
|
|
||||||
|
import android.content.Context
|
||||||
|
import android.util.AttributeSet
|
||||||
|
import android.view.ContextMenu.ContextMenuInfo
|
||||||
|
import android.view.View
|
||||||
|
import android.widget.AdapterView.AdapterContextMenuInfo
|
||||||
|
import androidx.recyclerview.widget.RecyclerView
|
||||||
|
|
||||||
|
|
||||||
|
class BaseRecyclerView : RecyclerView {
|
||||||
|
private var adapterContextMenuInfo: AdapterContextMenuInfo? = null
|
||||||
|
|
||||||
|
constructor(context: Context) : super(context)
|
||||||
|
constructor(context: Context, attrs: AttributeSet?) : super(context, attrs)
|
||||||
|
constructor(context: Context, attrs: AttributeSet?, defStyleAttr: Int) : super(
|
||||||
|
context,
|
||||||
|
attrs,
|
||||||
|
defStyleAttr
|
||||||
|
)
|
||||||
|
|
||||||
|
override fun getContextMenuInfo(): ContextMenuInfo? {
|
||||||
|
return adapterContextMenuInfo
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun showContextMenuForChild(originalView: View): Boolean {
|
||||||
|
adapterContextMenuInfo = AdapterContextMenuInfo(
|
||||||
|
originalView,
|
||||||
|
getChildAdapterPosition(originalView),
|
||||||
|
getChildItemId(originalView)
|
||||||
|
)
|
||||||
|
return super.showContextMenuForChild(originalView)
|
||||||
|
}
|
||||||
|
}
|
|
@ -7,7 +7,7 @@
|
||||||
android:layout_height="match_parent">
|
android:layout_height="match_parent">
|
||||||
|
|
||||||
|
|
||||||
<androidx.recyclerview.widget.RecyclerView
|
<eu.siacs.conversations.ui.widget.BaseRecyclerView
|
||||||
android:id="@+id/list"
|
android:id="@+id/list"
|
||||||
android:scrollbars="vertical"
|
android:scrollbars="vertical"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
|
|
41
src/main/res/menu/conversations.xml
Normal file
41
src/main/res/menu/conversations.xml
Normal file
|
@ -0,0 +1,41 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<menu xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
xmlns:app="http://schemas.android.com/apk/res-auto">
|
||||||
|
<item
|
||||||
|
android:id="@+id/action_toggle_pinned"
|
||||||
|
android:orderInCategory="10"
|
||||||
|
android:title="@string/add_to_favorites"
|
||||||
|
app:showAsAction="never" />
|
||||||
|
<item
|
||||||
|
android:id="@+id/action_mute"
|
||||||
|
android:orderInCategory="20"
|
||||||
|
android:title="@string/disable_notifications"
|
||||||
|
app:showAsAction="never" />
|
||||||
|
<item
|
||||||
|
android:id="@+id/action_unmute"
|
||||||
|
android:orderInCategory="21"
|
||||||
|
android:title="@string/enable_notifications"
|
||||||
|
app:showAsAction="never" />
|
||||||
|
<item
|
||||||
|
android:id="@+id/action_ongoing_call"
|
||||||
|
android:icon="?attr/icon_ongoing_call"
|
||||||
|
android:orderInCategory="30"
|
||||||
|
android:title="@string/return_to_ongoing_call"
|
||||||
|
app:showAsAction="always" />
|
||||||
|
<item
|
||||||
|
android:id="@+id/action_contact_details"
|
||||||
|
android:orderInCategory="40"
|
||||||
|
android:title="@string/action_contact_details"
|
||||||
|
app:showAsAction="never" />
|
||||||
|
<item
|
||||||
|
android:id="@+id/action_muc_details"
|
||||||
|
android:icon="?attr/icon_group"
|
||||||
|
android:orderInCategory="40"
|
||||||
|
android:title="@string/action_muc_details"
|
||||||
|
app:showAsAction="never" />
|
||||||
|
<item
|
||||||
|
android:id="@+id/action_archive"
|
||||||
|
android:orderInCategory="60"
|
||||||
|
android:title="@string/action_end_conversation"
|
||||||
|
app:showAsAction="never" />
|
||||||
|
</menu>
|
|
@ -15,6 +15,12 @@
|
||||||
android:id="@+id/mgmt_account_disable"
|
android:id="@+id/mgmt_account_disable"
|
||||||
app:showAsAction="never"
|
app:showAsAction="never"
|
||||||
android:title="@string/mgmt_account_disable"/>
|
android:title="@string/mgmt_account_disable"/>
|
||||||
|
|
||||||
|
<item
|
||||||
|
android:id="@+id/action_change_password_on_server"
|
||||||
|
app:showAsAction="never"
|
||||||
|
android:title="@string/change_password"/>
|
||||||
|
|
||||||
<item
|
<item
|
||||||
android:id="@+id/mgmt_account_delete"
|
android:id="@+id/mgmt_account_delete"
|
||||||
android:title="@string/mgmt_account_delete"/>
|
android:title="@string/mgmt_account_delete"/>
|
||||||
|
|
Loading…
Reference in a new issue