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