OnePaneController.java revision 0f7ae7a2d244463f75b3d4e1f79e27305a4dcb38
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; 261ddcf0f2bf44d3c9db89112ef52510d9b2433ac4Vikram Aggarwal 27d7a12cd5b5c2639b653d8c671b04844ef02ee01dVikram Aggarwalimport com.android.mail.ConversationListContext; 281ddcf0f2bf44d3c9db89112ef52510d9b2433ac4Vikram Aggarwalimport com.android.mail.R; 29cd09f5e9bf55e6f4310e8dc9408132b9c88e87c3Vikram Aggarwalimport com.android.mail.providers.Account; 309b87568c9e9f1c32a9672b315229866a58a1e757Mindy Pereiraimport com.android.mail.providers.Conversation; 313982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereiraimport com.android.mail.providers.Folder; 32fbe4019a262f6b1934a44e598009ae63dc5745eeMindy Pereiraimport com.android.mail.providers.Settings; 33fbe4019a262f6b1934a44e598009ae63dc5745eeMindy Pereiraimport com.android.mail.providers.UIProvider; 349e85333dfc57e7c98ffef27cded4712ea598f554Paul Westbrookimport com.android.mail.utils.LogUtils; 35fbe4019a262f6b1934a44e598009ae63dc5745eeMindy Pereira 36a55b36cb6b75ce8096812183651e89115300975aVikram Aggarwal/** 37a55b36cb6b75ce8096812183651e89115300975aVikram Aggarwal * Controller for one-pane Mail activity. One Pane is used for phones, where screen real estate is 38d7a12cd5b5c2639b653d8c671b04844ef02ee01dVikram Aggarwal * limited. This controller also does the layout, since the layout is simpler in the one pane case. 39a55b36cb6b75ce8096812183651e89115300975aVikram Aggarwal */ 40a55b36cb6b75ce8096812183651e89115300975aVikram Aggarwal 41a55b36cb6b75ce8096812183651e89115300975aVikram Aggarwal// Called OnePaneActivityController in Gmail. 42a76e5aeff4a54ec70661de35be4f3ecb9d1d2fe2Mindy Pereirapublic final class OnePaneController extends AbstractActivityController { 436902dcf8688d7d0691639f49365a78a3a78fe9e3Vikram Aggarwal // Used for saving transaction IDs in bundles 443982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira private static final String FOLDER_LIST_TRANSACTION_KEY = "folder-list-transaction"; 450e3fd9d61bc18ad9f828bb3c4dd24fc851f11df5Paul Westbrook private static final String INBOX_CONVERSATION_LIST_TRANSACTION_KEY = 460e3fd9d61bc18ad9f828bb3c4dd24fc851f11df5Paul Westbrook "inbox_conversation-list-transaction"; 473982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira private static final String CONVERSATION_LIST_TRANSACTION_KEY = "conversation-list-transaction"; 483982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira private static final String CONVERSATION_TRANSACTION_KEY = "conversation-transaction"; 492d50bcdca57756ecad20d21da0d936243215b79cPaul Westbrook 503982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira private static final int INVALID_ID = -1; 512175d0a93263672d4498458c81b404b0999134baVikram Aggarwal private boolean mConversationListVisible = false; 520e3fd9d61bc18ad9f828bb3c4dd24fc851f11df5Paul Westbrook private int mLastInboxConversationListTransactionId = INVALID_ID; 533982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira private int mLastConversationListTransactionId = INVALID_ID; 543982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira private int mLastConversationTransactionId = INVALID_ID; 553982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira private int mLastFolderListTransactionId = INVALID_ID; 563982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira private Folder mInbox; 57cd09f5e9bf55e6f4310e8dc9408132b9c88e87c3Vikram Aggarwal /** Whether a conversation list for this account has ever been shown.*/ 58cd09f5e9bf55e6f4310e8dc9408132b9c88e87c3Vikram Aggarwal private boolean mConversationListNeverShown = true; 59cd09f5e9bf55e6f4310e8dc9408132b9c88e87c3Vikram Aggarwal 60a55b36cb6b75ce8096812183651e89115300975aVikram Aggarwal /** 61a55b36cb6b75ce8096812183651e89115300975aVikram Aggarwal * @param activity 62a55b36cb6b75ce8096812183651e89115300975aVikram Aggarwal * @param viewMode 63a55b36cb6b75ce8096812183651e89115300975aVikram Aggarwal */ 64a55b36cb6b75ce8096812183651e89115300975aVikram Aggarwal public OnePaneController(MailActivity activity, ViewMode viewMode) { 65a55b36cb6b75ce8096812183651e89115300975aVikram Aggarwal super(activity, viewMode); 66a55b36cb6b75ce8096812183651e89115300975aVikram Aggarwal } 67a55b36cb6b75ce8096812183651e89115300975aVikram Aggarwal 681ddcf0f2bf44d3c9db89112ef52510d9b2433ac4Vikram Aggarwal @Override 69632721e6b3a9ba8c476456f2e0fb1b564561e0b5Andy Huang public void onRestoreInstanceState(Bundle inState) { 70632721e6b3a9ba8c476456f2e0fb1b564561e0b5Andy Huang super.onRestoreInstanceState(inState); 713982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira // TODO(mindyp) handle saved state. 723982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira if (inState != null) { 733982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira mLastFolderListTransactionId = inState.getInt(FOLDER_LIST_TRANSACTION_KEY, INVALID_ID); 740e3fd9d61bc18ad9f828bb3c4dd24fc851f11df5Paul Westbrook mLastInboxConversationListTransactionId = 750e3fd9d61bc18ad9f828bb3c4dd24fc851f11df5Paul Westbrook inState.getInt(INBOX_CONVERSATION_LIST_TRANSACTION_KEY, INVALID_ID); 763982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira mLastConversationListTransactionId = inState.getInt(CONVERSATION_LIST_TRANSACTION_KEY, 773982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira INVALID_ID); 783982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira mLastConversationTransactionId = inState.getInt(CONVERSATION_TRANSACTION_KEY, 793982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira INVALID_ID); 803982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira } 813982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira } 823982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira 833982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira @Override 843982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira public void onSaveInstanceState(Bundle outState) { 853982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira super.onSaveInstanceState(outState); 863982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira // TODO(mindyp) handle saved state. 873982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira outState.putInt(FOLDER_LIST_TRANSACTION_KEY, mLastFolderListTransactionId); 880e3fd9d61bc18ad9f828bb3c4dd24fc851f11df5Paul Westbrook outState.putInt(INBOX_CONVERSATION_LIST_TRANSACTION_KEY, 890e3fd9d61bc18ad9f828bb3c4dd24fc851f11df5Paul Westbrook mLastInboxConversationListTransactionId); 903982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira outState.putInt(CONVERSATION_LIST_TRANSACTION_KEY, mLastConversationListTransactionId); 913982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira outState.putInt(CONVERSATION_TRANSACTION_KEY, mLastConversationTransactionId); 923982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira } 933982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira 943982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira @Override 95d7a12cd5b5c2639b653d8c671b04844ef02ee01dVikram Aggarwal public void resetActionBarIcon() { 96d7a12cd5b5c2639b653d8c671b04844ef02ee01dVikram Aggarwal final int mode = mViewMode.getMode(); 972074a056bb2a634c66996225c55620d2aa6f7ac5Vikram Aggarwal if (!inInbox(mAccount, mConvListContext) 9868f2e222b4ffccd9f67f02b3a9cfdb3841a7eb43Mindy Pereira || mode == ViewMode.SEARCH_RESULTS_LIST 9968f2e222b4ffccd9f67f02b3a9cfdb3841a7eb43Mindy Pereira || mode == ViewMode.SEARCH_RESULTS_CONVERSATION 10068f2e222b4ffccd9f67f02b3a9cfdb3841a7eb43Mindy Pereira || mode == ViewMode.CONVERSATION 10168f2e222b4ffccd9f67f02b3a9cfdb3841a7eb43Mindy Pereira || mode == ViewMode.FOLDER_LIST) { 102d7a12cd5b5c2639b653d8c671b04844ef02ee01dVikram Aggarwal mActionBarView.setBackButton(); 103d7a12cd5b5c2639b653d8c671b04844ef02ee01dVikram Aggarwal } else { 104d7a12cd5b5c2639b653d8c671b04844ef02ee01dVikram Aggarwal mActionBarView.removeBackButton(); 105d7a12cd5b5c2639b653d8c671b04844ef02ee01dVikram Aggarwal } 106d7a12cd5b5c2639b653d8c671b04844ef02ee01dVikram Aggarwal } 107d7a12cd5b5c2639b653d8c671b04844ef02ee01dVikram Aggarwal 1087dd054e39986de84a213c56a3c11ac94731402e6Vikram Aggarwal /** 1097dd054e39986de84a213c56a3c11ac94731402e6Vikram Aggarwal * Returns true if the user is currently in the conversation list view, viewing the default 1107dd054e39986de84a213c56a3c11ac94731402e6Vikram Aggarwal * inbox. 1117dd054e39986de84a213c56a3c11ac94731402e6Vikram Aggarwal * @return 1127dd054e39986de84a213c56a3c11ac94731402e6Vikram Aggarwal */ 1132074a056bb2a634c66996225c55620d2aa6f7ac5Vikram Aggarwal private static boolean inInbox(final Account account, final ConversationListContext context) { 1142074a056bb2a634c66996225c55620d2aa6f7ac5Vikram Aggarwal // If we don't have valid state, then we are not in the inbox. 1152074a056bb2a634c66996225c55620d2aa6f7ac5Vikram Aggarwal if (account == null || context == null || context.folder == null 1162074a056bb2a634c66996225c55620d2aa6f7ac5Vikram Aggarwal || account.settings == null) { 1172074a056bb2a634c66996225c55620d2aa6f7ac5Vikram Aggarwal return false; 1182074a056bb2a634c66996225c55620d2aa6f7ac5Vikram Aggarwal } 1192074a056bb2a634c66996225c55620d2aa6f7ac5Vikram Aggarwal final Uri inboxUri = Settings.getDefaultInboxUri(account.settings); 1202074a056bb2a634c66996225c55620d2aa6f7ac5Vikram Aggarwal return !context.isSearchResult() && context.folder.uri.equals(inboxUri); 1213982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira } 1223982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira 123d7a12cd5b5c2639b653d8c671b04844ef02ee01dVikram Aggarwal @Override 124cd09f5e9bf55e6f4310e8dc9408132b9c88e87c3Vikram Aggarwal public void onAccountChanged(Account account) { 125cd09f5e9bf55e6f4310e8dc9408132b9c88e87c3Vikram Aggarwal super.onAccountChanged(account); 126cd09f5e9bf55e6f4310e8dc9408132b9c88e87c3Vikram Aggarwal mConversationListNeverShown = true; 127cd09f5e9bf55e6f4310e8dc9408132b9c88e87c3Vikram Aggarwal } 128cd09f5e9bf55e6f4310e8dc9408132b9c88e87c3Vikram Aggarwal 129cd09f5e9bf55e6f4310e8dc9408132b9c88e87c3Vikram Aggarwal @Override 130d7a12cd5b5c2639b653d8c671b04844ef02ee01dVikram Aggarwal public boolean onCreate(Bundle savedInstanceState) { 1311ddcf0f2bf44d3c9db89112ef52510d9b2433ac4Vikram Aggarwal mActivity.setContentView(R.layout.one_pane_activity); 132d7a12cd5b5c2639b653d8c671b04844ef02ee01dVikram Aggarwal // The parent class sets the correct viewmode and starts the application off. 133d7a12cd5b5c2639b653d8c671b04844ef02ee01dVikram Aggarwal return super.onCreate(savedInstanceState); 1341ddcf0f2bf44d3c9db89112ef52510d9b2433ac4Vikram Aggarwal } 1351ddcf0f2bf44d3c9db89112ef52510d9b2433ac4Vikram Aggarwal 1361ddcf0f2bf44d3c9db89112ef52510d9b2433ac4Vikram Aggarwal @Override 1371ddcf0f2bf44d3c9db89112ef52510d9b2433ac4Vikram Aggarwal protected boolean isConversationListVisible() { 1382175d0a93263672d4498458c81b404b0999134baVikram Aggarwal return mConversationListVisible; 1391ddcf0f2bf44d3c9db89112ef52510d9b2433ac4Vikram Aggarwal } 140d7a12cd5b5c2639b653d8c671b04844ef02ee01dVikram Aggarwal 141d7a12cd5b5c2639b653d8c671b04844ef02ee01dVikram Aggarwal @Override 142d7a12cd5b5c2639b653d8c671b04844ef02ee01dVikram Aggarwal public void onViewModeChanged(int newMode) { 143d7a12cd5b5c2639b653d8c671b04844ef02ee01dVikram Aggarwal super.onViewModeChanged(newMode); 144632721e6b3a9ba8c476456f2e0fb1b564561e0b5Andy Huang 145632721e6b3a9ba8c476456f2e0fb1b564561e0b5Andy Huang // When entering conversation list mode, hide and clean up any currently visible 146632721e6b3a9ba8c476456f2e0fb1b564561e0b5Andy Huang // conversation. 147632721e6b3a9ba8c476456f2e0fb1b564561e0b5Andy Huang // TODO: improve this transition 148b466bcf49502a1178cf7362a81470f3231d8892bMindy Pereira if (newMode == ViewMode.CONVERSATION_LIST || newMode == ViewMode.SEARCH_RESULTS_LIST) { 149632721e6b3a9ba8c476456f2e0fb1b564561e0b5Andy Huang mPagerController.hide(); 150632721e6b3a9ba8c476456f2e0fb1b564561e0b5Andy Huang } 151d7a12cd5b5c2639b653d8c671b04844ef02ee01dVikram Aggarwal } 152d7a12cd5b5c2639b653d8c671b04844ef02ee01dVikram Aggarwal 153d7a12cd5b5c2639b653d8c671b04844ef02ee01dVikram Aggarwal @Override 1549b87568c9e9f1c32a9672b315229866a58a1e757Mindy Pereira public void showConversationList(ConversationListContext listContext) { 155e128fc21fab03f6d66c656efeee2155fab449a7fVikram Aggarwal super.showConversationList(listContext); 156e128fc21fab03f6d66c656efeee2155fab449a7fVikram Aggarwal enableCabMode(); 1573982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira // TODO(viki): Check if the account has been changed since the previous 1583982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira // time. 15968f2e222b4ffccd9f67f02b3a9cfdb3841a7eb43Mindy Pereira if (listContext != null && listContext.isSearchResult()) { 16068f2e222b4ffccd9f67f02b3a9cfdb3841a7eb43Mindy Pereira mViewMode.enterSearchResultsListMode(); 16168f2e222b4ffccd9f67f02b3a9cfdb3841a7eb43Mindy Pereira } else { 16268f2e222b4ffccd9f67f02b3a9cfdb3841a7eb43Mindy Pereira mViewMode.enterConversationListMode(); 16368f2e222b4ffccd9f67f02b3a9cfdb3841a7eb43Mindy Pereira } 1649b87568c9e9f1c32a9672b315229866a58a1e757Mindy Pereira // TODO(viki): This account transition looks strange in two pane mode. 1652175d0a93263672d4498458c81b404b0999134baVikram Aggarwal // Revisit as the app is coming together and improve the look and feel. 166cd09f5e9bf55e6f4310e8dc9408132b9c88e87c3Vikram Aggarwal final int transition = mConversationListNeverShown 167cd09f5e9bf55e6f4310e8dc9408132b9c88e87c3Vikram Aggarwal ? FragmentTransaction.TRANSIT_FRAGMENT_FADE 1689b87568c9e9f1c32a9672b315229866a58a1e757Mindy Pereira : FragmentTransaction.TRANSIT_FRAGMENT_OPEN; 16901668eb393deaf8c8b8abf86be46109614a98631Mindy Pereira Fragment conversationListFragment = ConversationListFragment.newInstance(listContext); 170bf232c3735f65b1a4746943e4a134e59e36f0bdePaul Westbrook 1712074a056bb2a634c66996225c55620d2aa6f7ac5Vikram Aggarwal if (!inInbox(mAccount, mConvListContext)) { 1723982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira // Maintain fragment transaction history so we can get back to the 1733982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira // fragment used to launch this list. 17472a9f3918310f581fecf6411174645ad5b5ae112Mindy Pereira mLastConversationListTransactionId = replaceFragment(conversationListFragment, 17566150d75d09324e867be42ff8c0ea8fae115ef20Paul Westbrook transition, TAG_CONVERSATION_LIST); 1763982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira } else { 1773982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira // If going to the inbox, clear the folder list transaction history. 1783982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira mInbox = listContext.folder; 1790e3fd9d61bc18ad9f828bb3c4dd24fc851f11df5Paul Westbrook mLastInboxConversationListTransactionId = replaceFragment(conversationListFragment, 1800e3fd9d61bc18ad9f828bb3c4dd24fc851f11df5Paul Westbrook transition, TAG_CONVERSATION_LIST); 1813982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira mLastFolderListTransactionId = INVALID_ID; 1820e3fd9d61bc18ad9f828bb3c4dd24fc851f11df5Paul Westbrook 1830e3fd9d61bc18ad9f828bb3c4dd24fc851f11df5Paul Westbrook // If we ever to to the inbox, we want to unset the transation id for any other 1840e3fd9d61bc18ad9f828bb3c4dd24fc851f11df5Paul Westbrook // non-inbox folder. 1850e3fd9d61bc18ad9f828bb3c4dd24fc851f11df5Paul Westbrook mLastConversationListTransactionId = INVALID_ID; 1863982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira } 1872175d0a93263672d4498458c81b404b0999134baVikram Aggarwal mConversationListVisible = true; 1887dd054e39986de84a213c56a3c11ac94731402e6Vikram Aggarwal onConversationVisibilityChanged(false); 1899f119c72042e4d0382017d5ddcee9aa2113b6425Paul Westbrook onConversationListVisibilityChanged(true); 190cd09f5e9bf55e6f4310e8dc9408132b9c88e87c3Vikram Aggarwal mConversationListNeverShown = false; 19128d5f72e0ad0db75b6243ee8125bfe3aadbdcb85Mindy Pereira } 19228d5f72e0ad0db75b6243ee8125bfe3aadbdcb85Mindy Pereira 19328d5f72e0ad0db75b6243ee8125bfe3aadbdcb85Mindy Pereira @Override 1949b87568c9e9f1c32a9672b315229866a58a1e757Mindy Pereira public void showConversation(Conversation conversation) { 195ec5cbf79b825c6f96d45e85015319c66470b7e57Vikram Aggarwal super.showConversation(conversation); 1963d7ca9d2aefd20dc115f20532c1e19fdb60f7d68Vikram Aggarwal if (conversation == null) { 1973d7ca9d2aefd20dc115f20532c1e19fdb60f7d68Vikram Aggarwal // This is a request to remove the conversation view, and pop back the view stack. 1983d7ca9d2aefd20dc115f20532c1e19fdb60f7d68Vikram Aggarwal // If we are in conversation list view already, this should be a safe thing to do, so 1993d7ca9d2aefd20dc115f20532c1e19fdb60f7d68Vikram Aggarwal // we don't check viewmode. 2003d7ca9d2aefd20dc115f20532c1e19fdb60f7d68Vikram Aggarwal transitionBackToConversationListMode(); 2013d7ca9d2aefd20dc115f20532c1e19fdb60f7d68Vikram Aggarwal return; 2023d7ca9d2aefd20dc115f20532c1e19fdb60f7d68Vikram Aggarwal } 203e128fc21fab03f6d66c656efeee2155fab449a7fVikram Aggarwal disableCabMode(); 20468f2e222b4ffccd9f67f02b3a9cfdb3841a7eb43Mindy Pereira if (mConvListContext != null && mConvListContext.isSearchResult()) { 20568f2e222b4ffccd9f67f02b3a9cfdb3841a7eb43Mindy Pereira mViewMode.enterSearchResultsConversationMode(); 20668f2e222b4ffccd9f67f02b3a9cfdb3841a7eb43Mindy Pereira } else { 20768f2e222b4ffccd9f67f02b3a9cfdb3841a7eb43Mindy Pereira mViewMode.enterConversationMode(); 20868f2e222b4ffccd9f67f02b3a9cfdb3841a7eb43Mindy Pereira } 209632721e6b3a9ba8c476456f2e0fb1b564561e0b5Andy Huang 210632721e6b3a9ba8c476456f2e0fb1b564561e0b5Andy Huang // Switching to conversation view is an incongruous transition: we are not replacing a 211632721e6b3a9ba8c476456f2e0fb1b564561e0b5Andy Huang // fragment with another fragment as usual. Instead, reveal the heretofore inert 212632721e6b3a9ba8c476456f2e0fb1b564561e0b5Andy Huang // conversation ViewPager and just remove the previously visible fragment 213632721e6b3a9ba8c476456f2e0fb1b564561e0b5Andy Huang // (e.g. conversation list, or possibly label list?). 2147dd054e39986de84a213c56a3c11ac94731402e6Vikram Aggarwal final FragmentManager fm = mActivity.getFragmentManager(); 2157dd054e39986de84a213c56a3c11ac94731402e6Vikram Aggarwal final Fragment f = fm.findFragmentById(R.id.content_pane); 216632721e6b3a9ba8c476456f2e0fb1b564561e0b5Andy Huang if (f != null) { 2177dd054e39986de84a213c56a3c11ac94731402e6Vikram Aggarwal final FragmentTransaction ft = fm.beginTransaction(); 218632721e6b3a9ba8c476456f2e0fb1b564561e0b5Andy Huang ft.addToBackStack(null); 219632721e6b3a9ba8c476456f2e0fb1b564561e0b5Andy Huang ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN); 220632721e6b3a9ba8c476456f2e0fb1b564561e0b5Andy Huang ft.remove(f); 221632721e6b3a9ba8c476456f2e0fb1b564561e0b5Andy Huang ft.commitAllowingStateLoss(); 222632721e6b3a9ba8c476456f2e0fb1b564561e0b5Andy Huang } 223632721e6b3a9ba8c476456f2e0fb1b564561e0b5Andy Huang 224632721e6b3a9ba8c476456f2e0fb1b564561e0b5Andy Huang // TODO: improve this transition 22512a4d8040d64501aa5a24c25865c806331560b74Mindy Pereira mPagerController.show(mAccount, mFolder, conversation); 2267dd054e39986de84a213c56a3c11ac94731402e6Vikram Aggarwal onConversationVisibilityChanged(true); 227632721e6b3a9ba8c476456f2e0fb1b564561e0b5Andy Huang resetActionBarIcon(); 228632721e6b3a9ba8c476456f2e0fb1b564561e0b5Andy Huang 2292175d0a93263672d4498458c81b404b0999134baVikram Aggarwal mConversationListVisible = false; 2309f119c72042e4d0382017d5ddcee9aa2113b6425Paul Westbrook onConversationListVisibilityChanged(false); 2319b87568c9e9f1c32a9672b315229866a58a1e757Mindy Pereira } 2329b87568c9e9f1c32a9672b315229866a58a1e757Mindy Pereira 2339b87568c9e9f1c32a9672b315229866a58a1e757Mindy Pereira @Override 2342d50bcdca57756ecad20d21da0d936243215b79cPaul Westbrook public void showWaitForInitialization() { 2352d50bcdca57756ecad20d21da0d936243215b79cPaul Westbrook super.showWaitForInitialization(); 2362d50bcdca57756ecad20d21da0d936243215b79cPaul Westbrook 2372d50bcdca57756ecad20d21da0d936243215b79cPaul Westbrook replaceFragment(WaitFragment.newInstance(mAccount), 2386902dcf8688d7d0691639f49365a78a3a78fe9e3Vikram Aggarwal FragmentTransaction.TRANSIT_FRAGMENT_OPEN, TAG_WAIT); 2392d50bcdca57756ecad20d21da0d936243215b79cPaul Westbrook } 2402d50bcdca57756ecad20d21da0d936243215b79cPaul Westbrook 2412d50bcdca57756ecad20d21da0d936243215b79cPaul Westbrook @Override 2422d50bcdca57756ecad20d21da0d936243215b79cPaul Westbrook public void hideWaitForInitialization() { 2432d50bcdca57756ecad20d21da0d936243215b79cPaul Westbrook transitionToInbox(); 2442d50bcdca57756ecad20d21da0d936243215b79cPaul Westbrook } 2452d50bcdca57756ecad20d21da0d936243215b79cPaul Westbrook 2462d50bcdca57756ecad20d21da0d936243215b79cPaul Westbrook @Override 2479b87568c9e9f1c32a9672b315229866a58a1e757Mindy Pereira public void showFolderList() { 2489e85333dfc57e7c98ffef27cded4712ea598f554Paul Westbrook if (mAccount == null) { 2499e85333dfc57e7c98ffef27cded4712ea598f554Paul Westbrook LogUtils.e(LOG_TAG, "Null account in showFolderList"); 2509e85333dfc57e7c98ffef27cded4712ea598f554Paul Westbrook return; 2519e85333dfc57e7c98ffef27cded4712ea598f554Paul Westbrook } 25211e3596e8c5978d07195ae2d7c8a96bb51aa75b3Mindy Pereira // Null out the currently selected folder; we have nothing selected the 25311e3596e8c5978d07195ae2d7c8a96bb51aa75b3Mindy Pereira // first time the user enters the folder list 254c975e8416b64a1ebdec6adee7e65dd1d0928e8d4Mindy Pereira setHierarchyFolder(null); 25501668eb393deaf8c8b8abf86be46109614a98631Mindy Pereira mViewMode.enterFolderListMode(); 2560ec2a71d1bb48f1fa57f1a4c8a6d81a49f44400fVikram Aggarwal enableCabMode(); 2573982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira mLastFolderListTransactionId = replaceFragment( 258a76e5aeff4a54ec70661de35be4f3ecb9d1d2fe2Mindy Pereira FolderListFragment.newInstance(null, mAccount.folderListUri), 2596902dcf8688d7d0691639f49365a78a3a78fe9e3Vikram Aggarwal FragmentTransaction.TRANSIT_FRAGMENT_OPEN, TAG_FOLDER_LIST); 2602175d0a93263672d4498458c81b404b0999134baVikram Aggarwal mConversationListVisible = false; 2617dd054e39986de84a213c56a3c11ac94731402e6Vikram Aggarwal onConversationVisibilityChanged(false); 2629f119c72042e4d0382017d5ddcee9aa2113b6425Paul Westbrook onConversationListVisibilityChanged(false); 2639b87568c9e9f1c32a9672b315229866a58a1e757Mindy Pereira } 2649b87568c9e9f1c32a9672b315229866a58a1e757Mindy Pereira 2656902dcf8688d7d0691639f49365a78a3a78fe9e3Vikram Aggarwal /** 2666902dcf8688d7d0691639f49365a78a3a78fe9e3Vikram Aggarwal * Replace the content_pane with the fragment specified here. The tag is specified so that 2676902dcf8688d7d0691639f49365a78a3a78fe9e3Vikram Aggarwal * the {@link ActivityController} can look up the fragments through the 2686902dcf8688d7d0691639f49365a78a3a78fe9e3Vikram Aggarwal * {@link android.app.FragmentManager}. 2696902dcf8688d7d0691639f49365a78a3a78fe9e3Vikram Aggarwal * @param fragment 2706902dcf8688d7d0691639f49365a78a3a78fe9e3Vikram Aggarwal * @param transition 2716902dcf8688d7d0691639f49365a78a3a78fe9e3Vikram Aggarwal * @param tag 2726902dcf8688d7d0691639f49365a78a3a78fe9e3Vikram Aggarwal * @return transaction ID returned when the transition is committed. 2736902dcf8688d7d0691639f49365a78a3a78fe9e3Vikram Aggarwal */ 2742d50bcdca57756ecad20d21da0d936243215b79cPaul Westbrook private int replaceFragment(Fragment fragment, int transition, String tag) { 275d7a12cd5b5c2639b653d8c671b04844ef02ee01dVikram Aggarwal FragmentTransaction fragmentTransaction = mActivity.getFragmentManager().beginTransaction(); 276d7a12cd5b5c2639b653d8c671b04844ef02ee01dVikram Aggarwal fragmentTransaction.addToBackStack(null); 277d7a12cd5b5c2639b653d8c671b04844ef02ee01dVikram Aggarwal fragmentTransaction.setTransition(transition); 2782d50bcdca57756ecad20d21da0d936243215b79cPaul Westbrook fragmentTransaction.replace(R.id.content_pane, fragment, tag); 2796902dcf8688d7d0691639f49365a78a3a78fe9e3Vikram Aggarwal final int transactionId = fragmentTransaction.commitAllowingStateLoss(); 280d7a12cd5b5c2639b653d8c671b04844ef02ee01dVikram Aggarwal resetActionBarIcon(); 2813982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira return transactionId; 282d7a12cd5b5c2639b653d8c671b04844ef02ee01dVikram Aggarwal } 28301668eb393deaf8c8b8abf86be46109614a98631Mindy Pereira 2843982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira /** 2853982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira * Back works as follows: 2863982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira * 1) If the user is in the folder list view, go back 2873982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira * to the account default inbox. 2883982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira * 2) If the user is in a conversation list 2893982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira * that is not the inbox AND: 2903982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira * a) they got there by going through the folder 2913982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira * list view, go back to the folder list view. 2923982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira * b) they got there by using some other means (account dropdown), go back to the inbox. 2933982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira * 3) If the user is in a conversation, go back to the conversation list they were last in. 2943982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira * 4) If the user is in the conversation list for the default account inbox, 2953982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira * back exits the app. 2963982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira */ 29701668eb393deaf8c8b8abf86be46109614a98631Mindy Pereira @Override 29801668eb393deaf8c8b8abf86be46109614a98631Mindy Pereira public boolean onBackPressed() { 2992074a056bb2a634c66996225c55620d2aa6f7ac5Vikram Aggarwal final int mode = mViewMode.getMode(); 3003982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira if (mode == ViewMode.FOLDER_LIST) { 30112a4d8040d64501aa5a24c25865c806331560b74Mindy Pereira if (getFolderListFragment().showingHierarchy() && mFolder != null) { 30211e3596e8c5978d07195ae2d7c8a96bb51aa75b3Mindy Pereira // If we are showing the folder list and the user is exploring 30311e3596e8c5978d07195ae2d7c8a96bb51aa75b3Mindy Pereira // the children of a single parent folder, 30411e3596e8c5978d07195ae2d7c8a96bb51aa75b3Mindy Pereira // back should display the parent folder's parent and siblings. 30599f18d1504203d2f3a82373dcc0937ef0277561aMindy Pereira goUpFolderHierarchy(getHierarchyFolder()); 30611e3596e8c5978d07195ae2d7c8a96bb51aa75b3Mindy Pereira } else { 30711e3596e8c5978d07195ae2d7c8a96bb51aa75b3Mindy Pereira // We are at the topmost list of folders; just go back to 30811e3596e8c5978d07195ae2d7c8a96bb51aa75b3Mindy Pereira // whatever conv list we were viewing before. 30911e3596e8c5978d07195ae2d7c8a96bb51aa75b3Mindy Pereira mLastFolderListTransactionId = INVALID_ID; 31011e3596e8c5978d07195ae2d7c8a96bb51aa75b3Mindy Pereira transitionToInbox(); 31111e3596e8c5978d07195ae2d7c8a96bb51aa75b3Mindy Pereira } 31268f2e222b4ffccd9f67f02b3a9cfdb3841a7eb43Mindy Pereira } else if (mode == ViewMode.SEARCH_RESULTS_LIST) { 31368f2e222b4ffccd9f67f02b3a9cfdb3841a7eb43Mindy Pereira mActivity.finish(); 314b466bcf49502a1178cf7362a81470f3231d8892bMindy Pereira } else if (mViewMode.isListMode() && !inInbox(mAccount, mConvListContext)) { 31511e3596e8c5978d07195ae2d7c8a96bb51aa75b3Mindy Pereira if (mLastFolderListTransactionId != INVALID_ID) { 31611e3596e8c5978d07195ae2d7c8a96bb51aa75b3Mindy Pereira // If the user got here by navigating via the folder list, back 31711e3596e8c5978d07195ae2d7c8a96bb51aa75b3Mindy Pereira // should bring them back to the folder list. 3183982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira mViewMode.enterFolderListMode(); 31912a4d8040d64501aa5a24c25865c806331560b74Mindy Pereira if (mFolder != null && mFolder.parent != null) { 32011e3596e8c5978d07195ae2d7c8a96bb51aa75b3Mindy Pereira // If there was a parent folder, show the parent and 32111e3596e8c5978d07195ae2d7c8a96bb51aa75b3Mindy Pereira // siblings of the current folder for which we are viewing 32211e3596e8c5978d07195ae2d7c8a96bb51aa75b3Mindy Pereira // the conversation list. 323c975e8416b64a1ebdec6adee7e65dd1d0928e8d4Mindy Pereira setHierarchyFolder(mFolder.parent); 32411e3596e8c5978d07195ae2d7c8a96bb51aa75b3Mindy Pereira } else { 325c975e8416b64a1ebdec6adee7e65dd1d0928e8d4Mindy Pereira setHierarchyFolder(null); 32611e3596e8c5978d07195ae2d7c8a96bb51aa75b3Mindy Pereira } 3273982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira mActivity.getFragmentManager().popBackStack(mLastFolderListTransactionId, 0); 3283982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira } else { 32911e3596e8c5978d07195ae2d7c8a96bb51aa75b3Mindy Pereira mLastFolderListTransactionId = INVALID_ID; 3303982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira transitionToInbox(); 3313982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira } 33268f2e222b4ffccd9f67f02b3a9cfdb3841a7eb43Mindy Pereira } else if (mode == ViewMode.CONVERSATION || mode == ViewMode.SEARCH_RESULTS_CONVERSATION) { 333f5acda4a4b7c9e8ecacb41cb7d570ef426b6d4fcMindy Pereira transitionBackToConversationListMode(); 3343982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira } else { 3353982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira mActivity.finish(); 3363982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira } 337c2c9dc14aa184db1f05b8c060b27d97dda5a3ca4Andrew Sapperstein mToastBar.hide(false); 3383982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira return true; 3393982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira } 3403982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira 34112a4d8040d64501aa5a24c25865c806331560b74Mindy Pereira private void goUpFolderHierarchy(Folder current) { 34212a4d8040d64501aa5a24c25865c806331560b74Mindy Pereira Folder top = current.parent; 34312a4d8040d64501aa5a24c25865c806331560b74Mindy Pereira if (top != null) { 34499f18d1504203d2f3a82373dcc0937ef0277561aMindy Pereira setHierarchyFolder(top); 34512a4d8040d64501aa5a24c25865c806331560b74Mindy Pereira // Replace this fragment with a new FolderListFragment 34612a4d8040d64501aa5a24c25865c806331560b74Mindy Pereira // showing this folder's children if we are not already 34712a4d8040d64501aa5a24c25865c806331560b74Mindy Pereira // looking at the child view for this folder. 34812a4d8040d64501aa5a24c25865c806331560b74Mindy Pereira mLastFolderListTransactionId = replaceFragment(FolderListFragment.newInstance( 34912a4d8040d64501aa5a24c25865c806331560b74Mindy Pereira top, top.childFoldersListUri), 35012a4d8040d64501aa5a24c25865c806331560b74Mindy Pereira FragmentTransaction.TRANSIT_FRAGMENT_OPEN, TAG_FOLDER_LIST); 35112a4d8040d64501aa5a24c25865c806331560b74Mindy Pereira // Show the up affordance when digging into child folders. 35212a4d8040d64501aa5a24c25865c806331560b74Mindy Pereira mActionBarView.setBackButton(); 35312a4d8040d64501aa5a24c25865c806331560b74Mindy Pereira } else { 35412a4d8040d64501aa5a24c25865c806331560b74Mindy Pereira // Otherwise, clear the selected folder and go back to whatever the 35512a4d8040d64501aa5a24c25865c806331560b74Mindy Pereira // last folder list displayed was. 35612a4d8040d64501aa5a24c25865c806331560b74Mindy Pereira showFolderList(); 35712a4d8040d64501aa5a24c25865c806331560b74Mindy Pereira } 35812a4d8040d64501aa5a24c25865c806331560b74Mindy Pereira } 35912a4d8040d64501aa5a24c25865c806331560b74Mindy Pereira 3603982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira private void transitionToInbox() { 3618690e2b71e1a3dd812ce418c9607e21f3a88ab54Mindy Pereira mViewMode.enterConversationListMode(); 362f6acdade010b2d0f49fd425b33e7f7b376286490Mindy Pereira if (mInbox == null) { 363ab4863650794e81f35a0fd9abc16a5564d7b102bMindy Pereira loadAccountInbox(); 3643982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira } else { 365f6acdade010b2d0f49fd425b33e7f7b376286490Mindy Pereira ConversationListContext listContext = ConversationListContext.forFolder(mContext, 366f6acdade010b2d0f49fd425b33e7f7b376286490Mindy Pereira mAccount, mInbox); 36772a9f3918310f581fecf6411174645ad5b5ae112Mindy Pereira // Set the correct context for what the conversation view will be 36872a9f3918310f581fecf6411174645ad5b5ae112Mindy Pereira // now. 369f6acdade010b2d0f49fd425b33e7f7b376286490Mindy Pereira onFolderChanged(mInbox); 37072a9f3918310f581fecf6411174645ad5b5ae112Mindy Pereira showConversationList(listContext); 37101668eb393deaf8c8b8abf86be46109614a98631Mindy Pereira } 37201668eb393deaf8c8b8abf86be46109614a98631Mindy Pereira } 373f5acda4a4b7c9e8ecacb41cb7d570ef426b6d4fcMindy Pereira 374118b3f6443f1859ff4866c97c0e8896f3415f730Mindy Pereira @Override 375505df5f59c92adbe8eaa734321c1d3f91be84a4aMindy Pereira public void onFolderSelected(Folder folder) { 376a1f99981919755e50f31fe300517d2fed752997eMindy Pereira if (folder.hasChildren && !folder.equals(getHierarchyFolder())) { 3770f7ae7a2d244463f75b3d4e1f79e27305a4dcb38Mindy Pereira mViewMode.enterFolderListMode(); 378c975e8416b64a1ebdec6adee7e65dd1d0928e8d4Mindy Pereira setHierarchyFolder(folder); 37956e3f50f5aee6606035eae4b713ef634c4f3a686Mindy Pereira // Replace this fragment with a new FolderListFragment 38011e3596e8c5978d07195ae2d7c8a96bb51aa75b3Mindy Pereira // showing this folder's children if we are not already 38111e3596e8c5978d07195ae2d7c8a96bb51aa75b3Mindy Pereira // looking at the child view for this folder. 38256e3f50f5aee6606035eae4b713ef634c4f3a686Mindy Pereira mLastFolderListTransactionId = replaceFragment( 383a76e5aeff4a54ec70661de35be4f3ecb9d1d2fe2Mindy Pereira FolderListFragment.newInstance(folder, folder.childFoldersListUri), 3846902dcf8688d7d0691639f49365a78a3a78fe9e3Vikram Aggarwal FragmentTransaction.TRANSIT_FRAGMENT_OPEN, TAG_FOLDER_LIST); 38512a4d8040d64501aa5a24c25865c806331560b74Mindy Pereira // Show the up affordance when digging into child folders. 38612a4d8040d64501aa5a24c25865c806331560b74Mindy Pereira mActionBarView.setBackButton(); 38711e3596e8c5978d07195ae2d7c8a96bb51aa75b3Mindy Pereira } else { 38812a4d8040d64501aa5a24c25865c806331560b74Mindy Pereira super.onFolderSelected(folder); 389118b3f6443f1859ff4866c97c0e8896f3415f730Mindy Pereira } 390118b3f6443f1859ff4866c97c0e8896f3415f730Mindy Pereira } 391118b3f6443f1859ff4866c97c0e8896f3415f730Mindy Pereira 3923982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira private boolean isTransactionIdValid(int id) { 3933982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira return id >= 0; 3943982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira } 3953982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira 3963982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira /** 3973982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira * Up works as follows: 3983982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira * 1) If the user is in a conversation list that is not the default account inbox, 3993982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira * a conversation, or the folder list, up follows the rules of back. 4003982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira * 2) If the user is in search results, up exits search 4013982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira * mode and returns the user to whatever view they were in when they began search. 4023982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira * 3) If the user is in the inbox, there is no up. 4033982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira */ 404f5acda4a4b7c9e8ecacb41cb7d570ef426b6d4fcMindy Pereira @Override 405f5acda4a4b7c9e8ecacb41cb7d570ef426b6d4fcMindy Pereira public boolean onUpPressed() { 4069da85df06175d25c52a09e08df3b02d1fd9cc6b7Vikram Aggarwal final int mode = mViewMode.getMode(); 40768f2e222b4ffccd9f67f02b3a9cfdb3841a7eb43Mindy Pereira if (mode == ViewMode.SEARCH_RESULTS_LIST) { 40868f2e222b4ffccd9f67f02b3a9cfdb3841a7eb43Mindy Pereira mActivity.finish(); 409b466bcf49502a1178cf7362a81470f3231d8892bMindy Pereira } else if ((!inInbox(mAccount, mConvListContext) && mViewMode.isListMode()) 41068f2e222b4ffccd9f67f02b3a9cfdb3841a7eb43Mindy Pereira || mode == ViewMode.CONVERSATION 41168f2e222b4ffccd9f67f02b3a9cfdb3841a7eb43Mindy Pereira || mode == ViewMode.FOLDER_LIST 41268f2e222b4ffccd9f67f02b3a9cfdb3841a7eb43Mindy Pereira || mode == ViewMode.SEARCH_RESULTS_CONVERSATION) { 413f5acda4a4b7c9e8ecacb41cb7d570ef426b6d4fcMindy Pereira // Same as go back. 414f5acda4a4b7c9e8ecacb41cb7d570ef426b6d4fcMindy Pereira mActivity.onBackPressed(); 415f5acda4a4b7c9e8ecacb41cb7d570ef426b6d4fcMindy Pereira } 416f5acda4a4b7c9e8ecacb41cb7d570ef426b6d4fcMindy Pereira return true; 417f5acda4a4b7c9e8ecacb41cb7d570ef426b6d4fcMindy Pereira } 418f5acda4a4b7c9e8ecacb41cb7d570ef426b6d4fcMindy Pereira 419f5acda4a4b7c9e8ecacb41cb7d570ef426b6d4fcMindy Pereira private void transitionBackToConversationListMode() { 4209da85df06175d25c52a09e08df3b02d1fd9cc6b7Vikram Aggarwal final int mode = mViewMode.getMode(); 42190d89e2194cecb6ff0179c8159870575edf7365eVikram Aggarwal enableCabMode(); 42268f2e222b4ffccd9f67f02b3a9cfdb3841a7eb43Mindy Pereira if (mode == ViewMode.SEARCH_RESULTS_CONVERSATION) { 42368f2e222b4ffccd9f67f02b3a9cfdb3841a7eb43Mindy Pereira mViewMode.enterSearchResultsListMode(); 42468f2e222b4ffccd9f67f02b3a9cfdb3841a7eb43Mindy Pereira } else { 42568f2e222b4ffccd9f67f02b3a9cfdb3841a7eb43Mindy Pereira mViewMode.enterConversationListMode(); 42668f2e222b4ffccd9f67f02b3a9cfdb3841a7eb43Mindy Pereira } 42721ab490d4919985d611bc36ae2d8aea86a911499Mindy Pereira if (isTransactionIdValid(mLastConversationListTransactionId)) { 42821ab490d4919985d611bc36ae2d8aea86a911499Mindy Pereira mActivity.getFragmentManager().popBackStack(mLastConversationListTransactionId, 0); 42921ab490d4919985d611bc36ae2d8aea86a911499Mindy Pereira resetActionBarIcon(); 4300e3fd9d61bc18ad9f828bb3c4dd24fc851f11df5Paul Westbrook } else if (isTransactionIdValid(mLastInboxConversationListTransactionId)) { 4310e3fd9d61bc18ad9f828bb3c4dd24fc851f11df5Paul Westbrook mActivity.getFragmentManager().popBackStack(mLastInboxConversationListTransactionId, 0); 4320e3fd9d61bc18ad9f828bb3c4dd24fc851f11df5Paul Westbrook resetActionBarIcon(); 4330e3fd9d61bc18ad9f828bb3c4dd24fc851f11df5Paul Westbrook onFolderChanged(mInbox); 43421ab490d4919985d611bc36ae2d8aea86a911499Mindy Pereira } else { 4359da85df06175d25c52a09e08df3b02d1fd9cc6b7Vikram Aggarwal // TODO: revisit if this block is necessary 4369da85df06175d25c52a09e08df3b02d1fd9cc6b7Vikram Aggarwal final ConversationListContext listContext = ConversationListContext.forFolder(mContext, 43721ab490d4919985d611bc36ae2d8aea86a911499Mindy Pereira mAccount, mInbox); 43821ab490d4919985d611bc36ae2d8aea86a911499Mindy Pereira // Set the correct context for what the conversation view will be now. 43921ab490d4919985d611bc36ae2d8aea86a911499Mindy Pereira onFolderChanged(mInbox); 44021ab490d4919985d611bc36ae2d8aea86a911499Mindy Pereira showConversationList(listContext); 44121ab490d4919985d611bc36ae2d8aea86a911499Mindy Pereira } 442f5acda4a4b7c9e8ecacb41cb7d570ef426b6d4fcMindy Pereira resetActionBarIcon(); 4439f119c72042e4d0382017d5ddcee9aa2113b6425Paul Westbrook 4449f119c72042e4d0382017d5ddcee9aa2113b6425Paul Westbrook mConversationListVisible = true; 4457dd054e39986de84a213c56a3c11ac94731402e6Vikram Aggarwal onConversationVisibilityChanged(false); 4469f119c72042e4d0382017d5ddcee9aa2113b6425Paul Westbrook onConversationListVisibilityChanged(true); 447f5acda4a4b7c9e8ecacb41cb7d570ef426b6d4fcMindy Pereira } 448b849dfbda3c917f078a5c09f03906886c27ecbecMindy Pereira 449b849dfbda3c917f078a5c09f03906886c27ecbecMindy Pereira @Override 450b849dfbda3c917f078a5c09f03906886c27ecbecMindy Pereira public boolean shouldShowFirstConversation() { 451b849dfbda3c917f078a5c09f03906886c27ecbecMindy Pereira return false; 452b849dfbda3c917f078a5c09f03906886c27ecbecMindy Pereira } 453fbe4019a262f6b1934a44e598009ae63dc5745eeMindy Pereira 454fbe4019a262f6b1934a44e598009ae63dc5745eeMindy Pereira @Override 455d3367499e56116854ed637b1036fd71057ac0f49Mindy Pereira public void onUndoAvailable(ToastBarOperation op) { 4560963ef8394e1f0bca3f931f930b127b00790361aMindy Pereira if (op != null && mAccount.supportsCapability(UIProvider.AccountCapabilities.UNDO)) { 4577f602f7a64f176894ccb7942a6642f22584c3894Vikram Aggarwal final int mode = mViewMode.getMode(); 458dbab8fab0c98dc2d56bbe17c7436719129952b7bMindy Pereira final ConversationListFragment convList = getConversationListFragment(); 4590963ef8394e1f0bca3f931f930b127b00790361aMindy Pereira switch (mode) { 460b466bcf49502a1178cf7362a81470f3231d8892bMindy Pereira case ViewMode.SEARCH_RESULTS_CONVERSATION: 4610963ef8394e1f0bca3f931f930b127b00790361aMindy Pereira case ViewMode.CONVERSATION: 462c2c9dc14aa184db1f05b8c060b27d97dda5a3ca4Andrew Sapperstein mToastBar.setConversationMode(true); 463c2c9dc14aa184db1f05b8c060b27d97dda5a3ca4Andrew Sapperstein mToastBar.show( 464c2c9dc14aa184db1f05b8c060b27d97dda5a3ca4Andrew Sapperstein getUndoClickedListener( 465c2c9dc14aa184db1f05b8c060b27d97dda5a3ca4Andrew Sapperstein convList != null ? convList.getAnimatedAdapter() : null), 466c2c9dc14aa184db1f05b8c060b27d97dda5a3ca4Andrew Sapperstein 0, 467c2c9dc14aa184db1f05b8c060b27d97dda5a3ca4Andrew Sapperstein Html.fromHtml(op.getDescription(mActivity.getActivityContext())), 468c2c9dc14aa184db1f05b8c060b27d97dda5a3ca4Andrew Sapperstein true, /* showActionIcon */ 469c2c9dc14aa184db1f05b8c060b27d97dda5a3ca4Andrew Sapperstein R.string.undo, 470d3367499e56116854ed637b1036fd71057ac0f49Mindy Pereira true, /* replaceVisibleToast */ 471d3367499e56116854ed637b1036fd71057ac0f49Mindy Pereira op); 4720963ef8394e1f0bca3f931f930b127b00790361aMindy Pereira break; 473b466bcf49502a1178cf7362a81470f3231d8892bMindy Pereira case ViewMode.SEARCH_RESULTS_LIST: 4740963ef8394e1f0bca3f931f930b127b00790361aMindy Pereira case ViewMode.CONVERSATION_LIST: 4756902dcf8688d7d0691639f49365a78a3a78fe9e3Vikram Aggarwal if (convList != null) { 476c2c9dc14aa184db1f05b8c060b27d97dda5a3ca4Andrew Sapperstein mToastBar.setConversationMode(false); 477c2c9dc14aa184db1f05b8c060b27d97dda5a3ca4Andrew Sapperstein mToastBar.show( 478c2c9dc14aa184db1f05b8c060b27d97dda5a3ca4Andrew Sapperstein getUndoClickedListener(convList.getAnimatedAdapter()), 479c2c9dc14aa184db1f05b8c060b27d97dda5a3ca4Andrew Sapperstein 0, 480c2c9dc14aa184db1f05b8c060b27d97dda5a3ca4Andrew Sapperstein Html.fromHtml(op.getDescription(mActivity.getActivityContext())), 481c2c9dc14aa184db1f05b8c060b27d97dda5a3ca4Andrew Sapperstein true, /* showActionIcon */ 482c2c9dc14aa184db1f05b8c060b27d97dda5a3ca4Andrew Sapperstein R.string.undo, 483d3367499e56116854ed637b1036fd71057ac0f49Mindy Pereira true, /* replaceVisibleToast */ 484d3367499e56116854ed637b1036fd71057ac0f49Mindy Pereira op); 4856902dcf8688d7d0691639f49365a78a3a78fe9e3Vikram Aggarwal } 4860963ef8394e1f0bca3f931f930b127b00790361aMindy Pereira break; 4870963ef8394e1f0bca3f931f930b127b00790361aMindy Pereira } 4880963ef8394e1f0bca3f931f930b127b00790361aMindy Pereira } 4890963ef8394e1f0bca3f931f930b127b00790361aMindy Pereira } 490c2c9dc14aa184db1f05b8c060b27d97dda5a3ca4Andrew Sapperstein 491c2c9dc14aa184db1f05b8c060b27d97dda5a3ca4Andrew Sapperstein @Override 4929d7519d18e8ddbcdd59b37eec7c85210fca0e8c2Andrew Sapperstein public void onError(final Folder folder, boolean replaceVisibleToast) { 493c2c9dc14aa184db1f05b8c060b27d97dda5a3ca4Andrew Sapperstein final int mode = mViewMode.getMode(); 494c2c9dc14aa184db1f05b8c060b27d97dda5a3ca4Andrew Sapperstein switch (mode) { 495c2c9dc14aa184db1f05b8c060b27d97dda5a3ca4Andrew Sapperstein case ViewMode.SEARCH_RESULTS_LIST: 496c2c9dc14aa184db1f05b8c060b27d97dda5a3ca4Andrew Sapperstein case ViewMode.CONVERSATION_LIST: 4979d7519d18e8ddbcdd59b37eec7c85210fca0e8c2Andrew Sapperstein showErrorToast(folder, replaceVisibleToast); 498c2c9dc14aa184db1f05b8c060b27d97dda5a3ca4Andrew Sapperstein break; 499c2c9dc14aa184db1f05b8c060b27d97dda5a3ca4Andrew Sapperstein default: 500c2c9dc14aa184db1f05b8c060b27d97dda5a3ca4Andrew Sapperstein break; 501c2c9dc14aa184db1f05b8c060b27d97dda5a3ca4Andrew Sapperstein } 502c2c9dc14aa184db1f05b8c060b27d97dda5a3ca4Andrew Sapperstein } 503a55b36cb6b75ce8096812183651e89115300975aVikram Aggarwal} 504