com.xabber.android.ui.helper.ContextMenuHelper.java Source code

Java tutorial

Introduction

Here is the source code for com.xabber.android.ui.helper.ContextMenuHelper.java

Source

/**
 * Copyright (c) 2013, Redsolution LTD. All rights reserved.
 *
 * This file is part of Xabber project; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License, Version 3.
 *
 * Xabber is distributed in the hope that it will be useful, but
 * WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 * See the GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License,
 * along with this program. If not, see http://www.gnu.org/licenses/.
 */
package com.xabber.android.ui.helper;

import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.support.v4.app.FragmentActivity;
import android.view.ContextMenu;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;

import com.xabber.android.R;
import com.xabber.android.data.Application;
import com.xabber.android.data.NetworkException;
import com.xabber.android.data.SettingsManager;
import com.xabber.android.data.account.AccountItem;
import com.xabber.android.data.account.AccountManager;
import com.xabber.android.data.account.StatusMode;
import com.xabber.android.data.connection.ConnectionState;
import com.xabber.android.data.extension.muc.MUCManager;
import com.xabber.android.data.message.MessageManager;
import com.xabber.android.data.notification.NotificationManager;
import com.xabber.android.data.roster.AbstractContact;
import com.xabber.android.data.roster.GroupManager;
import com.xabber.android.data.roster.PresenceManager;
import com.xabber.android.data.roster.ShowOfflineMode;
import com.xabber.android.ui.ChatViewer;
import com.xabber.android.ui.ConferenceAdd;
import com.xabber.android.ui.ContactAdd;
import com.xabber.android.ui.ContactEditor;
import com.xabber.android.ui.ContactViewer;
import com.xabber.android.ui.GroupEditor;
import com.xabber.android.ui.StatusEditor;
import com.xabber.android.ui.adapter.UpdatableAdapter;
import com.xabber.android.ui.dialog.ContactDeleteDialogFragment;
import com.xabber.android.ui.dialog.GroupDeleteDialogFragment;
import com.xabber.android.ui.dialog.GroupRenameDialogFragment;
import com.xabber.android.ui.dialog.MUCDeleteDialogFragment;
import com.xabber.android.ui.preferences.AccountEditor;

/**
 * Helper class for context menu creation.
 *
 * @author alexander.ivanov
 */
public class ContextMenuHelper {

    private ContextMenuHelper() {
    }

    public static void createContactContextMenu(final FragmentActivity activity, final UpdatableAdapter adapter,
            AbstractContact abstractContact, ContextMenu menu) {
        final String account = abstractContact.getAccount();
        final String user = abstractContact.getUser();
        menu.setHeaderTitle(abstractContact.getName());
        MenuInflater inflater = activity.getMenuInflater();
        inflater.inflate(R.menu.contact_list_contact_context_menu, menu);

        setContactContextMenuActions(activity, adapter, menu, account, user);
        setContactContextMenuItemsVisibilty(abstractContact, menu, account, user);
    }

    private static void setContactContextMenuActions(final FragmentActivity activity,
            final UpdatableAdapter adapter, ContextMenu menu, final String account, final String user) {
        menu.findItem(R.id.action_chat).setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() {

            @Override
            public boolean onMenuItemClick(MenuItem item) {
                MessageManager.getInstance().openChat(account, user);
                activity.startActivity(ChatViewer.createSpecificChatIntent(activity, account, user));
                return true;
            }
        });

        menu.findItem(R.id.action_edit_conference).setIntent(ConferenceAdd.createIntent(activity, account, user));

