OnePaneController.java revision 01f30509c4c8ad0d13b7635447b7f023c7a0cab7
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; 23559c3b3d302b3f6d2c2cb43a909069d942652e34Mindy Pereiraimport android.net.Uri; 241ddcf0f2bf44d3c9db89112ef52510d9b2433ac4Vikram Aggarwalimport android.os.Bundle; 25c2c9dc14aa184db1f05b8c060b27d97dda5a3ca4Andrew Sappersteinimport android.text.Html; 26148b191681abebc56973f7a42d9adfbdf30c8a2cMindy Pereiraimport android.text.TextUtils; 271ddcf0f2bf44d3c9db89112ef52510d9b2433ac4Vikram Aggarwal 28d7a12cd5b5c2639b653d8c671b04844ef02ee01dVikram Aggarwalimport com.android.mail.ConversationListContext; 291ddcf0f2bf44d3c9db89112ef52510d9b2433ac4Vikram Aggarwalimport com.android.mail.R; 30cd09f5e9bf55e6f4310e8dc9408132b9c88e87c3Vikram Aggarwalimport com.android.mail.providers.Account; 319b87568c9e9f1c32a9672b315229866a58a1e757Mindy Pereiraimport com.android.mail.providers.Conversation; 323982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereiraimport com.android.mail.providers.Folder; 33fbe4019a262f6b1934a44e598009ae63dc5745eeMindy Pereiraimport com.android.mail.providers.Settings; 34fbe4019a262f6b1934a44e598009ae63dc5745eeMindy Pereiraimport com.android.mail.providers.UIProvider; 359e85333dfc57e7c98ffef27cded4712ea598f554Paul Westbrookimport com.android.mail.utils.LogUtils; 36fbe4019a262f6b1934a44e598009ae63dc5745eeMindy Pereira 37a55b36cb6b75ce8096812183651e89115300975aVikram Aggarwal/** 38a55b36cb6b75ce8096812183651e89115300975aVikram Aggarwal * Controller for one-pane Mail activity. One Pane is used for phones, where screen real estate is 39d7a12cd5b5c2639b653d8c671b04844ef02ee01dVikram Aggarwal * limited. This controller also does the layout, since the layout is simpler in the one pane case. 40a55b36cb6b75ce8096812183651e89115300975aVikram Aggarwal */ 41a55b36cb6b75ce8096812183651e89115300975aVikram Aggarwal 42a55b36cb6b75ce8096812183651e89115300975aVikram Aggarwal// Called OnePaneActivityController in Gmail. 43a76e5aeff4a54ec70661de35be4f3ecb9d1d2fe2Mindy Pereirapublic final class OnePaneController extends AbstractActivityController { 446902dcf8688d7d0691639f49365a78a3a78fe9e3Vikram Aggarwal // Used for saving transaction IDs in bundles 453982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira private static final String FOLDER_LIST_TRANSACTION_KEY = "folder-list-transaction"; 460e3fd9d61bc18ad9f828bb3c4dd24fc851f11df5Paul Westbrook private static final String INBOX_CONVERSATION_LIST_TRANSACTION_KEY = 470e3fd9d61bc18ad9f828bb3c4dd24fc851f11df5Paul Westbrook "inbox_conversation-list-transaction"; 483982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira private static final String CONVERSATION_LIST_TRANSACTION_KEY = "conversation-list-transaction"; 493982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira private static final String CONVERSATION_TRANSACTION_KEY = "conversation-transaction"; 502d50bcdca57756ecad20d21da0d936243215b79cPaul Westbrook 513982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira private static final int INVALID_ID = -1; 522175d0a93263672d4498458c81b404b0999134baVikram Aggarwal private boolean mConversationListVisible = false; 530e3fd9d61bc18ad9f828bb3c4dd24fc851f11df5Paul Westbrook private int mLastInboxConversationListTransactionId = INVALID_ID; 543982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira private int mLastConversationListTransactionId = INVALID_ID; 553982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira private int mLastConversationTransactionId = INVALID_ID; 563982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira private int mLastFolderListTransactionId = INVALID_ID; 573982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira private Folder mInbox; 58cd09f5e9bf55e6f4310e8dc9408132b9c88e87c3Vikram Aggarwal /** Whether a conversation list for this account has ever been shown.*/ 59cd09f5e9bf55e6f4310e8dc9408132b9c88e87c3Vikram Aggarwal private boolean mConversationListNeverShown = true; 60cd09f5e9bf55e6f4310e8dc9408132b9c88e87c3Vikram Aggarwal 61a55b36cb6b75ce8096812183651e89115300975aVikram Aggarwal /** 62a55b36cb6b75ce8096812183651e89115300975aVikram Aggarwal * @param activity 63a55b36cb6b75ce8096812183651e89115300975aVikram Aggarwal * @param viewMode 64a55b36cb6b75ce8096812183651e89115300975aVikram Aggarwal */ 65a55b36cb6b75ce8096812183651e89115300975aVikram Aggarwal public OnePaneController(MailActivity activity, ViewMode viewMode) { 66a55b36cb6b75ce8096812183651e89115300975aVikram Aggarwal super(activity, viewMode); 67a55b36cb6b75ce8096812183651e89115300975aVikram Aggarwal } 68a55b36cb6b75ce8096812183651e89115300975aVikram Aggarwal 691ddcf0f2bf44d3c9db89112ef52510d9b2433ac4Vikram Aggarwal @Override 70632721e6b3a9ba8c476456f2e0fb1b564561e0b5Andy Huang public void onRestoreInstanceState(Bundle inState) { 71632721e6b3a9ba8c476456f2e0fb1b564561e0b5Andy Huang super.onRestoreInstanceState(inState); 723982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira // TODO(mindyp) handle saved state. 733982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira if (inState != null) { 743982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira mLastFolderListTransactionId = inState.getInt(FOLDER_LIST_TRANSACTION_KEY, INVALID_ID); 750e3fd9d61bc18ad9f828bb3c4dd24fc851f11df5Paul Westbrook mLastInboxConversationListTransactionId = 760e3fd9d61bc18ad9f828bb3c4dd24fc851f11df5Paul Westbrook inState.getInt(INBOX_CONVERSATION_LIST_TRANSACTION_KEY, INVALID_ID); 773982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira mLastConversationListTransactionId = inState.getInt(CONVERSATION_LIST_TRANSACTION_KEY, 783982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira INVALID_ID); 793982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira mLastConversationTransactionId = inState.getInt(CONVERSATION_TRANSACTION_KEY, 803982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira INVALID_ID); 81148b191681abebc56973f7a42d9adfbdf30c8a2cMindy Pereira 82148b191681abebc56973f7a42d9adfbdf30c8a2cMindy Pereira // Enter folder list mode. 83148b191681abebc56973f7a42d9adfbdf30c8a2cMindy Pereira if (inState.containsKey(SAVED_HIERARCHICAL_FOLDER)) { 847b6d03db55338cbf9717896f99eb20d02bf371e4Mindy Pereira String folderString = inState.getString(SAVED_HIERARCHICAL_FOLDER); 857b6d03db55338cbf9717896f99eb20d02bf371e4Mindy Pereira if (!TextUtils.isEmpty(folderString)) { 867b6d03db55338cbf9717896f99eb20d02bf371e4Mindy Pereira Folder folder = Folder.fromString(inState 877b6d03db55338cbf9717896f99eb20d02bf371e4Mindy Pereira .getString(SAVED_HIERARCHICAL_FOLDER)); 887b6d03db55338cbf9717896f99eb20d02bf371e4Mindy Pereira onFolderSelected(folder); 897b6d03db55338cbf9717896f99eb20d02bf371e4Mindy Pereira } else { 907b6d03db55338cbf9717896f99eb20d02bf371e4Mindy Pereira showFolderList(); 91148b191681abebc56973f7a42d9adfbdf30c8a2cMindy Pereira } 92148b191681abebc56973f7a42d9adfbdf30c8a2cMindy Pereira } 933982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira } 943982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira } 953982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira 963982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira @Override 973982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira public void onSaveInstanceState(Bundle outState) { 983982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira super.onSaveInstanceState(outState); 993982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira // TODO(mindyp) handle saved state. 1003982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira outState.putInt(FOLDER_LIST_TRANSACTION_KEY, mLastFolderListTransactionId); 1010e3fd9d61bc18ad9f828bb3c4dd24fc851f11df5Paul Westbrook outState.putInt(INBOX_CONVERSATION_LIST_TRANSACTION_KEY, 1020e3fd9d61bc18ad9f828bb3c4dd24fc851f11df5Paul Westbrook mLastInboxConversationListTransactionId); 1033982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira outState.putInt(CONVERSATION_LIST_TRANSACTION_KEY, mLastConversationListTransactionId); 1043982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira outState.putInt(CONVERSATION_TRANSACTION_KEY, mLastConversationTransactionId); 105148b191681abebc56973f7a42d9adfbdf30c8a2cMindy Pereira if (mViewMode.getMode() == ViewMode.FOLDER_LIST) { 106148b191681abebc56973f7a42d9adfbdf30c8a2cMindy Pereira Folder hierarchyFolder = getHierarchyFolder(); 107148b191681abebc56973f7a42d9adfbdf30c8a2cMindy Pereira outState.putString(SAVED_HIERARCHICAL_FOLDER, 1087b6d03db55338cbf9717896f99eb20d02bf371e4Mindy Pereira hierarchyFolder != null ? Folder.toString(hierarchyFolder) : null); 109148b191681abebc56973f7a42d9adfbdf30c8a2cMindy Pereira } 1103982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira } 1113982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira 1123982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira @Override 113d7a12cd5b5c2639b653d8c671b04844ef02ee01dVikram Aggarwal public void resetActionBarIcon() { 114d7a12cd5b5c2639b653d8c671b04844ef02ee01dVikram Aggarwal final int mode = mViewMode.getMode(); 1152074a056bb2a634c66996225c55620d2aa6f7ac5Vikram Aggarwal if (!inInbox(mAccount, mConvListContext) 11668f2e222b4ffccd9f67f02b3a9cfdb3841a7eb43Mindy Pereira || mode == ViewMode.SEARCH_RESULTS_LIST 11768f2e222b4ffccd9f67f02b3a9cfdb3841a7eb43Mindy Pereira || mode == ViewMode.SEARCH_RESULTS_CONVERSATION 11868f2e222b4ffccd9f67f02b3a9cfdb3841a7eb43Mindy Pereira || mode == ViewMode.CONVERSATION 11968f2e222b4ffccd9f67f02b3a9cfdb3841a7eb43Mindy Pereira || mode == ViewMode.FOLDER_LIST) { 120d7a12cd5b5c2639b653d8c671b04844ef02ee01dVikram Aggarwal mActionBarView.setBackButton(); 121d7a12cd5b5c2639b653d8c671b04844ef02ee01dVikram Aggarwal } else { 122d7a12cd5b5c2639b653d8c671b04844ef02ee01dVikram Aggarwal mActionBarView.removeBackButton(); 123d7a12cd5b5c2639b653d8c671b04844ef02ee01dVikram Aggarwal } 124d7a12cd5b5c2639b653d8c671b04844ef02ee01dVikram Aggarwal } 125d7a12cd5b5c2639b653d8c671b04844ef02ee01dVikram Aggarwal 1267dd054e39986de84a213c56a3c11ac94731402e6Vikram Aggarwal /** 1277dd054e39986de84a213c56a3c11ac94731402e6Vikram Aggarwal * Returns true if the user is currently in the conversation list view, viewing the default 1287dd054e39986de84a213c56a3c11ac94731402e6Vikram Aggarwal * inbox. 1297dd054e39986de84a213c56a3c11ac94731402e6Vikram Aggarwal * @return 1307dd054e39986de84a213c56a3c11ac94731402e6Vikram Aggarwal */ 1312074a056bb2a634c66996225c55620d2aa6f7ac5Vikram Aggarwal private static boolean inInbox(final Account account, final ConversationListContext context) { 1322074a056bb2a634c66996225c55620d2aa6f7ac5Vikram Aggarwal // If we don't have valid state, then we are not in the inbox. 1332074a056bb2a634c66996225c55620d2aa6f7ac5Vikram Aggarwal if (account == null || context == null || context.folder == null 1342074a056bb2a634c66996225c55620d2aa6f7ac5Vikram Aggarwal || account.settings == null) { 1352074a056bb2a634c66996225c55620d2aa6f7ac5Vikram Aggarwal return false; 1362074a056bb2a634c66996225c55620d2aa6f7ac5Vikram Aggarwal } 1372074a056bb2a634c66996225c55620d2aa6f7ac5Vikram Aggarwal final Uri inboxUri = Settings.getDefaultInboxUri(account.settings); 138ae4ea997d3d3f3c8c11fc5a3e7f9d49f82b4e2e7Vikram Aggarwal return !ConversationListContext.isSearchResult(context) 139ae4ea997d3d3f3c8c11fc5a3e7f9d49f82b4e2e7Vikram Aggarwal && context.folder.uri.equals(inboxUri); 1403982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira } 1413982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira 142d7a12cd5b5c2639b653d8c671b04844ef02ee01dVikram Aggarwal @Override 143cd09f5e9bf55e6f4310e8dc9408132b9c88e87c3Vikram Aggarwal public void onAccountChanged(Account account) { 144cd09f5e9bf55e6f4310e8dc9408132b9c88e87c3Vikram Aggarwal super.onAccountChanged(account); 145cd09f5e9bf55e6f4310e8dc9408132b9c88e87c3Vikram Aggarwal mConversationListNeverShown = true; 146cd09f5e9bf55e6f4310e8dc9408132b9c88e87c3Vikram Aggarwal } 147cd09f5e9bf55e6f4310e8dc9408132b9c88e87c3Vikram Aggarwal 148cd09f5e9bf55e6f4310e8dc9408132b9c88e87c3Vikram Aggarwal @Override 149d7a12cd5b5c2639b653d8c671b04844ef02ee01dVikram Aggarwal public boolean onCreate(Bundle savedInstanceState) { 1501ddcf0f2bf44d3c9db89112ef52510d9b2433ac4Vikram Aggarwal mActivity.setContentView(R.layout.one_pane_activity); 151d7a12cd5b5c2639b653d8c671b04844ef02ee01dVikram Aggarwal // The parent class sets the correct viewmode and starts the application off. 152d7a12cd5b5c2639b653d8c671b04844ef02ee01dVikram Aggarwal return super.onCreate(savedInstanceState); 1531ddcf0f2bf44d3c9db89112ef52510d9b2433ac4Vikram Aggarwal } 1541ddcf0f2bf44d3c9db89112ef52510d9b2433ac4Vikram Aggarwal 1551ddcf0f2bf44d3c9db89112ef52510d9b2433ac4Vikram Aggarwal @Override 1561ddcf0f2bf44d3c9db89112ef52510d9b2433ac4Vikram Aggarwal protected boolean isConversationListVisible() { 1572175d0a93263672d4498458c81b404b0999134baVikram Aggarwal return mConversationListVisible; 1581ddcf0f2bf44d3c9db89112ef52510d9b2433ac4Vikram Aggarwal } 159d7a12cd5b5c2639b653d8c671b04844ef02ee01dVikram Aggarwal 160d7a12cd5b5c2639b653d8c671b04844ef02ee01dVikram Aggarwal @Override 161d7a12cd5b5c2639b653d8c671b04844ef02ee01dVikram Aggarwal public void onViewModeChanged(int newMode) { 162d7a12cd5b5c2639b653d8c671b04844ef02ee01dVikram Aggarwal super.onViewModeChanged(newMode); 163632721e6b3a9ba8c476456f2e0fb1b564561e0b5Andy Huang 164632721e6b3a9ba8c476456f2e0fb1b564561e0b5Andy Huang // When entering conversation list mode, hide and clean up any currently visible 165632721e6b3a9ba8c476456f2e0fb1b564561e0b5Andy Huang // conversation. 166632721e6b3a9ba8c476456f2e0fb1b564561e0b5Andy Huang // TODO: improve this transition 167b466bcf49502a1178cf7362a81470f3231d8892bMindy Pereira if (newMode == ViewMode.CONVERSATION_LIST || newMode == ViewMode.SEARCH_RESULTS_LIST) { 168632721e6b3a9ba8c476456f2e0fb1b564561e0b5Andy Huang mPagerController.hide(); 169632721e6b3a9ba8c476456f2e0fb1b564561e0b5Andy Huang } 170d7a12cd5b5c2639b653d8c671b04844ef02ee01dVikram Aggarwal } 171d7a12cd5b5c2639b653d8c671b04844ef02ee01dVikram Aggarwal 172d7a12cd5b5c2639b653d8c671b04844ef02ee01dVikram Aggarwal @Override 1739b87568c9e9f1c32a9672b315229866a58a1e757Mindy Pereira public void showConversationList(ConversationListContext listContext) { 174e128fc21fab03f6d66c656efeee2155fab449a7fVikram Aggarwal super.showConversationList(listContext); 175e128fc21fab03f6d66c656efeee2155fab449a7fVikram Aggarwal enableCabMode(); 1763982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira // TODO(viki): Check if the account has been changed since the previous 1773982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira // time. 178ae4ea997d3d3f3c8c11fc5a3e7f9d49f82b4e2e7Vikram Aggarwal if (ConversationListContext.isSearchResult(listContext)) { 17968f2e222b4ffccd9f67f02b3a9cfdb3841a7eb43Mindy Pereira mViewMode.enterSearchResultsListMode(); 18068f2e222b4ffccd9f67f02b3a9cfdb3841a7eb43Mindy Pereira } else { 18168f2e222b4ffccd9f67f02b3a9cfdb3841a7eb43Mindy Pereira mViewMode.enterConversationListMode(); 18268f2e222b4ffccd9f67f02b3a9cfdb3841a7eb43Mindy Pereira } 1839b87568c9e9f1c32a9672b315229866a58a1e757Mindy Pereira // TODO(viki): This account transition looks strange in two pane mode. 1842175d0a93263672d4498458c81b404b0999134baVikram Aggarwal // Revisit as the app is coming together and improve the look and feel. 185cd09f5e9bf55e6f4310e8dc9408132b9c88e87c3Vikram Aggarwal final int transition = mConversationListNeverShown 186cd09f5e9bf55e6f4310e8dc9408132b9c88e87c3Vikram Aggarwal ? FragmentTransaction.TRANSIT_FRAGMENT_FADE 1879b87568c9e9f1c32a9672b315229866a58a1e757Mindy Pereira : FragmentTransaction.TRANSIT_FRAGMENT_OPEN; 18801668eb393deaf8c8b8abf86be46109614a98631Mindy Pereira Fragment conversationListFragment = ConversationListFragment.newInstance(listContext); 189bf232c3735f65b1a4746943e4a134e59e36f0bdePaul Westbrook 1902074a056bb2a634c66996225c55620d2aa6f7ac5Vikram Aggarwal if (!inInbox(mAccount, mConvListContext)) { 1913982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira // Maintain fragment transaction history so we can get back to the 1923982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira // fragment used to launch this list. 19372a9f3918310f581fecf6411174645ad5b5ae112Mindy Pereira mLastConversationListTransactionId = replaceFragment(conversationListFragment, 19466150d75d09324e867be42ff8c0ea8fae115ef20Paul Westbrook transition, TAG_CONVERSATION_LIST); 1953982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira } else { 1963982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira // If going to the inbox, clear the folder list transaction history. 1973982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira mInbox = listContext.folder; 1980e3fd9d61bc18ad9f828bb3c4dd24fc851f11df5Paul Westbrook mLastInboxConversationListTransactionId = replaceFragment(conversationListFragment, 1990e3fd9d61bc18ad9f828bb3c4dd24fc851f11df5Paul Westbrook transition, TAG_CONVERSATION_LIST); 2003982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira mLastFolderListTransactionId = INVALID_ID; 2010e3fd9d61bc18ad9f828bb3c4dd24fc851f11df5Paul Westbrook 2020e3fd9d61bc18ad9f828bb3c4dd24fc851f11df5Paul Westbrook // If we ever to to the inbox, we want to unset the transation id for any other 2030e3fd9d61bc18ad9f828bb3c4dd24fc851f11df5Paul Westbrook // non-inbox folder. 2040e3fd9d61bc18ad9f828bb3c4dd24fc851f11df5Paul Westbrook mLastConversationListTransactionId = INVALID_ID; 2053982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira } 2062175d0a93263672d4498458c81b404b0999134baVikram Aggarwal mConversationListVisible = true; 2077dd054e39986de84a213c56a3c11ac94731402e6Vikram Aggarwal onConversationVisibilityChanged(false); 2089f119c72042e4d0382017d5ddcee9aa2113b6425Paul Westbrook onConversationListVisibilityChanged(true); 209cd09f5e9bf55e6f4310e8dc9408132b9c88e87c3Vikram Aggarwal mConversationListNeverShown = false; 21028d5f72e0ad0db75b6243ee8125bfe3aadbdcb85Mindy Pereira } 21128d5f72e0ad0db75b6243ee8125bfe3aadbdcb85Mindy Pereira 21228d5f72e0ad0db75b6243ee8125bfe3aadbdcb85Mindy Pereira @Override 2139b87568c9e9f1c32a9672b315229866a58a1e757Mindy Pereira public void showConversation(Conversation conversation) { 214ec5cbf79b825c6f96d45e85015319c66470b7e57Vikram Aggarwal super.showConversation(conversation); 2153d7ca9d2aefd20dc115f20532c1e19fdb60f7d68Vikram Aggarwal if (conversation == null) { 2163d7ca9d2aefd20dc115f20532c1e19fdb60f7d68Vikram Aggarwal // This is a request to remove the conversation view, and pop back the view stack. 2173d7ca9d2aefd20dc115f20532c1e19fdb60f7d68Vikram Aggarwal // If we are in conversation list view already, this should be a safe thing to do, so 2183d7ca9d2aefd20dc115f20532c1e19fdb60f7d68Vikram Aggarwal // we don't check viewmode. 2193d7ca9d2aefd20dc115f20532c1e19fdb60f7d68Vikram Aggarwal transitionBackToConversationListMode(); 2203d7ca9d2aefd20dc115f20532c1e19fdb60f7d68Vikram Aggarwal return; 2213d7ca9d2aefd20dc115f20532c1e19fdb60f7d68Vikram Aggarwal } 222e128fc21fab03f6d66c656efeee2155fab449a7fVikram Aggarwal disableCabMode(); 223ae4ea997d3d3f3c8c11fc5a3e7f9d49f82b4e2e7Vikram Aggarwal if (ConversationListContext.isSearchResult(mConvListContext)) { 22468f2e222b4ffccd9f67f02b3a9cfdb3841a7eb43Mindy Pereira mViewMode.enterSearchResultsConversationMode(); 22568f2e222b4ffccd9f67f02b3a9cfdb3841a7eb43Mindy Pereira } else { 22668f2e222b4ffccd9f67f02b3a9cfdb3841a7eb43Mindy Pereira mViewMode.enterConversationMode(); 22768f2e222b4ffccd9f67f02b3a9cfdb3841a7eb43Mindy Pereira } 228632721e6b3a9ba8c476456f2e0fb1b564561e0b5Andy Huang 229632721e6b3a9ba8c476456f2e0fb1b564561e0b5Andy Huang // Switching to conversation view is an incongruous transition: we are not replacing a 230632721e6b3a9ba8c476456f2e0fb1b564561e0b5Andy Huang // fragment with another fragment as usual. Instead, reveal the heretofore inert 231632721e6b3a9ba8c476456f2e0fb1b564561e0b5Andy Huang // conversation ViewPager and just remove the previously visible fragment 232632721e6b3a9ba8c476456f2e0fb1b564561e0b5Andy Huang // (e.g. conversation list, or possibly label list?). 2337dd054e39986de84a213c56a3c11ac94731402e6Vikram Aggarwal final FragmentManager fm = mActivity.getFragmentManager(); 2347dd054e39986de84a213c56a3c11ac94731402e6Vikram Aggarwal final Fragment f = fm.findFragmentById(R.id.content_pane); 235632721e6b3a9ba8c476456f2e0fb1b564561e0b5Andy Huang if (f != null) { 2367dd054e39986de84a213c56a3c11ac94731402e6Vikram Aggarwal final FragmentTransaction ft = fm.beginTransaction(); 237632721e6b3a9ba8c476456f2e0fb1b564561e0b5Andy Huang ft.addToBackStack(null); 238632721e6b3a9ba8c476456f2e0fb1b564561e0b5Andy Huang ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN); 239632721e6b3a9ba8c476456f2e0fb1b564561e0b5Andy Huang ft.remove(f); 240632721e6b3a9ba8c476456f2e0fb1b564561e0b5Andy Huang ft.commitAllowingStateLoss(); 241632721e6b3a9ba8c476456f2e0fb1b564561e0b5Andy Huang } 242632721e6b3a9ba8c476456f2e0fb1b564561e0b5Andy Huang 243632721e6b3a9ba8c476456f2e0fb1b564561e0b5Andy Huang // TODO: improve this transition 24412a4d8040d64501aa5a24c25865c806331560b74Mindy Pereira mPagerController.show(mAccount, mFolder, conversation); 2457dd054e39986de84a213c56a3c11ac94731402e6Vikram Aggarwal onConversationVisibilityChanged(true); 246632721e6b3a9ba8c476456f2e0fb1b564561e0b5Andy Huang resetActionBarIcon(); 247632721e6b3a9ba8c476456f2e0fb1b564561e0b5Andy Huang 2482175d0a93263672d4498458c81b404b0999134baVikram Aggarwal mConversationListVisible = false; 2499f119c72042e4d0382017d5ddcee9aa2113b6425Paul Westbrook onConversationListVisibilityChanged(false); 2509b87568c9e9f1c32a9672b315229866a58a1e757Mindy Pereira } 2519b87568c9e9f1c32a9672b315229866a58a1e757Mindy Pereira 2529b87568c9e9f1c32a9672b315229866a58a1e757Mindy Pereira @Override 2532d50bcdca57756ecad20d21da0d936243215b79cPaul Westbrook public void showWaitForInitialization() { 2542d50bcdca57756ecad20d21da0d936243215b79cPaul Westbrook super.showWaitForInitialization(); 2552d50bcdca57756ecad20d21da0d936243215b79cPaul Westbrook 2562d50bcdca57756ecad20d21da0d936243215b79cPaul Westbrook replaceFragment(WaitFragment.newInstance(mAccount), 2576902dcf8688d7d0691639f49365a78a3a78fe9e3Vikram Aggarwal FragmentTransaction.TRANSIT_FRAGMENT_OPEN, TAG_WAIT); 2582d50bcdca57756ecad20d21da0d936243215b79cPaul Westbrook } 2592d50bcdca57756ecad20d21da0d936243215b79cPaul Westbrook 2602d50bcdca57756ecad20d21da0d936243215b79cPaul Westbrook @Override 2612d50bcdca57756ecad20d21da0d936243215b79cPaul Westbrook public void hideWaitForInitialization() { 2622d50bcdca57756ecad20d21da0d936243215b79cPaul Westbrook transitionToInbox(); 2632d50bcdca57756ecad20d21da0d936243215b79cPaul Westbrook } 2642d50bcdca57756ecad20d21da0d936243215b79cPaul Westbrook 2652d50bcdca57756ecad20d21da0d936243215b79cPaul Westbrook @Override 2669b87568c9e9f1c32a9672b315229866a58a1e757Mindy Pereira public void showFolderList() { 2679e85333dfc57e7c98ffef27cded4712ea598f554Paul Westbrook if (mAccount == null) { 2689e85333dfc57e7c98ffef27cded4712ea598f554Paul Westbrook LogUtils.e(LOG_TAG, "Null account in showFolderList"); 2699e85333dfc57e7c98ffef27cded4712ea598f554Paul Westbrook return; 2709e85333dfc57e7c98ffef27cded4712ea598f554Paul Westbrook } 27111e3596e8c5978d07195ae2d7c8a96bb51aa75b3Mindy Pereira // Null out the currently selected folder; we have nothing selected the 27211e3596e8c5978d07195ae2d7c8a96bb51aa75b3Mindy Pereira // first time the user enters the folder list 273c975e8416b64a1ebdec6adee7e65dd1d0928e8d4Mindy Pereira setHierarchyFolder(null); 27401668eb393deaf8c8b8abf86be46109614a98631Mindy Pereira mViewMode.enterFolderListMode(); 2750ec2a71d1bb48f1fa57f1a4c8a6d81a49f44400fVikram Aggarwal enableCabMode(); 2763982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira mLastFolderListTransactionId = replaceFragment( 277a76e5aeff4a54ec70661de35be4f3ecb9d1d2fe2Mindy Pereira FolderListFragment.newInstance(null, mAccount.folderListUri), 2786902dcf8688d7d0691639f49365a78a3a78fe9e3Vikram Aggarwal FragmentTransaction.TRANSIT_FRAGMENT_OPEN, TAG_FOLDER_LIST); 2792175d0a93263672d4498458c81b404b0999134baVikram Aggarwal mConversationListVisible = false; 2807dd054e39986de84a213c56a3c11ac94731402e6Vikram Aggarwal onConversationVisibilityChanged(false); 2819f119c72042e4d0382017d5ddcee9aa2113b6425Paul Westbrook onConversationListVisibilityChanged(false); 2829b87568c9e9f1c32a9672b315229866a58a1e757Mindy Pereira } 2839b87568c9e9f1c32a9672b315229866a58a1e757Mindy Pereira 2846902dcf8688d7d0691639f49365a78a3a78fe9e3Vikram Aggarwal /** 2856902dcf8688d7d0691639f49365a78a3a78fe9e3Vikram Aggarwal * Replace the content_pane with the fragment specified here. The tag is specified so that 2866902dcf8688d7d0691639f49365a78a3a78fe9e3Vikram Aggarwal * the {@link ActivityController} can look up the fragments through the 2876902dcf8688d7d0691639f49365a78a3a78fe9e3Vikram Aggarwal * {@link android.app.FragmentManager}. 2886902dcf8688d7d0691639f49365a78a3a78fe9e3Vikram Aggarwal * @param fragment 2896902dcf8688d7d0691639f49365a78a3a78fe9e3Vikram Aggarwal * @param transition 2906902dcf8688d7d0691639f49365a78a3a78fe9e3Vikram Aggarwal * @param tag 2916902dcf8688d7d0691639f49365a78a3a78fe9e3Vikram Aggarwal * @return transaction ID returned when the transition is committed. 2926902dcf8688d7d0691639f49365a78a3a78fe9e3Vikram Aggarwal */ 2932d50bcdca57756ecad20d21da0d936243215b79cPaul Westbrook private int replaceFragment(Fragment fragment, int transition, String tag) { 294d7a12cd5b5c2639b653d8c671b04844ef02ee01dVikram Aggarwal FragmentTransaction fragmentTransaction = mActivity.getFragmentManager().beginTransaction(); 295d7a12cd5b5c2639b653d8c671b04844ef02ee01dVikram Aggarwal fragmentTransaction.addToBackStack(null); 296d7a12cd5b5c2639b653d8c671b04844ef02ee01dVikram Aggarwal fragmentTransaction.setTransition(transition); 2972d50bcdca57756ecad20d21da0d936243215b79cPaul Westbrook fragmentTransaction.replace(R.id.content_pane, fragment, tag); 2986902dcf8688d7d0691639f49365a78a3a78fe9e3Vikram Aggarwal final int transactionId = fragmentTransaction.commitAllowingStateLoss(); 299d7a12cd5b5c2639b653d8c671b04844ef02ee01dVikram Aggarwal resetActionBarIcon(); 3003982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira return transactionId; 301d7a12cd5b5c2639b653d8c671b04844ef02ee01dVikram Aggarwal } 30201668eb393deaf8c8b8abf86be46109614a98631Mindy Pereira 3033982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira /** 3043982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira * Back works as follows: 3053982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira * 1) If the user is in the folder list view, go back 3063982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira * to the account default inbox. 3073982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira * 2) If the user is in a conversation list 3083982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira * that is not the inbox AND: 3093982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira * a) they got there by going through the folder 3103982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira * list view, go back to the folder list view. 3113982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira * b) they got there by using some other means (account dropdown), go back to the inbox. 3123982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira * 3) If the user is in a conversation, go back to the conversation list they were last in. 3133982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira * 4) If the user is in the conversation list for the default account inbox, 3143982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira * back exits the app. 3153982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira */ 31601668eb393deaf8c8b8abf86be46109614a98631Mindy Pereira @Override 31701668eb393deaf8c8b8abf86be46109614a98631Mindy Pereira public boolean onBackPressed() { 3182074a056bb2a634c66996225c55620d2aa6f7ac5Vikram Aggarwal final int mode = mViewMode.getMode(); 3193982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira if (mode == ViewMode.FOLDER_LIST) { 320aea87622d3244be963ee4e9f9780e79b34ffe260Paul Westbrook final Folder hierarchyFolder = getHierarchyFolder(); 321aea87622d3244be963ee4e9f9780e79b34ffe260Paul Westbrook final FolderListFragment folderListFragment = getFolderListFragment(); 322aea87622d3244be963ee4e9f9780e79b34ffe260Paul Westbrook if (folderListFragment != null && 323aea87622d3244be963ee4e9f9780e79b34ffe260Paul Westbrook folderListFragment.showingHierarchy() && hierarchyFolder != null) { 32411e3596e8c5978d07195ae2d7c8a96bb51aa75b3Mindy Pereira // If we are showing the folder list and the user is exploring 32511e3596e8c5978d07195ae2d7c8a96bb51aa75b3Mindy Pereira // the children of a single parent folder, 32611e3596e8c5978d07195ae2d7c8a96bb51aa75b3Mindy Pereira // back should display the parent folder's parent and siblings. 327ea94550fcca64c3a3510cc10b0e5465d9018668eMindy Pereira goUpFolderHierarchy(hierarchyFolder); 32811e3596e8c5978d07195ae2d7c8a96bb51aa75b3Mindy Pereira } else { 32911e3596e8c5978d07195ae2d7c8a96bb51aa75b3Mindy Pereira // We are at the topmost list of folders; just go back to 33011e3596e8c5978d07195ae2d7c8a96bb51aa75b3Mindy Pereira // whatever conv list we were viewing before. 33111e3596e8c5978d07195ae2d7c8a96bb51aa75b3Mindy Pereira mLastFolderListTransactionId = INVALID_ID; 33211e3596e8c5978d07195ae2d7c8a96bb51aa75b3Mindy Pereira transitionToInbox(); 33311e3596e8c5978d07195ae2d7c8a96bb51aa75b3Mindy Pereira } 33468f2e222b4ffccd9f67f02b3a9cfdb3841a7eb43Mindy Pereira } else if (mode == ViewMode.SEARCH_RESULTS_LIST) { 33568f2e222b4ffccd9f67f02b3a9cfdb3841a7eb43Mindy Pereira mActivity.finish(); 336b466bcf49502a1178cf7362a81470f3231d8892bMindy Pereira } else if (mViewMode.isListMode() && !inInbox(mAccount, mConvListContext)) { 33711e3596e8c5978d07195ae2d7c8a96bb51aa75b3Mindy Pereira if (mLastFolderListTransactionId != INVALID_ID) { 33811e3596e8c5978d07195ae2d7c8a96bb51aa75b3Mindy Pereira // If the user got here by navigating via the folder list, back 33911e3596e8c5978d07195ae2d7c8a96bb51aa75b3Mindy Pereira // should bring them back to the folder list. 3403982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira mViewMode.enterFolderListMode(); 3413982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira mActivity.getFragmentManager().popBackStack(mLastFolderListTransactionId, 0); 3423982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira } else { 3433982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira transitionToInbox(); 3443982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira } 34568f2e222b4ffccd9f67f02b3a9cfdb3841a7eb43Mindy Pereira } else if (mode == ViewMode.CONVERSATION || mode == ViewMode.SEARCH_RESULTS_CONVERSATION) { 346f5acda4a4b7c9e8ecacb41cb7d570ef426b6d4fcMindy Pereira transitionBackToConversationListMode(); 3473982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira } else { 3483982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira mActivity.finish(); 3493982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira } 350c2c9dc14aa184db1f05b8c060b27d97dda5a3ca4Andrew Sapperstein mToastBar.hide(false); 3513982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira return true; 3523982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira } 3533982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira 35412a4d8040d64501aa5a24c25865c806331560b74Mindy Pereira private void goUpFolderHierarchy(Folder current) { 35512a4d8040d64501aa5a24c25865c806331560b74Mindy Pereira Folder top = current.parent; 35612a4d8040d64501aa5a24c25865c806331560b74Mindy Pereira if (top != null) { 35799f18d1504203d2f3a82373dcc0937ef0277561aMindy Pereira setHierarchyFolder(top); 35812a4d8040d64501aa5a24c25865c806331560b74Mindy Pereira // Replace this fragment with a new FolderListFragment 35912a4d8040d64501aa5a24c25865c806331560b74Mindy Pereira // showing this folder's children if we are not already 36012a4d8040d64501aa5a24c25865c806331560b74Mindy Pereira // looking at the child view for this folder. 36112a4d8040d64501aa5a24c25865c806331560b74Mindy Pereira mLastFolderListTransactionId = replaceFragment(FolderListFragment.newInstance( 36212a4d8040d64501aa5a24c25865c806331560b74Mindy Pereira top, top.childFoldersListUri), 36312a4d8040d64501aa5a24c25865c806331560b74Mindy Pereira FragmentTransaction.TRANSIT_FRAGMENT_OPEN, TAG_FOLDER_LIST); 36412a4d8040d64501aa5a24c25865c806331560b74Mindy Pereira // Show the up affordance when digging into child folders. 36512a4d8040d64501aa5a24c25865c806331560b74Mindy Pereira mActionBarView.setBackButton(); 36612a4d8040d64501aa5a24c25865c806331560b74Mindy Pereira } else { 36712a4d8040d64501aa5a24c25865c806331560b74Mindy Pereira // Otherwise, clear the selected folder and go back to whatever the 36812a4d8040d64501aa5a24c25865c806331560b74Mindy Pereira // last folder list displayed was. 36912a4d8040d64501aa5a24c25865c806331560b74Mindy Pereira showFolderList(); 37012a4d8040d64501aa5a24c25865c806331560b74Mindy Pereira } 37112a4d8040d64501aa5a24c25865c806331560b74Mindy Pereira } 37212a4d8040d64501aa5a24c25865c806331560b74Mindy Pereira 3733982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira private void transitionToInbox() { 3748690e2b71e1a3dd812ce418c9607e21f3a88ab54Mindy Pereira mViewMode.enterConversationListMode(); 375f6acdade010b2d0f49fd425b33e7f7b376286490Mindy Pereira if (mInbox == null) { 376ab4863650794e81f35a0fd9abc16a5564d7b102bMindy Pereira loadAccountInbox(); 3773982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira } else { 37853d46a3e3b3c3d97696ecfffc3a99ac9250063e8Vikram Aggarwal ConversationListContext listContext = ConversationListContext.forFolder( 379f6acdade010b2d0f49fd425b33e7f7b376286490Mindy Pereira mAccount, mInbox); 38072a9f3918310f581fecf6411174645ad5b5ae112Mindy Pereira // Set the correct context for what the conversation view will be 38172a9f3918310f581fecf6411174645ad5b5ae112Mindy Pereira // now. 382f6acdade010b2d0f49fd425b33e7f7b376286490Mindy Pereira onFolderChanged(mInbox); 38372a9f3918310f581fecf6411174645ad5b5ae112Mindy Pereira showConversationList(listContext); 38401668eb393deaf8c8b8abf86be46109614a98631Mindy Pereira } 38501668eb393deaf8c8b8abf86be46109614a98631Mindy Pereira } 386f5acda4a4b7c9e8ecacb41cb7d570ef426b6d4fcMindy Pereira 387118b3f6443f1859ff4866c97c0e8896f3415f730Mindy Pereira @Override 388505df5f59c92adbe8eaa734321c1d3f91be84a4aMindy Pereira public void onFolderSelected(Folder folder) { 389a1f99981919755e50f31fe300517d2fed752997eMindy Pereira if (folder.hasChildren && !folder.equals(getHierarchyFolder())) { 3900f7ae7a2d244463f75b3d4e1f79e27305a4dcb38Mindy Pereira mViewMode.enterFolderListMode(); 391c975e8416b64a1ebdec6adee7e65dd1d0928e8d4Mindy Pereira setHierarchyFolder(folder); 39256e3f50f5aee6606035eae4b713ef634c4f3a686Mindy Pereira // Replace this fragment with a new FolderListFragment 39311e3596e8c5978d07195ae2d7c8a96bb51aa75b3Mindy Pereira // showing this folder's children if we are not already 39411e3596e8c5978d07195ae2d7c8a96bb51aa75b3Mindy Pereira // looking at the child view for this folder. 39556e3f50f5aee6606035eae4b713ef634c4f3a686Mindy Pereira mLastFolderListTransactionId = replaceFragment( 396a76e5aeff4a54ec70661de35be4f3ecb9d1d2fe2Mindy Pereira FolderListFragment.newInstance(folder, folder.childFoldersListUri), 3976902dcf8688d7d0691639f49365a78a3a78fe9e3Vikram Aggarwal FragmentTransaction.TRANSIT_FRAGMENT_OPEN, TAG_FOLDER_LIST); 39812a4d8040d64501aa5a24c25865c806331560b74Mindy Pereira // Show the up affordance when digging into child folders. 39912a4d8040d64501aa5a24c25865c806331560b74Mindy Pereira mActionBarView.setBackButton(); 40011e3596e8c5978d07195ae2d7c8a96bb51aa75b3Mindy Pereira } else { 40112a4d8040d64501aa5a24c25865c806331560b74Mindy Pereira super.onFolderSelected(folder); 402118b3f6443f1859ff4866c97c0e8896f3415f730Mindy Pereira } 403118b3f6443f1859ff4866c97c0e8896f3415f730Mindy Pereira } 404118b3f6443f1859ff4866c97c0e8896f3415f730Mindy Pereira 4053982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira private boolean isTransactionIdValid(int id) { 4063982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira return id >= 0; 4073982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira } 4083982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira 4093982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira /** 4103982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira * Up works as follows: 4113982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira * 1) If the user is in a conversation list that is not the default account inbox, 4123982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira * a conversation, or the folder list, up follows the rules of back. 4133982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira * 2) If the user is in search results, up exits search 4143982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira * mode and returns the user to whatever view they were in when they began search. 4153982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira * 3) If the user is in the inbox, there is no up. 4163982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira */ 417f5acda4a4b7c9e8ecacb41cb7d570ef426b6d4fcMindy Pereira @Override 418f5acda4a4b7c9e8ecacb41cb7d570ef426b6d4fcMindy Pereira public boolean onUpPressed() { 4199da85df06175d25c52a09e08df3b02d1fd9cc6b7Vikram Aggarwal final int mode = mViewMode.getMode(); 42068f2e222b4ffccd9f67f02b3a9cfdb3841a7eb43Mindy Pereira if (mode == ViewMode.SEARCH_RESULTS_LIST) { 42168f2e222b4ffccd9f67f02b3a9cfdb3841a7eb43Mindy Pereira mActivity.finish(); 422b466bcf49502a1178cf7362a81470f3231d8892bMindy Pereira } else if ((!inInbox(mAccount, mConvListContext) && mViewMode.isListMode()) 42368f2e222b4ffccd9f67f02b3a9cfdb3841a7eb43Mindy Pereira || mode == ViewMode.CONVERSATION 42468f2e222b4ffccd9f67f02b3a9cfdb3841a7eb43Mindy Pereira || mode == ViewMode.FOLDER_LIST 42568f2e222b4ffccd9f67f02b3a9cfdb3841a7eb43Mindy Pereira || mode == ViewMode.SEARCH_RESULTS_CONVERSATION) { 426f5acda4a4b7c9e8ecacb41cb7d570ef426b6d4fcMindy Pereira // Same as go back. 427f5acda4a4b7c9e8ecacb41cb7d570ef426b6d4fcMindy Pereira mActivity.onBackPressed(); 428f5acda4a4b7c9e8ecacb41cb7d570ef426b6d4fcMindy Pereira } 429f5acda4a4b7c9e8ecacb41cb7d570ef426b6d4fcMindy Pereira return true; 430f5acda4a4b7c9e8ecacb41cb7d570ef426b6d4fcMindy Pereira } 431f5acda4a4b7c9e8ecacb41cb7d570ef426b6d4fcMindy Pereira 432f5acda4a4b7c9e8ecacb41cb7d570ef426b6d4fcMindy Pereira private void transitionBackToConversationListMode() { 4339da85df06175d25c52a09e08df3b02d1fd9cc6b7Vikram Aggarwal final int mode = mViewMode.getMode(); 43490d89e2194cecb6ff0179c8159870575edf7365eVikram Aggarwal enableCabMode(); 43568f2e222b4ffccd9f67f02b3a9cfdb3841a7eb43Mindy Pereira if (mode == ViewMode.SEARCH_RESULTS_CONVERSATION) { 43668f2e222b4ffccd9f67f02b3a9cfdb3841a7eb43Mindy Pereira mViewMode.enterSearchResultsListMode(); 43768f2e222b4ffccd9f67f02b3a9cfdb3841a7eb43Mindy Pereira } else { 43868f2e222b4ffccd9f67f02b3a9cfdb3841a7eb43Mindy Pereira mViewMode.enterConversationListMode(); 43968f2e222b4ffccd9f67f02b3a9cfdb3841a7eb43Mindy Pereira } 44021ab490d4919985d611bc36ae2d8aea86a911499Mindy Pereira if (isTransactionIdValid(mLastConversationListTransactionId)) { 44121ab490d4919985d611bc36ae2d8aea86a911499Mindy Pereira mActivity.getFragmentManager().popBackStack(mLastConversationListTransactionId, 0); 44221ab490d4919985d611bc36ae2d8aea86a911499Mindy Pereira resetActionBarIcon(); 4430e3fd9d61bc18ad9f828bb3c4dd24fc851f11df5Paul Westbrook } else if (isTransactionIdValid(mLastInboxConversationListTransactionId)) { 4440e3fd9d61bc18ad9f828bb3c4dd24fc851f11df5Paul Westbrook mActivity.getFragmentManager().popBackStack(mLastInboxConversationListTransactionId, 0); 4450e3fd9d61bc18ad9f828bb3c4dd24fc851f11df5Paul Westbrook resetActionBarIcon(); 4460e3fd9d61bc18ad9f828bb3c4dd24fc851f11df5Paul Westbrook onFolderChanged(mInbox); 44721ab490d4919985d611bc36ae2d8aea86a911499Mindy Pereira } else { 4489da85df06175d25c52a09e08df3b02d1fd9cc6b7Vikram Aggarwal // TODO: revisit if this block is necessary 44953d46a3e3b3c3d97696ecfffc3a99ac9250063e8Vikram Aggarwal final ConversationListContext listContext = ConversationListContext.forFolder( 45021ab490d4919985d611bc36ae2d8aea86a911499Mindy Pereira mAccount, mInbox); 45121ab490d4919985d611bc36ae2d8aea86a911499Mindy Pereira // Set the correct context for what the conversation view will be now. 45221ab490d4919985d611bc36ae2d8aea86a911499Mindy Pereira onFolderChanged(mInbox); 45321ab490d4919985d611bc36ae2d8aea86a911499Mindy Pereira showConversationList(listContext); 45421ab490d4919985d611bc36ae2d8aea86a911499Mindy Pereira } 455f5acda4a4b7c9e8ecacb41cb7d570ef426b6d4fcMindy Pereira resetActionBarIcon(); 4569f119c72042e4d0382017d5ddcee9aa2113b6425Paul Westbrook 4579f119c72042e4d0382017d5ddcee9aa2113b6425Paul Westbrook mConversationListVisible = true; 4587dd054e39986de84a213c56a3c11ac94731402e6Vikram Aggarwal onConversationVisibilityChanged(false); 4599f119c72042e4d0382017d5ddcee9aa2113b6425Paul Westbrook onConversationListVisibilityChanged(true); 460f5acda4a4b7c9e8ecacb41cb7d570ef426b6d4fcMindy Pereira } 461b849dfbda3c917f078a5c09f03906886c27ecbecMindy Pereira 462b849dfbda3c917f078a5c09f03906886c27ecbecMindy Pereira @Override 463b849dfbda3c917f078a5c09f03906886c27ecbecMindy Pereira public boolean shouldShowFirstConversation() { 464b849dfbda3c917f078a5c09f03906886c27ecbecMindy Pereira return false; 465b849dfbda3c917f078a5c09f03906886c27ecbecMindy Pereira } 466fbe4019a262f6b1934a44e598009ae63dc5745eeMindy Pereira 467fbe4019a262f6b1934a44e598009ae63dc5745eeMindy Pereira @Override 468d3367499e56116854ed637b1036fd71057ac0f49Mindy Pereira public void onUndoAvailable(ToastBarOperation op) { 4690963ef8394e1f0bca3f931f930b127b00790361aMindy Pereira if (op != null && mAccount.supportsCapability(UIProvider.AccountCapabilities.UNDO)) { 4707f602f7a64f176894ccb7942a6642f22584c3894Vikram Aggarwal final int mode = mViewMode.getMode(); 471dbab8fab0c98dc2d56bbe17c7436719129952b7bMindy Pereira final ConversationListFragment convList = getConversationListFragment(); 4720963ef8394e1f0bca3f931f930b127b00790361aMindy Pereira switch (mode) { 473b466bcf49502a1178cf7362a81470f3231d8892bMindy Pereira case ViewMode.SEARCH_RESULTS_CONVERSATION: 4740963ef8394e1f0bca3f931f930b127b00790361aMindy Pereira case ViewMode.CONVERSATION: 475c2c9dc14aa184db1f05b8c060b27d97dda5a3ca4Andrew Sapperstein mToastBar.setConversationMode(true); 476c2c9dc14aa184db1f05b8c060b27d97dda5a3ca4Andrew Sapperstein mToastBar.show( 477c2c9dc14aa184db1f05b8c060b27d97dda5a3ca4Andrew Sapperstein getUndoClickedListener( 478c2c9dc14aa184db1f05b8c060b27d97dda5a3ca4Andrew Sapperstein convList != null ? convList.getAnimatedAdapter() : null), 479c2c9dc14aa184db1f05b8c060b27d97dda5a3ca4Andrew Sapperstein 0, 48001f30509c4c8ad0d13b7635447b7f023c7a0cab7Mindy Pereira Html.fromHtml(op.getDescription(mActivity.getActivityContext(), 48101f30509c4c8ad0d13b7635447b7f023c7a0cab7Mindy Pereira mFolder)), 482c2c9dc14aa184db1f05b8c060b27d97dda5a3ca4Andrew Sapperstein true, /* showActionIcon */ 483c2c9dc14aa184db1f05b8c060b27d97dda5a3ca4Andrew Sapperstein R.string.undo, 484d3367499e56116854ed637b1036fd71057ac0f49Mindy Pereira true, /* replaceVisibleToast */ 485d3367499e56116854ed637b1036fd71057ac0f49Mindy Pereira op); 4860963ef8394e1f0bca3f931f930b127b00790361aMindy Pereira break; 487b466bcf49502a1178cf7362a81470f3231d8892bMindy Pereira case ViewMode.SEARCH_RESULTS_LIST: 4880963ef8394e1f0bca3f931f930b127b00790361aMindy Pereira case ViewMode.CONVERSATION_LIST: 4896902dcf8688d7d0691639f49365a78a3a78fe9e3Vikram Aggarwal if (convList != null) { 490c2c9dc14aa184db1f05b8c060b27d97dda5a3ca4Andrew Sapperstein mToastBar.setConversationMode(false); 491c2c9dc14aa184db1f05b8c060b27d97dda5a3ca4Andrew Sapperstein mToastBar.show( 492c2c9dc14aa184db1f05b8c060b27d97dda5a3ca4Andrew Sapperstein getUndoClickedListener(convList.getAnimatedAdapter()), 493c2c9dc14aa184db1f05b8c060b27d97dda5a3ca4Andrew Sapperstein 0, 49401f30509c4c8ad0d13b7635447b7f023c7a0cab7Mindy Pereira Html.fromHtml(op.getDescription(mActivity.getActivityContext(), 49501f30509c4c8ad0d13b7635447b7f023c7a0cab7Mindy Pereira mFolder)), 496c2c9dc14aa184db1f05b8c060b27d97dda5a3ca4Andrew Sapperstein true, /* showActionIcon */ 497c2c9dc14aa184db1f05b8c060b27d97dda5a3ca4Andrew Sapperstein R.string.undo, 498d3367499e56116854ed637b1036fd71057ac0f49Mindy Pereira true, /* replaceVisibleToast */ 499d3367499e56116854ed637b1036fd71057ac0f49Mindy Pereira op); 5004765c5c90802d0abcf2b05c4967e7dd7d2284f9aMindy Pereira } else { 5014765c5c90802d0abcf2b05c4967e7dd7d2284f9aMindy Pereira mActivity.setPendingToastOperation(op); 5026902dcf8688d7d0691639f49365a78a3a78fe9e3Vikram Aggarwal } 5030963ef8394e1f0bca3f931f930b127b00790361aMindy Pereira break; 5040963ef8394e1f0bca3f931f930b127b00790361aMindy Pereira } 5050963ef8394e1f0bca3f931f930b127b00790361aMindy Pereira } 5060963ef8394e1f0bca3f931f930b127b00790361aMindy Pereira } 507c2c9dc14aa184db1f05b8c060b27d97dda5a3ca4Andrew Sapperstein 508c2c9dc14aa184db1f05b8c060b27d97dda5a3ca4Andrew Sapperstein @Override 5099d7519d18e8ddbcdd59b37eec7c85210fca0e8c2Andrew Sapperstein public void onError(final Folder folder, boolean replaceVisibleToast) { 510c2c9dc14aa184db1f05b8c060b27d97dda5a3ca4Andrew Sapperstein final int mode = mViewMode.getMode(); 511c2c9dc14aa184db1f05b8c060b27d97dda5a3ca4Andrew Sapperstein switch (mode) { 512c2c9dc14aa184db1f05b8c060b27d97dda5a3ca4Andrew Sapperstein case ViewMode.SEARCH_RESULTS_LIST: 513c2c9dc14aa184db1f05b8c060b27d97dda5a3ca4Andrew Sapperstein case ViewMode.CONVERSATION_LIST: 5149d7519d18e8ddbcdd59b37eec7c85210fca0e8c2Andrew Sapperstein showErrorToast(folder, replaceVisibleToast); 515c2c9dc14aa184db1f05b8c060b27d97dda5a3ca4Andrew Sapperstein break; 516c2c9dc14aa184db1f05b8c060b27d97dda5a3ca4Andrew Sapperstein default: 517c2c9dc14aa184db1f05b8c060b27d97dda5a3ca4Andrew Sapperstein break; 518c2c9dc14aa184db1f05b8c060b27d97dda5a3ca4Andrew Sapperstein } 519c2c9dc14aa184db1f05b8c060b27d97dda5a3ca4Andrew Sapperstein } 520a55b36cb6b75ce8096812183651e89115300975aVikram Aggarwal} 521