168f2e222b4ffccd9f67f02b3a9cfdb3841a7eb43Mindy Pereira/*
268f2e222b4ffccd9f67f02b3a9cfdb3841a7eb43Mindy Pereira * Copyright (C) 2012 Google Inc.
368f2e222b4ffccd9f67f02b3a9cfdb3841a7eb43Mindy Pereira * Licensed to The Android Open Source Project.
45e5ac748eadbb17eee84b39a424b8b9270ade46cVikram Aggarwal *
568f2e222b4ffccd9f67f02b3a9cfdb3841a7eb43Mindy Pereira * Licensed under the Apache License, Version 2.0 (the "License");
668f2e222b4ffccd9f67f02b3a9cfdb3841a7eb43Mindy Pereira * you may not use this file except in compliance with the License.
768f2e222b4ffccd9f67f02b3a9cfdb3841a7eb43Mindy Pereira * You may obtain a copy of the License at
85e5ac748eadbb17eee84b39a424b8b9270ade46cVikram Aggarwal *
968f2e222b4ffccd9f67f02b3a9cfdb3841a7eb43Mindy Pereira *      http://www.apache.org/licenses/LICENSE-2.0
105e5ac748eadbb17eee84b39a424b8b9270ade46cVikram Aggarwal *
1168f2e222b4ffccd9f67f02b3a9cfdb3841a7eb43Mindy Pereira * Unless required by applicable law or agreed to in writing, software
1268f2e222b4ffccd9f67f02b3a9cfdb3841a7eb43Mindy Pereira * distributed under the License is distributed on an "AS IS" BASIS,
1368f2e222b4ffccd9f67f02b3a9cfdb3841a7eb43Mindy Pereira * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1468f2e222b4ffccd9f67f02b3a9cfdb3841a7eb43Mindy Pereira * See the License for the specific language governing permissions and
1568f2e222b4ffccd9f67f02b3a9cfdb3841a7eb43Mindy Pereira * limitations under the License.
1668f2e222b4ffccd9f67f02b3a9cfdb3841a7eb43Mindy Pereira */
175e5ac748eadbb17eee84b39a424b8b9270ade46cVikram Aggarwal
181ddcf0f2bf44d3c9db89112ef52510d9b2433ac4Vikram Aggarwalpackage com.android.mail.ui;
195e5ac748eadbb17eee84b39a424b8b9270ade46cVikram Aggarwal
2053a615db980802911c8570a04e437b03500323c4Scott Banachowskiimport android.content.ContentResolver;
2168f2e222b4ffccd9f67f02b3a9cfdb3841a7eb43Mindy Pereiraimport android.content.Context;
22a51ef9f052b3f5a1ed9dbf0cb116628a9213cb0aVikram Aggarwalimport android.net.Uri;
23a51ef9f052b3f5a1ed9dbf0cb116628a9213cb0aVikram Aggarwalimport android.os.AsyncTask;
245e5ac748eadbb17eee84b39a424b8b9270ade46cVikram Aggarwalimport android.os.Bundle;
2552882ff08fe9420fe2dbb3f681545a330222e9c8Andrew Sappersteinimport android.support.v7.app.ActionBar;
260531c9fdeee6ed2beb0298e2c901b9c44d3bd44cMindy Pereiraimport android.text.TextUtils;
275e5ac748eadbb17eee84b39a424b8b9270ade46cVikram Aggarwalimport android.view.Menu;
2868f2e222b4ffccd9f67f02b3a9cfdb3841a7eb43Mindy Pereiraimport android.view.MenuItem;
29a9b93f35035dc4badd0ac40f4016e1ff809b26b0Vikram Aggarwal
30760d956596a3698d533ad95d3e4b1a57cf2910b2Alice Yangimport com.android.mail.R;
31760d956596a3698d533ad95d3e4b1a57cf2910b2Alice Yangimport com.android.mail.providers.Account;
32760d956596a3698d533ad95d3e4b1a57cf2910b2Alice Yangimport com.android.mail.providers.AccountObserver;
33760d956596a3698d533ad95d3e4b1a57cf2910b2Alice Yangimport com.android.mail.providers.Conversation;
34760d956596a3698d533ad95d3e4b1a57cf2910b2Alice Yangimport com.android.mail.providers.Folder;
35760d956596a3698d533ad95d3e4b1a57cf2910b2Alice Yangimport com.android.mail.providers.FolderObserver;
36760d956596a3698d533ad95d3e4b1a57cf2910b2Alice Yangimport com.android.mail.providers.UIProvider;
37760d956596a3698d533ad95d3e4b1a57cf2910b2Alice Yangimport com.android.mail.providers.UIProvider.AccountCapabilities;
38760d956596a3698d533ad95d3e4b1a57cf2910b2Alice Yangimport com.android.mail.providers.UIProvider.FolderCapabilities;
397ee089ea2ef96e31504e88637b5f3b0969b3c7c1Scott Kennedyimport com.android.mail.providers.UIProvider.FolderType;
40760d956596a3698d533ad95d3e4b1a57cf2910b2Alice Yangimport com.android.mail.utils.LogTag;
41760d956596a3698d533ad95d3e4b1a57cf2910b2Alice Yangimport com.android.mail.utils.LogUtils;
42760d956596a3698d533ad95d3e4b1a57cf2910b2Alice Yangimport com.android.mail.utils.Utils;
43760d956596a3698d533ad95d3e4b1a57cf2910b2Alice Yang
445e5ac748eadbb17eee84b39a424b8b9270ade46cVikram Aggarwal/**
452d86d1123c4183024222dd2eb60f7cbdc24953fdAndrew Sapperstein * Controller to manage the various states of the {@link android.app.ActionBar}.
465e5ac748eadbb17eee84b39a424b8b9270ade46cVikram Aggarwal */
47c6801eb828627c37b8992584767c095dfe11df62Jin Caopublic class ActionBarController implements ViewMode.ModeChangeListener {
482d86d1123c4183024222dd2eb60f7cbdc24953fdAndrew Sapperstein
492d86d1123c4183024222dd2eb60f7cbdc24953fdAndrew Sapperstein    private final Context mContext;
50af65e73c4ad37fd98f6f21804f441edb2256f5daAndy Huang
51edb135e3089eb7e4a844152da9f42b4a7de60f59Mindy Pereira    protected ActionBar mActionBar;
527c401b7896910c00e6234e8774aab0be45740d32Vikram Aggarwal    protected ControllableActivity mActivity;
53edb135e3089eb7e4a844152da9f42b4a7de60f59Mindy Pereira    protected ActivityController mController;
545e5ac748eadbb17eee84b39a424b8b9270ade46cVikram Aggarwal    /**
55bd09150070b1aa25ebdd9af0a29e8bf9fbbf7af8Tony Mantler     * The current mode of the ActionBar and Activity
56bc57bf19ce029f81ad6a700d30bf877b3cfdc135Mindy Pereira     */
57bd09150070b1aa25ebdd9af0a29e8bf9fbbf7af8Tony Mantler    private ViewMode mViewModeController;
58bc57bf19ce029f81ad6a700d30bf877b3cfdc135Mindy Pereira
59bc57bf19ce029f81ad6a700d30bf877b3cfdc135Mindy Pereira    /**
6068f2e222b4ffccd9f67f02b3a9cfdb3841a7eb43Mindy Pereira     * The account currently being shown
615e5ac748eadbb17eee84b39a424b8b9270ade46cVikram Aggarwal     */
6268f2e222b4ffccd9f67f02b3a9cfdb3841a7eb43Mindy Pereira    private Account mAccount;
63edcab013674a4ef641c02d35c218ef78595890b6Marc Blank    /**
64edcab013674a4ef641c02d35c218ef78595890b6Marc Blank     * The folder currently being shown
65edcab013674a4ef641c02d35c218ef78595890b6Marc Blank     */
66edcab013674a4ef641c02d35c218ef78595890b6Marc Blank    private Folder mFolder;
675e5ac748eadbb17eee84b39a424b8b9270ade46cVikram Aggarwal
687ee089ea2ef96e31504e88637b5f3b0969b3c7c1Scott Kennedy    private MenuItem mEmptyTrashItem;
697ee089ea2ef96e31504e88637b5f3b0969b3c7c1Scott Kennedy    private MenuItem mEmptySpamItem;
708c887ef97607ad5c2c94d1d3b902afe6d5ef95a0Paul Westbrook
71f642b8128392890d84845ba8793192da0f9125aeVikram Aggarwal    /** True if the current device is a tablet, false otherwise. */
72ad8b99b26bf9eff7730ab733cc8ef8b0710a9e0eVikram Aggarwal    protected final boolean mIsOnTablet;
73f807ba7ac1011f7fd1e0d382dcc0518ba3529810Yorke Lee    private Conversation mCurrentConversation;
749b62380891e7bc2b46406adac089625e2830a47cMindy Pereira
75b334c9035e9b7a38766bb66c29da2208525d1e11Paul Westbrook    public static final String LOG_TAG = LogTag.getLogTag();
760d647354209f4bf57cffa35f008e09853977b189Andy Huang
7750ff0e50f1a27144e55e4184f48e433439727e7bVikram Aggarwal    private FolderObserver mFolderObserver;
785e5ac748eadbb17eee84b39a424b8b9270ade46cVikram Aggarwal
79a51ef9f052b3f5a1ed9dbf0cb116628a9213cb0aVikram Aggarwal    /** Updates the resolver and tells it the most recent account. */
80a51ef9f052b3f5a1ed9dbf0cb116628a9213cb0aVikram Aggarwal    private final class UpdateProvider extends AsyncTask<Bundle, Void, Void> {
81a51ef9f052b3f5a1ed9dbf0cb116628a9213cb0aVikram Aggarwal        final Uri mAccount;
82a51ef9f052b3f5a1ed9dbf0cb116628a9213cb0aVikram Aggarwal        final ContentResolver mResolver;
83a51ef9f052b3f5a1ed9dbf0cb116628a9213cb0aVikram Aggarwal        public UpdateProvider(Uri account, ContentResolver resolver) {
84a51ef9f052b3f5a1ed9dbf0cb116628a9213cb0aVikram Aggarwal            mAccount = account;
85a51ef9f052b3f5a1ed9dbf0cb116628a9213cb0aVikram Aggarwal            mResolver = resolver;
86a51ef9f052b3f5a1ed9dbf0cb116628a9213cb0aVikram Aggarwal        }
87a51ef9f052b3f5a1ed9dbf0cb116628a9213cb0aVikram Aggarwal
88a51ef9f052b3f5a1ed9dbf0cb116628a9213cb0aVikram Aggarwal        @Override
89a51ef9f052b3f5a1ed9dbf0cb116628a9213cb0aVikram Aggarwal        protected Void doInBackground(Bundle... params) {
90a51ef9f052b3f5a1ed9dbf0cb116628a9213cb0aVikram Aggarwal            mResolver.call(mAccount, UIProvider.AccountCallMethods.SET_CURRENT_ACCOUNT,
91a51ef9f052b3f5a1ed9dbf0cb116628a9213cb0aVikram Aggarwal                    mAccount.toString(), params[0]);
92a51ef9f052b3f5a1ed9dbf0cb116628a9213cb0aVikram Aggarwal            return null;
93a51ef9f052b3f5a1ed9dbf0cb116628a9213cb0aVikram Aggarwal        }
94a51ef9f052b3f5a1ed9dbf0cb116628a9213cb0aVikram Aggarwal    }
95a51ef9f052b3f5a1ed9dbf0cb116628a9213cb0aVikram Aggarwal
967c401b7896910c00e6234e8774aab0be45740d32Vikram Aggarwal    private final AccountObserver mAccountObserver = new AccountObserver() {
977c401b7896910c00e6234e8774aab0be45740d32Vikram Aggarwal        @Override
987c401b7896910c00e6234e8774aab0be45740d32Vikram Aggarwal        public void onChanged(Account newAccount) {
9953a615db980802911c8570a04e437b03500323c4Scott Banachowski            updateAccount(newAccount);
1007c401b7896910c00e6234e8774aab0be45740d32Vikram Aggarwal        }
1017c401b7896910c00e6234e8774aab0be45740d32Vikram Aggarwal    };
102af65e73c4ad37fd98f6f21804f441edb2256f5daAndy Huang
1032d86d1123c4183024222dd2eb60f7cbdc24953fdAndrew Sapperstein    public ActionBarController(Context context) {
1042d86d1123c4183024222dd2eb60f7cbdc24953fdAndrew Sapperstein        mContext = context;
1052d86d1123c4183024222dd2eb60f7cbdc24953fdAndrew Sapperstein        mIsOnTablet = Utils.useTabletUI(context.getResources());
10668f2e222b4ffccd9f67f02b3a9cfdb3841a7eb43Mindy Pereira    }
10768f2e222b4ffccd9f67f02b3a9cfdb3841a7eb43Mindy Pereira
10868f2e222b4ffccd9f67f02b3a9cfdb3841a7eb43Mindy Pereira    public boolean onCreateOptionsMenu(Menu menu) {
109640741df0eafe1cd8f69638d508fa331365c4e96James Lemieux        mEmptyTrashItem = menu.findItem(R.id.empty_trash);
110640741df0eafe1cd8f69638d508fa331365c4e96James Lemieux        mEmptySpamItem = menu.findItem(R.id.empty_spam);
111640741df0eafe1cd8f69638d508fa331365c4e96James Lemieux
112640741df0eafe1cd8f69638d508fa331365c4e96James Lemieux        // the menu should be displayed if the mode is known
113640741df0eafe1cd8f69638d508fa331365c4e96James Lemieux        return getMode() != ViewMode.UNKNOWN;
11468f2e222b4ffccd9f67f02b3a9cfdb3841a7eb43Mindy Pereira    }
11568f2e222b4ffccd9f67f02b3a9cfdb3841a7eb43Mindy Pereira
11668f2e222b4ffccd9f67f02b3a9cfdb3841a7eb43Mindy Pereira    public int getOptionsMenuId() {
117bd09150070b1aa25ebdd9af0a29e8bf9fbbf7af8Tony Mantler        switch (getMode()) {
118e29b97e508ad0bfc94a43000c79a9fd3abdfe1faTony Mantler            case ViewMode.UNKNOWN:
119e29b97e508ad0bfc94a43000c79a9fd3abdfe1faTony Mantler                return R.menu.conversation_list_menu;
120e29b97e508ad0bfc94a43000c79a9fd3abdfe1faTony Mantler            case ViewMode.CONVERSATION:
121e29b97e508ad0bfc94a43000c79a9fd3abdfe1faTony Mantler                return R.menu.conversation_actions;
122e29b97e508ad0bfc94a43000c79a9fd3abdfe1faTony Mantler            case ViewMode.CONVERSATION_LIST:
123e29b97e508ad0bfc94a43000c79a9fd3abdfe1faTony Mantler                return R.menu.conversation_list_menu;
124e29b97e508ad0bfc94a43000c79a9fd3abdfe1faTony Mantler            case ViewMode.SEARCH_RESULTS_LIST:
125e29b97e508ad0bfc94a43000c79a9fd3abdfe1faTony Mantler                return R.menu.conversation_list_search_results_actions;
126e29b97e508ad0bfc94a43000c79a9fd3abdfe1faTony Mantler            case ViewMode.SEARCH_RESULTS_CONVERSATION:
127e29b97e508ad0bfc94a43000c79a9fd3abdfe1faTony Mantler                return R.menu.conversation_actions;
128e29b97e508ad0bfc94a43000c79a9fd3abdfe1faTony Mantler            case ViewMode.WAITING_FOR_ACCOUNT_INITIALIZATION:
129e29b97e508ad0bfc94a43000c79a9fd3abdfe1faTony Mantler                return R.menu.wait_mode_actions;
130e29b97e508ad0bfc94a43000c79a9fd3abdfe1faTony Mantler        }
131e29b97e508ad0bfc94a43000c79a9fd3abdfe1faTony Mantler        LogUtils.wtf(LOG_TAG, "Menu requested for unknown view mode");
132e29b97e508ad0bfc94a43000c79a9fd3abdfe1faTony Mantler        return R.menu.conversation_list_menu;
13368f2e222b4ffccd9f67f02b3a9cfdb3841a7eb43Mindy Pereira    }
13468f2e222b4ffccd9f67f02b3a9cfdb3841a7eb43Mindy Pereira
1357c401b7896910c00e6234e8774aab0be45740d32Vikram Aggarwal    public void initialize(ControllableActivity activity, ActivityController callback,
136dac89fa9237268d14448946700290fbb7de26004Vikram Aggarwal            ActionBar actionBar) {
13768f2e222b4ffccd9f67f02b3a9cfdb3841a7eb43Mindy Pereira        mActionBar = actionBar;
138a799795e91b2a8049914c4559fa2a89fc0133faaVikram Aggarwal        mController = callback;
13968f2e222b4ffccd9f67f02b3a9cfdb3841a7eb43Mindy Pereira        mActivity = activity;
1408c887ef97607ad5c2c94d1d3b902afe6d5ef95a0Paul Westbrook
14150ff0e50f1a27144e55e4184f48e433439727e7bVikram Aggarwal        mFolderObserver = new FolderObserver() {
14250ff0e50f1a27144e55e4184f48e433439727e7bVikram Aggarwal            @Override
14350ff0e50f1a27144e55e4184f48e433439727e7bVikram Aggarwal            public void onChanged(Folder newFolder) {
14450ff0e50f1a27144e55e4184f48e433439727e7bVikram Aggarwal                onFolderUpdated(newFolder);
14550ff0e50f1a27144e55e4184f48e433439727e7bVikram Aggarwal            }
14650ff0e50f1a27144e55e4184f48e433439727e7bVikram Aggarwal        };
14726b0bfd6dbff67a00079e7a60c9f7120d3a1ed85Vikram Aggarwal        // Return values are purposely discarded. Initialization happens quite early, and we don't
14826b0bfd6dbff67a00079e7a60c9f7120d3a1ed85Vikram Aggarwal        // have a valid folder, or a valid list of accounts.
14950ff0e50f1a27144e55e4184f48e433439727e7bVikram Aggarwal        mFolderObserver.initialize(mController);
15053a615db980802911c8570a04e437b03500323c4Scott Banachowski        updateAccount(mAccountObserver.initialize(activity.getAccountController()));
15153a615db980802911c8570a04e437b03500323c4Scott Banachowski    }
15253a615db980802911c8570a04e437b03500323c4Scott Banachowski
15353a615db980802911c8570a04e437b03500323c4Scott Banachowski    private void updateAccount(Account account) {
154f18b1173c9624d1e0a8fa37ed15a63e9fe4ccdc8Vikram Aggarwal        final boolean accountChanged = mAccount == null || !mAccount.uri.equals(account.uri);
15553a615db980802911c8570a04e437b03500323c4Scott Banachowski        mAccount = account;
156f18b1173c9624d1e0a8fa37ed15a63e9fe4ccdc8Vikram Aggarwal        if (mAccount != null && accountChanged) {
157bc462cadc2dcd11d27e7810e437aeef1505f4cb2Vikram Aggarwal            final ContentResolver resolver = mActivity.getActivityContext().getContentResolver();
158bc462cadc2dcd11d27e7810e437aeef1505f4cb2Vikram Aggarwal            final Bundle bundle = new Bundle(1);
15953a615db980802911c8570a04e437b03500323c4Scott Banachowski            bundle.putParcelable(UIProvider.SetCurrentAccountColumns.ACCOUNT, account);
160a51ef9f052b3f5a1ed9dbf0cb116628a9213cb0aVikram Aggarwal            final UpdateProvider updater = new UpdateProvider(mAccount.uri, resolver);
161a51ef9f052b3f5a1ed9dbf0cb116628a9213cb0aVikram Aggarwal            updater.execute(bundle);
1622d86d1123c4183024222dd2eb60f7cbdc24953fdAndrew Sapperstein            setFolderAndAccount();
16353a615db980802911c8570a04e437b03500323c4Scott Banachowski        }
164abd24d82e41fd4747945d3f124b4e3a57e5dc6e6Vikram Aggarwal    }
165e303b9bfe8b9659a47e766a41985ff857eb2e8f0Andy Huang
166abd24d82e41fd4747945d3f124b4e3a57e5dc6e6Vikram Aggarwal    /**
16775d1bb1c9d4bcb6a3d6154ee481c64855ef39f94Vikram Aggarwal     * Called by the owner of the ActionBar to change the current folder.
1685e5ac748eadbb17eee84b39a424b8b9270ade46cVikram Aggarwal     */
16968f2e222b4ffccd9f67f02b3a9cfdb3841a7eb43Mindy Pereira    public void setFolder(Folder folder) {
170edcab013674a4ef641c02d35c218ef78595890b6Marc Blank        mFolder = folder;
1712d86d1123c4183024222dd2eb60f7cbdc24953fdAndrew Sapperstein        setFolderAndAccount();
17268f2e222b4ffccd9f67f02b3a9cfdb3841a7eb43Mindy Pereira    }
1735e5ac748eadbb17eee84b39a424b8b9270ade46cVikram Aggarwal
174641de6544634b55a5505cb2874059e02e13f70aeMindy Pereira    public void onDestroy() {
175641de6544634b55a5505cb2874059e02e13f70aeMindy Pereira        if (mFolderObserver != null) {
17650ff0e50f1a27144e55e4184f48e433439727e7bVikram Aggarwal            mFolderObserver.unregisterAndDestroy();
177641de6544634b55a5505cb2874059e02e13f70aeMindy Pereira            mFolderObserver = null;
178641de6544634b55a5505cb2874059e02e13f70aeMindy Pereira        }
1797c401b7896910c00e6234e8774aab0be45740d32Vikram Aggarwal        mAccountObserver.unregisterAndDestroy();
18068f2e222b4ffccd9f67f02b3a9cfdb3841a7eb43Mindy Pereira    }
18168f2e222b4ffccd9f67f02b3a9cfdb3841a7eb43Mindy Pereira
182a799795e91b2a8049914c4559fa2a89fc0133faaVikram Aggarwal    @Override
18368f2e222b4ffccd9f67f02b3a9cfdb3841a7eb43Mindy Pereira    public void onViewModeChanged(int newMode) {
18477db7fda313ed4c001eb05fb6b619f9f2798c635Rohan Shah        final boolean mIsTabletLandscape =
18577db7fda313ed4c001eb05fb6b619f9f2798c635Rohan Shah                mContext.getResources().getBoolean(R.bool.is_tablet_landscape);
18677db7fda313ed4c001eb05fb6b619f9f2798c635Rohan Shah
18752882ff08fe9420fe2dbb3f681545a330222e9c8Andrew Sapperstein        mActivity.supportInvalidateOptionsMenu();
1881a3f3fcb38756a3b5725d38b18145116ead9c117Vikram Aggarwal        // Check if we are either on a phone, or in Conversation mode on tablet. For these, the
1891a3f3fcb38756a3b5725d38b18145116ead9c117Vikram Aggarwal        // recent folders is enabled.
190bd09150070b1aa25ebdd9af0a29e8bf9fbbf7af8Tony Mantler        switch (getMode()) {
191d736a385f1ce5e1a59a7953f9245526b37126809Andy Huang            case ViewMode.UNKNOWN:
192d736a385f1ce5e1a59a7953f9245526b37126809Andy Huang                break;
193d736a385f1ce5e1a59a7953f9245526b37126809Andy Huang            case ViewMode.CONVERSATION_LIST:
194d736a385f1ce5e1a59a7953f9245526b37126809Andy Huang                showNavList();
195d736a385f1ce5e1a59a7953f9245526b37126809Andy Huang                break;
196ad8b99b26bf9eff7730ab733cc8ef8b0710a9e0eVikram Aggarwal            case ViewMode.SEARCH_RESULTS_CONVERSATION:
197e875b66908c81567f940a9b989d6f23f6de78099Vikram Aggarwal                mActionBar.setDisplayHomeAsUpEnabled(true);
198e875b66908c81567f940a9b989d6f23f6de78099Vikram Aggarwal                setEmptyMode();
199e875b66908c81567f940a9b989d6f23f6de78099Vikram Aggarwal                break;
200d736a385f1ce5e1a59a7953f9245526b37126809Andy Huang            case ViewMode.CONVERSATION:
20177db7fda313ed4c001eb05fb6b619f9f2798c635Rohan Shah                // If on tablet landscape, show current folder instead of emptying the action bar
20277db7fda313ed4c001eb05fb6b619f9f2798c635Rohan Shah                if (mIsTabletLandscape) {
20377db7fda313ed4c001eb05fb6b619f9f2798c635Rohan Shah                    mActionBar.setDisplayHomeAsUpEnabled(true);
20477db7fda313ed4c001eb05fb6b619f9f2798c635Rohan Shah                    showNavList();
20577db7fda313ed4c001eb05fb6b619f9f2798c635Rohan Shah                    break;
20677db7fda313ed4c001eb05fb6b619f9f2798c635Rohan Shah                }
20777db7fda313ed4c001eb05fb6b619f9f2798c635Rohan Shah                // Otherwise, fall through to default behavior, shared with Ads ViewMode.
2086c570db71b8adc43d7dc2f31e6fa63cf50c1426eAndrew Sapperstein            case ViewMode.AD:
209d736a385f1ce5e1a59a7953f9245526b37126809Andy Huang                mActionBar.setDisplayHomeAsUpEnabled(true);
210ad8b99b26bf9eff7730ab733cc8ef8b0710a9e0eVikram Aggarwal                setEmptyMode();
211d736a385f1ce5e1a59a7953f9245526b37126809Andy Huang                break;
212d736a385f1ce5e1a59a7953f9245526b37126809Andy Huang            case ViewMode.WAITING_FOR_ACCOUNT_INITIALIZATION:
213d736a385f1ce5e1a59a7953f9245526b37126809Andy Huang                // We want the user to be able to switch accounts while waiting for an account
214d736a385f1ce5e1a59a7953f9245526b37126809Andy Huang                // to sync.
215d736a385f1ce5e1a59a7953f9245526b37126809Andy Huang                showNavList();
216d736a385f1ce5e1a59a7953f9245526b37126809Andy Huang                break;
217d736a385f1ce5e1a59a7953f9245526b37126809Andy Huang        }
21868f2e222b4ffccd9f67f02b3a9cfdb3841a7eb43Mindy Pereira    }
219a9b93f35035dc4badd0ac40f4016e1ff809b26b0Vikram Aggarwal
220edb135e3089eb7e4a844152da9f42b4a7de60f59Mindy Pereira    protected int getMode() {
221bd09150070b1aa25ebdd9af0a29e8bf9fbbf7af8Tony Mantler        if (mViewModeController != null) {
222bd09150070b1aa25ebdd9af0a29e8bf9fbbf7af8Tony Mantler            return mViewModeController.getMode();
223bd09150070b1aa25ebdd9af0a29e8bf9fbbf7af8Tony Mantler        } else {
224bd09150070b1aa25ebdd9af0a29e8bf9fbbf7af8Tony Mantler            return ViewMode.UNKNOWN;
225bd09150070b1aa25ebdd9af0a29e8bf9fbbf7af8Tony Mantler        }
226edb135e3089eb7e4a844152da9f42b4a7de60f59Mindy Pereira    }
227edb135e3089eb7e4a844152da9f42b4a7de60f59Mindy Pereira
228e9f0783ec6ef4f5db7e2029eec506efe841be685Jin Cao    /**
229e9f0783ec6ef4f5db7e2029eec506efe841be685Jin Cao     * Helper function to ensure that the menu items that are prone to variable changes and race
230e9f0783ec6ef4f5db7e2029eec506efe841be685Jin Cao     * conditions are properly set to the correct visibility
231e9f0783ec6ef4f5db7e2029eec506efe841be685Jin Cao     */
232e9f0783ec6ef4f5db7e2029eec506efe841be685Jin Cao    public void validateVolatileMenuOptionVisibility() {
2331e5bccefa627306120fbfd783838e1ef8b7fe0d8Jin Cao        Utils.setMenuItemPresent(mEmptyTrashItem, mAccount != null && mFolder != null
2341e5bccefa627306120fbfd783838e1ef8b7fe0d8Jin Cao                && mAccount.supportsCapability(AccountCapabilities.EMPTY_TRASH)
2351e5bccefa627306120fbfd783838e1ef8b7fe0d8Jin Cao                && mFolder.isTrash() && mFolder.totalCount > 0
2361e5bccefa627306120fbfd783838e1ef8b7fe0d8Jin Cao                && (mController.getConversationListCursor() == null
2371e5bccefa627306120fbfd783838e1ef8b7fe0d8Jin Cao                || mController.getConversationListCursor().getCount() > 0));
2381e5bccefa627306120fbfd783838e1ef8b7fe0d8Jin Cao        Utils.setMenuItemPresent(mEmptySpamItem, mAccount != null && mFolder != null
2391e5bccefa627306120fbfd783838e1ef8b7fe0d8Jin Cao                && mAccount.supportsCapability(AccountCapabilities.EMPTY_SPAM)
2401e5bccefa627306120fbfd783838e1ef8b7fe0d8Jin Cao                && mFolder.isType(FolderType.SPAM) && mFolder.totalCount > 0
2411e5bccefa627306120fbfd783838e1ef8b7fe0d8Jin Cao                && (mController.getConversationListCursor() == null
2421e5bccefa627306120fbfd783838e1ef8b7fe0d8Jin Cao                || mController.getConversationListCursor().getCount() > 0));
243e9f0783ec6ef4f5db7e2029eec506efe841be685Jin Cao    }
244e9f0783ec6ef4f5db7e2029eec506efe841be685Jin Cao
24587a8982af83168453b6dc219fe984bff68047bebAndy Huang    public void onPrepareOptionsMenu(Menu menu) {
2461af562a320b7aef08c3c94a63a9b9520147e64c5Jin Cao        menu.setQwertyMode(true);
24768f2e222b4ffccd9f67f02b3a9cfdb3841a7eb43Mindy Pereira        // We start out with every option enabled. Based on the current view, we disable actions
24868f2e222b4ffccd9f67f02b3a9cfdb3841a7eb43Mindy Pereira        // that are possible.
24995b28abd0bbb165848aa59bdbdd6b6b5ba8f423dVikram Aggarwal        LogUtils.d(LOG_TAG, "ActionBarView.onPrepareOptionsMenu().");
25068f2e222b4ffccd9f67f02b3a9cfdb3841a7eb43Mindy Pereira
251b3281fbfe64d84fdd9ec864d90c8551e943e55e7Tony Mantler        if (mController.shouldHideMenuItems()) {
252a57da3c151ae174bc8621af79f3f09392ed90953Ray Chen            // Shortcut: hide all menu items if the drawer is shown
253b3281fbfe64d84fdd9ec864d90c8551e943e55e7Tony Mantler            final int size = menu.size();
254b3281fbfe64d84fdd9ec864d90c8551e943e55e7Tony Mantler
255b3281fbfe64d84fdd9ec864d90c8551e943e55e7Tony Mantler            for (int i = 0; i < size; i++) {
256b3281fbfe64d84fdd9ec864d90c8551e943e55e7Tony Mantler                final MenuItem item = menu.getItem(i);
257a57da3c151ae174bc8621af79f3f09392ed90953Ray Chen                item.setVisible(false);
258b3281fbfe64d84fdd9ec864d90c8551e943e55e7Tony Mantler            }
25987a8982af83168453b6dc219fe984bff68047bebAndy Huang            return;
260b3281fbfe64d84fdd9ec864d90c8551e943e55e7Tony Mantler        }
261e9f0783ec6ef4f5db7e2029eec506efe841be685Jin Cao        validateVolatileMenuOptionVisibility();
26262c71794b1c6ec8732a6cff5e0156c22e27cb5d4Mindy Pereira
263bd09150070b1aa25ebdd9af0a29e8bf9fbbf7af8Tony Mantler        switch (getMode()) {
264f807ba7ac1011f7fd1e0d382dcc0518ba3529810Yorke Lee            case ViewMode.CONVERSATION:
265f807ba7ac1011f7fd1e0d382dcc0518ba3529810Yorke Lee            case ViewMode.SEARCH_RESULTS_CONVERSATION:
266f807ba7ac1011f7fd1e0d382dcc0518ba3529810Yorke Lee                // We update the ActionBar options when we are entering conversation view because
267f807ba7ac1011f7fd1e0d382dcc0518ba3529810Yorke Lee                // waiting for the AbstractConversationViewFragment to do it causes duplicate icons
268f807ba7ac1011f7fd1e0d382dcc0518ba3529810Yorke Lee                // to show up during the time between the conversation is selected and the fragment
269f807ba7ac1011f7fd1e0d382dcc0518ba3529810Yorke Lee                // is added.
270f807ba7ac1011f7fd1e0d382dcc0518ba3529810Yorke Lee                setConversationModeOptions(menu);
271f807ba7ac1011f7fd1e0d382dcc0518ba3529810Yorke Lee                break;
272d03347378e0eb563bcd350c238823f12fdb23684Jin Cao            case ViewMode.CONVERSATION_LIST:
273a6b45218b8d90d7fc3a5ca0901293c71df404553Jin Cao            case ViewMode.SEARCH_RESULTS_LIST:
274d03347378e0eb563bcd350c238823f12fdb23684Jin Cao                // The search menu item should only be visible for non-tablet devices
2751e5bccefa627306120fbfd783838e1ef8b7fe0d8Jin Cao                Utils.setMenuItemPresent(menu, R.id.search,
276d03347378e0eb563bcd350c238823f12fdb23684Jin Cao                        mAccount.supportsSearch() && !mIsOnTablet);
27768f2e222b4ffccd9f67f02b3a9cfdb3841a7eb43Mindy Pereira        }
278a85831df1721dda712be5154fb57404d8df1758aScott Kennedy
27987a8982af83168453b6dc219fe984bff68047bebAndy Huang        return;
280a85831df1721dda712be5154fb57404d8df1758aScott Kennedy    }
281a85831df1721dda712be5154fb57404d8df1758aScott Kennedy
28226f2b30a88a35bc0ae6992c3f4297ebf20bbca53Scott Kennedy    /**
283ad8b99b26bf9eff7730ab733cc8ef8b0710a9e0eVikram Aggarwal     * Put the ActionBar in List navigation mode.
284abd24d82e41fd4747945d3f124b4e3a57e5dc6e6Vikram Aggarwal     */
28572a9f3918310f581fecf6411174645ad5b5ae112Mindy Pereira    private void showNavList() {
2862d86d1123c4183024222dd2eb60f7cbdc24953fdAndrew Sapperstein        setTitleModeFlags(ActionBar.DISPLAY_SHOW_TITLE);
2872d86d1123c4183024222dd2eb60f7cbdc24953fdAndrew Sapperstein        setFolderAndAccount();
2888c887ef97607ad5c2c94d1d3b902afe6d5ef95a0Paul Westbrook    }
2898c887ef97607ad5c2c94d1d3b902afe6d5ef95a0Paul Westbrook
2900a0795c1f6ee30c19c09e43821a7a3eb4adf885eAndrew Sapperstein    private void setTitle(String title) {
291c499d714d6dd9e42b5192f0aa36315c24ef908a3Andy Huang        if (!TextUtils.equals(title, mActionBar.getTitle())) {
292c499d714d6dd9e42b5192f0aa36315c24ef908a3Andy Huang            mActionBar.setTitle(title);
293c499d714d6dd9e42b5192f0aa36315c24ef908a3Andy Huang        }
2946fb1b62b9e8e480892cb1575c8219dfd4c4e1eeemindyp    }
2956fb1b62b9e8e480892cb1575c8219dfd4c4e1eeemindyp
2966fb1b62b9e8e480892cb1575c8219dfd4c4e1eeemindyp    /**
297fd7eaba36ff40d43bf3813df91c89823ac7567cdVikram Aggarwal     * Set the actionbar mode to empty: no title, no subtitle, no custom view.
2986fb1b62b9e8e480892cb1575c8219dfd4c4e1eeemindyp     */
2996fb1b62b9e8e480892cb1575c8219dfd4c4e1eeemindyp    protected void setEmptyMode() {
300fd7eaba36ff40d43bf3813df91c89823ac7567cdVikram Aggarwal        // Disable title/subtitle and the custom view by setting the bitmask to all off.
301fd7eaba36ff40d43bf3813df91c89823ac7567cdVikram Aggarwal        setTitleModeFlags(0);
302abd24d82e41fd4747945d3f124b4e3a57e5dc6e6Vikram Aggarwal    }
303abd24d82e41fd4747945d3f124b4e3a57e5dc6e6Vikram Aggarwal
304ad8b99b26bf9eff7730ab733cc8ef8b0710a9e0eVikram Aggarwal    /**
305ad8b99b26bf9eff7730ab733cc8ef8b0710a9e0eVikram Aggarwal     * Removes the back button from being shown
306ad8b99b26bf9eff7730ab733cc8ef8b0710a9e0eVikram Aggarwal     */
30768f2e222b4ffccd9f67f02b3a9cfdb3841a7eb43Mindy Pereira    public void removeBackButton() {
30868f2e222b4ffccd9f67f02b3a9cfdb3841a7eb43Mindy Pereira        if (mActionBar == null) {
30968f2e222b4ffccd9f67f02b3a9cfdb3841a7eb43Mindy Pereira            return;
31068f2e222b4ffccd9f67f02b3a9cfdb3841a7eb43Mindy Pereira        }
311649b9ea3653da73fac0c33c8fb0af18baad12ac3Vikram Aggarwal        // Remove the back button but continue showing an icon.
3122d86d1123c4183024222dd2eb60f7cbdc24953fdAndrew Sapperstein        final int mask = ActionBar.DISPLAY_HOME_AS_UP | ActionBar.DISPLAY_SHOW_HOME;
3132d86d1123c4183024222dd2eb60f7cbdc24953fdAndrew Sapperstein        mActionBar.setDisplayOptions(ActionBar.DISPLAY_SHOW_HOME, mask);
31452882ff08fe9420fe2dbb3f681545a330222e9c8Andrew Sapperstein        mActionBar.setHomeButtonEnabled(false);
31568f2e222b4ffccd9f67f02b3a9cfdb3841a7eb43Mindy Pereira    }
31668f2e222b4ffccd9f67f02b3a9cfdb3841a7eb43Mindy Pereira
31768f2e222b4ffccd9f67f02b3a9cfdb3841a7eb43Mindy Pereira    public void setBackButton() {
31812b3ee458e04ac7e0b69302e671d10b24a5c98cfAndy Huang        if (mActionBar == null) {
31968f2e222b4ffccd9f67f02b3a9cfdb3841a7eb43Mindy Pereira            return;
32068f2e222b4ffccd9f67f02b3a9cfdb3841a7eb43Mindy Pereira        }
321649b9ea3653da73fac0c33c8fb0af18baad12ac3Vikram Aggarwal        // Show home as up, and show an icon.
3222d86d1123c4183024222dd2eb60f7cbdc24953fdAndrew Sapperstein        final int mask = ActionBar.DISPLAY_HOME_AS_UP | ActionBar.DISPLAY_SHOW_HOME;
323649b9ea3653da73fac0c33c8fb0af18baad12ac3Vikram Aggarwal        mActionBar.setDisplayOptions(mask, mask);
32452882ff08fe9420fe2dbb3f681545a330222e9c8Andrew Sapperstein        mActionBar.setHomeButtonEnabled(true);
32568f2e222b4ffccd9f67f02b3a9cfdb3841a7eb43Mindy Pereira    }
32668f2e222b4ffccd9f67f02b3a9cfdb3841a7eb43Mindy Pereira
327f642b8128392890d84845ba8793192da0f9125aeVikram Aggarwal    /**
328f642b8128392890d84845ba8793192da0f9125aeVikram Aggarwal     * Uses the current state to update the current folder {@link #mFolder} and the current
32975d1bb1c9d4bcb6a3d6154ee481c64855ef39f94Vikram Aggarwal     * account {@link #mAccount} shown in the actionbar. Also updates the actionbar subtitle to
33075d1bb1c9d4bcb6a3d6154ee481c64855ef39f94Vikram Aggarwal     * momentarily display the unread count if it has changed.
331f642b8128392890d84845ba8793192da0f9125aeVikram Aggarwal     */
3322d86d1123c4183024222dd2eb60f7cbdc24953fdAndrew Sapperstein    private void setFolderAndAccount() {
3335fce99247640a1d46f0e703296fbef747d2db397Vikram Aggarwal        // Very little can be done if the actionbar or activity is null.
3345fce99247640a1d46f0e703296fbef747d2db397Vikram Aggarwal        if (mActionBar == null || mActivity == null) {
3355fce99247640a1d46f0e703296fbef747d2db397Vikram Aggarwal            return;
3365fce99247640a1d46f0e703296fbef747d2db397Vikram Aggarwal        }
337bd09150070b1aa25ebdd9af0a29e8bf9fbbf7af8Tony Mantler        if (ViewMode.isWaitingForSync(getMode())) {
33875d1bb1c9d4bcb6a3d6154ee481c64855ef39f94Vikram Aggarwal            // Account is not synced: clear title and update the subtitle.
3398c887ef97607ad5c2c94d1d3b902afe6d5ef95a0Paul Westbrook            setTitle("");
340f642b8128392890d84845ba8793192da0f9125aeVikram Aggarwal            return;
341f642b8128392890d84845ba8793192da0f9125aeVikram Aggarwal        }
34275d1bb1c9d4bcb6a3d6154ee481c64855ef39f94Vikram Aggarwal        // Check if we should be changing the actionbar at all, and back off if not.
343bd09150070b1aa25ebdd9af0a29e8bf9fbbf7af8Tony Mantler        final boolean isShowingFolder = mIsOnTablet || ViewMode.isListMode(getMode());
34475d1bb1c9d4bcb6a3d6154ee481c64855ef39f94Vikram Aggarwal        if (!isShowingFolder) {
3459102495933a7b728c0a9bf7764405be94eeee7ebPaul Westbrook            // It isn't necessary to set the title in this case, as the title view will
3469102495933a7b728c0a9bf7764405be94eeee7ebPaul Westbrook            // be hidden
34775d1bb1c9d4bcb6a3d6154ee481c64855ef39f94Vikram Aggarwal            return;
348f642b8128392890d84845ba8793192da0f9125aeVikram Aggarwal        }
34926b0bfd6dbff67a00079e7a60c9f7120d3a1ed85Vikram Aggarwal        if (mFolder == null) {
3509102495933a7b728c0a9bf7764405be94eeee7ebPaul Westbrook            // Clear the action bar title.  We don't want the app name to be shown while
3519102495933a7b728c0a9bf7764405be94eeee7ebPaul Westbrook            // waiting for the folder query to finish
3528c887ef97607ad5c2c94d1d3b902afe6d5ef95a0Paul Westbrook            setTitle("");
35326b0bfd6dbff67a00079e7a60c9f7120d3a1ed85Vikram Aggarwal            return;
35426b0bfd6dbff67a00079e7a60c9f7120d3a1ed85Vikram Aggarwal        }
3558c887ef97607ad5c2c94d1d3b902afe6d5ef95a0Paul Westbrook        setTitle(mFolder.name);
356f18b1173c9624d1e0a8fa37ed15a63e9fe4ccdc8Vikram Aggarwal    }
357f18b1173c9624d1e0a8fa37ed15a63e9fe4ccdc8Vikram Aggarwal
358bc462cadc2dcd11d27e7810e437aeef1505f4cb2Vikram Aggarwal
359a46a57f2ea73dd8106966598631625bc4cb85ef0Mindy Pereira    /**
360a46a57f2ea73dd8106966598631625bc4cb85ef0Mindy Pereira     * Notify that the folder has changed.
361a46a57f2ea73dd8106966598631625bc4cb85ef0Mindy Pereira     */
362a46a57f2ea73dd8106966598631625bc4cb85ef0Mindy Pereira    public void onFolderUpdated(Folder folder) {
36326b0bfd6dbff67a00079e7a60c9f7120d3a1ed85Vikram Aggarwal        if (folder == null) {
36426b0bfd6dbff67a00079e7a60c9f7120d3a1ed85Vikram Aggarwal            return;
36526b0bfd6dbff67a00079e7a60c9f7120d3a1ed85Vikram Aggarwal        }
366e875b66908c81567f940a9b989d6f23f6de78099Vikram Aggarwal        /** True if we are changing folders. */
367c18c3380c131183875cfa97f72cd7ce101ef3c8bVikram Aggarwal        mFolder = folder;
3682d86d1123c4183024222dd2eb60f7cbdc24953fdAndrew Sapperstein        setFolderAndAccount();
369e9f0783ec6ef4f5db7e2029eec506efe841be685Jin Cao        // make sure that we re-validate the optional menu items
370e9f0783ec6ef4f5db7e2029eec506efe841be685Jin Cao        validateVolatileMenuOptionVisibility();
371a46a57f2ea73dd8106966598631625bc4cb85ef0Mindy Pereira    }
3720dda573e51786dd907b2674baddbca20ffa5c725Vikram Aggarwal
373fd7eaba36ff40d43bf3813df91c89823ac7567cdVikram Aggarwal    /**
374fd7eaba36ff40d43bf3813df91c89823ac7567cdVikram Aggarwal     * Sets the actionbar mode: Pass it an integer which contains each of these values, perhaps
3758c887ef97607ad5c2c94d1d3b902afe6d5ef95a0Paul Westbrook     * OR'd together: {@link ActionBar#DISPLAY_SHOW_CUSTOM} and
3768c887ef97607ad5c2c94d1d3b902afe6d5ef95a0Paul Westbrook     * {@link ActionBar#DISPLAY_SHOW_TITLE}. To disable all, pass a zero.
377fd7eaba36ff40d43bf3813df91c89823ac7567cdVikram Aggarwal     * @param enabledFlags
378fd7eaba36ff40d43bf3813df91c89823ac7567cdVikram Aggarwal     */
379af65e73c4ad37fd98f6f21804f441edb2256f5daAndy Huang    private void setTitleModeFlags(int enabledFlags) {
3808c887ef97607ad5c2c94d1d3b902afe6d5ef95a0Paul Westbrook        final int mask = ActionBar.DISPLAY_SHOW_TITLE | ActionBar.DISPLAY_SHOW_CUSTOM;
381af65e73c4ad37fd98f6f21804f441edb2256f5daAndy Huang        mActionBar.setDisplayOptions(enabledFlags, mask);
382af65e73c4ad37fd98f6f21804f441edb2256f5daAndy Huang    }
383af65e73c4ad37fd98f6f21804f441edb2256f5daAndy Huang
384f807ba7ac1011f7fd1e0d382dcc0518ba3529810Yorke Lee    public void setCurrentConversation(Conversation conversation) {
385f807ba7ac1011f7fd1e0d382dcc0518ba3529810Yorke Lee        mCurrentConversation = conversation;
386f807ba7ac1011f7fd1e0d382dcc0518ba3529810Yorke Lee    }
387f807ba7ac1011f7fd1e0d382dcc0518ba3529810Yorke Lee
388f807ba7ac1011f7fd1e0d382dcc0518ba3529810Yorke Lee    //We need to do this here instead of in the fragment
389f807ba7ac1011f7fd1e0d382dcc0518ba3529810Yorke Lee    public void setConversationModeOptions(Menu menu) {
390f807ba7ac1011f7fd1e0d382dcc0518ba3529810Yorke Lee        if (mCurrentConversation == null) {
391f807ba7ac1011f7fd1e0d382dcc0518ba3529810Yorke Lee            return;
392f807ba7ac1011f7fd1e0d382dcc0518ba3529810Yorke Lee        }
393f807ba7ac1011f7fd1e0d382dcc0518ba3529810Yorke Lee        final boolean showMarkImportant = !mCurrentConversation.isImportant();
3941e5bccefa627306120fbfd783838e1ef8b7fe0d8Jin Cao        Utils.setMenuItemPresent(menu, R.id.mark_important, showMarkImportant
395f807ba7ac1011f7fd1e0d382dcc0518ba3529810Yorke Lee                && mAccount.supportsCapability(UIProvider.AccountCapabilities.MARK_IMPORTANT));
3961e5bccefa627306120fbfd783838e1ef8b7fe0d8Jin Cao        Utils.setMenuItemPresent(menu, R.id.mark_not_important, !showMarkImportant
397f807ba7ac1011f7fd1e0d382dcc0518ba3529810Yorke Lee                && mAccount.supportsCapability(UIProvider.AccountCapabilities.MARK_IMPORTANT));
398512821c11d89d49908f3cfdee0b582601f500f3dJin Cao        final boolean isOutbox = mFolder.isType(FolderType.OUTBOX);
399ea61dab12099606a1d385e1003dde46bf0f47d4bJin Cao        final boolean showDiscardOutbox = mFolder != null && isOutbox;
4001e5bccefa627306120fbfd783838e1ef8b7fe0d8Jin Cao        Utils.setMenuItemPresent(menu, R.id.discard_outbox, showDiscardOutbox);
401512821c11d89d49908f3cfdee0b582601f500f3dJin Cao        final boolean showDelete = !isOutbox && mFolder != null &&
402f807ba7ac1011f7fd1e0d382dcc0518ba3529810Yorke Lee                mFolder.supportsCapability(UIProvider.FolderCapabilities.DELETE);
4031e5bccefa627306120fbfd783838e1ef8b7fe0d8Jin Cao        Utils.setMenuItemPresent(menu, R.id.delete, showDelete);
404f807ba7ac1011f7fd1e0d382dcc0518ba3529810Yorke Lee        // We only want to show the discard drafts menu item if we are not showing the delete menu
405f807ba7ac1011f7fd1e0d382dcc0518ba3529810Yorke Lee        // item, and the current folder is a draft folder and the account supports discarding
406f807ba7ac1011f7fd1e0d382dcc0518ba3529810Yorke Lee        // drafts for a conversation
407f807ba7ac1011f7fd1e0d382dcc0518ba3529810Yorke Lee        final boolean showDiscardDrafts = !showDelete && mFolder != null && mFolder.isDraft() &&
408f807ba7ac1011f7fd1e0d382dcc0518ba3529810Yorke Lee                mAccount.supportsCapability(AccountCapabilities.DISCARD_CONVERSATION_DRAFTS);
4091e5bccefa627306120fbfd783838e1ef8b7fe0d8Jin Cao        Utils.setMenuItemPresent(menu, R.id.discard_drafts, showDiscardDrafts);
410f807ba7ac1011f7fd1e0d382dcc0518ba3529810Yorke Lee        final boolean archiveVisible = mAccount.supportsCapability(AccountCapabilities.ARCHIVE)
411f807ba7ac1011f7fd1e0d382dcc0518ba3529810Yorke Lee                && mFolder != null && mFolder.supportsCapability(FolderCapabilities.ARCHIVE)
412f807ba7ac1011f7fd1e0d382dcc0518ba3529810Yorke Lee                && !mFolder.isTrash();
4131e5bccefa627306120fbfd783838e1ef8b7fe0d8Jin Cao        Utils.setMenuItemPresent(menu, R.id.archive, archiveVisible);
4141e5bccefa627306120fbfd783838e1ef8b7fe0d8Jin Cao        Utils.setMenuItemPresent(menu, R.id.remove_folder, !archiveVisible && mFolder != null
415f807ba7ac1011f7fd1e0d382dcc0518ba3529810Yorke Lee                && mFolder.supportsCapability(FolderCapabilities.CAN_ACCEPT_MOVED_MESSAGES)
41653b34250c0029ac3dae4c72822f79d9fad85caa4Tony Mantler                && !mFolder.isProviderFolder()
41753b34250c0029ac3dae4c72822f79d9fad85caa4Tony Mantler                && mAccount.supportsCapability(AccountCapabilities.ARCHIVE));
4181e5bccefa627306120fbfd783838e1ef8b7fe0d8Jin Cao        Utils.setMenuItemPresent(menu, R.id.move_to, mFolder != null
41928f3d5c247927890a45880345b4bf6788f29a820Scott Kennedy                && mFolder.supportsCapability(FolderCapabilities.ALLOWS_REMOVE_CONVERSATION));
4201e5bccefa627306120fbfd783838e1ef8b7fe0d8Jin Cao        Utils.setMenuItemPresent(menu, R.id.move_to_inbox, mFolder != null
421dd2ec688cf18e0ec132d936168ccaa3c43cdefb1Scott Kennedy                && mFolder.supportsCapability(FolderCapabilities.ALLOWS_MOVE_TO_INBOX));
4221e5bccefa627306120fbfd783838e1ef8b7fe0d8Jin Cao        Utils.setMenuItemPresent(menu, R.id.change_folders, mAccount.supportsCapability(
42369419bb35240747d14765d4c74d4c2de58f4f8c5Rohan Shah                UIProvider.AccountCapabilities.MULTIPLE_FOLDERS_PER_CONV));
424dd2ec688cf18e0ec132d936168ccaa3c43cdefb1Scott Kennedy
425f807ba7ac1011f7fd1e0d382dcc0518ba3529810Yorke Lee        final MenuItem removeFolder = menu.findItem(R.id.remove_folder);
42640698e6785e64ffa5c103a70079958e53f9af130Alice Yang        if (mFolder != null && removeFolder != null) {
427f807ba7ac1011f7fd1e0d382dcc0518ba3529810Yorke Lee            removeFolder.setTitle(mActivity.getApplicationContext().getString(
428f807ba7ac1011f7fd1e0d382dcc0518ba3529810Yorke Lee                    R.string.remove_folder, mFolder.name));
429f807ba7ac1011f7fd1e0d382dcc0518ba3529810Yorke Lee        }
4301e5bccefa627306120fbfd783838e1ef8b7fe0d8Jin Cao        Utils.setMenuItemPresent(menu, R.id.report_spam,
431f807ba7ac1011f7fd1e0d382dcc0518ba3529810Yorke Lee                mAccount.supportsCapability(AccountCapabilities.REPORT_SPAM) && mFolder != null
432f807ba7ac1011f7fd1e0d382dcc0518ba3529810Yorke Lee                        && mFolder.supportsCapability(FolderCapabilities.REPORT_SPAM)
433f807ba7ac1011f7fd1e0d382dcc0518ba3529810Yorke Lee                        && !mCurrentConversation.spam);
4341e5bccefa627306120fbfd783838e1ef8b7fe0d8Jin Cao        Utils.setMenuItemPresent(menu, R.id.mark_not_spam,
435f807ba7ac1011f7fd1e0d382dcc0518ba3529810Yorke Lee                mAccount.supportsCapability(AccountCapabilities.REPORT_SPAM) && mFolder != null
436f807ba7ac1011f7fd1e0d382dcc0518ba3529810Yorke Lee                        && mFolder.supportsCapability(FolderCapabilities.MARK_NOT_SPAM)
437f807ba7ac1011f7fd1e0d382dcc0518ba3529810Yorke Lee                        && mCurrentConversation.spam);
4381e5bccefa627306120fbfd783838e1ef8b7fe0d8Jin Cao        Utils.setMenuItemPresent(menu, R.id.report_phishing,
439f807ba7ac1011f7fd1e0d382dcc0518ba3529810Yorke Lee                mAccount.supportsCapability(AccountCapabilities.REPORT_PHISHING) && mFolder != null
440f807ba7ac1011f7fd1e0d382dcc0518ba3529810Yorke Lee                        && mFolder.supportsCapability(FolderCapabilities.REPORT_PHISHING)
441f807ba7ac1011f7fd1e0d382dcc0518ba3529810Yorke Lee                        && !mCurrentConversation.phishing);
4421e5bccefa627306120fbfd783838e1ef8b7fe0d8Jin Cao        Utils.setMenuItemPresent(menu, R.id.mute,
4431e5bccefa627306120fbfd783838e1ef8b7fe0d8Jin Cao                mAccount.supportsCapability(AccountCapabilities.MUTE) && mFolder != null
444f807ba7ac1011f7fd1e0d382dcc0518ba3529810Yorke Lee                        && mFolder.supportsCapability(FolderCapabilities.DESTRUCTIVE_MUTE)
445f807ba7ac1011f7fd1e0d382dcc0518ba3529810Yorke Lee                        && !mCurrentConversation.muted);
446f807ba7ac1011f7fd1e0d382dcc0518ba3529810Yorke Lee    }
4478c887ef97607ad5c2c94d1d3b902afe6d5ef95a0Paul Westbrook
448bd09150070b1aa25ebdd9af0a29e8bf9fbbf7af8Tony Mantler    public void setViewModeController(ViewMode viewModeController) {
449bd09150070b1aa25ebdd9af0a29e8bf9fbbf7af8Tony Mantler        mViewModeController = viewModeController;
450bd09150070b1aa25ebdd9af0a29e8bf9fbbf7af8Tony Mantler        mViewModeController.addListener(this);
451bd09150070b1aa25ebdd9af0a29e8bf9fbbf7af8Tony Mantler    }
4522d86d1123c4183024222dd2eb60f7cbdc24953fdAndrew Sapperstein
4532d86d1123c4183024222dd2eb60f7cbdc24953fdAndrew Sapperstein    public Context getContext() {
4542d86d1123c4183024222dd2eb60f7cbdc24953fdAndrew Sapperstein        return mContext;
4552d86d1123c4183024222dd2eb60f7cbdc24953fdAndrew Sapperstein    }
4565e5ac748eadbb17eee84b39a424b8b9270ade46cVikram Aggarwal}
457