OnePaneController.java revision e128fc21fab03f6d66c656efeee2155fab449a7f
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;
21d7a12cd5b5c2639b653d8c671b04844ef02ee01dVikram Aggarwalimport android.app.FragmentTransaction;
22fbe4019a262f6b1934a44e598009ae63dc5745eeMindy Pereiraimport android.database.Cursor;
23559c3b3d302b3f6d2c2cb43a909069d942652e34Mindy Pereiraimport android.net.Uri;
241ddcf0f2bf44d3c9db89112ef52510d9b2433ac4Vikram Aggarwalimport android.os.Bundle;
25fbe4019a262f6b1934a44e598009ae63dc5745eeMindy Pereiraimport android.view.MenuItem;
261ddcf0f2bf44d3c9db89112ef52510d9b2433ac4Vikram Aggarwal
27d7a12cd5b5c2639b653d8c671b04844ef02ee01dVikram Aggarwalimport com.android.mail.ConversationListContext;
281ddcf0f2bf44d3c9db89112ef52510d9b2433ac4Vikram Aggarwalimport com.android.mail.R;
29967ede63e059810d9d4d425c50111d606014c893Mindy Pereiraimport com.android.mail.browse.ConversationCursor;
30cd09f5e9bf55e6f4310e8dc9408132b9c88e87c3Vikram Aggarwalimport com.android.mail.providers.Account;
319b87568c9e9f1c32a9672b315229866a58a1e757Mindy Pereiraimport com.android.mail.providers.Conversation;
323982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereiraimport com.android.mail.providers.Folder;
33fbe4019a262f6b1934a44e598009ae63dc5745eeMindy Pereiraimport com.android.mail.providers.Settings;
34fbe4019a262f6b1934a44e598009ae63dc5745eeMindy Pereiraimport com.android.mail.providers.UIProvider;
35fbe4019a262f6b1934a44e598009ae63dc5745eeMindy Pereiraimport com.android.mail.providers.UIProvider.AutoAdvance;
36fbe4019a262f6b1934a44e598009ae63dc5745eeMindy Pereiraimport com.android.mail.providers.UIProvider.ConversationColumns;
3756e3f50f5aee6606035eae4b713ef634c4f3a686Mindy Pereiraimport com.android.mail.ui.FolderListFragment.FolderListSelectionListener;
38fbe4019a262f6b1934a44e598009ae63dc5745eeMindy Pereira
39fbe4019a262f6b1934a44e598009ae63dc5745eeMindy Pereiraimport java.util.ArrayList;
40fbe4019a262f6b1934a44e598009ae63dc5745eeMindy Pereiraimport java.util.Collections;
41a55b36cb6b75ce8096812183651e89115300975aVikram Aggarwal
42a55b36cb6b75ce8096812183651e89115300975aVikram Aggarwal/**
43a55b36cb6b75ce8096812183651e89115300975aVikram Aggarwal * Controller for one-pane Mail activity. One Pane is used for phones, where screen real estate is
44d7a12cd5b5c2639b653d8c671b04844ef02ee01dVikram Aggarwal * limited. This controller also does the layout, since the layout is simpler in the one pane case.
45a55b36cb6b75ce8096812183651e89115300975aVikram Aggarwal */
46a55b36cb6b75ce8096812183651e89115300975aVikram Aggarwal
47a55b36cb6b75ce8096812183651e89115300975aVikram Aggarwal// Called OnePaneActivityController in Gmail.
48a76e5aeff4a54ec70661de35be4f3ecb9d1d2fe2Mindy Pereirapublic final class OnePaneController extends AbstractActivityController {
493982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira    private static final String FOLDER_LIST_TRANSACTION_KEY = "folder-list-transaction";
503982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira    private static final String CONVERSATION_LIST_TRANSACTION_KEY = "conversation-list-transaction";
513982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira    private static final String CONVERSATION_TRANSACTION_KEY = "conversation-transaction";
523982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira    private static final int INVALID_ID = -1;
532175d0a93263672d4498458c81b404b0999134baVikram Aggarwal    private boolean mConversationListVisible = false;
543982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira    private int mLastConversationListTransactionId = INVALID_ID;
553982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira    private int mLastConversationTransactionId = INVALID_ID;
563982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira    private int mLastFolderListTransactionId = INVALID_ID;
573982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira    private Folder mInbox;
58cd09f5e9bf55e6f4310e8dc9408132b9c88e87c3Vikram Aggarwal    /** Whether a conversation list for this account has ever been shown.*/
59cd09f5e9bf55e6f4310e8dc9408132b9c88e87c3Vikram Aggarwal    private boolean mConversationListNeverShown = true;
60cd09f5e9bf55e6f4310e8dc9408132b9c88e87c3Vikram Aggarwal
61fbe4019a262f6b1934a44e598009ae63dc5745eeMindy Pereira
62fbe4019a262f6b1934a44e598009ae63dc5745eeMindy Pereira    private final ActionCompleteListener mDeleteListener = new OnePaneDestructiveActionListener(
63fbe4019a262f6b1934a44e598009ae63dc5745eeMindy Pereira            R.id.delete);
64fbe4019a262f6b1934a44e598009ae63dc5745eeMindy Pereira    private final ActionCompleteListener mArchiveListener = new OnePaneDestructiveActionListener(
65fbe4019a262f6b1934a44e598009ae63dc5745eeMindy Pereira            R.id.archive);
66fbe4019a262f6b1934a44e598009ae63dc5745eeMindy Pereira    private final ActionCompleteListener mMuteListener = new OnePaneDestructiveActionListener(
67fbe4019a262f6b1934a44e598009ae63dc5745eeMindy Pereira            R.id.mute);
68fbe4019a262f6b1934a44e598009ae63dc5745eeMindy Pereira    private final ActionCompleteListener mSpamListener = new OnePaneDestructiveActionListener(
69fbe4019a262f6b1934a44e598009ae63dc5745eeMindy Pereira            R.id.report_spam);
706778f4663a790d3e9d4c6a2f43292eef43c1e0bdMindy Pereira    private final ActionCompleteListener mUnreadListener = new OnePaneDestructiveActionListener(
716778f4663a790d3e9d4c6a2f43292eef43c1e0bdMindy Pereira            R.id.inside_conversation_unread);
72e5f4dc0661dad02e2cb39ffa62ff2157147ac387Mindy Pereira    private final OnePaneDestructiveActionListener mFolderChangeListener =
73e5f4dc0661dad02e2cb39ffa62ff2157147ac387Mindy Pereira            new OnePaneDestructiveActionListener(R.id.change_folder);
74fbe4019a262f6b1934a44e598009ae63dc5745eeMindy Pereira
75a55b36cb6b75ce8096812183651e89115300975aVikram Aggarwal    /**
76a55b36cb6b75ce8096812183651e89115300975aVikram Aggarwal     * @param activity
77a55b36cb6b75ce8096812183651e89115300975aVikram Aggarwal     * @param viewMode
78a55b36cb6b75ce8096812183651e89115300975aVikram Aggarwal     */
79a55b36cb6b75ce8096812183651e89115300975aVikram Aggarwal    public OnePaneController(MailActivity activity, ViewMode viewMode) {
80a55b36cb6b75ce8096812183651e89115300975aVikram Aggarwal        super(activity, viewMode);
81a55b36cb6b75ce8096812183651e89115300975aVikram Aggarwal    }
82a55b36cb6b75ce8096812183651e89115300975aVikram Aggarwal
831ddcf0f2bf44d3c9db89112ef52510d9b2433ac4Vikram Aggarwal    @Override
843982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira    protected void restoreState(Bundle inState) {
853982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira        super.restoreState(inState);
863982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira        // TODO(mindyp) handle saved state.
873982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira        if (inState != null) {
883982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira            mLastFolderListTransactionId = inState.getInt(FOLDER_LIST_TRANSACTION_KEY, INVALID_ID);
893982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira            mLastConversationListTransactionId = inState.getInt(CONVERSATION_LIST_TRANSACTION_KEY,
903982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira                    INVALID_ID);
913982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira            mLastConversationTransactionId = inState.getInt(CONVERSATION_TRANSACTION_KEY,
923982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira                    INVALID_ID);
933982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira        }
943982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira    }
953982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira
963982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira    @Override
973982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira    public void onSaveInstanceState(Bundle outState) {
983982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira        super.onSaveInstanceState(outState);
993982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira        // TODO(mindyp) handle saved state.
1003982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira        outState.putInt(FOLDER_LIST_TRANSACTION_KEY, mLastFolderListTransactionId);
1013982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira        outState.putInt(CONVERSATION_LIST_TRANSACTION_KEY, mLastConversationListTransactionId);
1023982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira        outState.putInt(CONVERSATION_TRANSACTION_KEY, mLastConversationTransactionId);
1033982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira    }
1043982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira
1053982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira    @Override
106d7a12cd5b5c2639b653d8c671b04844ef02ee01dVikram Aggarwal    public void resetActionBarIcon() {
107d7a12cd5b5c2639b653d8c671b04844ef02ee01dVikram Aggarwal        final int mode = mViewMode.getMode();
108559c3b3d302b3f6d2c2cb43a909069d942652e34Mindy Pereira        // If the settings aren't loaded yet, we may not know what the default
109559c3b3d302b3f6d2c2cb43a909069d942652e34Mindy Pereira        // inbox is, so err toward this being the account inbox.
110559c3b3d302b3f6d2c2cb43a909069d942652e34Mindy Pereira        if ((mCachedSettings != null && mConvListContext != null && !inInbox())
11168f2e222b4ffccd9f67f02b3a9cfdb3841a7eb43Mindy Pereira                || mode == ViewMode.SEARCH_RESULTS_LIST
11268f2e222b4ffccd9f67f02b3a9cfdb3841a7eb43Mindy Pereira                || mode == ViewMode.SEARCH_RESULTS_CONVERSATION
11368f2e222b4ffccd9f67f02b3a9cfdb3841a7eb43Mindy Pereira                || mode == ViewMode.CONVERSATION
11468f2e222b4ffccd9f67f02b3a9cfdb3841a7eb43Mindy Pereira                || mode == ViewMode.FOLDER_LIST) {
115d7a12cd5b5c2639b653d8c671b04844ef02ee01dVikram Aggarwal            mActionBarView.setBackButton();
116d7a12cd5b5c2639b653d8c671b04844ef02ee01dVikram Aggarwal        } else {
117d7a12cd5b5c2639b653d8c671b04844ef02ee01dVikram Aggarwal            mActionBarView.removeBackButton();
118d7a12cd5b5c2639b653d8c671b04844ef02ee01dVikram Aggarwal        }
119d7a12cd5b5c2639b653d8c671b04844ef02ee01dVikram Aggarwal    }
120d7a12cd5b5c2639b653d8c671b04844ef02ee01dVikram Aggarwal
1213982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira    private boolean inInbox() {
122559c3b3d302b3f6d2c2cb43a909069d942652e34Mindy Pereira        Uri inboxUri = mCachedSettings != null ? mCachedSettings.defaultInbox : null;
123559c3b3d302b3f6d2c2cb43a909069d942652e34Mindy Pereira        return mConvListContext != null && mConvListContext.folder != null ? (!mConvListContext
124559c3b3d302b3f6d2c2cb43a909069d942652e34Mindy Pereira                .isSearchResult() && mConvListContext.folder.uri.equals(inboxUri)) : false;
1253982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira    }
1263982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira
127d7a12cd5b5c2639b653d8c671b04844ef02ee01dVikram Aggarwal    @Override
128cd09f5e9bf55e6f4310e8dc9408132b9c88e87c3Vikram Aggarwal    public void onAccountChanged(Account account) {
129cd09f5e9bf55e6f4310e8dc9408132b9c88e87c3Vikram Aggarwal        super.onAccountChanged(account);
130cd09f5e9bf55e6f4310e8dc9408132b9c88e87c3Vikram Aggarwal        mConversationListNeverShown = true;
131cd09f5e9bf55e6f4310e8dc9408132b9c88e87c3Vikram Aggarwal    }
132cd09f5e9bf55e6f4310e8dc9408132b9c88e87c3Vikram Aggarwal
133cd09f5e9bf55e6f4310e8dc9408132b9c88e87c3Vikram Aggarwal    @Override
134d7a12cd5b5c2639b653d8c671b04844ef02ee01dVikram Aggarwal    public boolean onCreate(Bundle savedInstanceState) {
1351ddcf0f2bf44d3c9db89112ef52510d9b2433ac4Vikram Aggarwal        // Set 1-pane content view.
1361ddcf0f2bf44d3c9db89112ef52510d9b2433ac4Vikram Aggarwal        mActivity.setContentView(R.layout.one_pane_activity);
137d7a12cd5b5c2639b653d8c671b04844ef02ee01dVikram Aggarwal        // The parent class sets the correct viewmode and starts the application off.
138d7a12cd5b5c2639b653d8c671b04844ef02ee01dVikram Aggarwal        return super.onCreate(savedInstanceState);
1391ddcf0f2bf44d3c9db89112ef52510d9b2433ac4Vikram Aggarwal    }
1401ddcf0f2bf44d3c9db89112ef52510d9b2433ac4Vikram Aggarwal
1411ddcf0f2bf44d3c9db89112ef52510d9b2433ac4Vikram Aggarwal    @Override
1421ddcf0f2bf44d3c9db89112ef52510d9b2433ac4Vikram Aggarwal    protected boolean isConversationListVisible() {
1432175d0a93263672d4498458c81b404b0999134baVikram Aggarwal        return mConversationListVisible;
1441ddcf0f2bf44d3c9db89112ef52510d9b2433ac4Vikram Aggarwal    }
145d7a12cd5b5c2639b653d8c671b04844ef02ee01dVikram Aggarwal
146d7a12cd5b5c2639b653d8c671b04844ef02ee01dVikram Aggarwal    @Override
147d7a12cd5b5c2639b653d8c671b04844ef02ee01dVikram Aggarwal    public void onViewModeChanged(int newMode) {
148d7a12cd5b5c2639b653d8c671b04844ef02ee01dVikram Aggarwal        super.onViewModeChanged(newMode);
149d7a12cd5b5c2639b653d8c671b04844ef02ee01dVikram Aggarwal    }
150d7a12cd5b5c2639b653d8c671b04844ef02ee01dVikram Aggarwal
151d7a12cd5b5c2639b653d8c671b04844ef02ee01dVikram Aggarwal    @Override
1529b87568c9e9f1c32a9672b315229866a58a1e757Mindy Pereira    public void showConversationList(ConversationListContext listContext) {
153e128fc21fab03f6d66c656efeee2155fab449a7fVikram Aggarwal        super.showConversationList(listContext);
154e128fc21fab03f6d66c656efeee2155fab449a7fVikram Aggarwal        enableCabMode();
1553982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira        // TODO(viki): Check if the account has been changed since the previous
1563982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira        // time.
15768f2e222b4ffccd9f67f02b3a9cfdb3841a7eb43Mindy Pereira        if (listContext != null && listContext.isSearchResult()) {
15868f2e222b4ffccd9f67f02b3a9cfdb3841a7eb43Mindy Pereira            mViewMode.enterSearchResultsListMode();
15968f2e222b4ffccd9f67f02b3a9cfdb3841a7eb43Mindy Pereira        } else {
16068f2e222b4ffccd9f67f02b3a9cfdb3841a7eb43Mindy Pereira            mViewMode.enterConversationListMode();
16168f2e222b4ffccd9f67f02b3a9cfdb3841a7eb43Mindy Pereira        }
1629b87568c9e9f1c32a9672b315229866a58a1e757Mindy Pereira        // TODO(viki): This account transition looks strange in two pane mode.
1632175d0a93263672d4498458c81b404b0999134baVikram Aggarwal        // Revisit as the app is coming together and improve the look and feel.
164cd09f5e9bf55e6f4310e8dc9408132b9c88e87c3Vikram Aggarwal        final int transition = mConversationListNeverShown
165cd09f5e9bf55e6f4310e8dc9408132b9c88e87c3Vikram Aggarwal                ? FragmentTransaction.TRANSIT_FRAGMENT_FADE
1669b87568c9e9f1c32a9672b315229866a58a1e757Mindy Pereira                : FragmentTransaction.TRANSIT_FRAGMENT_OPEN;
16701668eb393deaf8c8b8abf86be46109614a98631Mindy Pereira        Fragment conversationListFragment = ConversationListFragment.newInstance(listContext);
1683982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira        if (!inInbox()) {
1693982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira            // Maintain fragment transaction history so we can get back to the
1703982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira            // fragment used to launch this list.
17172a9f3918310f581fecf6411174645ad5b5ae112Mindy Pereira            mLastConversationListTransactionId = replaceFragment(conversationListFragment,
17272a9f3918310f581fecf6411174645ad5b5ae112Mindy Pereira                    transition);
1733982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira        } else {
1743982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira            // If going to the inbox, clear the folder list transaction history.
1753982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira            mInbox = listContext.folder;
17672a9f3918310f581fecf6411174645ad5b5ae112Mindy Pereira            replaceFragment(conversationListFragment,
1773982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira                    transition);
1783982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira            mLastFolderListTransactionId = INVALID_ID;
1793982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira        }
1802175d0a93263672d4498458c81b404b0999134baVikram Aggarwal        mConversationListVisible = true;
181cd09f5e9bf55e6f4310e8dc9408132b9c88e87c3Vikram Aggarwal        mConversationListNeverShown = false;
18228d5f72e0ad0db75b6243ee8125bfe3aadbdcb85Mindy Pereira    }
18328d5f72e0ad0db75b6243ee8125bfe3aadbdcb85Mindy Pereira
18428d5f72e0ad0db75b6243ee8125bfe3aadbdcb85Mindy Pereira    @Override
1859b87568c9e9f1c32a9672b315229866a58a1e757Mindy Pereira    public void showConversation(Conversation conversation) {
186ec5cbf79b825c6f96d45e85015319c66470b7e57Vikram Aggarwal        super.showConversation(conversation);
187e128fc21fab03f6d66c656efeee2155fab449a7fVikram Aggarwal        disableCabMode();
18868f2e222b4ffccd9f67f02b3a9cfdb3841a7eb43Mindy Pereira        if (mConvListContext != null && mConvListContext.isSearchResult()) {
18968f2e222b4ffccd9f67f02b3a9cfdb3841a7eb43Mindy Pereira            mViewMode.enterSearchResultsConversationMode();
19068f2e222b4ffccd9f67f02b3a9cfdb3841a7eb43Mindy Pereira        } else {
19168f2e222b4ffccd9f67f02b3a9cfdb3841a7eb43Mindy Pereira            mViewMode.enterConversationMode();
19268f2e222b4ffccd9f67f02b3a9cfdb3841a7eb43Mindy Pereira        }
1933982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira        mLastConversationTransactionId = replaceFragment(
194863e44160d9175023d30e7e225ecb69ad3892eecMindy Pereira                ConversationViewFragment.newInstance(mAccount, conversation, mFolder),
1952175d0a93263672d4498458c81b404b0999134baVikram Aggarwal                FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
1962175d0a93263672d4498458c81b404b0999134baVikram Aggarwal        mConversationListVisible = false;
1979b87568c9e9f1c32a9672b315229866a58a1e757Mindy Pereira    }
1989b87568c9e9f1c32a9672b315229866a58a1e757Mindy Pereira
1999b87568c9e9f1c32a9672b315229866a58a1e757Mindy Pereira    @Override
2009b87568c9e9f1c32a9672b315229866a58a1e757Mindy Pereira    public void showFolderList() {
20101668eb393deaf8c8b8abf86be46109614a98631Mindy Pereira        mViewMode.enterFolderListMode();
2023982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira        mLastFolderListTransactionId = replaceFragment(
203a76e5aeff4a54ec70661de35be4f3ecb9d1d2fe2Mindy Pereira                FolderListFragment.newInstance(null, mAccount.folderListUri),
2042175d0a93263672d4498458c81b404b0999134baVikram Aggarwal                FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
2052175d0a93263672d4498458c81b404b0999134baVikram Aggarwal        mConversationListVisible = false;
2069b87568c9e9f1c32a9672b315229866a58a1e757Mindy Pereira    }
2079b87568c9e9f1c32a9672b315229866a58a1e757Mindy Pereira
2083982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira    private int replaceFragment(Fragment fragment, int transition) {
209d7a12cd5b5c2639b653d8c671b04844ef02ee01dVikram Aggarwal        FragmentTransaction fragmentTransaction = mActivity.getFragmentManager().beginTransaction();
210d7a12cd5b5c2639b653d8c671b04844ef02ee01dVikram Aggarwal        fragmentTransaction.addToBackStack(null);
211d7a12cd5b5c2639b653d8c671b04844ef02ee01dVikram Aggarwal        fragmentTransaction.setTransition(transition);
2129b87568c9e9f1c32a9672b315229866a58a1e757Mindy Pereira        fragmentTransaction.replace(R.id.content_pane, fragment);
2133982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira        int transactionId = fragmentTransaction.commitAllowingStateLoss();
214d7a12cd5b5c2639b653d8c671b04844ef02ee01dVikram Aggarwal        resetActionBarIcon();
2153982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira        return transactionId;
216d7a12cd5b5c2639b653d8c671b04844ef02ee01dVikram Aggarwal    }
21701668eb393deaf8c8b8abf86be46109614a98631Mindy Pereira
2183982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira    /**
2193982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira     * Back works as follows:
2203982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira     * 1) If the user is in the folder list view, go back
2213982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira     * to the account default inbox.
2223982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira     * 2) If the user is in a conversation list
2233982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira     * that is not the inbox AND:
2243982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira     *  a) they got there by going through the folder
2253982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira     *  list view, go back to the folder list view.
2263982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira     *  b) they got there by using some other means (account dropdown), go back to the inbox.
2273982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira     * 3) If the user is in a conversation, go back to the conversation list they were last in.
2283982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira     * 4) If the user is in the conversation list for the default account inbox,
2293982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira     * back exits the app.
2303982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira     */
23101668eb393deaf8c8b8abf86be46109614a98631Mindy Pereira    @Override
23201668eb393deaf8c8b8abf86be46109614a98631Mindy Pereira    public boolean onBackPressed() {
23301668eb393deaf8c8b8abf86be46109614a98631Mindy Pereira        int mode = mViewMode.getMode();
2343982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira        if (mode == ViewMode.FOLDER_LIST) {
2353982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira            mLastFolderListTransactionId = INVALID_ID;
2363982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira            transitionToInbox();
23768f2e222b4ffccd9f67f02b3a9cfdb3841a7eb43Mindy Pereira        } else if (mode == ViewMode.SEARCH_RESULTS_LIST) {
23868f2e222b4ffccd9f67f02b3a9cfdb3841a7eb43Mindy Pereira            mActivity.finish();
2393982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira        } else if (mode == ViewMode.CONVERSATION_LIST && !inInbox()) {
2403982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira            if (isTransactionIdValid(mLastFolderListTransactionId)) {
24130fd47bf1947da5ad813cb957b6cbe569dce563aMindy Pereira                // Go back to previous folder list.
2423982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira                mViewMode.enterFolderListMode();
2433982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira                mActivity.getFragmentManager().popBackStack(mLastFolderListTransactionId, 0);
2443982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira            } else {
2453982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira                // Go back to Inbox.
2463982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira                transitionToInbox();
2473982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira            }
24868f2e222b4ffccd9f67f02b3a9cfdb3841a7eb43Mindy Pereira        } else if (mode == ViewMode.CONVERSATION || mode == ViewMode.SEARCH_RESULTS_CONVERSATION) {
249f5acda4a4b7c9e8ecacb41cb7d570ef426b6d4fcMindy Pereira            transitionBackToConversationListMode();
2503982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira        } else {
2513982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira            mActivity.finish();
2523982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira        }
2533982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira        return true;
2543982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira    }
2553982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira
2563982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira    private void transitionToInbox() {
2578690e2b71e1a3dd812ce418c9607e21f3a88ab54Mindy Pereira        mViewMode.enterConversationListMode();
258f6acdade010b2d0f49fd425b33e7f7b376286490Mindy Pereira        if (mInbox == null) {
259ab4863650794e81f35a0fd9abc16a5564d7b102bMindy Pereira            loadAccountInbox();
2603982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira        } else {
261f6acdade010b2d0f49fd425b33e7f7b376286490Mindy Pereira            ConversationListContext listContext = ConversationListContext.forFolder(mContext,
262f6acdade010b2d0f49fd425b33e7f7b376286490Mindy Pereira                    mAccount, mInbox);
26372a9f3918310f581fecf6411174645ad5b5ae112Mindy Pereira            // Set the correct context for what the conversation view will be
26472a9f3918310f581fecf6411174645ad5b5ae112Mindy Pereira            // now.
265f6acdade010b2d0f49fd425b33e7f7b376286490Mindy Pereira            onFolderChanged(mInbox);
26672a9f3918310f581fecf6411174645ad5b5ae112Mindy Pereira            showConversationList(listContext);
26701668eb393deaf8c8b8abf86be46109614a98631Mindy Pereira        }
26801668eb393deaf8c8b8abf86be46109614a98631Mindy Pereira    }
269f5acda4a4b7c9e8ecacb41cb7d570ef426b6d4fcMindy Pereira
270118b3f6443f1859ff4866c97c0e8896f3415f730Mindy Pereira    @Override
27156e3f50f5aee6606035eae4b713ef634c4f3a686Mindy Pereira    public void onFolderSelected(Folder folder, boolean childView) {
27256e3f50f5aee6606035eae4b713ef634c4f3a686Mindy Pereira        if (!childView && folder.hasChildren) {
27356e3f50f5aee6606035eae4b713ef634c4f3a686Mindy Pereira            // Replace this fragment with a new FolderListFragment
27456e3f50f5aee6606035eae4b713ef634c4f3a686Mindy Pereira            // showing this folder's children if we are not already looking
27556e3f50f5aee6606035eae4b713ef634c4f3a686Mindy Pereira            // at the child view for this folder.
27656e3f50f5aee6606035eae4b713ef634c4f3a686Mindy Pereira            mLastFolderListTransactionId = replaceFragment(
277a76e5aeff4a54ec70661de35be4f3ecb9d1d2fe2Mindy Pereira                    FolderListFragment.newInstance(folder, folder.childFoldersListUri),
27856e3f50f5aee6606035eae4b713ef634c4f3a686Mindy Pereira                    FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
27956e3f50f5aee6606035eae4b713ef634c4f3a686Mindy Pereira            return;
28056e3f50f5aee6606035eae4b713ef634c4f3a686Mindy Pereira        }
28156e3f50f5aee6606035eae4b713ef634c4f3a686Mindy Pereira        if (mViewMode.getMode() == ViewMode.FOLDER_LIST && folder != null
28256e3f50f5aee6606035eae4b713ef634c4f3a686Mindy Pereira                && folder.equals(mFolder)) {
283118b3f6443f1859ff4866c97c0e8896f3415f730Mindy Pereira            // if we are in folder list when we select a new folder,
284118b3f6443f1859ff4866c97c0e8896f3415f730Mindy Pereira            // and it is the same as the existing folder, clear the previous
285118b3f6443f1859ff4866c97c0e8896f3415f730Mindy Pereira            // folder setting so that the folder will be re-loaded/ shown.
286118b3f6443f1859ff4866c97c0e8896f3415f730Mindy Pereira            mFolder = null;
287118b3f6443f1859ff4866c97c0e8896f3415f730Mindy Pereira        }
288118b3f6443f1859ff4866c97c0e8896f3415f730Mindy Pereira        super.onFolderChanged(folder);
289118b3f6443f1859ff4866c97c0e8896f3415f730Mindy Pereira    }
290118b3f6443f1859ff4866c97c0e8896f3415f730Mindy Pereira
2913982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira    private boolean isTransactionIdValid(int id) {
2923982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira        return id >= 0;
2933982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira    }
2943982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira
2953982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira    /**
2963982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira     * Up works as follows:
2973982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira     * 1) If the user is in a conversation list that is not the default account inbox,
2983982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira     * a conversation, or the folder list, up follows the rules of back.
2993982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira     * 2) If the user is in search results, up exits search
3003982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira     * mode and returns the user to whatever view they were in when they began search.
3013982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira     * 3) If the user is in the inbox, there is no up.
3023982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira     */
303f5acda4a4b7c9e8ecacb41cb7d570ef426b6d4fcMindy Pereira    @Override
304f5acda4a4b7c9e8ecacb41cb7d570ef426b6d4fcMindy Pereira    public boolean onUpPressed() {
305f5acda4a4b7c9e8ecacb41cb7d570ef426b6d4fcMindy Pereira        int mode = mViewMode.getMode();
30668f2e222b4ffccd9f67f02b3a9cfdb3841a7eb43Mindy Pereira        if (mode == ViewMode.SEARCH_RESULTS_LIST) {
30768f2e222b4ffccd9f67f02b3a9cfdb3841a7eb43Mindy Pereira            mActivity.finish();
30868f2e222b4ffccd9f67f02b3a9cfdb3841a7eb43Mindy Pereira        } else if ((!inInbox() && mode == ViewMode.CONVERSATION_LIST)
30968f2e222b4ffccd9f67f02b3a9cfdb3841a7eb43Mindy Pereira                || mode == ViewMode.CONVERSATION
31068f2e222b4ffccd9f67f02b3a9cfdb3841a7eb43Mindy Pereira                || mode == ViewMode.FOLDER_LIST
31168f2e222b4ffccd9f67f02b3a9cfdb3841a7eb43Mindy Pereira                || mode == ViewMode.SEARCH_RESULTS_CONVERSATION) {
312f5acda4a4b7c9e8ecacb41cb7d570ef426b6d4fcMindy Pereira            // Same as go back.
313f5acda4a4b7c9e8ecacb41cb7d570ef426b6d4fcMindy Pereira            mActivity.onBackPressed();
314f5acda4a4b7c9e8ecacb41cb7d570ef426b6d4fcMindy Pereira        }
315f5acda4a4b7c9e8ecacb41cb7d570ef426b6d4fcMindy Pereira        return true;
316f5acda4a4b7c9e8ecacb41cb7d570ef426b6d4fcMindy Pereira    }
317f5acda4a4b7c9e8ecacb41cb7d570ef426b6d4fcMindy Pereira
318f5acda4a4b7c9e8ecacb41cb7d570ef426b6d4fcMindy Pereira    private void transitionBackToConversationListMode() {
31968f2e222b4ffccd9f67f02b3a9cfdb3841a7eb43Mindy Pereira        int mode = mViewMode.getMode();
32068f2e222b4ffccd9f67f02b3a9cfdb3841a7eb43Mindy Pereira        if (mode == ViewMode.SEARCH_RESULTS_CONVERSATION) {
32168f2e222b4ffccd9f67f02b3a9cfdb3841a7eb43Mindy Pereira            mViewMode.enterSearchResultsListMode();
32268f2e222b4ffccd9f67f02b3a9cfdb3841a7eb43Mindy Pereira        } else {
32368f2e222b4ffccd9f67f02b3a9cfdb3841a7eb43Mindy Pereira            mViewMode.enterConversationListMode();
32468f2e222b4ffccd9f67f02b3a9cfdb3841a7eb43Mindy Pereira        }
32521ab490d4919985d611bc36ae2d8aea86a911499Mindy Pereira        if (isTransactionIdValid(mLastConversationListTransactionId)) {
32621ab490d4919985d611bc36ae2d8aea86a911499Mindy Pereira            mActivity.getFragmentManager().popBackStack(mLastConversationListTransactionId, 0);
32721ab490d4919985d611bc36ae2d8aea86a911499Mindy Pereira            resetActionBarIcon();
32821ab490d4919985d611bc36ae2d8aea86a911499Mindy Pereira        } else {
32921ab490d4919985d611bc36ae2d8aea86a911499Mindy Pereira            ConversationListContext listContext = ConversationListContext.forFolder(mContext,
33021ab490d4919985d611bc36ae2d8aea86a911499Mindy Pereira                    mAccount, mInbox);
33121ab490d4919985d611bc36ae2d8aea86a911499Mindy Pereira            // Set the correct context for what the conversation view will be now.
33221ab490d4919985d611bc36ae2d8aea86a911499Mindy Pereira            onFolderChanged(mInbox);
33321ab490d4919985d611bc36ae2d8aea86a911499Mindy Pereira            showConversationList(listContext);
33421ab490d4919985d611bc36ae2d8aea86a911499Mindy Pereira        }
335f5acda4a4b7c9e8ecacb41cb7d570ef426b6d4fcMindy Pereira        resetActionBarIcon();
336f5acda4a4b7c9e8ecacb41cb7d570ef426b6d4fcMindy Pereira    }
337b849dfbda3c917f078a5c09f03906886c27ecbecMindy Pereira
338b849dfbda3c917f078a5c09f03906886c27ecbecMindy Pereira    @Override
339b849dfbda3c917f078a5c09f03906886c27ecbecMindy Pereira    public boolean shouldShowFirstConversation() {
340b849dfbda3c917f078a5c09f03906886c27ecbecMindy Pereira        return false;
341b849dfbda3c917f078a5c09f03906886c27ecbecMindy Pereira    }
342fbe4019a262f6b1934a44e598009ae63dc5745eeMindy Pereira
343fbe4019a262f6b1934a44e598009ae63dc5745eeMindy Pereira    @Override
344fbe4019a262f6b1934a44e598009ae63dc5745eeMindy Pereira    public boolean onOptionsItemSelected(MenuItem item) {
345fbe4019a262f6b1934a44e598009ae63dc5745eeMindy Pereira        boolean handled = true;
346fbe4019a262f6b1934a44e598009ae63dc5745eeMindy Pereira        final int id = item.getItemId();
347fbe4019a262f6b1934a44e598009ae63dc5745eeMindy Pereira        switch (id) {
348fbe4019a262f6b1934a44e598009ae63dc5745eeMindy Pereira            case R.id.y_button: {
349fbe4019a262f6b1934a44e598009ae63dc5745eeMindy Pereira                final Settings settings = mActivity.getSettings();
350fbe4019a262f6b1934a44e598009ae63dc5745eeMindy Pereira                final boolean showDialog = (settings != null && settings.confirmArchive);
351fbe4019a262f6b1934a44e598009ae63dc5745eeMindy Pereira                confirmAndDelete(showDialog, R.plurals.confirm_archive_conversation,
352fbe4019a262f6b1934a44e598009ae63dc5745eeMindy Pereira                        mArchiveListener);
353fbe4019a262f6b1934a44e598009ae63dc5745eeMindy Pereira                break;
354fbe4019a262f6b1934a44e598009ae63dc5745eeMindy Pereira            }
355fbe4019a262f6b1934a44e598009ae63dc5745eeMindy Pereira            case R.id.delete: {
356fbe4019a262f6b1934a44e598009ae63dc5745eeMindy Pereira                final Settings settings = mActivity.getSettings();
357fbe4019a262f6b1934a44e598009ae63dc5745eeMindy Pereira                final boolean showDialog = (settings != null && settings.confirmDelete);
358fbe4019a262f6b1934a44e598009ae63dc5745eeMindy Pereira                confirmAndDelete(showDialog,
359fbe4019a262f6b1934a44e598009ae63dc5745eeMindy Pereira                        R.plurals.confirm_delete_conversation, mDeleteListener);
360fbe4019a262f6b1934a44e598009ae63dc5745eeMindy Pereira                break;
361fbe4019a262f6b1934a44e598009ae63dc5745eeMindy Pereira            }
362fbe4019a262f6b1934a44e598009ae63dc5745eeMindy Pereira            case R.id.change_folders:
363fbe4019a262f6b1934a44e598009ae63dc5745eeMindy Pereira                new FoldersSelectionDialog(mActivity.getActivityContext(), mAccount, this,
364fbe4019a262f6b1934a44e598009ae63dc5745eeMindy Pereira                        Collections.singletonList(mCurrentConversation)).show();
365fbe4019a262f6b1934a44e598009ae63dc5745eeMindy Pereira                break;
366fbe4019a262f6b1934a44e598009ae63dc5745eeMindy Pereira            case R.id.inside_conversation_unread:
3676778f4663a790d3e9d4c6a2f43292eef43c1e0bdMindy Pereira                // Mark as unread and advance.
3686778f4663a790d3e9d4c6a2f43292eef43c1e0bdMindy Pereira                performInsideConversationUnread();
369fbe4019a262f6b1934a44e598009ae63dc5745eeMindy Pereira                break;
370fbe4019a262f6b1934a44e598009ae63dc5745eeMindy Pereira            case R.id.mark_important:
371fbe4019a262f6b1934a44e598009ae63dc5745eeMindy Pereira                updateCurrentConversation(ConversationColumns.PRIORITY,
372fbe4019a262f6b1934a44e598009ae63dc5745eeMindy Pereira                        UIProvider.ConversationPriority.HIGH);
373fbe4019a262f6b1934a44e598009ae63dc5745eeMindy Pereira                break;
374fbe4019a262f6b1934a44e598009ae63dc5745eeMindy Pereira            case R.id.mark_not_important:
375fbe4019a262f6b1934a44e598009ae63dc5745eeMindy Pereira                updateCurrentConversation(ConversationColumns.PRIORITY,
376fbe4019a262f6b1934a44e598009ae63dc5745eeMindy Pereira                        UIProvider.ConversationPriority.LOW);
377fbe4019a262f6b1934a44e598009ae63dc5745eeMindy Pereira                break;
378fbe4019a262f6b1934a44e598009ae63dc5745eeMindy Pereira            case R.id.mute:
379c9d59184da271d5a6974edb709e3b39a5a970fa7Mindy Pereira                requestDelete(mMuteListener);
380fbe4019a262f6b1934a44e598009ae63dc5745eeMindy Pereira                break;
381fbe4019a262f6b1934a44e598009ae63dc5745eeMindy Pereira            case R.id.report_spam:
382c9d59184da271d5a6974edb709e3b39a5a970fa7Mindy Pereira                requestDelete(mSpamListener);
383fbe4019a262f6b1934a44e598009ae63dc5745eeMindy Pereira                break;
384fbe4019a262f6b1934a44e598009ae63dc5745eeMindy Pereira            default:
385fbe4019a262f6b1934a44e598009ae63dc5745eeMindy Pereira                handled = false;
386fbe4019a262f6b1934a44e598009ae63dc5745eeMindy Pereira                break;
387fbe4019a262f6b1934a44e598009ae63dc5745eeMindy Pereira        }
388fbe4019a262f6b1934a44e598009ae63dc5745eeMindy Pereira        return handled || super.onOptionsItemSelected(item);
389fbe4019a262f6b1934a44e598009ae63dc5745eeMindy Pereira    }
390fbe4019a262f6b1934a44e598009ae63dc5745eeMindy Pereira
3916778f4663a790d3e9d4c6a2f43292eef43c1e0bdMindy Pereira    // TODO: If when the conversation was opened, some of the messages were unread,
3926778f4663a790d3e9d4c6a2f43292eef43c1e0bdMindy Pereira    // this is supposed to restore that state. Otherwise, this should mark all
3936778f4663a790d3e9d4c6a2f43292eef43c1e0bdMindy Pereira    // messages as unread
3946778f4663a790d3e9d4c6a2f43292eef43c1e0bdMindy Pereira    private void performInsideConversationUnread() {
3956778f4663a790d3e9d4c6a2f43292eef43c1e0bdMindy Pereira        updateCurrentConversation(ConversationColumns.READ, false);
3966778f4663a790d3e9d4c6a2f43292eef43c1e0bdMindy Pereira        if (returnToList()) {
3976778f4663a790d3e9d4c6a2f43292eef43c1e0bdMindy Pereira            onBackPressed();
3986778f4663a790d3e9d4c6a2f43292eef43c1e0bdMindy Pereira        } else {
3996778f4663a790d3e9d4c6a2f43292eef43c1e0bdMindy Pereira            mUnreadListener.onActionComplete();
4006778f4663a790d3e9d4c6a2f43292eef43c1e0bdMindy Pereira        }
4016778f4663a790d3e9d4c6a2f43292eef43c1e0bdMindy Pereira    }
4026778f4663a790d3e9d4c6a2f43292eef43c1e0bdMindy Pereira
403fbe4019a262f6b1934a44e598009ae63dc5745eeMindy Pereira    private class OnePaneDestructiveActionListener extends DestructiveActionListener {
404fbe4019a262f6b1934a44e598009ae63dc5745eeMindy Pereira        public OnePaneDestructiveActionListener(int action) {
405fbe4019a262f6b1934a44e598009ae63dc5745eeMindy Pereira            super(action);
406fbe4019a262f6b1934a44e598009ae63dc5745eeMindy Pereira        }
407fbe4019a262f6b1934a44e598009ae63dc5745eeMindy Pereira
408fbe4019a262f6b1934a44e598009ae63dc5745eeMindy Pereira        @Override
409fbe4019a262f6b1934a44e598009ae63dc5745eeMindy Pereira        public void onActionComplete() {
410fbe4019a262f6b1934a44e598009ae63dc5745eeMindy Pereira            Conversation next = null;
411fbe4019a262f6b1934a44e598009ae63dc5745eeMindy Pereira            final ArrayList<Conversation> single = new ArrayList<Conversation>();
412fbe4019a262f6b1934a44e598009ae63dc5745eeMindy Pereira            single.add(mCurrentConversation);
413c67182dfb4884e92262a2365ecfcc5d254c7999cVikram Aggarwal            final int mode = mViewMode.getMode();
414fbe4019a262f6b1934a44e598009ae63dc5745eeMindy Pereira            if (mode == ViewMode.CONVERSATION) {
415fbe4019a262f6b1934a44e598009ae63dc5745eeMindy Pereira                next = getNextConversation();
4166778f4663a790d3e9d4c6a2f43292eef43c1e0bdMindy Pereira            } else if (mode == ViewMode.CONVERSATION_LIST
4176778f4663a790d3e9d4c6a2f43292eef43c1e0bdMindy Pereira                    && mAction != R.id.inside_conversation_unread) {
418967ede63e059810d9d4d425c50111d606014c893Mindy Pereira                OnePaneController.this.onActionComplete();
419fbe4019a262f6b1934a44e598009ae63dc5745eeMindy Pereira                mConversationListFragment.onUndoAvailable(new UndoOperation(1, mAction));
420fbe4019a262f6b1934a44e598009ae63dc5745eeMindy Pereira            }
421fbe4019a262f6b1934a44e598009ae63dc5745eeMindy Pereira            performConversationAction(single);
422967ede63e059810d9d4d425c50111d606014c893Mindy Pereira            if (next != null) {
423967ede63e059810d9d4d425c50111d606014c893Mindy Pereira                if (mode == ViewMode.CONVERSATION) {
424967ede63e059810d9d4d425c50111d606014c893Mindy Pereira                    showConversation(next);
425967ede63e059810d9d4d425c50111d606014c893Mindy Pereira                }
426fbe4019a262f6b1934a44e598009ae63dc5745eeMindy Pereira            } else {
427c67182dfb4884e92262a2365ecfcc5d254c7999cVikram Aggarwal                // Don't have the next conversation, go back to conversation list.
428967ede63e059810d9d4d425c50111d606014c893Mindy Pereira                if (mode == ViewMode.CONVERSATION_LIST) {
429967ede63e059810d9d4d425c50111d606014c893Mindy Pereira                    mConversationListFragment.requestListRefresh();
430967ede63e059810d9d4d425c50111d606014c893Mindy Pereira                } else if (mode == ViewMode.CONVERSATION) {
431967ede63e059810d9d4d425c50111d606014c893Mindy Pereira                    final int position = mCurrentConversation.position;
432967ede63e059810d9d4d425c50111d606014c893Mindy Pereira                    final OnePaneDestructiveActionListener listener = this;
433967ede63e059810d9d4d425c50111d606014c893Mindy Pereira                    onBackPressed();
434967ede63e059810d9d4d425c50111d606014c893Mindy Pereira                    mHandler.post(new Runnable() {
435967ede63e059810d9d4d425c50111d606014c893Mindy Pereira                        @Override
436967ede63e059810d9d4d425c50111d606014c893Mindy Pereira                        public void run() {
437967ede63e059810d9d4d425c50111d606014c893Mindy Pereira                            if (mConversationListFragment != null) {
438967ede63e059810d9d4d425c50111d606014c893Mindy Pereira                                mConversationListFragment.requestDelete(position, listener);
439967ede63e059810d9d4d425c50111d606014c893Mindy Pereira                            }
440967ede63e059810d9d4d425c50111d606014c893Mindy Pereira                        }
441967ede63e059810d9d4d425c50111d606014c893Mindy Pereira                    });
442967ede63e059810d9d4d425c50111d606014c893Mindy Pereira                }
443fbe4019a262f6b1934a44e598009ae63dc5745eeMindy Pereira            }
444fbe4019a262f6b1934a44e598009ae63dc5745eeMindy Pereira        }
445fbe4019a262f6b1934a44e598009ae63dc5745eeMindy Pereira    }
446fbe4019a262f6b1934a44e598009ae63dc5745eeMindy Pereira
447c67182dfb4884e92262a2365ecfcc5d254c7999cVikram Aggarwal    /**
448c67182dfb4884e92262a2365ecfcc5d254c7999cVikram Aggarwal     * Returns true if we need to return back to conversation list based on the current
449c67182dfb4884e92262a2365ecfcc5d254c7999cVikram Aggarwal     * AutoAdvance setting and the number of messages in the list.
450c67182dfb4884e92262a2365ecfcc5d254c7999cVikram Aggarwal     * @return true if we need to return back to conversation list, false otherwise.
451c67182dfb4884e92262a2365ecfcc5d254c7999cVikram Aggarwal     */
4526778f4663a790d3e9d4c6a2f43292eef43c1e0bdMindy Pereira    private boolean returnToList() {
453967ede63e059810d9d4d425c50111d606014c893Mindy Pereira        ConversationCursor conversationListCursor = mConversationListCursor;
4546778f4663a790d3e9d4c6a2f43292eef43c1e0bdMindy Pereira        int pref = getAutoAdvanceSetting(mActivity);
455a3c4dc2efddf837d79639706bdadae72f773d407Mindy Pereira        final int position = mCurrentConversation.position;
4566778f4663a790d3e9d4c6a2f43292eef43c1e0bdMindy Pereira        boolean canMove = false;
457a3c4dc2efddf837d79639706bdadae72f773d407Mindy Pereira        switch (pref) {
458a3c4dc2efddf837d79639706bdadae72f773d407Mindy Pereira            case AutoAdvance.NEWER:
459a3c4dc2efddf837d79639706bdadae72f773d407Mindy Pereira                canMove = position - 1 >= 0;
460a3c4dc2efddf837d79639706bdadae72f773d407Mindy Pereira                break;
461a3c4dc2efddf837d79639706bdadae72f773d407Mindy Pereira            case AutoAdvance.OLDER:
462967ede63e059810d9d4d425c50111d606014c893Mindy Pereira                Cursor c = conversationListCursor;
463a3c4dc2efddf837d79639706bdadae72f773d407Mindy Pereira                if (c != null) {
464a3c4dc2efddf837d79639706bdadae72f773d407Mindy Pereira                    canMove = position + 1 < c.getCount();
465a3c4dc2efddf837d79639706bdadae72f773d407Mindy Pereira                }
466a3c4dc2efddf837d79639706bdadae72f773d407Mindy Pereira                break;
467a3c4dc2efddf837d79639706bdadae72f773d407Mindy Pereira        }
4686778f4663a790d3e9d4c6a2f43292eef43c1e0bdMindy Pereira        return pref == AutoAdvance.LIST || !canMove;
4696778f4663a790d3e9d4c6a2f43292eef43c1e0bdMindy Pereira    }
4706778f4663a790d3e9d4c6a2f43292eef43c1e0bdMindy Pereira
47170f130ee9be956e72bc0686e80c3fc4c92807451Vikram Aggarwal    @Override
4726778f4663a790d3e9d4c6a2f43292eef43c1e0bdMindy Pereira    protected void requestDelete(final ActionCompleteListener listener) {
4736778f4663a790d3e9d4c6a2f43292eef43c1e0bdMindy Pereira        final int position = mCurrentConversation.position;
4746778f4663a790d3e9d4c6a2f43292eef43c1e0bdMindy Pereira        if (returnToList()) {
475fbe4019a262f6b1934a44e598009ae63dc5745eeMindy Pereira            onBackPressed();
476fbe4019a262f6b1934a44e598009ae63dc5745eeMindy Pereira            mHandler.post(new Runnable() {
477fbe4019a262f6b1934a44e598009ae63dc5745eeMindy Pereira
478fbe4019a262f6b1934a44e598009ae63dc5745eeMindy Pereira                @Override
479fbe4019a262f6b1934a44e598009ae63dc5745eeMindy Pereira                public void run() {
480967ede63e059810d9d4d425c50111d606014c893Mindy Pereira                    if (mConversationListFragment != null) {
481967ede63e059810d9d4d425c50111d606014c893Mindy Pereira                        mConversationListFragment.requestDelete(position, listener);
482967ede63e059810d9d4d425c50111d606014c893Mindy Pereira                    }
483fbe4019a262f6b1934a44e598009ae63dc5745eeMindy Pereira                }
484fbe4019a262f6b1934a44e598009ae63dc5745eeMindy Pereira
485fbe4019a262f6b1934a44e598009ae63dc5745eeMindy Pereira            });
486fbe4019a262f6b1934a44e598009ae63dc5745eeMindy Pereira        } else {
487967ede63e059810d9d4d425c50111d606014c893Mindy Pereira            if (mConversationListCursor != null) {
488967ede63e059810d9d4d425c50111d606014c893Mindy Pereira                mConversationListCursor.moveToPosition(position);
489967ede63e059810d9d4d425c50111d606014c893Mindy Pereira            }
490967ede63e059810d9d4d425c50111d606014c893Mindy Pereira            listener.onActionComplete();
491fbe4019a262f6b1934a44e598009ae63dc5745eeMindy Pereira        }
492fbe4019a262f6b1934a44e598009ae63dc5745eeMindy Pereira    }
493fbe4019a262f6b1934a44e598009ae63dc5745eeMindy Pereira
494e5f4dc0661dad02e2cb39ffa62ff2157147ac387Mindy Pereira    @Override
495e5f4dc0661dad02e2cb39ffa62ff2157147ac387Mindy Pereira    protected DestructiveActionListener getFolderDestructiveActionListener() {
496e5f4dc0661dad02e2cb39ffa62ff2157147ac387Mindy Pereira        return mFolderChangeListener;
497e5f4dc0661dad02e2cb39ffa62ff2157147ac387Mindy Pereira    }
498a55b36cb6b75ce8096812183651e89115300975aVikram Aggarwal}
499