OnePaneController.java revision 37a20ca39be842b4b4cb54d5b5ed418d49d950cf
1a55b36cb6b75ce8096812183651e89115300975aVikram Aggarwal/******************************************************************************* 2a55b36cb6b75ce8096812183651e89115300975aVikram Aggarwal * Copyright (C) 2012 Google Inc. 3a55b36cb6b75ce8096812183651e89115300975aVikram Aggarwal * Licensed to The Android Open Source Project. 4a55b36cb6b75ce8096812183651e89115300975aVikram Aggarwal * 5a55b36cb6b75ce8096812183651e89115300975aVikram Aggarwal * Licensed under the Apache License, Version 2.0 (the "License"); 6a55b36cb6b75ce8096812183651e89115300975aVikram Aggarwal * you may not use this file except in compliance with the License. 7a55b36cb6b75ce8096812183651e89115300975aVikram Aggarwal * You may obtain a copy of the License at 8a55b36cb6b75ce8096812183651e89115300975aVikram Aggarwal * 9a55b36cb6b75ce8096812183651e89115300975aVikram Aggarwal * http://www.apache.org/licenses/LICENSE-2.0 10a55b36cb6b75ce8096812183651e89115300975aVikram Aggarwal * 11a55b36cb6b75ce8096812183651e89115300975aVikram Aggarwal * Unless required by applicable law or agreed to in writing, software 12a55b36cb6b75ce8096812183651e89115300975aVikram Aggarwal * distributed under the License is distributed on an "AS IS" BASIS, 13a55b36cb6b75ce8096812183651e89115300975aVikram Aggarwal * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14a55b36cb6b75ce8096812183651e89115300975aVikram Aggarwal * See the License for the specific language governing permissions and 15a55b36cb6b75ce8096812183651e89115300975aVikram Aggarwal * limitations under the License. 16a55b36cb6b75ce8096812183651e89115300975aVikram Aggarwal *******************************************************************************/ 17a55b36cb6b75ce8096812183651e89115300975aVikram Aggarwal 18a55b36cb6b75ce8096812183651e89115300975aVikram Aggarwalpackage com.android.mail.ui; 19a55b36cb6b75ce8096812183651e89115300975aVikram Aggarwal 20d7a12cd5b5c2639b653d8c671b04844ef02ee01dVikram Aggarwalimport android.app.Fragment; 21632721e6b3a9ba8c476456f2e0fb1b564561e0b5Andy Huangimport android.app.FragmentManager; 22d7a12cd5b5c2639b653d8c671b04844ef02ee01dVikram Aggarwalimport android.app.FragmentTransaction; 231ee96b2b100546b5b69ad42c5bc3755a4293d1a3Andy Huangimport android.app.LoaderManager.LoaderCallbacks; 24559c3b3d302b3f6d2c2cb43a909069d942652e34Mindy Pereiraimport android.net.Uri; 251ddcf0f2bf44d3c9db89112ef52510d9b2433ac4Vikram Aggarwalimport android.os.Bundle; 268e65c6d2527c7539b689e0e8548c84f690badca5Rohan Shahimport android.support.v4.widget.DrawerLayout; 27feb5b1ef0c9489c1ea727177f8bd423250b64990Scott Kennedyimport android.widget.ListView; 288e65c6d2527c7539b689e0e8548c84f690badca5Rohan Shah 29d7a12cd5b5c2639b653d8c671b04844ef02ee01dVikram Aggarwalimport com.android.mail.ConversationListContext; 301ddcf0f2bf44d3c9db89112ef52510d9b2433ac4Vikram Aggarwalimport com.android.mail.R; 31cd09f5e9bf55e6f4310e8dc9408132b9c88e87c3Vikram Aggarwalimport com.android.mail.providers.Account; 329b87568c9e9f1c32a9672b315229866a58a1e757Mindy Pereiraimport com.android.mail.providers.Conversation; 333982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereiraimport com.android.mail.providers.Folder; 34fbe4019a262f6b1934a44e598009ae63dc5745eeMindy Pereiraimport com.android.mail.providers.UIProvider; 359e85333dfc57e7c98ffef27cded4712ea598f554Paul Westbrookimport com.android.mail.utils.LogUtils; 36c59dd8270215f97d39697dae9e69976bcfe3642bmindypimport com.android.mail.utils.Utils; 37fbe4019a262f6b1934a44e598009ae63dc5745eeMindy Pereira 38a55b36cb6b75ce8096812183651e89115300975aVikram Aggarwal/** 39a55b36cb6b75ce8096812183651e89115300975aVikram Aggarwal * Controller for one-pane Mail activity. One Pane is used for phones, where screen real estate is 40d7a12cd5b5c2639b653d8c671b04844ef02ee01dVikram Aggarwal * limited. This controller also does the layout, since the layout is simpler in the one pane case. 41a55b36cb6b75ce8096812183651e89115300975aVikram Aggarwal */ 42a55b36cb6b75ce8096812183651e89115300975aVikram Aggarwal 43a55b36cb6b75ce8096812183651e89115300975aVikram Aggarwal// Called OnePaneActivityController in Gmail. 44a76e5aeff4a54ec70661de35be4f3ecb9d1d2fe2Mindy Pereirapublic final class OnePaneController extends AbstractActivityController { 452bfb5c0fa1cfe7f25c121d6435dc1a04439f7bacVikram Aggarwal /** Key used to store {@link #mLastFolderListTransactionId}. */ 463982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira private static final String FOLDER_LIST_TRANSACTION_KEY = "folder-list-transaction"; 472bfb5c0fa1cfe7f25c121d6435dc1a04439f7bacVikram Aggarwal /** Key used to store {@link #mLastInboxConversationListTransactionId} */ 480e3fd9d61bc18ad9f828bb3c4dd24fc851f11df5Paul Westbrook private static final String INBOX_CONVERSATION_LIST_TRANSACTION_KEY = 490e3fd9d61bc18ad9f828bb3c4dd24fc851f11df5Paul Westbrook "inbox_conversation-list-transaction"; 502bfb5c0fa1cfe7f25c121d6435dc1a04439f7bacVikram Aggarwal /** Key used to store {@link #mLastConversationListTransactionId} */ 513982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira private static final String CONVERSATION_LIST_TRANSACTION_KEY = "conversation-list-transaction"; 522bfb5c0fa1cfe7f25c121d6435dc1a04439f7bacVikram Aggarwal /** Key used to store {@link #mLastConversationTransactionId}. */ 533982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira private static final String CONVERSATION_TRANSACTION_KEY = "conversation-transaction"; 542bfb5c0fa1cfe7f25c121d6435dc1a04439f7bacVikram Aggarwal /** Key used to store {@link #mConversationListVisible}. */ 55649b9ea3653da73fac0c33c8fb0af18baad12ac3Vikram Aggarwal private static final String CONVERSATION_LIST_VISIBLE_KEY = "conversation-list-visible"; 562bfb5c0fa1cfe7f25c121d6435dc1a04439f7bacVikram Aggarwal /** Key used to store {@link #mConversationListNeverShown}. */ 57649b9ea3653da73fac0c33c8fb0af18baad12ac3Vikram Aggarwal private static final String CONVERSATION_LIST_NEVER_SHOWN_KEY = "conversation-list-never-shown"; 582bfb5c0fa1cfe7f25c121d6435dc1a04439f7bacVikram Aggarwal /** Key to store {@link #mInbox}. */ 592bfb5c0fa1cfe7f25c121d6435dc1a04439f7bacVikram Aggarwal private final static String SAVED_INBOX_KEY = "m-inbox"; 602d50bcdca57756ecad20d21da0d936243215b79cPaul Westbrook 613982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira private static final int INVALID_ID = -1; 622175d0a93263672d4498458c81b404b0999134baVikram Aggarwal private boolean mConversationListVisible = false; 630e3fd9d61bc18ad9f828bb3c4dd24fc851f11df5Paul Westbrook private int mLastInboxConversationListTransactionId = INVALID_ID; 643982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira private int mLastConversationListTransactionId = INVALID_ID; 653982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira private int mLastConversationTransactionId = INVALID_ID; 663982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira private int mLastFolderListTransactionId = INVALID_ID; 673982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira private Folder mInbox; 68cd09f5e9bf55e6f4310e8dc9408132b9c88e87c3Vikram Aggarwal /** Whether a conversation list for this account has ever been shown.*/ 69cd09f5e9bf55e6f4310e8dc9408132b9c88e87c3Vikram Aggarwal private boolean mConversationListNeverShown = true; 70713156d695326e3d5a1d0726ea1ec0d1d490bd30Rohan Shah 71a55b36cb6b75ce8096812183651e89115300975aVikram Aggarwal public OnePaneController(MailActivity activity, ViewMode viewMode) { 72a55b36cb6b75ce8096812183651e89115300975aVikram Aggarwal super(activity, viewMode); 73a55b36cb6b75ce8096812183651e89115300975aVikram Aggarwal } 74a55b36cb6b75ce8096812183651e89115300975aVikram Aggarwal 751ddcf0f2bf44d3c9db89112ef52510d9b2433ac4Vikram Aggarwal @Override 76632721e6b3a9ba8c476456f2e0fb1b564561e0b5Andy Huang public void onRestoreInstanceState(Bundle inState) { 77632721e6b3a9ba8c476456f2e0fb1b564561e0b5Andy Huang super.onRestoreInstanceState(inState); 78649b9ea3653da73fac0c33c8fb0af18baad12ac3Vikram Aggarwal if (inState == null) { 79649b9ea3653da73fac0c33c8fb0af18baad12ac3Vikram Aggarwal return; 803982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira } 81649b9ea3653da73fac0c33c8fb0af18baad12ac3Vikram Aggarwal mLastFolderListTransactionId = inState.getInt(FOLDER_LIST_TRANSACTION_KEY, INVALID_ID); 82649b9ea3653da73fac0c33c8fb0af18baad12ac3Vikram Aggarwal mLastInboxConversationListTransactionId = 83649b9ea3653da73fac0c33c8fb0af18baad12ac3Vikram Aggarwal inState.getInt(INBOX_CONVERSATION_LIST_TRANSACTION_KEY, INVALID_ID); 84649b9ea3653da73fac0c33c8fb0af18baad12ac3Vikram Aggarwal mLastConversationListTransactionId = 85649b9ea3653da73fac0c33c8fb0af18baad12ac3Vikram Aggarwal inState.getInt(CONVERSATION_LIST_TRANSACTION_KEY, INVALID_ID); 86649b9ea3653da73fac0c33c8fb0af18baad12ac3Vikram Aggarwal mLastConversationTransactionId = inState.getInt(CONVERSATION_TRANSACTION_KEY, INVALID_ID); 87649b9ea3653da73fac0c33c8fb0af18baad12ac3Vikram Aggarwal mConversationListVisible = inState.getBoolean(CONVERSATION_LIST_VISIBLE_KEY); 88649b9ea3653da73fac0c33c8fb0af18baad12ac3Vikram Aggarwal mConversationListNeverShown = inState.getBoolean(CONVERSATION_LIST_NEVER_SHOWN_KEY); 892bfb5c0fa1cfe7f25c121d6435dc1a04439f7bacVikram Aggarwal mInbox = inState.getParcelable(SAVED_INBOX_KEY); 903982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira } 913982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira 923982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira @Override 933982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira public void onSaveInstanceState(Bundle outState) { 943982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira super.onSaveInstanceState(outState); 953982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira outState.putInt(FOLDER_LIST_TRANSACTION_KEY, mLastFolderListTransactionId); 960e3fd9d61bc18ad9f828bb3c4dd24fc851f11df5Paul Westbrook outState.putInt(INBOX_CONVERSATION_LIST_TRANSACTION_KEY, 970e3fd9d61bc18ad9f828bb3c4dd24fc851f11df5Paul Westbrook mLastInboxConversationListTransactionId); 983982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira outState.putInt(CONVERSATION_LIST_TRANSACTION_KEY, mLastConversationListTransactionId); 993982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira outState.putInt(CONVERSATION_TRANSACTION_KEY, mLastConversationTransactionId); 100649b9ea3653da73fac0c33c8fb0af18baad12ac3Vikram Aggarwal outState.putBoolean(CONVERSATION_LIST_VISIBLE_KEY, mConversationListVisible); 101649b9ea3653da73fac0c33c8fb0af18baad12ac3Vikram Aggarwal outState.putBoolean(CONVERSATION_LIST_NEVER_SHOWN_KEY, mConversationListNeverShown); 1022bfb5c0fa1cfe7f25c121d6435dc1a04439f7bacVikram Aggarwal outState.putParcelable(SAVED_INBOX_KEY, mInbox); 1033982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira } 1043982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira 1053982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira @Override 106d7a12cd5b5c2639b653d8c671b04844ef02ee01dVikram Aggarwal public void resetActionBarIcon() { 1071dd054f4e5581b69a52936c9d257fa91cb6daee7Rohan Shah // Calling resetActionBarIcon should never remove the up affordance 1081dd054f4e5581b69a52936c9d257fa91cb6daee7Rohan Shah // even when waiting for sync (Folder list should still show with one 1091dd054f4e5581b69a52936c9d257fa91cb6daee7Rohan Shah // account. Currently this method is blank to avoid any changes. 110d7a12cd5b5c2639b653d8c671b04844ef02ee01dVikram Aggarwal } 111d7a12cd5b5c2639b653d8c671b04844ef02ee01dVikram Aggarwal 1127dd054e39986de84a213c56a3c11ac94731402e6Vikram Aggarwal /** 1137c7043b2b546bb638ef1ca69c978ee8d3f41debbVikram Aggarwal * Returns true if the candidate URI is the URI for the default inbox for the given account. 1143e068bab6009a758309f07ddcea3d6171feac635Vikram Aggarwal * @param candidate the URI to check 1153e068bab6009a758309f07ddcea3d6171feac635Vikram Aggarwal * @param account the account whose default Inbox the candidate might be 1163e068bab6009a758309f07ddcea3d6171feac635Vikram Aggarwal * @return true if the candidate is indeed the default inbox for the given account. 1177c7043b2b546bb638ef1ca69c978ee8d3f41debbVikram Aggarwal */ 1183e068bab6009a758309f07ddcea3d6171feac635Vikram Aggarwal private static boolean isDefaultInbox(Uri candidate, Account account) { 1193e068bab6009a758309f07ddcea3d6171feac635Vikram Aggarwal return (candidate != null && account != null) 1203e068bab6009a758309f07ddcea3d6171feac635Vikram Aggarwal && candidate.equals(account.settings.defaultInbox); 1217c7043b2b546bb638ef1ca69c978ee8d3f41debbVikram Aggarwal } 1227c7043b2b546bb638ef1ca69c978ee8d3f41debbVikram Aggarwal 1237c7043b2b546bb638ef1ca69c978ee8d3f41debbVikram Aggarwal /** 1247dd054e39986de84a213c56a3c11ac94731402e6Vikram Aggarwal * Returns true if the user is currently in the conversation list view, viewing the default 1257dd054e39986de84a213c56a3c11ac94731402e6Vikram Aggarwal * inbox. 1263e068bab6009a758309f07ddcea3d6171feac635Vikram Aggarwal * @return true if user is in conversation list mode, viewing the default inbox. 1277dd054e39986de84a213c56a3c11ac94731402e6Vikram Aggarwal */ 1282074a056bb2a634c66996225c55620d2aa6f7ac5Vikram Aggarwal private static boolean inInbox(final Account account, final ConversationListContext context) { 1292074a056bb2a634c66996225c55620d2aa6f7ac5Vikram Aggarwal // If we don't have valid state, then we are not in the inbox. 1303e068bab6009a758309f07ddcea3d6171feac635Vikram Aggarwal return !(account == null || context == null || context.folder == null 1313e068bab6009a758309f07ddcea3d6171feac635Vikram Aggarwal || account.settings == null) && !ConversationListContext.isSearchResult(context) 1327c7043b2b546bb638ef1ca69c978ee8d3f41debbVikram Aggarwal && isDefaultInbox(context.folder.uri, account); 1333982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira } 1343982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira 1358e65c6d2527c7539b689e0e8548c84f690badca5Rohan Shah /** 1368e65c6d2527c7539b689e0e8548c84f690badca5Rohan Shah * On account change, carry out super implementation, load FolderListFragment 1378e65c6d2527c7539b689e0e8548c84f690badca5Rohan Shah * into drawer (to avoid repetitive calls to replaceFragment). 1388e65c6d2527c7539b689e0e8548c84f690badca5Rohan Shah */ 139d7a12cd5b5c2639b653d8c671b04844ef02ee01dVikram Aggarwal @Override 1405fd8afd5c1b40580c069a5a97039ca0601208216Vikram Aggarwal public void changeAccount(Account account) { 1415fd8afd5c1b40580c069a5a97039ca0601208216Vikram Aggarwal super.changeAccount(account); 142cd09f5e9bf55e6f4310e8dc9408132b9c88e87c3Vikram Aggarwal mConversationListNeverShown = true; 14323b528f182f14ef7ec1f1a4eb8d8ee9b8f04a2f2Vikram Aggarwal closeDrawerIfOpen(); 144cd09f5e9bf55e6f4310e8dc9408132b9c88e87c3Vikram Aggarwal } 145cd09f5e9bf55e6f4310e8dc9408132b9c88e87c3Vikram Aggarwal 146cd09f5e9bf55e6f4310e8dc9408132b9c88e87c3Vikram Aggarwal @Override 147d7a12cd5b5c2639b653d8c671b04844ef02ee01dVikram Aggarwal public boolean onCreate(Bundle savedInstanceState) { 1481ddcf0f2bf44d3c9db89112ef52510d9b2433ac4Vikram Aggarwal mActivity.setContentView(R.layout.one_pane_activity); 1498e65c6d2527c7539b689e0e8548c84f690badca5Rohan Shah mDrawerContainer = (DrawerLayout) mActivity.findViewById(R.id.drawer_container); 15012b3ee458e04ac7e0b69302e671d10b24a5c98cfAndy Huang mDrawerPullout = mDrawerContainer.findViewById(R.id.drawer_pullout); 1511aced4cbbb00618e6e1eb34438b5769ef5180e69Andy Huang mDrawerPullout.setBackgroundResource(R.color.list_background_color); 15257246a4bf94e8b440c0597fa4a8e4f4e8a46532aPaul Westbrook 153d7a12cd5b5c2639b653d8c671b04844ef02ee01dVikram Aggarwal // The parent class sets the correct viewmode and starts the application off. 154d7a12cd5b5c2639b653d8c671b04844ef02ee01dVikram Aggarwal return super.onCreate(savedInstanceState); 1551ddcf0f2bf44d3c9db89112ef52510d9b2433ac4Vikram Aggarwal } 1561ddcf0f2bf44d3c9db89112ef52510d9b2433ac4Vikram Aggarwal 15757246a4bf94e8b440c0597fa4a8e4f4e8a46532aPaul Westbrook @Override 1581ddcf0f2bf44d3c9db89112ef52510d9b2433ac4Vikram Aggarwal protected boolean isConversationListVisible() { 1592175d0a93263672d4498458c81b404b0999134baVikram Aggarwal return mConversationListVisible; 1601ddcf0f2bf44d3c9db89112ef52510d9b2433ac4Vikram Aggarwal } 161d7a12cd5b5c2639b653d8c671b04844ef02ee01dVikram Aggarwal 162d7a12cd5b5c2639b653d8c671b04844ef02ee01dVikram Aggarwal @Override 163d7a12cd5b5c2639b653d8c671b04844ef02ee01dVikram Aggarwal public void onViewModeChanged(int newMode) { 164d7a12cd5b5c2639b653d8c671b04844ef02ee01dVikram Aggarwal super.onViewModeChanged(newMode); 165eb89afee9bcdacaf82dfd9033ae752fca5571ac3Rohan Shah 166632721e6b3a9ba8c476456f2e0fb1b564561e0b5Andy Huang // When entering conversation list mode, hide and clean up any currently visible 167632721e6b3a9ba8c476456f2e0fb1b564561e0b5Andy Huang // conversation. 16849e0e991fe8880852b936a0f8d7d57c5b36f2154Vikram Aggarwal if (ViewMode.isListMode(newMode)) { 169a3ed834c959ece3453c1b34953fabecb3b19c424Andy Huang mPagerController.hide(true /* changeVisibility */); 170632721e6b3a9ba8c476456f2e0fb1b564561e0b5Andy Huang } 17149e0e991fe8880852b936a0f8d7d57c5b36f2154Vikram Aggarwal // When we step away from the conversation mode, we don't have a current conversation 17249e0e991fe8880852b936a0f8d7d57c5b36f2154Vikram Aggarwal // anymore. Let's blank it out so clients calling getCurrentConversation are not misled. 17349e0e991fe8880852b936a0f8d7d57c5b36f2154Vikram Aggarwal if (!ViewMode.isConversationMode(newMode)) { 17449e0e991fe8880852b936a0f8d7d57c5b36f2154Vikram Aggarwal setCurrentConversation(null); 17549e0e991fe8880852b936a0f8d7d57c5b36f2154Vikram Aggarwal } 176d7a12cd5b5c2639b653d8c671b04844ef02ee01dVikram Aggarwal } 177d7a12cd5b5c2639b653d8c671b04844ef02ee01dVikram Aggarwal 178d7a12cd5b5c2639b653d8c671b04844ef02ee01dVikram Aggarwal @Override 1796214ee405453b79f08859025fee5ed361d5499feAndy Huang public String toString() { 1806214ee405453b79f08859025fee5ed361d5499feAndy Huang final StringBuilder sb = new StringBuilder(super.toString()); 1816214ee405453b79f08859025fee5ed361d5499feAndy Huang sb.append("{lastFolderListTransId="); 1826214ee405453b79f08859025fee5ed361d5499feAndy Huang sb.append(mLastFolderListTransactionId); 1836214ee405453b79f08859025fee5ed361d5499feAndy Huang sb.append(" lastInboxTransId="); 1846214ee405453b79f08859025fee5ed361d5499feAndy Huang sb.append(mLastInboxConversationListTransactionId); 1856214ee405453b79f08859025fee5ed361d5499feAndy Huang sb.append(" lastConvListTransId="); 1866214ee405453b79f08859025fee5ed361d5499feAndy Huang sb.append(mLastConversationListTransactionId); 1876214ee405453b79f08859025fee5ed361d5499feAndy Huang sb.append("}"); 1886214ee405453b79f08859025fee5ed361d5499feAndy Huang return sb.toString(); 1896214ee405453b79f08859025fee5ed361d5499feAndy Huang } 1906214ee405453b79f08859025fee5ed361d5499feAndy Huang 1916214ee405453b79f08859025fee5ed361d5499feAndy Huang @Override 1929b87568c9e9f1c32a9672b315229866a58a1e757Mindy Pereira public void showConversationList(ConversationListContext listContext) { 193e128fc21fab03f6d66c656efeee2155fab449a7fVikram Aggarwal super.showConversationList(listContext); 194e128fc21fab03f6d66c656efeee2155fab449a7fVikram Aggarwal enableCabMode(); 19512b3ee458e04ac7e0b69302e671d10b24a5c98cfAndy Huang mConversationListVisible = true; 196ae4ea997d3d3f3c8c11fc5a3e7f9d49f82b4e2e7Vikram Aggarwal if (ConversationListContext.isSearchResult(listContext)) { 19768f2e222b4ffccd9f67f02b3a9cfdb3841a7eb43Mindy Pereira mViewMode.enterSearchResultsListMode(); 19868f2e222b4ffccd9f67f02b3a9cfdb3841a7eb43Mindy Pereira } else { 19968f2e222b4ffccd9f67f02b3a9cfdb3841a7eb43Mindy Pereira mViewMode.enterConversationListMode(); 20068f2e222b4ffccd9f67f02b3a9cfdb3841a7eb43Mindy Pereira } 201cd09f5e9bf55e6f4310e8dc9408132b9c88e87c3Vikram Aggarwal final int transition = mConversationListNeverShown 202cd09f5e9bf55e6f4310e8dc9408132b9c88e87c3Vikram Aggarwal ? FragmentTransaction.TRANSIT_FRAGMENT_FADE 2039b87568c9e9f1c32a9672b315229866a58a1e757Mindy Pereira : FragmentTransaction.TRANSIT_FRAGMENT_OPEN; 20437a20ca39be842b4b4cb54d5b5ed418d49d950cfVikram Aggarwal final Fragment conversationListFragment = 20537a20ca39be842b4b4cb54d5b5ed418d49d950cfVikram Aggarwal ConversationListFragment.newInstance(listContext); 206bf232c3735f65b1a4746943e4a134e59e36f0bdePaul Westbrook 2076214ee405453b79f08859025fee5ed361d5499feAndy Huang if (!inInbox(mAccount, listContext)) { 2083982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira // Maintain fragment transaction history so we can get back to the 2093982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira // fragment used to launch this list. 2106214ee405453b79f08859025fee5ed361d5499feAndy Huang mLastConversationListTransactionId = replaceFragmentWithBack(conversationListFragment, 2118e65c6d2527c7539b689e0e8548c84f690badca5Rohan Shah transition, TAG_CONVERSATION_LIST, R.id.content_pane); 2123982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira } else { 2133982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira // If going to the inbox, clear the folder list transaction history. 2143982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira mInbox = listContext.folder; 2156214ee405453b79f08859025fee5ed361d5499feAndy Huang mLastInboxConversationListTransactionId = replaceFragmentWithBack( 2166214ee405453b79f08859025fee5ed361d5499feAndy Huang conversationListFragment, transition, TAG_CONVERSATION_LIST, R.id.content_pane); 2176214ee405453b79f08859025fee5ed361d5499feAndy Huang 2186214ee405453b79f08859025fee5ed361d5499feAndy Huang // FIXME: "forgetting" the folder list entry in the back stack doesn't remove it from 2196214ee405453b79f08859025fee5ed361d5499feAndy Huang // the back stack. only popping past it can remove it. 2206214ee405453b79f08859025fee5ed361d5499feAndy Huang // Maybe we should clear the back stack prior to opening a folder. 2213982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira mLastFolderListTransactionId = INVALID_ID; 2220e3fd9d61bc18ad9f828bb3c4dd24fc851f11df5Paul Westbrook 2230e3fd9d61bc18ad9f828bb3c4dd24fc851f11df5Paul Westbrook // If we ever to to the inbox, we want to unset the transation id for any other 2240e3fd9d61bc18ad9f828bb3c4dd24fc851f11df5Paul Westbrook // non-inbox folder. 2250e3fd9d61bc18ad9f828bb3c4dd24fc851f11df5Paul Westbrook mLastConversationListTransactionId = INVALID_ID; 2263982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira } 22708b0a0dc9e77697c58f39ae9c49b3b884af29c71Andy Huang 22808b0a0dc9e77697c58f39ae9c49b3b884af29c71Andy Huang mActivity.getFragmentManager().executePendingTransactions(); 22908b0a0dc9e77697c58f39ae9c49b3b884af29c71Andy Huang 2307dd054e39986de84a213c56a3c11ac94731402e6Vikram Aggarwal onConversationVisibilityChanged(false); 2319f119c72042e4d0382017d5ddcee9aa2113b6425Paul Westbrook onConversationListVisibilityChanged(true); 232cd09f5e9bf55e6f4310e8dc9408132b9c88e87c3Vikram Aggarwal mConversationListNeverShown = false; 23328d5f72e0ad0db75b6243ee8125bfe3aadbdcb85Mindy Pereira } 23428d5f72e0ad0db75b6243ee8125bfe3aadbdcb85Mindy Pereira 23528d5f72e0ad0db75b6243ee8125bfe3aadbdcb85Mindy Pereira @Override 2361ee96b2b100546b5b69ad42c5bc3755a4293d1a3Andy Huang protected void showConversation(Conversation conversation, boolean inLoaderCallbacks) { 2371ee96b2b100546b5b69ad42c5bc3755a4293d1a3Andy Huang super.showConversation(conversation, inLoaderCallbacks); 23812b3ee458e04ac7e0b69302e671d10b24a5c98cfAndy Huang mConversationListVisible = false; 2393d7ca9d2aefd20dc115f20532c1e19fdb60f7d68Vikram Aggarwal if (conversation == null) { 2401ee96b2b100546b5b69ad42c5bc3755a4293d1a3Andy Huang transitionBackToConversationListMode(inLoaderCallbacks); 2413d7ca9d2aefd20dc115f20532c1e19fdb60f7d68Vikram Aggarwal return; 2423d7ca9d2aefd20dc115f20532c1e19fdb60f7d68Vikram Aggarwal } 243e128fc21fab03f6d66c656efeee2155fab449a7fVikram Aggarwal disableCabMode(); 244ae4ea997d3d3f3c8c11fc5a3e7f9d49f82b4e2e7Vikram Aggarwal if (ConversationListContext.isSearchResult(mConvListContext)) { 24568f2e222b4ffccd9f67f02b3a9cfdb3841a7eb43Mindy Pereira mViewMode.enterSearchResultsConversationMode(); 24668f2e222b4ffccd9f67f02b3a9cfdb3841a7eb43Mindy Pereira } else { 24768f2e222b4ffccd9f67f02b3a9cfdb3841a7eb43Mindy Pereira mViewMode.enterConversationMode(); 24868f2e222b4ffccd9f67f02b3a9cfdb3841a7eb43Mindy Pereira } 2497dd054e39986de84a213c56a3c11ac94731402e6Vikram Aggarwal final FragmentManager fm = mActivity.getFragmentManager(); 250f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp final FragmentTransaction ft = fm.beginTransaction(); 251f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp ft.addToBackStack(null); 252f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp // Switching to conversation view is an incongruous transition: 253f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp // we are not replacing a fragment with another fragment as 254f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp // usual. Instead, reveal the heretofore inert conversation 255f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp // ViewPager and just remove the previously visible fragment 256f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp // e.g. conversation list, or possibly label list?). 2577dd054e39986de84a213c56a3c11ac94731402e6Vikram Aggarwal final Fragment f = fm.findFragmentById(R.id.content_pane); 258deab11995a1ebb83b24bf567508440088ec943bfPaul Westbrook // FragmentManager#findFragmentById can return fragments that are not added to the activity. 259deab11995a1ebb83b24bf567508440088ec943bfPaul Westbrook // We want to make sure that we don't attempt to remove fragments that are not added to the 260deab11995a1ebb83b24bf567508440088ec943bfPaul Westbrook // activity, as when the transaction is popped off, the FragmentManager will attempt to 261deab11995a1ebb83b24bf567508440088ec943bfPaul Westbrook // readd the same fragment twice 262deab11995a1ebb83b24bf567508440088ec943bfPaul Westbrook if (f != null && f.isAdded()) { 2632b703c6c71a369485efc8ade26d449d25669ceecVikram Aggarwal ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN); 2642b703c6c71a369485efc8ade26d449d25669ceecVikram Aggarwal ft.remove(f); 2652b703c6c71a369485efc8ade26d449d25669ceecVikram Aggarwal ft.commitAllowingStateLoss(); 2666214ee405453b79f08859025fee5ed361d5499feAndy Huang fm.executePendingTransactions(); 267632721e6b3a9ba8c476456f2e0fb1b564561e0b5Andy Huang } 268a3ed834c959ece3453c1b34953fabecb3b19c424Andy Huang mPagerController.show(mAccount, mFolder, conversation, true /* changeVisibility */); 2697dd054e39986de84a213c56a3c11ac94731402e6Vikram Aggarwal onConversationVisibilityChanged(true); 2709f119c72042e4d0382017d5ddcee9aa2113b6425Paul Westbrook onConversationListVisibilityChanged(false); 2719b87568c9e9f1c32a9672b315229866a58a1e757Mindy Pereira } 2729b87568c9e9f1c32a9672b315229866a58a1e757Mindy Pereira 2739b87568c9e9f1c32a9672b315229866a58a1e757Mindy Pereira @Override 2742d50bcdca57756ecad20d21da0d936243215b79cPaul Westbrook public void showWaitForInitialization() { 2752d50bcdca57756ecad20d21da0d936243215b79cPaul Westbrook super.showWaitForInitialization(); 2768e65c6d2527c7539b689e0e8548c84f690badca5Rohan Shah replaceFragment(getWaitFragment(), FragmentTransaction.TRANSIT_FRAGMENT_OPEN, TAG_WAIT, 2778e65c6d2527c7539b689e0e8548c84f690badca5Rohan Shah R.id.content_pane); 2782d50bcdca57756ecad20d21da0d936243215b79cPaul Westbrook } 2792d50bcdca57756ecad20d21da0d936243215b79cPaul Westbrook 280a3f43d4c2423ab03bdae925042fe8440b7f70025Vikram Aggarwal @Override 281dd6a7ce32c4003bd0941e2f18fcf5b80b5cd43c5Vikram Aggarwal protected void hideWaitForInitialization() { 2822d50bcdca57756ecad20d21da0d936243215b79cPaul Westbrook transitionToInbox(); 283a3f43d4c2423ab03bdae925042fe8440b7f70025Vikram Aggarwal super.hideWaitForInitialization(); 2842d50bcdca57756ecad20d21da0d936243215b79cPaul Westbrook } 2852d50bcdca57756ecad20d21da0d936243215b79cPaul Westbrook 2862d50bcdca57756ecad20d21da0d936243215b79cPaul Westbrook @Override 28717a8e78d61bff414610e23f24889bab29955f54emindyp public boolean doesActionChangeConversationListVisibility(int action) { 28817a8e78d61bff414610e23f24889bab29955f54emindyp switch (action) { 28917a8e78d61bff414610e23f24889bab29955f54emindyp case R.id.archive: 29017a8e78d61bff414610e23f24889bab29955f54emindyp case R.id.remove_folder: 29117a8e78d61bff414610e23f24889bab29955f54emindyp case R.id.delete: 29217a8e78d61bff414610e23f24889bab29955f54emindyp case R.id.discard_drafts: 29317a8e78d61bff414610e23f24889bab29955f54emindyp case R.id.mark_important: 29417a8e78d61bff414610e23f24889bab29955f54emindyp case R.id.mark_not_important: 29517a8e78d61bff414610e23f24889bab29955f54emindyp case R.id.mute: 29617a8e78d61bff414610e23f24889bab29955f54emindyp case R.id.report_spam: 29717a8e78d61bff414610e23f24889bab29955f54emindyp case R.id.mark_not_spam: 29817a8e78d61bff414610e23f24889bab29955f54emindyp case R.id.report_phishing: 29917a8e78d61bff414610e23f24889bab29955f54emindyp case R.id.refresh: 30017a8e78d61bff414610e23f24889bab29955f54emindyp case R.id.change_folder: 30117a8e78d61bff414610e23f24889bab29955f54emindyp return false; 30217a8e78d61bff414610e23f24889bab29955f54emindyp default: 30317a8e78d61bff414610e23f24889bab29955f54emindyp return true; 30417a8e78d61bff414610e23f24889bab29955f54emindyp } 30517a8e78d61bff414610e23f24889bab29955f54emindyp } 30617a8e78d61bff414610e23f24889bab29955f54emindyp 3078e65c6d2527c7539b689e0e8548c84f690badca5Rohan Shah /** 3086902dcf8688d7d0691639f49365a78a3a78fe9e3Vikram Aggarwal * Replace the content_pane with the fragment specified here. The tag is specified so that 3096902dcf8688d7d0691639f49365a78a3a78fe9e3Vikram Aggarwal * the {@link ActivityController} can look up the fragments through the 3106214ee405453b79f08859025fee5ed361d5499feAndy Huang * {@link android.app.FragmentManager}. This action will be placed on the back stack. 3113e068bab6009a758309f07ddcea3d6171feac635Vikram Aggarwal * @param fragment the new fragment to put 3123e068bab6009a758309f07ddcea3d6171feac635Vikram Aggarwal * @param transition the transition to show 3133e068bab6009a758309f07ddcea3d6171feac635Vikram Aggarwal * @param tag a tag for the fragment manager. 3148e65c6d2527c7539b689e0e8548c84f690badca5Rohan Shah * @param anchor ID of view to replace fragment in 3156902dcf8688d7d0691639f49365a78a3a78fe9e3Vikram Aggarwal * @return transaction ID returned when the transition is committed. 3166902dcf8688d7d0691639f49365a78a3a78fe9e3Vikram Aggarwal */ 3176214ee405453b79f08859025fee5ed361d5499feAndy Huang private int replaceFragmentWithBack(Fragment fragment, int transition, String tag, int anchor) { 3186214ee405453b79f08859025fee5ed361d5499feAndy Huang return replaceFragment(fragment, transition, tag, anchor, true); 3196214ee405453b79f08859025fee5ed361d5499feAndy Huang } 3206214ee405453b79f08859025fee5ed361d5499feAndy Huang 3216214ee405453b79f08859025fee5ed361d5499feAndy Huang // (Not on the back stack -> no transaction ID to return.) 3226214ee405453b79f08859025fee5ed361d5499feAndy Huang private void replaceFragment(Fragment fragment, int transition, String tag, int anchor) { 3236214ee405453b79f08859025fee5ed361d5499feAndy Huang replaceFragment(fragment, transition, tag, anchor, false); 3246214ee405453b79f08859025fee5ed361d5499feAndy Huang } 3256214ee405453b79f08859025fee5ed361d5499feAndy Huang 3266214ee405453b79f08859025fee5ed361d5499feAndy Huang private int replaceFragment(Fragment fragment, int transition, String tag, int anchor, 3276214ee405453b79f08859025fee5ed361d5499feAndy Huang boolean addToBackStack) { 3286214ee405453b79f08859025fee5ed361d5499feAndy Huang final FragmentManager fm = mActivity.getFragmentManager(); 3296214ee405453b79f08859025fee5ed361d5499feAndy Huang FragmentTransaction fragmentTransaction = fm.beginTransaction(); 330d7a12cd5b5c2639b653d8c671b04844ef02ee01dVikram Aggarwal fragmentTransaction.setTransition(transition); 3316214ee405453b79f08859025fee5ed361d5499feAndy Huang if (addToBackStack) { 3326214ee405453b79f08859025fee5ed361d5499feAndy Huang fragmentTransaction.addToBackStack(null); 3336214ee405453b79f08859025fee5ed361d5499feAndy Huang } 3348e65c6d2527c7539b689e0e8548c84f690badca5Rohan Shah fragmentTransaction.replace(anchor, fragment, tag); 3356214ee405453b79f08859025fee5ed361d5499feAndy Huang final int id = fragmentTransaction.commitAllowingStateLoss(); 3366214ee405453b79f08859025fee5ed361d5499feAndy Huang fm.executePendingTransactions(); 3376214ee405453b79f08859025fee5ed361d5499feAndy Huang return id; 338d7a12cd5b5c2639b653d8c671b04844ef02ee01dVikram Aggarwal } 33901668eb393deaf8c8b8abf86be46109614a98631Mindy Pereira 3403982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira /** 3413982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira * Back works as follows: 3428e65c6d2527c7539b689e0e8548c84f690badca5Rohan Shah * 1) If the drawer is pulled out (Or mid-drag), close it - handled. 3438e65c6d2527c7539b689e0e8548c84f690badca5Rohan Shah * 2) If the user is in the folder list view, go back 3443982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira * to the account default inbox. 3458e65c6d2527c7539b689e0e8548c84f690badca5Rohan Shah * 3) If the user is in a conversation list 3463982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira * that is not the inbox AND: 3473982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira * a) they got there by going through the folder 3483982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira * list view, go back to the folder list view. 3493982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira * b) they got there by using some other means (account dropdown), go back to the inbox. 3508e65c6d2527c7539b689e0e8548c84f690badca5Rohan Shah * 4) If the user is in a conversation, go back to the conversation list they were last in. 3518e65c6d2527c7539b689e0e8548c84f690badca5Rohan Shah * 5) If the user is in the conversation list for the default account inbox, 3523982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira * back exits the app. 3533982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira */ 35401668eb393deaf8c8b8abf86be46109614a98631Mindy Pereira @Override 355c1fb9a9c2730178105977fca629e80951bfc3cdcAndy Huang public boolean handleBackPress() { 3562074a056bb2a634c66996225c55620d2aa6f7ac5Vikram Aggarwal final int mode = mViewMode.getMode(); 3578e65c6d2527c7539b689e0e8548c84f690badca5Rohan Shah 3588e65c6d2527c7539b689e0e8548c84f690badca5Rohan Shah //TODO(shahrk): Remove the folder list standalone view 3593982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira if (mode == ViewMode.FOLDER_LIST) { 360aea87622d3244be963ee4e9f9780e79b34ffe260Paul Westbrook final Folder hierarchyFolder = getHierarchyFolder(); 361aea87622d3244be963ee4e9f9780e79b34ffe260Paul Westbrook final FolderListFragment folderListFragment = getFolderListFragment(); 36254202a343b039d7d6984a7d1c2fc43bfd8f4e0bbVikram Aggarwal final boolean parentHasChildren = folderListFragment != null && 36354202a343b039d7d6984a7d1c2fc43bfd8f4e0bbVikram Aggarwal folderListFragment.showingHierarchy() && hierarchyFolder != null 36454202a343b039d7d6984a7d1c2fc43bfd8f4e0bbVikram Aggarwal && hierarchyFolder.parent != null; 36554202a343b039d7d6984a7d1c2fc43bfd8f4e0bbVikram Aggarwal if (parentHasChildren) { 36611e3596e8c5978d07195ae2d7c8a96bb51aa75b3Mindy Pereira // If we are showing the folder list and the user is exploring 36711e3596e8c5978d07195ae2d7c8a96bb51aa75b3Mindy Pereira // the children of a single parent folder, 36811e3596e8c5978d07195ae2d7c8a96bb51aa75b3Mindy Pereira // back should display the parent folder's parent and siblings. 369ea94550fcca64c3a3510cc10b0e5465d9018668eMindy Pereira goUpFolderHierarchy(hierarchyFolder); 37011e3596e8c5978d07195ae2d7c8a96bb51aa75b3Mindy Pereira } else { 371649b9ea3653da73fac0c33c8fb0af18baad12ac3Vikram Aggarwal // We are at the topmost list of folders: go back 37211e3596e8c5978d07195ae2d7c8a96bb51aa75b3Mindy Pereira mLastFolderListTransactionId = INVALID_ID; 37311e3596e8c5978d07195ae2d7c8a96bb51aa75b3Mindy Pereira transitionToInbox(); 37411e3596e8c5978d07195ae2d7c8a96bb51aa75b3Mindy Pereira } 37568f2e222b4ffccd9f67f02b3a9cfdb3841a7eb43Mindy Pereira } else if (mode == ViewMode.SEARCH_RESULTS_LIST) { 37668f2e222b4ffccd9f67f02b3a9cfdb3841a7eb43Mindy Pereira mActivity.finish(); 377b466bcf49502a1178cf7362a81470f3231d8892bMindy Pereira } else if (mViewMode.isListMode() && !inInbox(mAccount, mConvListContext)) { 37811e3596e8c5978d07195ae2d7c8a96bb51aa75b3Mindy Pereira if (mLastFolderListTransactionId != INVALID_ID) { 379feb5b1ef0c9489c1ea727177f8bd423250b64990Scott Kennedy // Set the hierarchy folder to what it will be once we go up 380feb5b1ef0c9489c1ea727177f8bd423250b64990Scott Kennedy final Folder hierarchyFolder = getHierarchyFolder(); 381feb5b1ef0c9489c1ea727177f8bd423250b64990Scott Kennedy if (hierarchyFolder != null && hierarchyFolder.parent != null) { 382feb5b1ef0c9489c1ea727177f8bd423250b64990Scott Kennedy setHierarchyFolder(hierarchyFolder.parent); 383feb5b1ef0c9489c1ea727177f8bd423250b64990Scott Kennedy } 384feb5b1ef0c9489c1ea727177f8bd423250b64990Scott Kennedy 38511e3596e8c5978d07195ae2d7c8a96bb51aa75b3Mindy Pereira // If the user got here by navigating via the folder list, back 38611e3596e8c5978d07195ae2d7c8a96bb51aa75b3Mindy Pereira // should bring them back to the folder list. 3873982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira mViewMode.enterFolderListMode(); 3883982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira mActivity.getFragmentManager().popBackStack(mLastFolderListTransactionId, 0); 3893982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira } else { 3903982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira transitionToInbox(); 3913982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira } 3926214ee405453b79f08859025fee5ed361d5499feAndy Huang } else if (mViewMode.isConversationMode()) { 3931ee96b2b100546b5b69ad42c5bc3755a4293d1a3Andy Huang transitionBackToConversationListMode(false /* inLoaderCallbacks */); 3943982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira } else { 3953982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira mActivity.finish(); 3963982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira } 397c2c9dc14aa184db1f05b8c060b27d97dda5a3ca4Andrew Sapperstein mToastBar.hide(false); 3983982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira return true; 3993982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira } 4003982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira 40112a4d8040d64501aa5a24c25865c806331560b74Mindy Pereira private void goUpFolderHierarchy(Folder current) { 40212a4d8040d64501aa5a24c25865c806331560b74Mindy Pereira Folder top = current.parent; 40312a4d8040d64501aa5a24c25865c806331560b74Mindy Pereira if (top != null) { 4046214ee405453b79f08859025fee5ed361d5499feAndy Huang // FIXME: This is silly. we worked so hard to add folder fragments to the back stack. 4056214ee405453b79f08859025fee5ed361d5499feAndy Huang // it should either just pop back, or should not use the back stack at all. 4066214ee405453b79f08859025fee5ed361d5499feAndy Huang 40799f18d1504203d2f3a82373dcc0937ef0277561aMindy Pereira setHierarchyFolder(top); 40812a4d8040d64501aa5a24c25865c806331560b74Mindy Pereira // Replace this fragment with a new FolderListFragment 40912a4d8040d64501aa5a24c25865c806331560b74Mindy Pereira // showing this folder's children if we are not already 41012a4d8040d64501aa5a24c25865c806331560b74Mindy Pereira // looking at the child view for this folder. 4116214ee405453b79f08859025fee5ed361d5499feAndy Huang mLastFolderListTransactionId = replaceFragmentWithBack( 412687e64deeafade4709bf0acac1076776bc9ab9a9Rohan Shah FolderListFragment.ofTree(top, false), 413e9dcd245262567c1d294d36faa7f0f23973cb229Vikram Aggarwal FragmentTransaction.TRANSIT_FRAGMENT_OPEN, TAG_FOLDER_LIST, R.id.content_pane); 41412a4d8040d64501aa5a24c25865c806331560b74Mindy Pereira } else { 41512a4d8040d64501aa5a24c25865c806331560b74Mindy Pereira // Otherwise, clear the selected folder and go back to whatever the 41612a4d8040d64501aa5a24c25865c806331560b74Mindy Pereira // last folder list displayed was. 41723b528f182f14ef7ec1f1a4eb8d8ee9b8f04a2f2Vikram Aggarwal // TODO(viki): Load folder list for parent folder. 41812a4d8040d64501aa5a24c25865c806331560b74Mindy Pereira } 41912a4d8040d64501aa5a24c25865c806331560b74Mindy Pereira } 42012a4d8040d64501aa5a24c25865c806331560b74Mindy Pereira 421649b9ea3653da73fac0c33c8fb0af18baad12ac3Vikram Aggarwal /** 422649b9ea3653da73fac0c33c8fb0af18baad12ac3Vikram Aggarwal * Switch to the Inbox by creating a new conversation list context that loads the inbox. 423649b9ea3653da73fac0c33c8fb0af18baad12ac3Vikram Aggarwal */ 4243982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira private void transitionToInbox() { 4257c7043b2b546bb638ef1ca69c978ee8d3f41debbVikram Aggarwal // The inbox could have changed, in which case we should load it again. 4266214ee405453b79f08859025fee5ed361d5499feAndy Huang if (mInbox == null || !isDefaultInbox(mInbox.uri, mAccount)) { 427ab4863650794e81f35a0fd9abc16a5564d7b102bMindy Pereira loadAccountInbox(); 4283982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira } else { 429f6acdade010b2d0f49fd425b33e7f7b376286490Mindy Pereira onFolderChanged(mInbox); 43001668eb393deaf8c8b8abf86be46109614a98631Mindy Pereira } 43101668eb393deaf8c8b8abf86be46109614a98631Mindy Pereira } 432f5acda4a4b7c9e8ecacb41cb7d570ef426b6d4fcMindy Pereira 433118b3f6443f1859ff4866c97c0e8896f3415f730Mindy Pereira @Override 434505df5f59c92adbe8eaa734321c1d3f91be84a4aMindy Pereira public void onFolderSelected(Folder folder) { 435a1f99981919755e50f31fe300517d2fed752997eMindy Pereira if (folder.hasChildren && !folder.equals(getHierarchyFolder())) { 4360f7ae7a2d244463f75b3d4e1f79e27305a4dcb38Mindy Pereira mViewMode.enterFolderListMode(); 437c975e8416b64a1ebdec6adee7e65dd1d0928e8d4Mindy Pereira setHierarchyFolder(folder); 43856e3f50f5aee6606035eae4b713ef634c4f3a686Mindy Pereira // Replace this fragment with a new FolderListFragment 43911e3596e8c5978d07195ae2d7c8a96bb51aa75b3Mindy Pereira // showing this folder's children if we are not already 44011e3596e8c5978d07195ae2d7c8a96bb51aa75b3Mindy Pereira // looking at the child view for this folder. 4416214ee405453b79f08859025fee5ed361d5499feAndy Huang mLastFolderListTransactionId = replaceFragmentWithBack( 442687e64deeafade4709bf0acac1076776bc9ab9a9Rohan Shah FolderListFragment.ofTree(folder, false), 4438e65c6d2527c7539b689e0e8548c84f690badca5Rohan Shah FragmentTransaction.TRANSIT_FRAGMENT_OPEN, TAG_FOLDER_LIST, R.id.content_pane); 44411e3596e8c5978d07195ae2d7c8a96bb51aa75b3Mindy Pereira } else { 445feb5b1ef0c9489c1ea727177f8bd423250b64990Scott Kennedy setHierarchyFolder(folder); 44612a4d8040d64501aa5a24c25865c806331560b74Mindy Pereira super.onFolderSelected(folder); 447118b3f6443f1859ff4866c97c0e8896f3415f730Mindy Pereira } 448118b3f6443f1859ff4866c97c0e8896f3415f730Mindy Pereira } 449118b3f6443f1859ff4866c97c0e8896f3415f730Mindy Pereira 4509e2d407fdafeb874e640eb84017feaf784309075Scott Kennedy private static boolean isTransactionIdValid(int id) { 4513982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira return id >= 0; 4523982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira } 4533982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira 4543982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira /** 4553982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira * Up works as follows: 4563982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira * 1) If the user is in a conversation list that is not the default account inbox, 4573982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira * a conversation, or the folder list, up follows the rules of back. 4583982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira * 2) If the user is in search results, up exits search 4593982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira * mode and returns the user to whatever view they were in when they began search. 4603982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira * 3) If the user is in the inbox, there is no up. 4613982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira */ 462f5acda4a4b7c9e8ecacb41cb7d570ef426b6d4fcMindy Pereira @Override 463c1fb9a9c2730178105977fca629e80951bfc3cdcAndy Huang public boolean handleUpPress() { 4649da85df06175d25c52a09e08df3b02d1fd9cc6b7Vikram Aggarwal final int mode = mViewMode.getMode(); 46568f2e222b4ffccd9f67f02b3a9cfdb3841a7eb43Mindy Pereira if (mode == ViewMode.SEARCH_RESULTS_LIST) { 46668f2e222b4ffccd9f67f02b3a9cfdb3841a7eb43Mindy Pereira mActivity.finish(); 4677f65718157f9336e6590401a4b3ab6bfce2d9659Vikram Aggarwal // Not needed, the activity is going away anyway. 4687f65718157f9336e6590401a4b3ab6bfce2d9659Vikram Aggarwal return true; 4697f65718157f9336e6590401a4b3ab6bfce2d9659Vikram Aggarwal } 4701dd054f4e5581b69a52936c9d257fa91cb6daee7Rohan Shah if (mode == ViewMode.CONVERSATION_LIST 4711dd054f4e5581b69a52936c9d257fa91cb6daee7Rohan Shah || mode == ViewMode.WAITING_FOR_ACCOUNT_INITIALIZATION) { 4727f65718157f9336e6590401a4b3ab6bfce2d9659Vikram Aggarwal // Up affordance: show the drawer. 4737f65718157f9336e6590401a4b3ab6bfce2d9659Vikram Aggarwal toggleFolderListState(); 4747f65718157f9336e6590401a4b3ab6bfce2d9659Vikram Aggarwal return true; 4757f65718157f9336e6590401a4b3ab6bfce2d9659Vikram Aggarwal } 476cfaaf427ff0ccb65329ced60e5e5298039b94eaaVikram Aggarwal if (mode == ViewMode.CONVERSATION 47768f2e222b4ffccd9f67f02b3a9cfdb3841a7eb43Mindy Pereira || mode == ViewMode.SEARCH_RESULTS_CONVERSATION) { 478f5acda4a4b7c9e8ecacb41cb7d570ef426b6d4fcMindy Pereira // Same as go back. 479c1fb9a9c2730178105977fca629e80951bfc3cdcAndy Huang handleBackPress(); 4807f65718157f9336e6590401a4b3ab6bfce2d9659Vikram Aggarwal return true; 481f5acda4a4b7c9e8ecacb41cb7d570ef426b6d4fcMindy Pereira } 4821dd054f4e5581b69a52936c9d257fa91cb6daee7Rohan Shah if (mode == ViewMode.FOLDER_LIST) { 4831dd054f4e5581b69a52936c9d257fa91cb6daee7Rohan Shah // If the folder is the top level of an heirarchy or flat, toggle the 4841dd054f4e5581b69a52936c9d257fa91cb6daee7Rohan Shah // state of the drawer. Otherwise, let it pass on as a back press. 4851dd054f4e5581b69a52936c9d257fa91cb6daee7Rohan Shah // We don't want this code in back press, otherwise pressing back 4861dd054f4e5581b69a52936c9d257fa91cb6daee7Rohan Shah // will exhibit the same behavior 4871dd054f4e5581b69a52936c9d257fa91cb6daee7Rohan Shah final FolderListFragment folderListFragment = getFolderListFragment(); 4881dd054f4e5581b69a52936c9d257fa91cb6daee7Rohan Shah if (folderListFragment != null) { 4891dd054f4e5581b69a52936c9d257fa91cb6daee7Rohan Shah final Folder parentFolder = folderListFragment.getParentFolder(); 4901dd054f4e5581b69a52936c9d257fa91cb6daee7Rohan Shah if (parentFolder == null || parentFolder.parent == null) { 4911dd054f4e5581b69a52936c9d257fa91cb6daee7Rohan Shah toggleFolderListState(); 4921dd054f4e5581b69a52936c9d257fa91cb6daee7Rohan Shah return true; 4931dd054f4e5581b69a52936c9d257fa91cb6daee7Rohan Shah } 4941dd054f4e5581b69a52936c9d257fa91cb6daee7Rohan Shah } 4951dd054f4e5581b69a52936c9d257fa91cb6daee7Rohan Shah handleBackPress(); 4961dd054f4e5581b69a52936c9d257fa91cb6daee7Rohan Shah } 497f5acda4a4b7c9e8ecacb41cb7d570ef426b6d4fcMindy Pereira return true; 498f5acda4a4b7c9e8ecacb41cb7d570ef426b6d4fcMindy Pereira } 499f5acda4a4b7c9e8ecacb41cb7d570ef426b6d4fcMindy Pereira 5001ee96b2b100546b5b69ad42c5bc3755a4293d1a3Andy Huang private void transitionBackToConversationListMode(boolean inLoaderCallbacks) { 5019da85df06175d25c52a09e08df3b02d1fd9cc6b7Vikram Aggarwal final int mode = mViewMode.getMode(); 50290d89e2194cecb6ff0179c8159870575edf7365eVikram Aggarwal enableCabMode(); 50312b3ee458e04ac7e0b69302e671d10b24a5c98cfAndy Huang mConversationListVisible = true; 50468f2e222b4ffccd9f67f02b3a9cfdb3841a7eb43Mindy Pereira if (mode == ViewMode.SEARCH_RESULTS_CONVERSATION) { 50568f2e222b4ffccd9f67f02b3a9cfdb3841a7eb43Mindy Pereira mViewMode.enterSearchResultsListMode(); 50668f2e222b4ffccd9f67f02b3a9cfdb3841a7eb43Mindy Pereira } else { 50768f2e222b4ffccd9f67f02b3a9cfdb3841a7eb43Mindy Pereira mViewMode.enterConversationListMode(); 50868f2e222b4ffccd9f67f02b3a9cfdb3841a7eb43Mindy Pereira } 50921ab490d4919985d611bc36ae2d8aea86a911499Mindy Pereira if (isTransactionIdValid(mLastConversationListTransactionId)) { 5101ee96b2b100546b5b69ad42c5bc3755a4293d1a3Andy Huang safelyPopBackStack(mLastConversationListTransactionId, inLoaderCallbacks); 5110e3fd9d61bc18ad9f828bb3c4dd24fc851f11df5Paul Westbrook } else if (isTransactionIdValid(mLastInboxConversationListTransactionId)) { 5121ee96b2b100546b5b69ad42c5bc3755a4293d1a3Andy Huang safelyPopBackStack(mLastInboxConversationListTransactionId, inLoaderCallbacks); 5130e3fd9d61bc18ad9f828bb3c4dd24fc851f11df5Paul Westbrook onFolderChanged(mInbox); 51421ab490d4919985d611bc36ae2d8aea86a911499Mindy Pereira } else { 5159da85df06175d25c52a09e08df3b02d1fd9cc6b7Vikram Aggarwal // TODO: revisit if this block is necessary 51621ab490d4919985d611bc36ae2d8aea86a911499Mindy Pereira // Set the correct context for what the conversation view will be now. 51721ab490d4919985d611bc36ae2d8aea86a911499Mindy Pereira onFolderChanged(mInbox); 51821ab490d4919985d611bc36ae2d8aea86a911499Mindy Pereira } 5197dd054e39986de84a213c56a3c11ac94731402e6Vikram Aggarwal onConversationVisibilityChanged(false); 5209f119c72042e4d0382017d5ddcee9aa2113b6425Paul Westbrook onConversationListVisibilityChanged(true); 521f5acda4a4b7c9e8ecacb41cb7d570ef426b6d4fcMindy Pereira } 522b849dfbda3c917f078a5c09f03906886c27ecbecMindy Pereira 5236214ee405453b79f08859025fee5ed361d5499feAndy Huang private void safelyPopBackStack(boolean inLoaderCallbacks) { 5246214ee405453b79f08859025fee5ed361d5499feAndy Huang safelyPopBackStack(-1, inLoaderCallbacks); 5256214ee405453b79f08859025fee5ed361d5499feAndy Huang } 5266214ee405453b79f08859025fee5ed361d5499feAndy Huang 5271ee96b2b100546b5b69ad42c5bc3755a4293d1a3Andy Huang /** 5281ee96b2b100546b5b69ad42c5bc3755a4293d1a3Andy Huang * Pop to a specified point in the fragment back stack without causing IllegalStateExceptions 5291ee96b2b100546b5b69ad42c5bc3755a4293d1a3Andy Huang * from committing a fragment transaction "at the wrong time". 5301ee96b2b100546b5b69ad42c5bc3755a4293d1a3Andy Huang * <p> 5311ee96b2b100546b5b69ad42c5bc3755a4293d1a3Andy Huang * If the caller specifies that we are in 5321ee96b2b100546b5b69ad42c5bc3755a4293d1a3Andy Huang * the scope of an {@link LoaderCallbacks#onLoadFinished(android.content.Loader, Object)}, 5331ee96b2b100546b5b69ad42c5bc3755a4293d1a3Andy Huang * this method will pop back in a Handler. The deferred job will also check that the Activity 5341ee96b2b100546b5b69ad42c5bc3755a4293d1a3Andy Huang * is in a valid state for fragment transactions, using {@link #safeToModifyFragments()}. 5351ee96b2b100546b5b69ad42c5bc3755a4293d1a3Andy Huang * Otherwise, this method will pop back immediately if safe. Finally, if we are not in 5361ee96b2b100546b5b69ad42c5bc3755a4293d1a3Andy Huang * onLoadFinished and it's not safe, this method will just ignore the request. 5371ee96b2b100546b5b69ad42c5bc3755a4293d1a3Andy Huang * 5386214ee405453b79f08859025fee5ed361d5499feAndy Huang * @param transactionId back stack destination to pop to, or -1 to just pop the top 5391ee96b2b100546b5b69ad42c5bc3755a4293d1a3Andy Huang * @param inLoaderCallbacks whether we are in the scope of an onLoadFinished (when fragment 5401ee96b2b100546b5b69ad42c5bc3755a4293d1a3Andy Huang * transactions are disallowed) 5411ee96b2b100546b5b69ad42c5bc3755a4293d1a3Andy Huang */ 5421ee96b2b100546b5b69ad42c5bc3755a4293d1a3Andy Huang private void safelyPopBackStack(int transactionId, boolean inLoaderCallbacks) { 5431ee96b2b100546b5b69ad42c5bc3755a4293d1a3Andy Huang final PopBackStackRunnable r = new PopBackStackRunnable(transactionId); 5441ee96b2b100546b5b69ad42c5bc3755a4293d1a3Andy Huang if (inLoaderCallbacks) { 5451ee96b2b100546b5b69ad42c5bc3755a4293d1a3Andy Huang // always run deferred. ensure deferred job checks safety. 5461ee96b2b100546b5b69ad42c5bc3755a4293d1a3Andy Huang mHandler.post(r); 5471ee96b2b100546b5b69ad42c5bc3755a4293d1a3Andy Huang } else if (safeToModifyFragments()) { 5481ee96b2b100546b5b69ad42c5bc3755a4293d1a3Andy Huang // run now 5491ee96b2b100546b5b69ad42c5bc3755a4293d1a3Andy Huang r.popBackStack(); 5501ee96b2b100546b5b69ad42c5bc3755a4293d1a3Andy Huang } else { 5511ee96b2b100546b5b69ad42c5bc3755a4293d1a3Andy Huang // ignore 5521ee96b2b100546b5b69ad42c5bc3755a4293d1a3Andy Huang LogUtils.i(LOG_TAG, "Activity has been saved; ignoring unsafe immediate request" 5531ee96b2b100546b5b69ad42c5bc3755a4293d1a3Andy Huang + " to pop back stack"); 5541ee96b2b100546b5b69ad42c5bc3755a4293d1a3Andy Huang } 5551ee96b2b100546b5b69ad42c5bc3755a4293d1a3Andy Huang } 5561ee96b2b100546b5b69ad42c5bc3755a4293d1a3Andy Huang 557b849dfbda3c917f078a5c09f03906886c27ecbecMindy Pereira @Override 558b849dfbda3c917f078a5c09f03906886c27ecbecMindy Pereira public boolean shouldShowFirstConversation() { 559b849dfbda3c917f078a5c09f03906886c27ecbecMindy Pereira return false; 560b849dfbda3c917f078a5c09f03906886c27ecbecMindy Pereira } 561fbe4019a262f6b1934a44e598009ae63dc5745eeMindy Pereira 562fbe4019a262f6b1934a44e598009ae63dc5745eeMindy Pereira @Override 563d3367499e56116854ed637b1036fd71057ac0f49Mindy Pereira public void onUndoAvailable(ToastBarOperation op) { 5640963ef8394e1f0bca3f931f930b127b00790361aMindy Pereira if (op != null && mAccount.supportsCapability(UIProvider.AccountCapabilities.UNDO)) { 5657f602f7a64f176894ccb7942a6642f22584c3894Vikram Aggarwal final int mode = mViewMode.getMode(); 566dbab8fab0c98dc2d56bbe17c7436719129952b7bMindy Pereira final ConversationListFragment convList = getConversationListFragment(); 5670963ef8394e1f0bca3f931f930b127b00790361aMindy Pereira switch (mode) { 568b466bcf49502a1178cf7362a81470f3231d8892bMindy Pereira case ViewMode.SEARCH_RESULTS_CONVERSATION: 5690963ef8394e1f0bca3f931f930b127b00790361aMindy Pereira case ViewMode.CONVERSATION: 570c2c9dc14aa184db1f05b8c060b27d97dda5a3ca4Andrew Sapperstein mToastBar.setConversationMode(true); 571c2c9dc14aa184db1f05b8c060b27d97dda5a3ca4Andrew Sapperstein mToastBar.show( 572c2c9dc14aa184db1f05b8c060b27d97dda5a3ca4Andrew Sapperstein getUndoClickedListener( 573c2c9dc14aa184db1f05b8c060b27d97dda5a3ca4Andrew Sapperstein convList != null ? convList.getAnimatedAdapter() : null), 574c2c9dc14aa184db1f05b8c060b27d97dda5a3ca4Andrew Sapperstein 0, 575c59dd8270215f97d39697dae9e69976bcfe3642bmindyp Utils.convertHtmlToPlainText 5766a3d5ce0b18f58fcfa1af0315dc8ddc7331c2c5fScott Kennedy (op.getDescription(mActivity.getActivityContext())), 577c2c9dc14aa184db1f05b8c060b27d97dda5a3ca4Andrew Sapperstein true, /* showActionIcon */ 578c2c9dc14aa184db1f05b8c060b27d97dda5a3ca4Andrew Sapperstein R.string.undo, 579d3367499e56116854ed637b1036fd71057ac0f49Mindy Pereira true, /* replaceVisibleToast */ 580d3367499e56116854ed637b1036fd71057ac0f49Mindy Pereira op); 5810963ef8394e1f0bca3f931f930b127b00790361aMindy Pereira break; 582b466bcf49502a1178cf7362a81470f3231d8892bMindy Pereira case ViewMode.SEARCH_RESULTS_LIST: 5830963ef8394e1f0bca3f931f930b127b00790361aMindy Pereira case ViewMode.CONVERSATION_LIST: 5846902dcf8688d7d0691639f49365a78a3a78fe9e3Vikram Aggarwal if (convList != null) { 585c2c9dc14aa184db1f05b8c060b27d97dda5a3ca4Andrew Sapperstein mToastBar.setConversationMode(false); 586c2c9dc14aa184db1f05b8c060b27d97dda5a3ca4Andrew Sapperstein mToastBar.show( 587c2c9dc14aa184db1f05b8c060b27d97dda5a3ca4Andrew Sapperstein getUndoClickedListener(convList.getAnimatedAdapter()), 588c2c9dc14aa184db1f05b8c060b27d97dda5a3ca4Andrew Sapperstein 0, 589c59dd8270215f97d39697dae9e69976bcfe3642bmindyp Utils.convertHtmlToPlainText 5906a3d5ce0b18f58fcfa1af0315dc8ddc7331c2c5fScott Kennedy (op.getDescription(mActivity.getActivityContext())), 591c2c9dc14aa184db1f05b8c060b27d97dda5a3ca4Andrew Sapperstein true, /* showActionIcon */ 592c2c9dc14aa184db1f05b8c060b27d97dda5a3ca4Andrew Sapperstein R.string.undo, 593d3367499e56116854ed637b1036fd71057ac0f49Mindy Pereira true, /* replaceVisibleToast */ 594d3367499e56116854ed637b1036fd71057ac0f49Mindy Pereira op); 5954765c5c90802d0abcf2b05c4967e7dd7d2284f9aMindy Pereira } else { 5964765c5c90802d0abcf2b05c4967e7dd7d2284f9aMindy Pereira mActivity.setPendingToastOperation(op); 5976902dcf8688d7d0691639f49365a78a3a78fe9e3Vikram Aggarwal } 5980963ef8394e1f0bca3f931f930b127b00790361aMindy Pereira break; 5990963ef8394e1f0bca3f931f930b127b00790361aMindy Pereira } 6000963ef8394e1f0bca3f931f930b127b00790361aMindy Pereira } 6010963ef8394e1f0bca3f931f930b127b00790361aMindy Pereira } 602c2c9dc14aa184db1f05b8c060b27d97dda5a3ca4Andrew Sapperstein 603c2c9dc14aa184db1f05b8c060b27d97dda5a3ca4Andrew Sapperstein @Override 604d243d459b64003c5171ac5ff606729e525161be6Mark Wei protected void hideOrRepositionToastBar(boolean animated) { 605d243d459b64003c5171ac5ff606729e525161be6Mark Wei mToastBar.hide(animated); 606d243d459b64003c5171ac5ff606729e525161be6Mark Wei } 607d243d459b64003c5171ac5ff606729e525161be6Mark Wei 608d243d459b64003c5171ac5ff606729e525161be6Mark Wei @Override 6099d7519d18e8ddbcdd59b37eec7c85210fca0e8c2Andrew Sapperstein public void onError(final Folder folder, boolean replaceVisibleToast) { 610c2c9dc14aa184db1f05b8c060b27d97dda5a3ca4Andrew Sapperstein final int mode = mViewMode.getMode(); 611c2c9dc14aa184db1f05b8c060b27d97dda5a3ca4Andrew Sapperstein switch (mode) { 612c2c9dc14aa184db1f05b8c060b27d97dda5a3ca4Andrew Sapperstein case ViewMode.SEARCH_RESULTS_LIST: 613c2c9dc14aa184db1f05b8c060b27d97dda5a3ca4Andrew Sapperstein case ViewMode.CONVERSATION_LIST: 6149d7519d18e8ddbcdd59b37eec7c85210fca0e8c2Andrew Sapperstein showErrorToast(folder, replaceVisibleToast); 615c2c9dc14aa184db1f05b8c060b27d97dda5a3ca4Andrew Sapperstein break; 616c2c9dc14aa184db1f05b8c060b27d97dda5a3ca4Andrew Sapperstein default: 617c2c9dc14aa184db1f05b8c060b27d97dda5a3ca4Andrew Sapperstein break; 618c2c9dc14aa184db1f05b8c060b27d97dda5a3ca4Andrew Sapperstein } 619c2c9dc14aa184db1f05b8c060b27d97dda5a3ca4Andrew Sapperstein } 62030745b6e9c4d280ac578d1186fbc0cec9bd2a838Paul Westbrook 62130745b6e9c4d280ac578d1186fbc0cec9bd2a838Paul Westbrook @Override 62230745b6e9c4d280ac578d1186fbc0cec9bd2a838Paul Westbrook public String getHelpContext() { 62330745b6e9c4d280ac578d1186fbc0cec9bd2a838Paul Westbrook final int mode = mViewMode.getMode(); 62430745b6e9c4d280ac578d1186fbc0cec9bd2a838Paul Westbrook switch (mode) { 62530745b6e9c4d280ac578d1186fbc0cec9bd2a838Paul Westbrook case ViewMode.FOLDER_LIST: 62630745b6e9c4d280ac578d1186fbc0cec9bd2a838Paul Westbrook return mContext.getString(R.string.one_pane_folder_list_help_context); 62730745b6e9c4d280ac578d1186fbc0cec9bd2a838Paul Westbrook } 62830745b6e9c4d280ac578d1186fbc0cec9bd2a838Paul Westbrook return super.getHelpContext(); 62930745b6e9c4d280ac578d1186fbc0cec9bd2a838Paul Westbrook } 6301ee96b2b100546b5b69ad42c5bc3755a4293d1a3Andy Huang 6311ee96b2b100546b5b69ad42c5bc3755a4293d1a3Andy Huang private final class PopBackStackRunnable implements Runnable { 6321ee96b2b100546b5b69ad42c5bc3755a4293d1a3Andy Huang 6331ee96b2b100546b5b69ad42c5bc3755a4293d1a3Andy Huang private final int mTransactionId; 6341ee96b2b100546b5b69ad42c5bc3755a4293d1a3Andy Huang 6351ee96b2b100546b5b69ad42c5bc3755a4293d1a3Andy Huang public PopBackStackRunnable(int transactionId) { 6361ee96b2b100546b5b69ad42c5bc3755a4293d1a3Andy Huang mTransactionId = transactionId; 6371ee96b2b100546b5b69ad42c5bc3755a4293d1a3Andy Huang } 6381ee96b2b100546b5b69ad42c5bc3755a4293d1a3Andy Huang 6391ee96b2b100546b5b69ad42c5bc3755a4293d1a3Andy Huang public void popBackStack() { 6406214ee405453b79f08859025fee5ed361d5499feAndy Huang final FragmentManager fm = mActivity.getFragmentManager(); 6416214ee405453b79f08859025fee5ed361d5499feAndy Huang if (mTransactionId < 0) { 6426214ee405453b79f08859025fee5ed361d5499feAndy Huang fm.popBackStackImmediate(); 6436214ee405453b79f08859025fee5ed361d5499feAndy Huang } else { 6446214ee405453b79f08859025fee5ed361d5499feAndy Huang fm.popBackStackImmediate(mTransactionId, 0); 6456214ee405453b79f08859025fee5ed361d5499feAndy Huang } 6461ee96b2b100546b5b69ad42c5bc3755a4293d1a3Andy Huang } 6471ee96b2b100546b5b69ad42c5bc3755a4293d1a3Andy Huang 6481ee96b2b100546b5b69ad42c5bc3755a4293d1a3Andy Huang @Override 6491ee96b2b100546b5b69ad42c5bc3755a4293d1a3Andy Huang public void run() { 6501ee96b2b100546b5b69ad42c5bc3755a4293d1a3Andy Huang if (safeToModifyFragments()) { 6511ee96b2b100546b5b69ad42c5bc3755a4293d1a3Andy Huang popBackStack(); 6521ee96b2b100546b5b69ad42c5bc3755a4293d1a3Andy Huang } else { 6531ee96b2b100546b5b69ad42c5bc3755a4293d1a3Andy Huang LogUtils.i(LOG_TAG, "Activity has been saved; ignoring unsafe deferred request" 6541ee96b2b100546b5b69ad42c5bc3755a4293d1a3Andy Huang + " to pop back stack"); 6551ee96b2b100546b5b69ad42c5bc3755a4293d1a3Andy Huang } 6561ee96b2b100546b5b69ad42c5bc3755a4293d1a3Andy Huang } 6571ee96b2b100546b5b69ad42c5bc3755a4293d1a3Andy Huang } 6581ee96b2b100546b5b69ad42c5bc3755a4293d1a3Andy Huang 6598c887ef97607ad5c2c94d1d3b902afe6d5ef95a0Paul Westbrook @Override 6608c887ef97607ad5c2c94d1d3b902afe6d5ef95a0Paul Westbrook public boolean isDrawerEnabled() { 6618c887ef97607ad5c2c94d1d3b902afe6d5ef95a0Paul Westbrook // The drawer is enabled for one pane mode 6628c887ef97607ad5c2c94d1d3b902afe6d5ef95a0Paul Westbrook return true; 6638c887ef97607ad5c2c94d1d3b902afe6d5ef95a0Paul Westbrook } 664feb5b1ef0c9489c1ea727177f8bd423250b64990Scott Kennedy 665feb5b1ef0c9489c1ea727177f8bd423250b64990Scott Kennedy @Override 666feb5b1ef0c9489c1ea727177f8bd423250b64990Scott Kennedy public int getFolderListViewChoiceMode() { 667feb5b1ef0c9489c1ea727177f8bd423250b64990Scott Kennedy // By default, we do not want to allow any item to be selected in the folder list 668feb5b1ef0c9489c1ea727177f8bd423250b64990Scott Kennedy return ListView.CHOICE_MODE_NONE; 669feb5b1ef0c9489c1ea727177f8bd423250b64990Scott Kennedy } 670a55b36cb6b75ce8096812183651e89115300975aVikram Aggarwal} 671