From 1af135cbcab70a7216170479ca9bff407e8b4a8f Mon Sep 17 00:00:00 2001 From: Christian Schneppe Date: Wed, 12 Sep 2018 20:29:40 +0200 Subject: code cleanup for group chat user context menu --- .../de/pixart/messenger/entities/MucOptions.java | 1 - .../messenger/ui/ConferenceDetailsActivity.java | 14 +-- .../pixart/messenger/ui/ConversationFragment.java | 28 ++--- .../ui/util/MucDetailsContextMenuHelper.java | 116 ++++++++++++--------- 4 files changed, 83 insertions(+), 76 deletions(-) diff --git a/src/main/java/de/pixart/messenger/entities/MucOptions.java b/src/main/java/de/pixart/messenger/entities/MucOptions.java index 8f9f4fd0d..258ded842 100644 --- a/src/main/java/de/pixart/messenger/entities/MucOptions.java +++ b/src/main/java/de/pixart/messenger/entities/MucOptions.java @@ -564,7 +564,6 @@ public class MucOptions { if (user == null) { user = new User(this, null); user.setRealJid(jid); - user.setRole("visitor"); } return user; } diff --git a/src/main/java/de/pixart/messenger/ui/ConferenceDetailsActivity.java b/src/main/java/de/pixart/messenger/ui/ConferenceDetailsActivity.java index 17e4e0cba..38479b459 100644 --- a/src/main/java/de/pixart/messenger/ui/ConferenceDetailsActivity.java +++ b/src/main/java/de/pixart/messenger/ui/ConferenceDetailsActivity.java @@ -448,8 +448,6 @@ public class ConferenceDetailsActivity extends XmppActivity implements OnConvers if (tag instanceof User) { getMenuInflater().inflate(R.menu.muc_details_context, menu); final User user = (User) tag; - final User self = mConversation.getMucOptions().getSelf(); - final Jid jid = user.getFullJid(); this.mSelectedUser = user; String name; final Contact contact = user.getContact(); @@ -464,27 +462,19 @@ public class ConferenceDetailsActivity extends XmppActivity implements OnConvers MenuItem sendPrivateMessage = menu.findItem(R.id.send_private_message); MenuItem highlightInMuc = menu.findItem(R.id.highlight_in_muc); highlightInMuc.setVisible(true); - MucDetailsContextMenuHelper.configureMucDetailsContextMenu(menu, mConversation, user, mAdvancedMode); + MucDetailsContextMenuHelper.configureMucDetailsContextMenu(this, menu, mConversation, user); } super.onCreateContextMenu(menu, v, menuInfo); } @Override public boolean onContextItemSelected(MenuItem item) { - if (!MucDetailsContextMenuHelper.onContextItemSelected(item, mSelectedUser, mConversation, this, this, this)) { + if (!MucDetailsContextMenuHelper.onContextItemSelected(item, mSelectedUser, mConversation, this)) { return super.onContextItemSelected(item); } return true; } - private void removeFromRoom(final User user) { - MucDetailsContextMenuHelper.removeFromRoom(user, mConversation, this, this, this); - } - - protected void startConversation(User user) { - MucDetailsContextMenuHelper.startConversation(user, this.mConversation, this); - } - protected void saveAsBookmark() { xmppConnectionService.saveConversationAsBookmark(mConversation, mConversation.getMucOptions().getName()); updateView(); diff --git a/src/main/java/de/pixart/messenger/ui/ConversationFragment.java b/src/main/java/de/pixart/messenger/ui/ConversationFragment.java index 1ea11de90..0d4610c8e 100644 --- a/src/main/java/de/pixart/messenger/ui/ConversationFragment.java +++ b/src/main/java/de/pixart/messenger/ui/ConversationFragment.java @@ -6,6 +6,7 @@ import android.animation.AnimatorInflater; import android.annotation.SuppressLint; import android.app.Activity; import android.app.Fragment; +import android.app.FragmentManager; import android.app.PendingIntent; import android.content.Context; import android.content.DialogInterface; @@ -592,6 +593,17 @@ public class ConversationFragment extends XmppFragment implements EditMessage.Ke } } + public static ConversationFragment get(Activity activity) { + FragmentManager fragmentManager = activity.getFragmentManager(); + Fragment fragment = fragmentManager.findFragmentById(R.id.main_fragment); + if (fragment != null && fragment instanceof ConversationFragment) { + return (ConversationFragment) fragment; + } else { + fragment = fragmentManager.findFragmentById(R.id.secondary_fragment); + return fragment != null && fragment instanceof ConversationFragment ? (ConversationFragment) fragment : null; + } + } + public static Conversation getConversationReliable(Activity activity) { final Conversation conversation = getConversation(activity, R.id.secondary_fragment); if (conversation != null) { @@ -1272,21 +1284,13 @@ public class ConversationFragment extends XmppFragment implements EditMessage.Ke Jid tcp = message.getTrueCounterpart(); Jid cp = message.getCounterpart(); if (cp != null && !cp.isBareJid()) { - User userByRealJid = conversation.getMucOptions().findOrCreateUserByRealJid(tcp); + User userByRealJid = tcp != null ? conversation.getMucOptions().findOrCreateUserByRealJid(tcp) : null; final User user = userByRealJid != null ? userByRealJid : conversation.getMucOptions().findUserByFullJid(cp); final PopupMenu popupMenu = new PopupMenu(getActivity(), v); popupMenu.inflate(R.menu.muc_details_context); final Menu menu = popupMenu.getMenu(); - final boolean advancedMode = activity.getPreferences().getBoolean("advanced_muc_mode", false); - MucDetailsContextMenuHelper.configureMucDetailsContextMenu(menu, conversation, user, advancedMode); - final MucOptions mucOptions = ((Conversation) message.getConversation()).getMucOptions(); - popupMenu.setOnMenuItemClickListener(menuItem -> { - if (menuItem.getItemId() == R.id.send_private_message) { - privateMessageWith(cp); - return true; - } - return MucDetailsContextMenuHelper.onContextItemSelected(menuItem, user, conversation, activity, activity, activity); - }); + MucDetailsContextMenuHelper.configureMucDetailsContextMenu(activity, menu, conversation, user); + popupMenu.setOnMenuItemClickListener(menuItem -> MucDetailsContextMenuHelper.onContextItemSelected(menuItem, user, conversation, activity)); popupMenu.show(); } } @@ -2025,7 +2029,7 @@ public class ConversationFragment extends XmppFragment implements EditMessage.Ke conversation.getAccount().getPgpDecryptionService().decrypt(message, false); } - private void privateMessageWith(final Jid counterpart) { + public void privateMessageWith(final Jid counterpart) { if (conversation.setOutgoingChatState(Config.DEFAULT_CHATSTATE)) { activity.xmppConnectionService.sendChatState(conversation); } diff --git a/src/main/java/de/pixart/messenger/ui/util/MucDetailsContextMenuHelper.java b/src/main/java/de/pixart/messenger/ui/util/MucDetailsContextMenuHelper.java index aa5987912..dc338e02c 100644 --- a/src/main/java/de/pixart/messenger/ui/util/MucDetailsContextMenuHelper.java +++ b/src/main/java/de/pixart/messenger/ui/util/MucDetailsContextMenuHelper.java @@ -1,9 +1,13 @@ package de.pixart.messenger.ui.util; +import android.app.Activity; +import android.preference.PreferenceManager; import android.support.v7.app.AlertDialog; +import android.text.SpannableString; +import android.text.Spanned; +import android.text.style.TypefaceSpan; import android.view.Menu; import android.view.MenuItem; -import android.widget.Toast; import de.pixart.messenger.Config; import de.pixart.messenger.R; @@ -12,66 +16,67 @@ import de.pixart.messenger.entities.Conversation; import de.pixart.messenger.entities.MucOptions; import de.pixart.messenger.entities.MucOptions.User; import de.pixart.messenger.services.XmppConnectionService; +import de.pixart.messenger.ui.ConferenceDetailsActivity; +import de.pixart.messenger.ui.ConversationFragment; +import de.pixart.messenger.ui.ConversationsActivity; import de.pixart.messenger.ui.XmppActivity; import rocks.xmpp.addr.Jid; public final class MucDetailsContextMenuHelper { - public static void configureMucDetailsContextMenu(Menu menu, Conversation conversation, MucOptions.User user, boolean advancedMode) { - if (user != null) { - if (user.getRealJid() != null) { - MenuItem showContactDetails = menu.findItem(R.id.action_contact_details); - MenuItem startConversation = menu.findItem(R.id.start_conversation); - MenuItem giveMembership = menu.findItem(R.id.give_membership); - MenuItem removeMembership = menu.findItem(R.id.remove_membership); - MenuItem giveAdminPrivileges = menu.findItem(R.id.give_admin_privileges); - MenuItem removeAdminPrivileges = menu.findItem(R.id.remove_admin_privileges); - MenuItem removeFromRoom = menu.findItem(R.id.remove_from_room); - MenuItem banFromConference = menu.findItem(R.id.ban_from_conference); - MenuItem invite = menu.findItem(R.id.invite); - startConversation.setVisible(true); - final Contact contact = user.getContact(); - final User self = conversation.getMucOptions().getSelf(); - if (contact != null && contact.showInRoster()) { - showContactDetails.setVisible(!contact.isSelf()); - } - if (user.getRole() == MucOptions.Role.NONE) { - invite.setVisible(true); - } - if (self.getAffiliation().ranks(MucOptions.Affiliation.ADMIN) && - self.getAffiliation().outranks(user.getAffiliation())) { - if (advancedMode) { - if (user.getAffiliation() == MucOptions.Affiliation.NONE) { - giveMembership.setVisible(true); - } else { - removeMembership.setVisible(true); - } - if (!Config.DISABLE_BAN) { - banFromConference.setVisible(true); - } + public static void configureMucDetailsContextMenu(Activity activity, Menu menu, Conversation conversation, User user) { + final boolean advancedMode = PreferenceManager.getDefaultSharedPreferences(activity).getBoolean("advanced_muc_mode", false); + if (user != null && user.getRealJid() != null) { + MenuItem showContactDetails = menu.findItem(R.id.action_contact_details); + MenuItem startConversation = menu.findItem(R.id.start_conversation); + MenuItem giveMembership = menu.findItem(R.id.give_membership); + MenuItem removeMembership = menu.findItem(R.id.remove_membership); + MenuItem giveAdminPrivileges = menu.findItem(R.id.give_admin_privileges); + MenuItem removeAdminPrivileges = menu.findItem(R.id.remove_admin_privileges); + MenuItem removeFromRoom = menu.findItem(R.id.remove_from_room); + MenuItem banFromConference = menu.findItem(R.id.ban_from_conference); + MenuItem invite = menu.findItem(R.id.invite); + startConversation.setVisible(true); + final Contact contact = user.getContact(); + final User self = conversation.getMucOptions().getSelf(); + if (contact != null && contact.showInRoster()) { + showContactDetails.setVisible(!contact.isSelf()); + } + if (activity instanceof ConferenceDetailsActivity && user.getRole() == MucOptions.Role.NONE) { + invite.setVisible(true); + } + if (self.getAffiliation().ranks(MucOptions.Affiliation.ADMIN) && + self.getAffiliation().outranks(user.getAffiliation())) { + if (advancedMode) { + if (user.getAffiliation() == MucOptions.Affiliation.NONE) { + giveMembership.setVisible(true); } else { - if (!Config.DISABLE_BAN || conversation.getMucOptions().membersOnly()) { - removeFromRoom.setVisible(true); - } + removeMembership.setVisible(true); } - if (user.getAffiliation() != MucOptions.Affiliation.ADMIN) { - giveAdminPrivileges.setVisible(true); - } else { - removeAdminPrivileges.setVisible(true); + if (!Config.DISABLE_BAN) { + banFromConference.setVisible(true); + } + } else { + if (!Config.DISABLE_BAN || conversation.getMucOptions().membersOnly()) { + removeFromRoom.setVisible(true); } } - } else { - MenuItem sendPrivateMessage = menu.findItem(R.id.send_private_message); - sendPrivateMessage.setVisible(true); - sendPrivateMessage.setEnabled(user.getRole().ranks(MucOptions.Role.VISITOR)); + if (user.getAffiliation() != MucOptions.Affiliation.ADMIN) { + giveAdminPrivileges.setVisible(true); + } else { + removeAdminPrivileges.setVisible(true); + } } } else { + final MucOptions mucOptions = conversation.getMucOptions(); MenuItem sendPrivateMessage = menu.findItem(R.id.send_private_message); sendPrivateMessage.setVisible(true); - sendPrivateMessage.setEnabled(false); + sendPrivateMessage.setEnabled(user != null && mucOptions.allowPm() && user.getRole().ranks(MucOptions.Role.VISITOR)); } } - public static boolean onContextItemSelected(MenuItem item, User user, Conversation conversation, XmppActivity activity, XmppConnectionService.OnAffiliationChanged onAffiliationChanged, XmppConnectionService.OnRoleChanged onRoleChanged) { + public static boolean onContextItemSelected(MenuItem item, User user, Conversation conversation, XmppActivity activity) { + final XmppConnectionService.OnAffiliationChanged onAffiliationChanged = activity instanceof XmppConnectionService.OnAffiliationChanged ? (XmppConnectionService.OnAffiliationChanged) activity : null; + final XmppConnectionService.OnRoleChanged onRoleChanged = activity instanceof XmppConnectionService.OnRoleChanged ? (XmppConnectionService.OnRoleChanged) activity : null; Jid jid = user.getRealJid(); switch (item.getItemId()) { case R.id.action_contact_details: @@ -105,11 +110,14 @@ public final class MucDetailsContextMenuHelper { } return true; case R.id.send_private_message: - if (conversation.getMucOptions().allowPm()) { - activity.privateMsgInMuc(conversation, user.getName()); - } else { - Toast.makeText(activity, R.string.private_messages_are_disabled, Toast.LENGTH_SHORT).show(); + if (activity instanceof ConversationsActivity) { + ConversationFragment conversationFragment = ConversationFragment.get(activity); + if (conversationFragment != null) { + conversationFragment.privateMessageWith(user.getFullJid()); + return true; + } } + activity.privateMsgInMuc(conversation, user.getName()); return true; case R.id.invite: activity.xmppConnectionService.directInvite(conversation, jid); @@ -128,7 +136,13 @@ public final class MucDetailsContextMenuHelper { } else { AlertDialog.Builder builder = new AlertDialog.Builder(activity); builder.setTitle(R.string.ban_from_conference); - builder.setMessage(activity.getString(R.string.removing_from_public_conference, user.getName())); + String jid = user.getRealJid().asBareJid().toString(); + SpannableString message = new SpannableString(activity.getString(R.string.removing_from_public_conference, jid)); + int start = message.toString().indexOf(jid); + if (start >= 0) { + message.setSpan(new TypefaceSpan("monospace"), start, start + jid.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); + } + builder.setMessage(message); builder.setNegativeButton(R.string.cancel, null); builder.setPositiveButton(R.string.ban_now, (dialog, which) -> { activity.xmppConnectionService.changeAffiliationInConference(conversation, user.getRealJid(), MucOptions.Affiliation.OUTCAST, onAffiliationChanged); -- cgit v1.2.3