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