        menu.findItem(R.id.action_delete_conference)
                .setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() {
                    @Override
                    public boolean onMenuItemClick(MenuItem item) {
                        MUCDeleteDialogFragment.newInstance(account, user).show(activity.getFragmentManager(),
                                "MUC_DELETE");
                        return true;
                    }
                });

        menu.findItem(R.id.action_join_conference)
                .setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() {
                    @Override
                    public boolean onMenuItemClick(MenuItem item) {
                        MUCManager.getInstance().joinRoom(account, user, true);
                        return true;
                    }
                });

        menu.findItem(R.id.action_leave_conference)
                .setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() {

                    @Override
                    public boolean onMenuItemClick(MenuItem item) {
                        MUCManager.getInstance().leaveRoom(account, user);
                        MessageManager.getInstance().closeChat(account, user);
                        NotificationManager.getInstance().removeMessageNotification(account, user);
                        adapter.onChange();
                        return true;
                    }

                });

        menu.findItem(R.id.action_contact_info).setIntent(ContactEditor.createIntent(activity, account, user));
        menu.findItem(R.id.action_edit_contact_groups).setIntent(GroupEditor.createIntent(activity, account, user));

        menu.findItem(R.id.action_delete_contact)
                .setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() {

                    @Override
                    public boolean onMenuItemClick(MenuItem item) {
                        ContactDeleteDialogFragment.newInstance(account, user).show(activity.getFragmentManager(),
                                "CONTACT_DELETE");
                        return true;
                    }

                });

        menu.findItem(R.id.action_close_chat).setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() {

            @Override
            public boolean onMenuItemClick(MenuItem item) {
                MessageManager.getInstance().closeChat(account, user);
                NotificationManager.getInstance().removeMessageNotification(account, user);
                adapter.onChange();
                return true;
            }

        });

        menu.findItem(R.id.action_request_subscription)
                .setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() {

                    @Override
                    public boolean onMenuItemClick(MenuItem item) {
                        try {
                            PresenceManager.getInstance().requestSubscription(account, user);
                        } catch (NetworkException e) {
                            Application.getInstance().onError(e);
                        }
                        return true;
                    }

                });

        menu.findItem(R.id.action_accept_subscription)
                .setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() {
                    @Override
                    public boolean onMenuItemClick(MenuItem item) {
                        try {
                            PresenceManager.getInstance().acceptSubscription(account, user);
                        } catch (NetworkException e) {
                            Application.getInstance().onError(e);
                        }
                        activity.startActivity(GroupEditor.createIntent(activity, account, user));
                        return true;
                    }
                });
        menu.findItem(R.id.action_discard_subscription)
                .setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() {
                    @Override
                    public boolean onMenuItemClick(MenuItem item) {
                        try {
                            PresenceManager.getInstance().discardSubscription(account, user);
                        } catch (NetworkException e) {
                            Application.getInstance().onError(e);
                        }
                        return true;
                    }
                });
    }

    private static void setContactContextMenuItemsVisibilty(AbstractContact abstractContact, ContextMenu menu,
            String account, String user) {
        // all menu items are visible by default
        // it allows to hide items in xml file without touching code

        if (!MUCManager.getInstance().hasRoom(account, user)) {
            // is not conference

            menu.findItem(R.id.action_edit_conference).setVisible(false);
            menu.findItem(R.id.action_delete_conference).setVisible(false);
            menu.findItem(R.id.action_leave_conference).setVisible(false);
            menu.findItem(R.id.action_join_conference).setVisible(false);

            if (!MessageManager.getInstance().hasActiveChat(account, user)) {
                menu.findItem(R.id.action_close_chat).setVisible(false);
            }
            if (abstractContact.getStatusMode() != StatusMode.unsubscribed) {
                menu.findItem(R.id.action_request_subscription).setVisible(false);
            }
        } else { // is conference

            menu.findItem(R.id.action_contact_info).setVisible(false);
            menu.findItem(R.id.action_edit_contact_groups).setVisible(false);
            menu.findItem(R.id.action_delete_contact).setVisible(false);
            menu.findItem(R.id.action_close_chat).setVisible(false);
            menu.findItem(R.id.action_request_subscription).setVisible(false);

            if (MUCManager.getInstance().inUse(account, user)) {
                menu.findItem(R.id.action_edit_conference).setVisible(false);
            }

            if (MUCManager.getInstance().isDisabled(account, user)) {
                menu.findItem(R.id.action_leave_conference).setVisible(false);
            } else {
                menu.findItem(R.id.action_join_conference).setVisible(false);
            }

        }

        if (!PresenceManager.getInstance().hasSubscriptionRequest(account, user)) {
            menu.findItem(R.id.action_accept_subscription).setVisible(false);
            menu.findItem(R.id.action_discard_subscription).setVisible(false);
        }
    }

    public static void createGroupContextMenu(final FragmentActivity activity, final UpdatableAdapter adapter,
            final String account, final String group, ContextMenu menu) {
        menu.setHeaderTitle(GroupManager.getInstance().getGroupName(account, group));
        if (!group.equals(GroupManager.ACTIVE_CHATS) && !group.equals(GroupManager.IS_ROOM)) {
            menu.add(R.string.group_rename).setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() {

                @Override
                public boolean onMenuItemClick(MenuItem item) {
                    GroupRenameDialogFragment
                            .newInstance(account.equals(GroupManager.NO_ACCOUNT) ? null : account,
                                    group.equals(GroupManager.NO_GROUP) ? null : group)
                            .show(activity.getFragmentManager(), "GROUP_RENAME");
                    return true;
                }
            });
            if (!group.equals(GroupManager.NO_GROUP)) {
                menu.add(R.string.group_remove).setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() {

                    @Override
                    public boolean onMenuItemClick(MenuItem item) {
                        GroupDeleteDialogFragment
                                .newInstance(account.equals(GroupManager.NO_ACCOUNT) ? null : account, group)
                                .show(activity.getFragmentManager(), "GROUP_DELETE");
                        return true;
                    }
                });
            }
        }
        if (!group.equals(GroupManager.ACTIVE_CHATS)) {
            menu.add(R.string.show_offline_settings)
                    .setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() {
                        @Override
                        public boolean onMenuItemClick(MenuItem item) {
                            createOfflineContactsDialog(activity, adapter, account, group).show();
                            return true;
                        }
                    });
        }
    }

    public static void createAccountContextMenu(final FragmentActivity activity, final UpdatableAdapter adapter,
            final String account, ContextMenu menu) {
        activity.getMenuInflater().inflate(R.menu.account, menu);
        menu.setHeaderTitle(AccountManager.getInstance().getVerboseName(account));

        setUpAccountMenu(activity, adapter, account, menu);
    }

    public static void setUpAccountMenu(final FragmentActivity activity, final UpdatableAdapter adapter,
            final String account, Menu menu) {
        final AccountItem accountItem = AccountManager.getInstance().getAccount(account);
        ConnectionState state = accountItem.getState();

        if (state == ConnectionState.waiting) {
            menu.findItem(R.id.action_reconnect_account).setVisible(true)
                    .setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() {

                        @Override
                        public boolean onMenuItemClick(MenuItem item) {
                            if (accountItem.updateConnection(true))
                                AccountManager.getInstance().onAccountChanged(account);
                            return true;
                        }

                    });
        }

        menu.findItem(R.id.action_edit_account_status).setIntent(StatusEditor.createIntent(activity, account));
        menu.findItem(R.id.action_edit_account).setIntent(AccountEditor.createIntent(activity, account));

        if (state.isConnected()) {
            menu.findItem(R.id.action_contact_info).setVisible(true)
                    .setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() {
                        @Override
                        public boolean onMenuItemClick(MenuItem item) {
                            activity.startActivity(
                                    ContactViewer.createIntent(activity, account, GroupManager.IS_ACCOUNT));
                            return true;
                        }
                    });
            menu.findItem(R.id.action_add_contact).setVisible(true)
                    .setIntent(ContactAdd.createIntent(activity, account));
        }

        if (SettingsManager.contactsShowAccounts()) {
            menu.findItem(R.id.action_set_up_offline_contacts).setVisible(true)
                    .setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() {
                        @Override
                        public boolean onMenuItemClick(MenuItem item) {
                            ContextMenuHelper.createOfflineContactsDialog(activity, adapter, account,
                                    GroupManager.IS_ACCOUNT).show();
                            return true;
                        }
                    });
        }
    }

    public static AlertDialog createOfflineContactsDialog(Context context, final UpdatableAdapter adapter,
            final String account, final String group) {
        return new AlertDialog.Builder(context).setTitle(R.string.show_offline_settings)
                .setSingleChoiceItems(R.array.offline_contacts_show_option,
                        GroupManager.getInstance().getShowOfflineMode(account, group).ordinal(),
                        new DialogInterface.OnClickListener() {
                            @Override
                            public void onClick(DialogInterface dialog, int which) {
                                GroupManager.getInstance().setShowOfflineMode(account, group,
                                        ShowOfflineMode.values()[which]);
                                adapter.onChange();
                                dialog.dismiss();
                            }
                        })
                .create();
    }
}