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