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