MucDetailsContextMenuHelper.java

  1package eu.siacs.conversations.ui.util;
  2
  3import android.app.Activity;
  4import android.content.SharedPreferences;
  5import android.preference.PreferenceManager;
  6import android.support.v7.app.AlertDialog;
  7import android.text.SpannableString;
  8import android.text.Spanned;
  9import android.text.style.TypefaceSpan;
 10import android.view.Menu;
 11import android.view.MenuItem;
 12
 13import eu.siacs.conversations.Config;
 14import eu.siacs.conversations.entities.Contact;
 15import eu.siacs.conversations.entities.Conversation;
 16import eu.siacs.conversations.entities.MucOptions;
 17import eu.siacs.conversations.entities.MucOptions.User;
 18import eu.siacs.conversations.R;
 19import eu.siacs.conversations.services.XmppConnectionService;
 20import eu.siacs.conversations.ui.ConferenceDetailsActivity;
 21import eu.siacs.conversations.ui.ConversationFragment;
 22import eu.siacs.conversations.ui.ConversationsActivity;
 23import eu.siacs.conversations.ui.XmppActivity;
 24import rocks.xmpp.addr.Jid;
 25
 26
 27public final class MucDetailsContextMenuHelper {
 28    public static void configureMucDetailsContextMenu(Activity activity, Menu menu, Conversation conversation, User user) {
 29        final boolean advancedMode = PreferenceManager.getDefaultSharedPreferences(activity).getBoolean("advanced_muc_mode", false);
 30        if (user != null && user.getRealJid() != null) {
 31            MenuItem showContactDetails = menu.findItem(R.id.action_contact_details);
 32            MenuItem startConversation = menu.findItem(R.id.start_conversation);
 33            MenuItem giveMembership = menu.findItem(R.id.give_membership);
 34            MenuItem removeMembership = menu.findItem(R.id.remove_membership);
 35            MenuItem giveAdminPrivileges = menu.findItem(R.id.give_admin_privileges);
 36            MenuItem removeAdminPrivileges = menu.findItem(R.id.remove_admin_privileges);
 37            MenuItem removeFromRoom = menu.findItem(R.id.remove_from_room);
 38            MenuItem banFromConference = menu.findItem(R.id.ban_from_conference);
 39            MenuItem invite = menu.findItem(R.id.invite);
 40            startConversation.setVisible(true);
 41            final Contact contact = user.getContact();
 42            final User self = conversation.getMucOptions().getSelf();
 43            if (contact != null && contact.showInRoster()) {
 44                showContactDetails.setVisible(!contact.isSelf());
 45            }
 46            if (activity instanceof ConferenceDetailsActivity && user.getRole() == MucOptions.Role.NONE) {
 47                invite.setVisible(true);
 48            }
 49            if (self.getAffiliation().ranks(MucOptions.Affiliation.ADMIN) &&
 50                    self.getAffiliation().outranks(user.getAffiliation())) {
 51                if (advancedMode) {
 52                    if (user.getAffiliation() == MucOptions.Affiliation.NONE) {
 53                        giveMembership.setVisible(true);
 54                    } else {
 55                        removeMembership.setVisible(true);
 56                    }
 57                    if (!Config.DISABLE_BAN) {
 58                        banFromConference.setVisible(true);
 59                    }
 60                } else {
 61                    if (!Config.DISABLE_BAN || conversation.getMucOptions().membersOnly()) {
 62                        removeFromRoom.setVisible(true);
 63                    }
 64                }
 65                if (user.getAffiliation() != MucOptions.Affiliation.ADMIN) {
 66                    giveAdminPrivileges.setVisible(true);
 67                } else {
 68                    removeAdminPrivileges.setVisible(true);
 69                }
 70            }
 71        } else {
 72            final MucOptions mucOptions = conversation.getMucOptions();
 73            MenuItem sendPrivateMessage = menu.findItem(R.id.send_private_message);
 74            sendPrivateMessage.setVisible(true);
 75            sendPrivateMessage.setEnabled(user != null && mucOptions.allowPm() && user.getRole().ranks(MucOptions.Role.VISITOR));
 76        }
 77    }
 78
 79    public static boolean onContextItemSelected(MenuItem item, User user, Conversation conversation, XmppActivity activity) {
 80        final XmppConnectionService.OnAffiliationChanged onAffiliationChanged = activity instanceof XmppConnectionService.OnAffiliationChanged ? (XmppConnectionService.OnAffiliationChanged) activity : null;
 81        final XmppConnectionService.OnRoleChanged onRoleChanged = activity instanceof XmppConnectionService.OnRoleChanged ? (XmppConnectionService.OnRoleChanged) activity : null;
 82        Jid jid = user.getRealJid();
 83        switch (item.getItemId()) {
 84            case R.id.action_contact_details:
 85                Contact contact = user.getContact();
 86                if (contact != null) {
 87                    activity.switchToContactDetails(contact);
 88                }
 89                return true;
 90            case R.id.start_conversation:
 91                startConversation(user, conversation, activity);
 92                return true;
 93            case R.id.give_admin_privileges:
 94                activity.xmppConnectionService.changeAffiliationInConference(conversation, jid, MucOptions.Affiliation.ADMIN, onAffiliationChanged);
 95                return true;
 96            case R.id.give_membership:
 97                activity.xmppConnectionService.changeAffiliationInConference(conversation, jid, MucOptions.Affiliation.MEMBER, onAffiliationChanged);
 98                return true;
 99            case R.id.remove_membership:
100                activity.xmppConnectionService.changeAffiliationInConference(conversation, jid, MucOptions.Affiliation.NONE, onAffiliationChanged);
101                return true;
102            case R.id.remove_admin_privileges:
103                activity.xmppConnectionService.changeAffiliationInConference(conversation, jid, MucOptions.Affiliation.MEMBER, onAffiliationChanged);
104                return true;
105            case R.id.remove_from_room:
106                removeFromRoom(user, conversation, activity, onAffiliationChanged, onRoleChanged);
107                return true;
108            case R.id.ban_from_conference:
109                activity.xmppConnectionService.changeAffiliationInConference(conversation, jid, MucOptions.Affiliation.OUTCAST, onAffiliationChanged);
110                if (user.getRole() != MucOptions.Role.NONE) {
111                    activity.xmppConnectionService.changeRoleInConference(conversation, user.getName(), MucOptions.Role.NONE, onRoleChanged);
112                }
113                return true;
114            case R.id.send_private_message:
115                if (activity instanceof ConversationsActivity) {
116                    ConversationFragment conversationFragment = ConversationFragment.get(activity);
117                    if (conversationFragment != null) {
118                        conversationFragment.privateMessageWith(user.getFullJid());
119                        return true;
120                    }
121                }
122                activity.privateMsgInMuc(conversation, user.getName());
123                return true;
124            case R.id.invite:
125                activity.xmppConnectionService.directInvite(conversation, jid);
126                return true;
127            default:
128                return false;
129        }
130    }
131
132    public static void removeFromRoom(final User user, Conversation conversation, XmppActivity activity, XmppConnectionService.OnAffiliationChanged onAffiliationChanged, XmppConnectionService.OnRoleChanged onRoleChanged) {
133        if (conversation.getMucOptions().membersOnly()) {
134            activity.xmppConnectionService.changeAffiliationInConference(conversation, user.getRealJid(), MucOptions.Affiliation.NONE, onAffiliationChanged);
135            if (user.getRole() != MucOptions.Role.NONE) {
136                activity.xmppConnectionService.changeRoleInConference(conversation, user.getName(), MucOptions.Role.NONE, onRoleChanged);
137            }
138        } else {
139            AlertDialog.Builder builder = new AlertDialog.Builder(activity);
140            builder.setTitle(R.string.ban_from_conference);
141            String jid = user.getRealJid().asBareJid().toString();
142            SpannableString message = new SpannableString(activity.getString(R.string.removing_from_public_conference, jid));
143            int start = message.toString().indexOf(jid);
144            if (start >= 0) {
145                message.setSpan(new TypefaceSpan("monospace"), start, start + jid.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
146            }
147            builder.setMessage(message);
148            builder.setNegativeButton(R.string.cancel, null);
149            builder.setPositiveButton(R.string.ban_now, (dialog, which) -> {
150                activity.xmppConnectionService.changeAffiliationInConference(conversation, user.getRealJid(), MucOptions.Affiliation.OUTCAST, onAffiliationChanged);
151                if (user.getRole() != MucOptions.Role.NONE) {
152                    activity.xmppConnectionService.changeRoleInConference(conversation, user.getName(), MucOptions.Role.NONE, onRoleChanged);
153                }
154            });
155            builder.create().show();
156        }
157    }
158
159    public static void startConversation(User user, Conversation conversation, XmppActivity activity) {
160        if (user.getRealJid() != null) {
161            Conversation newConversation = activity.xmppConnectionService.findOrCreateConversation(conversation.getAccount(), user.getRealJid().asBareJid(), false, true);
162            activity.switchToConversation(newConversation);
163        }
164    }
165}