OnePaneController.java revision 30fd47bf1947da5ad813cb957b6cbe569dce563a
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;
213982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereiraimport android.app.FragmentManager;
22d7a12cd5b5c2639b653d8c671b04844ef02ee01dVikram Aggarwalimport android.app.FragmentTransaction;
23559c3b3d302b3f6d2c2cb43a909069d942652e34Mindy Pereiraimport android.net.Uri;
241ddcf0f2bf44d3c9db89112ef52510d9b2433ac4Vikram Aggarwalimport android.os.Bundle;
251ddcf0f2bf44d3c9db89112ef52510d9b2433ac4Vikram Aggarwal
26d7a12cd5b5c2639b653d8c671b04844ef02ee01dVikram Aggarwalimport com.android.mail.ConversationListContext;
271ddcf0f2bf44d3c9db89112ef52510d9b2433ac4Vikram Aggarwalimport com.android.mail.R;
289b87568c9e9f1c32a9672b315229866a58a1e757Mindy Pereiraimport com.android.mail.providers.Conversation;
293982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereiraimport com.android.mail.providers.Folder;
30a55b36cb6b75ce8096812183651e89115300975aVikram Aggarwal
31a55b36cb6b75ce8096812183651e89115300975aVikram Aggarwal/**
32a55b36cb6b75ce8096812183651e89115300975aVikram Aggarwal * Controller for one-pane Mail activity. One Pane is used for phones, where screen real estate is
33d7a12cd5b5c2639b653d8c671b04844ef02ee01dVikram Aggarwal * limited. This controller also does the layout, since the layout is simpler in the one pane case.
34a55b36cb6b75ce8096812183651e89115300975aVikram Aggarwal */
35a55b36cb6b75ce8096812183651e89115300975aVikram Aggarwal
36a55b36cb6b75ce8096812183651e89115300975aVikram Aggarwal// Called OnePaneActivityController in Gmail.
371ddcf0f2bf44d3c9db89112ef52510d9b2433ac4Vikram Aggarwalpublic final class OnePaneController extends AbstractActivityController {
383982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira    private static final String FOLDER_LIST_TRANSACTION_KEY = "folder-list-transaction";
393982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira    private static final String CONVERSATION_LIST_TRANSACTION_KEY = "conversation-list-transaction";
403982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira    private static final String CONVERSATION_TRANSACTION_KEY = "conversation-transaction";
413982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira    private static final int INVALID_ID = -1;
422175d0a93263672d4498458c81b404b0999134baVikram Aggarwal    private boolean mConversationListVisible = false;
433982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira    private int mLastConversationListTransactionId = INVALID_ID;
443982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira    private int mLastConversationTransactionId = INVALID_ID;
453982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira    private int mLastFolderListTransactionId = INVALID_ID;
463982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira    private Folder mInbox;
47a55b36cb6b75ce8096812183651e89115300975aVikram Aggarwal    /**
48a55b36cb6b75ce8096812183651e89115300975aVikram Aggarwal     * @param activity
49a55b36cb6b75ce8096812183651e89115300975aVikram Aggarwal     * @param viewMode
50a55b36cb6b75ce8096812183651e89115300975aVikram Aggarwal     */
51a55b36cb6b75ce8096812183651e89115300975aVikram Aggarwal    public OnePaneController(MailActivity activity, ViewMode viewMode) {
52a55b36cb6b75ce8096812183651e89115300975aVikram Aggarwal        super(activity, viewMode);
53a55b36cb6b75ce8096812183651e89115300975aVikram Aggarwal    }
54a55b36cb6b75ce8096812183651e89115300975aVikram Aggarwal
551ddcf0f2bf44d3c9db89112ef52510d9b2433ac4Vikram Aggarwal    @Override
563982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira    protected void restoreState(Bundle inState) {
573982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira        super.restoreState(inState);
583982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira        // TODO(mindyp) handle saved state.
593982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira        if (inState != null) {
603982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira            mLastFolderListTransactionId = inState.getInt(FOLDER_LIST_TRANSACTION_KEY, INVALID_ID);
613982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira            mLastConversationListTransactionId = inState.getInt(CONVERSATION_LIST_TRANSACTION_KEY,
623982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira                    INVALID_ID);
633982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira            mLastConversationTransactionId = inState.getInt(CONVERSATION_TRANSACTION_KEY,
643982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira                    INVALID_ID);
653982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira        }
663982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira    }
673982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira
683982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira    @Override
693982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira    public void onSaveInstanceState(Bundle outState) {
703982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira        super.onSaveInstanceState(outState);
713982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira        // TODO(mindyp) handle saved state.
723982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira        outState.putInt(FOLDER_LIST_TRANSACTION_KEY, mLastFolderListTransactionId);
733982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira        outState.putInt(CONVERSATION_LIST_TRANSACTION_KEY, mLastConversationListTransactionId);
743982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira        outState.putInt(CONVERSATION_TRANSACTION_KEY, mLastConversationTransactionId);
753982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira    }
763982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira
773982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira    @Override
78d7a12cd5b5c2639b653d8c671b04844ef02ee01dVikram Aggarwal    public void resetActionBarIcon() {
79d7a12cd5b5c2639b653d8c671b04844ef02ee01dVikram Aggarwal        final int mode = mViewMode.getMode();
80559c3b3d302b3f6d2c2cb43a909069d942652e34Mindy Pereira        // If the settings aren't loaded yet, we may not know what the default
81559c3b3d302b3f6d2c2cb43a909069d942652e34Mindy Pereira        // inbox is, so err toward this being the account inbox.
82559c3b3d302b3f6d2c2cb43a909069d942652e34Mindy Pereira        if ((mCachedSettings != null && mConvListContext != null && !inInbox())
8368f2e222b4ffccd9f67f02b3a9cfdb3841a7eb43Mindy Pereira                || mode == ViewMode.SEARCH_RESULTS_LIST
8468f2e222b4ffccd9f67f02b3a9cfdb3841a7eb43Mindy Pereira                || mode == ViewMode.SEARCH_RESULTS_CONVERSATION
8568f2e222b4ffccd9f67f02b3a9cfdb3841a7eb43Mindy Pereira                || mode == ViewMode.CONVERSATION
8668f2e222b4ffccd9f67f02b3a9cfdb3841a7eb43Mindy Pereira                || mode == ViewMode.FOLDER_LIST) {
87d7a12cd5b5c2639b653d8c671b04844ef02ee01dVikram Aggarwal            mActionBarView.setBackButton();
88d7a12cd5b5c2639b653d8c671b04844ef02ee01dVikram Aggarwal        } else {
89d7a12cd5b5c2639b653d8c671b04844ef02ee01dVikram Aggarwal            mActionBarView.removeBackButton();
90d7a12cd5b5c2639b653d8c671b04844ef02ee01dVikram Aggarwal        }
91d7a12cd5b5c2639b653d8c671b04844ef02ee01dVikram Aggarwal    }
92d7a12cd5b5c2639b653d8c671b04844ef02ee01dVikram Aggarwal
933982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira    private boolean inInbox() {
94559c3b3d302b3f6d2c2cb43a909069d942652e34Mindy Pereira        Uri inboxUri = mCachedSettings != null ? mCachedSettings.defaultInbox : null;
95559c3b3d302b3f6d2c2cb43a909069d942652e34Mindy Pereira        return mConvListContext != null && mConvListContext.folder != null ? (!mConvListContext
96559c3b3d302b3f6d2c2cb43a909069d942652e34Mindy Pereira                .isSearchResult() && mConvListContext.folder.uri.equals(inboxUri)) : false;
973982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira    }
983982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira
99d7a12cd5b5c2639b653d8c671b04844ef02ee01dVikram Aggarwal    @Override
100d7a12cd5b5c2639b653d8c671b04844ef02ee01dVikram Aggarwal    public boolean onCreate(Bundle savedInstanceState) {
1011ddcf0f2bf44d3c9db89112ef52510d9b2433ac4Vikram Aggarwal        // Set 1-pane content view.
1021ddcf0f2bf44d3c9db89112ef52510d9b2433ac4Vikram Aggarwal        mActivity.setContentView(R.layout.one_pane_activity);
103d7a12cd5b5c2639b653d8c671b04844ef02ee01dVikram Aggarwal        // The parent class sets the correct viewmode and starts the application off.
104d7a12cd5b5c2639b653d8c671b04844ef02ee01dVikram Aggarwal        return super.onCreate(savedInstanceState);
1051ddcf0f2bf44d3c9db89112ef52510d9b2433ac4Vikram Aggarwal    }
1061ddcf0f2bf44d3c9db89112ef52510d9b2433ac4Vikram Aggarwal
1071ddcf0f2bf44d3c9db89112ef52510d9b2433ac4Vikram Aggarwal    @Override
1081ddcf0f2bf44d3c9db89112ef52510d9b2433ac4Vikram Aggarwal    protected boolean isConversationListVisible() {
1092175d0a93263672d4498458c81b404b0999134baVikram Aggarwal        return mConversationListVisible;
1101ddcf0f2bf44d3c9db89112ef52510d9b2433ac4Vikram Aggarwal    }
111d7a12cd5b5c2639b653d8c671b04844ef02ee01dVikram Aggarwal
112d7a12cd5b5c2639b653d8c671b04844ef02ee01dVikram Aggarwal    @Override
113d7a12cd5b5c2639b653d8c671b04844ef02ee01dVikram Aggarwal    public void onViewModeChanged(int newMode) {
114d7a12cd5b5c2639b653d8c671b04844ef02ee01dVikram Aggarwal        super.onViewModeChanged(newMode);
115d7a12cd5b5c2639b653d8c671b04844ef02ee01dVikram Aggarwal    }
116d7a12cd5b5c2639b653d8c671b04844ef02ee01dVikram Aggarwal
117d7a12cd5b5c2639b653d8c671b04844ef02ee01dVikram Aggarwal    @Override
1189b87568c9e9f1c32a9672b315229866a58a1e757Mindy Pereira    public void showConversationList(ConversationListContext listContext) {
1193982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira        // TODO(viki): Check if the account has been changed since the previous
1203982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira        // time.
12168f2e222b4ffccd9f67f02b3a9cfdb3841a7eb43Mindy Pereira        if (listContext != null && listContext.isSearchResult()) {
12268f2e222b4ffccd9f67f02b3a9cfdb3841a7eb43Mindy Pereira            mViewMode.enterSearchResultsListMode();
12368f2e222b4ffccd9f67f02b3a9cfdb3841a7eb43Mindy Pereira        } else {
12468f2e222b4ffccd9f67f02b3a9cfdb3841a7eb43Mindy Pereira            mViewMode.enterConversationListMode();
12568f2e222b4ffccd9f67f02b3a9cfdb3841a7eb43Mindy Pereira        }
12628d5f72e0ad0db75b6243ee8125bfe3aadbdcb85Mindy Pereira        final boolean accountChanged = false;
1279b87568c9e9f1c32a9672b315229866a58a1e757Mindy Pereira        // TODO(viki): This account transition looks strange in two pane mode.
1282175d0a93263672d4498458c81b404b0999134baVikram Aggarwal        // Revisit as the app is coming together and improve the look and feel.
1299b87568c9e9f1c32a9672b315229866a58a1e757Mindy Pereira        final int transition = accountChanged ? FragmentTransaction.TRANSIT_FRAGMENT_FADE
1309b87568c9e9f1c32a9672b315229866a58a1e757Mindy Pereira                : FragmentTransaction.TRANSIT_FRAGMENT_OPEN;
13101668eb393deaf8c8b8abf86be46109614a98631Mindy Pereira        Fragment conversationListFragment = ConversationListFragment.newInstance(listContext);
1323982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira        if (!inInbox()) {
1333982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira            // Maintain fragment transaction history so we can get back to the
1343982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira            // fragment used to launch this list.
1353982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira            replaceFragment(conversationListFragment, transition);
1363982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira        } else {
1373982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira            // If going to the inbox, clear the folder list transaction history.
1383982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira            mInbox = listContext.folder;
1393982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira            mLastConversationListTransactionId = replaceFragment(conversationListFragment,
1403982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira                    transition);
1413982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira            mLastFolderListTransactionId = INVALID_ID;
1423982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira        }
1432175d0a93263672d4498458c81b404b0999134baVikram Aggarwal        mConversationListVisible = true;
14428d5f72e0ad0db75b6243ee8125bfe3aadbdcb85Mindy Pereira    }
14528d5f72e0ad0db75b6243ee8125bfe3aadbdcb85Mindy Pereira
14628d5f72e0ad0db75b6243ee8125bfe3aadbdcb85Mindy Pereira    @Override
1479b87568c9e9f1c32a9672b315229866a58a1e757Mindy Pereira    public void showConversation(Conversation conversation) {
14868f2e222b4ffccd9f67f02b3a9cfdb3841a7eb43Mindy Pereira        if (mConvListContext != null && mConvListContext.isSearchResult()) {
14968f2e222b4ffccd9f67f02b3a9cfdb3841a7eb43Mindy Pereira            mViewMode.enterSearchResultsConversationMode();
15068f2e222b4ffccd9f67f02b3a9cfdb3841a7eb43Mindy Pereira        } else {
15168f2e222b4ffccd9f67f02b3a9cfdb3841a7eb43Mindy Pereira            mViewMode.enterConversationMode();
15268f2e222b4ffccd9f67f02b3a9cfdb3841a7eb43Mindy Pereira        }
1533982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira        mLastConversationTransactionId = replaceFragment(
1543982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira                ConversationViewFragment.newInstance(mAccount, conversation),
1552175d0a93263672d4498458c81b404b0999134baVikram Aggarwal                FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
1562175d0a93263672d4498458c81b404b0999134baVikram Aggarwal        mConversationListVisible = false;
1579b87568c9e9f1c32a9672b315229866a58a1e757Mindy Pereira    }
1589b87568c9e9f1c32a9672b315229866a58a1e757Mindy Pereira
1599b87568c9e9f1c32a9672b315229866a58a1e757Mindy Pereira    @Override
1609b87568c9e9f1c32a9672b315229866a58a1e757Mindy Pereira    public void showFolderList() {
16101668eb393deaf8c8b8abf86be46109614a98631Mindy Pereira        mViewMode.enterFolderListMode();
1623982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira        mLastFolderListTransactionId = replaceFragment(
1633982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira                FolderListFragment.newInstance(this, mAccount.folderListUri),
1642175d0a93263672d4498458c81b404b0999134baVikram Aggarwal                FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
1652175d0a93263672d4498458c81b404b0999134baVikram Aggarwal        mConversationListVisible = false;
1669b87568c9e9f1c32a9672b315229866a58a1e757Mindy Pereira    }
1679b87568c9e9f1c32a9672b315229866a58a1e757Mindy Pereira
1683982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira    private int replaceFragment(Fragment fragment, int transition) {
169d7a12cd5b5c2639b653d8c671b04844ef02ee01dVikram Aggarwal        FragmentTransaction fragmentTransaction = mActivity.getFragmentManager().beginTransaction();
170d7a12cd5b5c2639b653d8c671b04844ef02ee01dVikram Aggarwal        fragmentTransaction.addToBackStack(null);
171d7a12cd5b5c2639b653d8c671b04844ef02ee01dVikram Aggarwal        fragmentTransaction.setTransition(transition);
1729b87568c9e9f1c32a9672b315229866a58a1e757Mindy Pereira        fragmentTransaction.replace(R.id.content_pane, fragment);
1733982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira        int transactionId = fragmentTransaction.commitAllowingStateLoss();
174d7a12cd5b5c2639b653d8c671b04844ef02ee01dVikram Aggarwal        resetActionBarIcon();
1753982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira        return transactionId;
176d7a12cd5b5c2639b653d8c671b04844ef02ee01dVikram Aggarwal    }
17701668eb393deaf8c8b8abf86be46109614a98631Mindy Pereira
1783982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira    /**
1793982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira     * Back works as follows:
1803982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira     * 1) If the user is in the folder list view, go back
1813982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira     * to the account default inbox.
1823982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira     * 2) If the user is in a conversation list
1833982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira     * that is not the inbox AND:
1843982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira     *  a) they got there by going through the folder
1853982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira     *  list view, go back to the folder list view.
1863982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira     *  b) they got there by using some other means (account dropdown), go back to the inbox.
1873982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira     * 3) If the user is in a conversation, go back to the conversation list they were last in.
1883982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira     * 4) If the user is in the conversation list for the default account inbox,
1893982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira     * back exits the app.
1903982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira     */
19101668eb393deaf8c8b8abf86be46109614a98631Mindy Pereira    @Override
19201668eb393deaf8c8b8abf86be46109614a98631Mindy Pereira    public boolean onBackPressed() {
19301668eb393deaf8c8b8abf86be46109614a98631Mindy Pereira        int mode = mViewMode.getMode();
1943982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira        if (mode == ViewMode.FOLDER_LIST) {
1953982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira            mLastFolderListTransactionId = INVALID_ID;
1963982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira            transitionToInbox();
19768f2e222b4ffccd9f67f02b3a9cfdb3841a7eb43Mindy Pereira        } else if (mode == ViewMode.SEARCH_RESULTS_LIST) {
19868f2e222b4ffccd9f67f02b3a9cfdb3841a7eb43Mindy Pereira            mActivity.finish();
1993982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira        } else if (mode == ViewMode.CONVERSATION_LIST && !inInbox()) {
2003982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira            if (isTransactionIdValid(mLastFolderListTransactionId)) {
20130fd47bf1947da5ad813cb957b6cbe569dce563aMindy Pereira                // Go back to previous folder list.
2023982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira                mViewMode.enterFolderListMode();
2033982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira                mActivity.getFragmentManager().popBackStack(mLastFolderListTransactionId, 0);
2043982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira            } else {
2053982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira                // Go back to Inbox.
2063982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira                transitionToInbox();
2073982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira            }
20868f2e222b4ffccd9f67f02b3a9cfdb3841a7eb43Mindy Pereira        } else if (mode == ViewMode.CONVERSATION || mode == ViewMode.SEARCH_RESULTS_CONVERSATION) {
209f5acda4a4b7c9e8ecacb41cb7d570ef426b6d4fcMindy Pereira            transitionBackToConversationListMode();
2103982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira        } else {
2113982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira            mActivity.finish();
2123982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira        }
2133982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira        return true;
2143982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira    }
2153982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira
2163982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira    private void transitionToInbox() {
2178690e2b71e1a3dd812ce418c9607e21f3a88ab54Mindy Pereira        mViewMode.enterConversationListMode();
2183982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira        ConversationListContext listContext = ConversationListContext.forFolder(mContext,
2193982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira                mAccount, mInbox);
2203982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira        // Set the correct context for what the conversation view will be now.
2213982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira        onFolderChanged(mInbox);
2223982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira        if (isTransactionIdValid(mLastConversationListTransactionId)) {
2233982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira           // showConversationList(listContext);
2243982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira            mActivity.getFragmentManager().popBackStack(mLastConversationListTransactionId, 0);
2253982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira            resetActionBarIcon();
2263982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira        } else {
2273982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira            showConversationList(listContext);
22801668eb393deaf8c8b8abf86be46109614a98631Mindy Pereira        }
22901668eb393deaf8c8b8abf86be46109614a98631Mindy Pereira    }
230f5acda4a4b7c9e8ecacb41cb7d570ef426b6d4fcMindy Pereira
2313982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira    private boolean isTransactionIdValid(int id) {
2323982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira        return id >= 0;
2333982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira    }
2343982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira
2353982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira    /**
2363982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira     * Up works as follows:
2373982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira     * 1) If the user is in a conversation list that is not the default account inbox,
2383982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira     * a conversation, or the folder list, up follows the rules of back.
2393982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira     * 2) If the user is in search results, up exits search
2403982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira     * mode and returns the user to whatever view they were in when they began search.
2413982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira     * 3) If the user is in the inbox, there is no up.
2423982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira     */
243f5acda4a4b7c9e8ecacb41cb7d570ef426b6d4fcMindy Pereira    @Override
244f5acda4a4b7c9e8ecacb41cb7d570ef426b6d4fcMindy Pereira    public boolean onUpPressed() {
245f5acda4a4b7c9e8ecacb41cb7d570ef426b6d4fcMindy Pereira        int mode = mViewMode.getMode();
24668f2e222b4ffccd9f67f02b3a9cfdb3841a7eb43Mindy Pereira        if (mode == ViewMode.SEARCH_RESULTS_LIST) {
24768f2e222b4ffccd9f67f02b3a9cfdb3841a7eb43Mindy Pereira            mActivity.finish();
24868f2e222b4ffccd9f67f02b3a9cfdb3841a7eb43Mindy Pereira        } else if ((!inInbox() && mode == ViewMode.CONVERSATION_LIST)
24968f2e222b4ffccd9f67f02b3a9cfdb3841a7eb43Mindy Pereira                || mode == ViewMode.CONVERSATION
25068f2e222b4ffccd9f67f02b3a9cfdb3841a7eb43Mindy Pereira                || mode == ViewMode.FOLDER_LIST
25168f2e222b4ffccd9f67f02b3a9cfdb3841a7eb43Mindy Pereira                || mode == ViewMode.SEARCH_RESULTS_CONVERSATION) {
252f5acda4a4b7c9e8ecacb41cb7d570ef426b6d4fcMindy Pereira            // Same as go back.
253f5acda4a4b7c9e8ecacb41cb7d570ef426b6d4fcMindy Pereira            mActivity.onBackPressed();
254f5acda4a4b7c9e8ecacb41cb7d570ef426b6d4fcMindy Pereira        }
255f5acda4a4b7c9e8ecacb41cb7d570ef426b6d4fcMindy Pereira        return true;
256f5acda4a4b7c9e8ecacb41cb7d570ef426b6d4fcMindy Pereira    }
257f5acda4a4b7c9e8ecacb41cb7d570ef426b6d4fcMindy Pereira
258f5acda4a4b7c9e8ecacb41cb7d570ef426b6d4fcMindy Pereira    private void transitionBackToConversationListMode() {
25968f2e222b4ffccd9f67f02b3a9cfdb3841a7eb43Mindy Pereira        int mode = mViewMode.getMode();
26068f2e222b4ffccd9f67f02b3a9cfdb3841a7eb43Mindy Pereira        if (mode == ViewMode.SEARCH_RESULTS_CONVERSATION) {
26168f2e222b4ffccd9f67f02b3a9cfdb3841a7eb43Mindy Pereira            mViewMode.enterSearchResultsListMode();
26268f2e222b4ffccd9f67f02b3a9cfdb3841a7eb43Mindy Pereira        } else {
26368f2e222b4ffccd9f67f02b3a9cfdb3841a7eb43Mindy Pereira            mViewMode.enterConversationListMode();
26468f2e222b4ffccd9f67f02b3a9cfdb3841a7eb43Mindy Pereira        }
2653982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira        mActivity.getFragmentManager().popBackStack(mLastConversationTransactionId,
2663982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira                FragmentManager.POP_BACK_STACK_INCLUSIVE);
267f5acda4a4b7c9e8ecacb41cb7d570ef426b6d4fcMindy Pereira        resetActionBarIcon();
268f5acda4a4b7c9e8ecacb41cb7d570ef426b6d4fcMindy Pereira    }
269b849dfbda3c917f078a5c09f03906886c27ecbecMindy Pereira
270b849dfbda3c917f078a5c09f03906886c27ecbecMindy Pereira    @Override
271b849dfbda3c917f078a5c09f03906886c27ecbecMindy Pereira    public boolean shouldShowFirstConversation() {
272b849dfbda3c917f078a5c09f03906886c27ecbecMindy Pereira        return false;
273b849dfbda3c917f078a5c09f03906886c27ecbecMindy Pereira    }
274a55b36cb6b75ce8096812183651e89115300975aVikram Aggarwal}
275