1a55b36cb6b75ce8096812183651e89115300975aVikram Aggarwal/*******************************************************************************
2a55b36cb6b75ce8096812183651e89115300975aVikram Aggarwal *      Copyright (C) 2012 Google Inc.
3a55b36cb6b75ce8096812183651e89115300975aVikram Aggarwal *      Licensed to The Android Open Source Project.
4a55b36cb6b75ce8096812183651e89115300975aVikram Aggarwal *
5a55b36cb6b75ce8096812183651e89115300975aVikram Aggarwal *      Licensed under the Apache License, Version 2.0 (the "License");
6a55b36cb6b75ce8096812183651e89115300975aVikram Aggarwal *      you may not use this file except in compliance with the License.
7a55b36cb6b75ce8096812183651e89115300975aVikram Aggarwal *      You may obtain a copy of the License at
8a55b36cb6b75ce8096812183651e89115300975aVikram Aggarwal *
9a55b36cb6b75ce8096812183651e89115300975aVikram Aggarwal *           http://www.apache.org/licenses/LICENSE-2.0
10a55b36cb6b75ce8096812183651e89115300975aVikram Aggarwal *
11a55b36cb6b75ce8096812183651e89115300975aVikram Aggarwal *      Unless required by applicable law or agreed to in writing, software
12a55b36cb6b75ce8096812183651e89115300975aVikram Aggarwal *      distributed under the License is distributed on an "AS IS" BASIS,
13a55b36cb6b75ce8096812183651e89115300975aVikram Aggarwal *      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14a55b36cb6b75ce8096812183651e89115300975aVikram Aggarwal *      See the License for the specific language governing permissions and
15a55b36cb6b75ce8096812183651e89115300975aVikram Aggarwal *      limitations under the License.
16a55b36cb6b75ce8096812183651e89115300975aVikram Aggarwal *******************************************************************************/
17a55b36cb6b75ce8096812183651e89115300975aVikram Aggarwal
18a55b36cb6b75ce8096812183651e89115300975aVikram Aggarwalpackage com.android.mail.ui;
19a55b36cb6b75ce8096812183651e89115300975aVikram Aggarwal
20d7a12cd5b5c2639b653d8c671b04844ef02ee01dVikram Aggarwalimport android.app.Fragment;
21632721e6b3a9ba8c476456f2e0fb1b564561e0b5Andy Huangimport android.app.FragmentManager;
22d7a12cd5b5c2639b653d8c671b04844ef02ee01dVikram Aggarwalimport android.app.FragmentTransaction;
23559c3b3d302b3f6d2c2cb43a909069d942652e34Mindy Pereiraimport android.net.Uri;
241ddcf0f2bf44d3c9db89112ef52510d9b2433ac4Vikram Aggarwalimport android.os.Bundle;
258e65c6d2527c7539b689e0e8548c84f690badca5Rohan Shahimport android.support.v4.widget.DrawerLayout;
26feb5b1ef0c9489c1ea727177f8bd423250b64990Scott Kennedyimport android.widget.ListView;
278e65c6d2527c7539b689e0e8548c84f690badca5Rohan Shah
28d7a12cd5b5c2639b653d8c671b04844ef02ee01dVikram Aggarwalimport com.android.mail.ConversationListContext;
291ddcf0f2bf44d3c9db89112ef52510d9b2433ac4Vikram Aggarwalimport com.android.mail.R;
30cd09f5e9bf55e6f4310e8dc9408132b9c88e87c3Vikram Aggarwalimport com.android.mail.providers.Account;
319b87568c9e9f1c32a9672b315229866a58a1e757Mindy Pereiraimport com.android.mail.providers.Conversation;
323982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereiraimport com.android.mail.providers.Folder;
33fbe4019a262f6b1934a44e598009ae63dc5745eeMindy Pereiraimport com.android.mail.providers.UIProvider;
34259df5b9e11908c8ef7c91483924891dd96b3c27Scott Kennedyimport com.android.mail.utils.FolderUri;
35c59dd8270215f97d39697dae9e69976bcfe3642bmindypimport com.android.mail.utils.Utils;
36fbe4019a262f6b1934a44e598009ae63dc5745eeMindy Pereira
37a55b36cb6b75ce8096812183651e89115300975aVikram Aggarwal/**
38a55b36cb6b75ce8096812183651e89115300975aVikram Aggarwal * Controller for one-pane Mail activity. One Pane is used for phones, where screen real estate is
39d7a12cd5b5c2639b653d8c671b04844ef02ee01dVikram Aggarwal * limited. This controller also does the layout, since the layout is simpler in the one pane case.
40a55b36cb6b75ce8096812183651e89115300975aVikram Aggarwal */
41a55b36cb6b75ce8096812183651e89115300975aVikram Aggarwal
42a76e5aeff4a54ec70661de35be4f3ecb9d1d2fe2Mindy Pereirapublic final class OnePaneController extends AbstractActivityController {
432bfb5c0fa1cfe7f25c121d6435dc1a04439f7bacVikram Aggarwal    /** Key used to store {@link #mLastConversationListTransactionId} */
443982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira    private static final String CONVERSATION_LIST_TRANSACTION_KEY = "conversation-list-transaction";
452bfb5c0fa1cfe7f25c121d6435dc1a04439f7bacVikram Aggarwal    /** Key used to store {@link #mLastConversationTransactionId}. */
463982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira    private static final String CONVERSATION_TRANSACTION_KEY = "conversation-transaction";
472bfb5c0fa1cfe7f25c121d6435dc1a04439f7bacVikram Aggarwal    /** Key used to store {@link #mConversationListVisible}. */
48649b9ea3653da73fac0c33c8fb0af18baad12ac3Vikram Aggarwal    private static final String CONVERSATION_LIST_VISIBLE_KEY = "conversation-list-visible";
492bfb5c0fa1cfe7f25c121d6435dc1a04439f7bacVikram Aggarwal    /** Key used to store {@link #mConversationListNeverShown}. */
50649b9ea3653da73fac0c33c8fb0af18baad12ac3Vikram Aggarwal    private static final String CONVERSATION_LIST_NEVER_SHOWN_KEY = "conversation-list-never-shown";
512d50bcdca57756ecad20d21da0d936243215b79cPaul Westbrook
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;
56cd09f5e9bf55e6f4310e8dc9408132b9c88e87c3Vikram Aggarwal    /** Whether a conversation list for this account has ever been shown.*/
57cd09f5e9bf55e6f4310e8dc9408132b9c88e87c3Vikram Aggarwal    private boolean mConversationListNeverShown = true;
58713156d695326e3d5a1d0726ea1ec0d1d490bd30Rohan Shah
59a55b36cb6b75ce8096812183651e89115300975aVikram Aggarwal    public OnePaneController(MailActivity activity, ViewMode viewMode) {
60a55b36cb6b75ce8096812183651e89115300975aVikram Aggarwal        super(activity, viewMode);
61a55b36cb6b75ce8096812183651e89115300975aVikram Aggarwal    }
62a55b36cb6b75ce8096812183651e89115300975aVikram Aggarwal
631ddcf0f2bf44d3c9db89112ef52510d9b2433ac4Vikram Aggarwal    @Override
64632721e6b3a9ba8c476456f2e0fb1b564561e0b5Andy Huang    public void onRestoreInstanceState(Bundle inState) {
65632721e6b3a9ba8c476456f2e0fb1b564561e0b5Andy Huang        super.onRestoreInstanceState(inState);
66649b9ea3653da73fac0c33c8fb0af18baad12ac3Vikram Aggarwal        if (inState == null) {
67649b9ea3653da73fac0c33c8fb0af18baad12ac3Vikram Aggarwal            return;
683982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira        }
69649b9ea3653da73fac0c33c8fb0af18baad12ac3Vikram Aggarwal        mLastConversationListTransactionId =
70649b9ea3653da73fac0c33c8fb0af18baad12ac3Vikram Aggarwal                inState.getInt(CONVERSATION_LIST_TRANSACTION_KEY, INVALID_ID);
71649b9ea3653da73fac0c33c8fb0af18baad12ac3Vikram Aggarwal        mLastConversationTransactionId = inState.getInt(CONVERSATION_TRANSACTION_KEY, INVALID_ID);
72649b9ea3653da73fac0c33c8fb0af18baad12ac3Vikram Aggarwal        mConversationListVisible = inState.getBoolean(CONVERSATION_LIST_VISIBLE_KEY);
73649b9ea3653da73fac0c33c8fb0af18baad12ac3Vikram Aggarwal        mConversationListNeverShown = inState.getBoolean(CONVERSATION_LIST_NEVER_SHOWN_KEY);
743982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira    }
753982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira
763982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira    @Override
773982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira    public void onSaveInstanceState(Bundle outState) {
783982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira        super.onSaveInstanceState(outState);
793982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira        outState.putInt(CONVERSATION_LIST_TRANSACTION_KEY, mLastConversationListTransactionId);
803982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira        outState.putInt(CONVERSATION_TRANSACTION_KEY, mLastConversationTransactionId);
81649b9ea3653da73fac0c33c8fb0af18baad12ac3Vikram Aggarwal        outState.putBoolean(CONVERSATION_LIST_VISIBLE_KEY, mConversationListVisible);
82649b9ea3653da73fac0c33c8fb0af18baad12ac3Vikram Aggarwal        outState.putBoolean(CONVERSATION_LIST_NEVER_SHOWN_KEY, mConversationListNeverShown);
833982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira    }
843982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira
853982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira    @Override
86d7a12cd5b5c2639b653d8c671b04844ef02ee01dVikram Aggarwal    public void resetActionBarIcon() {
871dd054f4e5581b69a52936c9d257fa91cb6daee7Rohan Shah        // Calling resetActionBarIcon should never remove the up affordance
881dd054f4e5581b69a52936c9d257fa91cb6daee7Rohan Shah        // even when waiting for sync (Folder list should still show with one
891dd054f4e5581b69a52936c9d257fa91cb6daee7Rohan Shah        // account. Currently this method is blank to avoid any changes.
90d7a12cd5b5c2639b653d8c671b04844ef02ee01dVikram Aggarwal    }
91d7a12cd5b5c2639b653d8c671b04844ef02ee01dVikram Aggarwal
927dd054e39986de84a213c56a3c11ac94731402e6Vikram Aggarwal    /**
937c7043b2b546bb638ef1ca69c978ee8d3f41debbVikram Aggarwal     * Returns true if the candidate URI is the URI for the default inbox for the given account.
943e068bab6009a758309f07ddcea3d6171feac635Vikram Aggarwal     * @param candidate the URI to check
953e068bab6009a758309f07ddcea3d6171feac635Vikram Aggarwal     * @param account the account whose default Inbox the candidate might be
963e068bab6009a758309f07ddcea3d6171feac635Vikram Aggarwal     * @return true if the candidate is indeed the default inbox for the given account.
977c7043b2b546bb638ef1ca69c978ee8d3f41debbVikram Aggarwal     */
98259df5b9e11908c8ef7c91483924891dd96b3c27Scott Kennedy    private static boolean isDefaultInbox(FolderUri candidate, Account account) {
993e068bab6009a758309f07ddcea3d6171feac635Vikram Aggarwal        return (candidate != null && account != null)
1003e068bab6009a758309f07ddcea3d6171feac635Vikram Aggarwal                && candidate.equals(account.settings.defaultInbox);
1017c7043b2b546bb638ef1ca69c978ee8d3f41debbVikram Aggarwal    }
1027c7043b2b546bb638ef1ca69c978ee8d3f41debbVikram Aggarwal
1037c7043b2b546bb638ef1ca69c978ee8d3f41debbVikram Aggarwal    /**
1047dd054e39986de84a213c56a3c11ac94731402e6Vikram Aggarwal     * Returns true if the user is currently in the conversation list view, viewing the default
1057dd054e39986de84a213c56a3c11ac94731402e6Vikram Aggarwal     * inbox.
1063e068bab6009a758309f07ddcea3d6171feac635Vikram Aggarwal     * @return true if user is in conversation list mode, viewing the default inbox.
1077dd054e39986de84a213c56a3c11ac94731402e6Vikram Aggarwal     */
1082074a056bb2a634c66996225c55620d2aa6f7ac5Vikram Aggarwal    private static boolean inInbox(final Account account, final ConversationListContext context) {
1092074a056bb2a634c66996225c55620d2aa6f7ac5Vikram Aggarwal        // If we don't have valid state, then we are not in the inbox.
1103e068bab6009a758309f07ddcea3d6171feac635Vikram Aggarwal        return !(account == null || context == null || context.folder == null
1113e068bab6009a758309f07ddcea3d6171feac635Vikram Aggarwal                || account.settings == null) && !ConversationListContext.isSearchResult(context)
112259df5b9e11908c8ef7c91483924891dd96b3c27Scott Kennedy                && isDefaultInbox(context.folder.folderUri, account);
1133982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira    }
1143982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira
1158e65c6d2527c7539b689e0e8548c84f690badca5Rohan Shah    /**
1168e65c6d2527c7539b689e0e8548c84f690badca5Rohan Shah     * On account change, carry out super implementation, load FolderListFragment
1178e65c6d2527c7539b689e0e8548c84f690badca5Rohan Shah     * into drawer (to avoid repetitive calls to replaceFragment).
1188e65c6d2527c7539b689e0e8548c84f690badca5Rohan Shah     */
119d7a12cd5b5c2639b653d8c671b04844ef02ee01dVikram Aggarwal    @Override
1205fd8afd5c1b40580c069a5a97039ca0601208216Vikram Aggarwal    public void changeAccount(Account account) {
1215fd8afd5c1b40580c069a5a97039ca0601208216Vikram Aggarwal        super.changeAccount(account);
122cd09f5e9bf55e6f4310e8dc9408132b9c88e87c3Vikram Aggarwal        mConversationListNeverShown = true;
12323b528f182f14ef7ec1f1a4eb8d8ee9b8f04a2f2Vikram Aggarwal        closeDrawerIfOpen();
124cd09f5e9bf55e6f4310e8dc9408132b9c88e87c3Vikram Aggarwal    }
125cd09f5e9bf55e6f4310e8dc9408132b9c88e87c3Vikram Aggarwal
126cd09f5e9bf55e6f4310e8dc9408132b9c88e87c3Vikram Aggarwal    @Override
127d7a12cd5b5c2639b653d8c671b04844ef02ee01dVikram Aggarwal    public boolean onCreate(Bundle savedInstanceState) {
1281ddcf0f2bf44d3c9db89112ef52510d9b2433ac4Vikram Aggarwal        mActivity.setContentView(R.layout.one_pane_activity);
1298e65c6d2527c7539b689e0e8548c84f690badca5Rohan Shah        mDrawerContainer = (DrawerLayout) mActivity.findViewById(R.id.drawer_container);
13012b3ee458e04ac7e0b69302e671d10b24a5c98cfAndy Huang        mDrawerPullout = mDrawerContainer.findViewById(R.id.drawer_pullout);
1311aced4cbbb00618e6e1eb34438b5769ef5180e69Andy Huang        mDrawerPullout.setBackgroundResource(R.color.list_background_color);
13257246a4bf94e8b440c0597fa4a8e4f4e8a46532aPaul Westbrook
133d7a12cd5b5c2639b653d8c671b04844ef02ee01dVikram Aggarwal        // The parent class sets the correct viewmode and starts the application off.
134d7a12cd5b5c2639b653d8c671b04844ef02ee01dVikram Aggarwal        return super.onCreate(savedInstanceState);
1351ddcf0f2bf44d3c9db89112ef52510d9b2433ac4Vikram Aggarwal    }
1361ddcf0f2bf44d3c9db89112ef52510d9b2433ac4Vikram Aggarwal
13757246a4bf94e8b440c0597fa4a8e4f4e8a46532aPaul Westbrook    @Override
1381ddcf0f2bf44d3c9db89112ef52510d9b2433ac4Vikram Aggarwal    protected boolean isConversationListVisible() {
1392175d0a93263672d4498458c81b404b0999134baVikram Aggarwal        return mConversationListVisible;
1401ddcf0f2bf44d3c9db89112ef52510d9b2433ac4Vikram Aggarwal    }
141d7a12cd5b5c2639b653d8c671b04844ef02ee01dVikram Aggarwal
142d7a12cd5b5c2639b653d8c671b04844ef02ee01dVikram Aggarwal    @Override
143d7a12cd5b5c2639b653d8c671b04844ef02ee01dVikram Aggarwal    public void onViewModeChanged(int newMode) {
144d7a12cd5b5c2639b653d8c671b04844ef02ee01dVikram Aggarwal        super.onViewModeChanged(newMode);
145eb89afee9bcdacaf82dfd9033ae752fca5571ac3Rohan Shah
146632721e6b3a9ba8c476456f2e0fb1b564561e0b5Andy Huang        // When entering conversation list mode, hide and clean up any currently visible
147632721e6b3a9ba8c476456f2e0fb1b564561e0b5Andy Huang        // conversation.
14849e0e991fe8880852b936a0f8d7d57c5b36f2154Vikram Aggarwal        if (ViewMode.isListMode(newMode)) {
149a3ed834c959ece3453c1b34953fabecb3b19c424Andy Huang            mPagerController.hide(true /* changeVisibility */);
150632721e6b3a9ba8c476456f2e0fb1b564561e0b5Andy Huang        }
15149e0e991fe8880852b936a0f8d7d57c5b36f2154Vikram Aggarwal        // When we step away from the conversation mode, we don't have a current conversation
15249e0e991fe8880852b936a0f8d7d57c5b36f2154Vikram Aggarwal        // anymore. Let's blank it out so clients calling getCurrentConversation are not misled.
15349e0e991fe8880852b936a0f8d7d57c5b36f2154Vikram Aggarwal        if (!ViewMode.isConversationMode(newMode)) {
15449e0e991fe8880852b936a0f8d7d57c5b36f2154Vikram Aggarwal            setCurrentConversation(null);
15549e0e991fe8880852b936a0f8d7d57c5b36f2154Vikram Aggarwal        }
156d7a12cd5b5c2639b653d8c671b04844ef02ee01dVikram Aggarwal    }
157d7a12cd5b5c2639b653d8c671b04844ef02ee01dVikram Aggarwal
158d7a12cd5b5c2639b653d8c671b04844ef02ee01dVikram Aggarwal    @Override
1596214ee405453b79f08859025fee5ed361d5499feAndy Huang    public String toString() {
1606214ee405453b79f08859025fee5ed361d5499feAndy Huang        final StringBuilder sb = new StringBuilder(super.toString());
1616214ee405453b79f08859025fee5ed361d5499feAndy Huang        sb.append(" lastConvListTransId=");
1626214ee405453b79f08859025fee5ed361d5499feAndy Huang        sb.append(mLastConversationListTransactionId);
1636214ee405453b79f08859025fee5ed361d5499feAndy Huang        sb.append("}");
1646214ee405453b79f08859025fee5ed361d5499feAndy Huang        return sb.toString();
1656214ee405453b79f08859025fee5ed361d5499feAndy Huang    }
1666214ee405453b79f08859025fee5ed361d5499feAndy Huang
1676214ee405453b79f08859025fee5ed361d5499feAndy Huang    @Override
1689b87568c9e9f1c32a9672b315229866a58a1e757Mindy Pereira    public void showConversationList(ConversationListContext listContext) {
169e128fc21fab03f6d66c656efeee2155fab449a7fVikram Aggarwal        super.showConversationList(listContext);
170e128fc21fab03f6d66c656efeee2155fab449a7fVikram Aggarwal        enableCabMode();
17112b3ee458e04ac7e0b69302e671d10b24a5c98cfAndy Huang        mConversationListVisible = true;
172ae4ea997d3d3f3c8c11fc5a3e7f9d49f82b4e2e7Vikram Aggarwal        if (ConversationListContext.isSearchResult(listContext)) {
17368f2e222b4ffccd9f67f02b3a9cfdb3841a7eb43Mindy Pereira            mViewMode.enterSearchResultsListMode();
17468f2e222b4ffccd9f67f02b3a9cfdb3841a7eb43Mindy Pereira        } else {
17568f2e222b4ffccd9f67f02b3a9cfdb3841a7eb43Mindy Pereira            mViewMode.enterConversationListMode();
17668f2e222b4ffccd9f67f02b3a9cfdb3841a7eb43Mindy Pereira        }
177cd09f5e9bf55e6f4310e8dc9408132b9c88e87c3Vikram Aggarwal        final int transition = mConversationListNeverShown
178cd09f5e9bf55e6f4310e8dc9408132b9c88e87c3Vikram Aggarwal                ? FragmentTransaction.TRANSIT_FRAGMENT_FADE
1799b87568c9e9f1c32a9672b315229866a58a1e757Mindy Pereira                : FragmentTransaction.TRANSIT_FRAGMENT_OPEN;
18037a20ca39be842b4b4cb54d5b5ed418d49d950cfVikram Aggarwal        final Fragment conversationListFragment =
18137a20ca39be842b4b4cb54d5b5ed418d49d950cfVikram Aggarwal                ConversationListFragment.newInstance(listContext);
182bf232c3735f65b1a4746943e4a134e59e36f0bdePaul Westbrook
1836214ee405453b79f08859025fee5ed361d5499feAndy Huang        if (!inInbox(mAccount, listContext)) {
1843982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira            // Maintain fragment transaction history so we can get back to the
1853982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira            // fragment used to launch this list.
186ebeef1babe39de2c1d97429a93ea956c655cd377Alice Yang            mLastConversationListTransactionId = replaceFragment(conversationListFragment,
1878e65c6d2527c7539b689e0e8548c84f690badca5Rohan Shah                    transition, TAG_CONVERSATION_LIST, R.id.content_pane);
1883982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira        } else {
1893982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira            // If going to the inbox, clear the folder list transaction history.
1903982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira            mInbox = listContext.folder;
191ebeef1babe39de2c1d97429a93ea956c655cd377Alice Yang            replaceFragment(conversationListFragment, transition, TAG_CONVERSATION_LIST,
192ebeef1babe39de2c1d97429a93ea956c655cd377Alice Yang                    R.id.content_pane);
1936214ee405453b79f08859025fee5ed361d5499feAndy Huang
1940e3fd9d61bc18ad9f828bb3c4dd24fc851f11df5Paul Westbrook            // If we ever to to the inbox, we want to unset the transation id for any other
1950e3fd9d61bc18ad9f828bb3c4dd24fc851f11df5Paul Westbrook            // non-inbox folder.
1960e3fd9d61bc18ad9f828bb3c4dd24fc851f11df5Paul Westbrook            mLastConversationListTransactionId = INVALID_ID;
1973982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira        }
19808b0a0dc9e77697c58f39ae9c49b3b884af29c71Andy Huang
19908b0a0dc9e77697c58f39ae9c49b3b884af29c71Andy Huang        mActivity.getFragmentManager().executePendingTransactions();
20008b0a0dc9e77697c58f39ae9c49b3b884af29c71Andy Huang
2017dd054e39986de84a213c56a3c11ac94731402e6Vikram Aggarwal        onConversationVisibilityChanged(false);
2029f119c72042e4d0382017d5ddcee9aa2113b6425Paul Westbrook        onConversationListVisibilityChanged(true);
203cd09f5e9bf55e6f4310e8dc9408132b9c88e87c3Vikram Aggarwal        mConversationListNeverShown = false;
20428d5f72e0ad0db75b6243ee8125bfe3aadbdcb85Mindy Pereira    }
20528d5f72e0ad0db75b6243ee8125bfe3aadbdcb85Mindy Pereira
20628d5f72e0ad0db75b6243ee8125bfe3aadbdcb85Mindy Pereira    @Override
2071ee96b2b100546b5b69ad42c5bc3755a4293d1a3Andy Huang    protected void showConversation(Conversation conversation, boolean inLoaderCallbacks) {
2081ee96b2b100546b5b69ad42c5bc3755a4293d1a3Andy Huang        super.showConversation(conversation, inLoaderCallbacks);
20912b3ee458e04ac7e0b69302e671d10b24a5c98cfAndy Huang        mConversationListVisible = false;
2103d7ca9d2aefd20dc115f20532c1e19fdb60f7d68Vikram Aggarwal        if (conversation == null) {
211ebeef1babe39de2c1d97429a93ea956c655cd377Alice Yang            transitionBackToConversationListMode();
2123d7ca9d2aefd20dc115f20532c1e19fdb60f7d68Vikram Aggarwal            return;
2133d7ca9d2aefd20dc115f20532c1e19fdb60f7d68Vikram Aggarwal        }
214e128fc21fab03f6d66c656efeee2155fab449a7fVikram Aggarwal        disableCabMode();
215ae4ea997d3d3f3c8c11fc5a3e7f9d49f82b4e2e7Vikram Aggarwal        if (ConversationListContext.isSearchResult(mConvListContext)) {
21668f2e222b4ffccd9f67f02b3a9cfdb3841a7eb43Mindy Pereira            mViewMode.enterSearchResultsConversationMode();
21768f2e222b4ffccd9f67f02b3a9cfdb3841a7eb43Mindy Pereira        } else {
21868f2e222b4ffccd9f67f02b3a9cfdb3841a7eb43Mindy Pereira            mViewMode.enterConversationMode();
21968f2e222b4ffccd9f67f02b3a9cfdb3841a7eb43Mindy Pereira        }
2207dd054e39986de84a213c56a3c11ac94731402e6Vikram Aggarwal        final FragmentManager fm = mActivity.getFragmentManager();
221f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp        final FragmentTransaction ft = fm.beginTransaction();
222f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp        // Switching to conversation view is an incongruous transition:
223f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp        // we are not replacing a fragment with another fragment as
224f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp        // usual. Instead, reveal the heretofore inert conversation
225f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp        // ViewPager and just remove the previously visible fragment
226f4fce1227d8b49f45e6569f1590565f2df9e8d6emindyp        // e.g. conversation list, or possibly label list?).
2277dd054e39986de84a213c56a3c11ac94731402e6Vikram Aggarwal        final Fragment f = fm.findFragmentById(R.id.content_pane);
228deab11995a1ebb83b24bf567508440088ec943bfPaul Westbrook        // FragmentManager#findFragmentById can return fragments that are not added to the activity.
229deab11995a1ebb83b24bf567508440088ec943bfPaul Westbrook        // We want to make sure that we don't attempt to remove fragments that are not added to the
230deab11995a1ebb83b24bf567508440088ec943bfPaul Westbrook        // activity, as when the transaction is popped off, the FragmentManager will attempt to
231deab11995a1ebb83b24bf567508440088ec943bfPaul Westbrook        // readd the same fragment twice
232deab11995a1ebb83b24bf567508440088ec943bfPaul Westbrook        if (f != null && f.isAdded()) {
2332b703c6c71a369485efc8ade26d449d25669ceecVikram Aggarwal            ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
2342b703c6c71a369485efc8ade26d449d25669ceecVikram Aggarwal            ft.remove(f);
2352b703c6c71a369485efc8ade26d449d25669ceecVikram Aggarwal            ft.commitAllowingStateLoss();
2366214ee405453b79f08859025fee5ed361d5499feAndy Huang            fm.executePendingTransactions();
237632721e6b3a9ba8c476456f2e0fb1b564561e0b5Andy Huang        }
238a3ed834c959ece3453c1b34953fabecb3b19c424Andy Huang        mPagerController.show(mAccount, mFolder, conversation, true /* changeVisibility */);
2397dd054e39986de84a213c56a3c11ac94731402e6Vikram Aggarwal        onConversationVisibilityChanged(true);
2409f119c72042e4d0382017d5ddcee9aa2113b6425Paul Westbrook        onConversationListVisibilityChanged(false);
2419b87568c9e9f1c32a9672b315229866a58a1e757Mindy Pereira    }
2429b87568c9e9f1c32a9672b315229866a58a1e757Mindy Pereira
2439b87568c9e9f1c32a9672b315229866a58a1e757Mindy Pereira    @Override
2442d50bcdca57756ecad20d21da0d936243215b79cPaul Westbrook    public void showWaitForInitialization() {
2452d50bcdca57756ecad20d21da0d936243215b79cPaul Westbrook        super.showWaitForInitialization();
2468e65c6d2527c7539b689e0e8548c84f690badca5Rohan Shah        replaceFragment(getWaitFragment(), FragmentTransaction.TRANSIT_FRAGMENT_OPEN, TAG_WAIT,
2478e65c6d2527c7539b689e0e8548c84f690badca5Rohan Shah                R.id.content_pane);
2482d50bcdca57756ecad20d21da0d936243215b79cPaul Westbrook    }
2492d50bcdca57756ecad20d21da0d936243215b79cPaul Westbrook
250a3f43d4c2423ab03bdae925042fe8440b7f70025Vikram Aggarwal    @Override
251dd6a7ce32c4003bd0941e2f18fcf5b80b5cd43c5Vikram Aggarwal    protected void hideWaitForInitialization() {
2522d50bcdca57756ecad20d21da0d936243215b79cPaul Westbrook        transitionToInbox();
253a3f43d4c2423ab03bdae925042fe8440b7f70025Vikram Aggarwal        super.hideWaitForInitialization();
2542d50bcdca57756ecad20d21da0d936243215b79cPaul Westbrook    }
2552d50bcdca57756ecad20d21da0d936243215b79cPaul Westbrook
2562d50bcdca57756ecad20d21da0d936243215b79cPaul Westbrook    @Override
2572b9d80eb16156173f11a02eae4f770d8c975927cScott Kennedy    public boolean doesActionChangeConversationListVisibility(final int action) {
2582b9d80eb16156173f11a02eae4f770d8c975927cScott Kennedy        if (action == R.id.archive
2592b9d80eb16156173f11a02eae4f770d8c975927cScott Kennedy                || action == R.id.remove_folder
2602b9d80eb16156173f11a02eae4f770d8c975927cScott Kennedy                || action == R.id.delete
2612b9d80eb16156173f11a02eae4f770d8c975927cScott Kennedy                || action == R.id.discard_drafts
2622b9d80eb16156173f11a02eae4f770d8c975927cScott Kennedy                || action == R.id.mark_important
2632b9d80eb16156173f11a02eae4f770d8c975927cScott Kennedy                || action == R.id.mark_not_important
2642b9d80eb16156173f11a02eae4f770d8c975927cScott Kennedy                || action == R.id.mute
2652b9d80eb16156173f11a02eae4f770d8c975927cScott Kennedy                || action == R.id.report_spam
2662b9d80eb16156173f11a02eae4f770d8c975927cScott Kennedy                || action == R.id.mark_not_spam
2672b9d80eb16156173f11a02eae4f770d8c975927cScott Kennedy                || action == R.id.report_phishing
2682b9d80eb16156173f11a02eae4f770d8c975927cScott Kennedy                || action == R.id.refresh
2696c570db71b8adc43d7dc2f31e6fa63cf50c1426eAndrew Sapperstein                || action == R.id.change_folders) {
2702b9d80eb16156173f11a02eae4f770d8c975927cScott Kennedy            return false;
2712b9d80eb16156173f11a02eae4f770d8c975927cScott Kennedy        } else {
2722b9d80eb16156173f11a02eae4f770d8c975927cScott Kennedy            return true;
27317a8e78d61bff414610e23f24889bab29955f54emindyp        }
27417a8e78d61bff414610e23f24889bab29955f54emindyp    }
27517a8e78d61bff414610e23f24889bab29955f54emindyp
2768e65c6d2527c7539b689e0e8548c84f690badca5Rohan Shah    /**
2776902dcf8688d7d0691639f49365a78a3a78fe9e3Vikram Aggarwal     * Replace the content_pane with the fragment specified here. The tag is specified so that
2786902dcf8688d7d0691639f49365a78a3a78fe9e3Vikram Aggarwal     * the {@link ActivityController} can look up the fragments through the
279ebeef1babe39de2c1d97429a93ea956c655cd377Alice Yang     * {@link android.app.FragmentManager}.
2803e068bab6009a758309f07ddcea3d6171feac635Vikram Aggarwal     * @param fragment the new fragment to put
2813e068bab6009a758309f07ddcea3d6171feac635Vikram Aggarwal     * @param transition the transition to show
2823e068bab6009a758309f07ddcea3d6171feac635Vikram Aggarwal     * @param tag a tag for the fragment manager.
2838e65c6d2527c7539b689e0e8548c84f690badca5Rohan Shah     * @param anchor ID of view to replace fragment in
2846902dcf8688d7d0691639f49365a78a3a78fe9e3Vikram Aggarwal     * @return transaction ID returned when the transition is committed.
2856902dcf8688d7d0691639f49365a78a3a78fe9e3Vikram Aggarwal     */
286ebeef1babe39de2c1d97429a93ea956c655cd377Alice Yang    private int replaceFragment(Fragment fragment, int transition, String tag, int anchor) {
2876214ee405453b79f08859025fee5ed361d5499feAndy Huang        final FragmentManager fm = mActivity.getFragmentManager();
2886214ee405453b79f08859025fee5ed361d5499feAndy Huang        FragmentTransaction fragmentTransaction = fm.beginTransaction();
289d7a12cd5b5c2639b653d8c671b04844ef02ee01dVikram Aggarwal        fragmentTransaction.setTransition(transition);
2908e65c6d2527c7539b689e0e8548c84f690badca5Rohan Shah        fragmentTransaction.replace(anchor, fragment, tag);
2916214ee405453b79f08859025fee5ed361d5499feAndy Huang        final int id = fragmentTransaction.commitAllowingStateLoss();
2926214ee405453b79f08859025fee5ed361d5499feAndy Huang        fm.executePendingTransactions();
2936214ee405453b79f08859025fee5ed361d5499feAndy Huang        return id;
294d7a12cd5b5c2639b653d8c671b04844ef02ee01dVikram Aggarwal    }
29501668eb393deaf8c8b8abf86be46109614a98631Mindy Pereira
2963982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira    /**
2973982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira     * Back works as follows:
2988e65c6d2527c7539b689e0e8548c84f690badca5Rohan Shah     * 1) If the drawer is pulled out (Or mid-drag), close it - handled.
2998e65c6d2527c7539b689e0e8548c84f690badca5Rohan Shah     * 2) If the user is in the folder list view, go back
3003982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira     * to the account default inbox.
3018e65c6d2527c7539b689e0e8548c84f690badca5Rohan Shah     * 3) If the user is in a conversation list
3023982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira     * that is not the inbox AND:
3033982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira     *  a) they got there by going through the folder
3043982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira     *  list view, go back to the folder list view.
3053982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira     *  b) they got there by using some other means (account dropdown), go back to the inbox.
3068e65c6d2527c7539b689e0e8548c84f690badca5Rohan Shah     * 4) If the user is in a conversation, go back to the conversation list they were last in.
3078e65c6d2527c7539b689e0e8548c84f690badca5Rohan Shah     * 5) If the user is in the conversation list for the default account inbox,
3083982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira     * back exits the app.
3093982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira     */
31001668eb393deaf8c8b8abf86be46109614a98631Mindy Pereira    @Override
311c1fb9a9c2730178105977fca629e80951bfc3cdcAndy Huang    public boolean handleBackPress() {
3122074a056bb2a634c66996225c55620d2aa6f7ac5Vikram Aggarwal        final int mode = mViewMode.getMode();
3138e65c6d2527c7539b689e0e8548c84f690badca5Rohan Shah
314aded57845c51f128fc5dbd8e992697823775ce5aScott Kennedy        if (mode == ViewMode.SEARCH_RESULTS_LIST) {
31568f2e222b4ffccd9f67f02b3a9cfdb3841a7eb43Mindy Pereira            mActivity.finish();
316b466bcf49502a1178cf7362a81470f3231d8892bMindy Pereira        } else if (mViewMode.isListMode() && !inInbox(mAccount, mConvListContext)) {
317ebeef1babe39de2c1d97429a93ea956c655cd377Alice Yang            navigateUpFolderHierarchy();
3186c570db71b8adc43d7dc2f31e6fa63cf50c1426eAndrew Sapperstein        } else if (mViewMode.isConversationMode() || mViewMode.isAdMode()) {
319ebeef1babe39de2c1d97429a93ea956c655cd377Alice Yang            transitionBackToConversationListMode();
3203982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira        } else {
3213982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira            mActivity.finish();
3223982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira        }
323f8ccdcfc26f362d9c20771e2295a0c0e8d1195f3Andrew Sapperstein        mToastBar.hide(false, false /* actionClicked */);
3243982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira        return true;
3253982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira    }
3263982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira
327649b9ea3653da73fac0c33c8fb0af18baad12ac3Vikram Aggarwal    /**
328649b9ea3653da73fac0c33c8fb0af18baad12ac3Vikram Aggarwal     * Switch to the Inbox by creating a new conversation list context that loads the inbox.
329649b9ea3653da73fac0c33c8fb0af18baad12ac3Vikram Aggarwal     */
3303982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira    private void transitionToInbox() {
3317c7043b2b546bb638ef1ca69c978ee8d3f41debbVikram Aggarwal        // The inbox could have changed, in which case we should load it again.
332259df5b9e11908c8ef7c91483924891dd96b3c27Scott Kennedy        if (mInbox == null || !isDefaultInbox(mInbox.folderUri, mAccount)) {
333ab4863650794e81f35a0fd9abc16a5564d7b102bMindy Pereira            loadAccountInbox();
3343982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira        } else {
335ebeef1babe39de2c1d97429a93ea956c655cd377Alice Yang            onFolderChanged(mInbox, false /* force */);
33601668eb393deaf8c8b8abf86be46109614a98631Mindy Pereira        }
33701668eb393deaf8c8b8abf86be46109614a98631Mindy Pereira    }
338f5acda4a4b7c9e8ecacb41cb7d570ef426b6d4fcMindy Pereira
339118b3f6443f1859ff4866c97c0e8896f3415f730Mindy Pereira    @Override
340505df5f59c92adbe8eaa734321c1d3f91be84a4aMindy Pereira    public void onFolderSelected(Folder folder) {
341fcde31a9e40ba2ffac0b877005c5a13e76640a05Vikram Aggarwal        setHierarchyFolder(folder);
342fcde31a9e40ba2ffac0b877005c5a13e76640a05Vikram Aggarwal        super.onFolderSelected(folder);
343118b3f6443f1859ff4866c97c0e8896f3415f730Mindy Pereira    }
344118b3f6443f1859ff4866c97c0e8896f3415f730Mindy Pereira
3453982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira    /**
3463982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira     * Up works as follows:
3473982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira     * 1) If the user is in a conversation list that is not the default account inbox,
3483982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira     * a conversation, or the folder list, up follows the rules of back.
3493982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira     * 2) If the user is in search results, up exits search
3503982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira     * mode and returns the user to whatever view they were in when they began search.
3513982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira     * 3) If the user is in the inbox, there is no up.
3523982e236fb2dd36d460df4dbf24e07e8ba55b3bdMindy Pereira     */
353f5acda4a4b7c9e8ecacb41cb7d570ef426b6d4fcMindy Pereira    @Override
354c1fb9a9c2730178105977fca629e80951bfc3cdcAndy Huang    public boolean handleUpPress() {
3559da85df06175d25c52a09e08df3b02d1fd9cc6b7Vikram Aggarwal        final int mode = mViewMode.getMode();
35668f2e222b4ffccd9f67f02b3a9cfdb3841a7eb43Mindy Pereira        if (mode == ViewMode.SEARCH_RESULTS_LIST) {
35768f2e222b4ffccd9f67f02b3a9cfdb3841a7eb43Mindy Pereira            mActivity.finish();
3587f65718157f9336e6590401a4b3ab6bfce2d9659Vikram Aggarwal            // Not needed, the activity is going away anyway.
359d9eaca8676ad4c6c58122fd41be799872bfd9cdaTony Mantler        } else if (mode == ViewMode.CONVERSATION_LIST
3601dd054f4e5581b69a52936c9d257fa91cb6daee7Rohan Shah                || mode == ViewMode.WAITING_FOR_ACCOUNT_INITIALIZATION) {
3610eaef6fb257f220687434cda763354ec5f8cb5bcScott Kennedy            final boolean isTopLevel = (mFolder == null) || (mFolder.parent == Uri.EMPTY);
3620eaef6fb257f220687434cda763354ec5f8cb5bcScott Kennedy
3630eaef6fb257f220687434cda763354ec5f8cb5bcScott Kennedy            if (isTopLevel) {
3640eaef6fb257f220687434cda763354ec5f8cb5bcScott Kennedy                // Show the drawer.
365d9eaca8676ad4c6c58122fd41be799872bfd9cdaTony Mantler                toggleDrawerState();
3660eaef6fb257f220687434cda763354ec5f8cb5bcScott Kennedy            } else {
367ebeef1babe39de2c1d97429a93ea956c655cd377Alice Yang                navigateUpFolderHierarchy();
3680eaef6fb257f220687434cda763354ec5f8cb5bcScott Kennedy            }
3696c570db71b8adc43d7dc2f31e6fa63cf50c1426eAndrew Sapperstein        } else if (mode == ViewMode.CONVERSATION || mode == ViewMode.SEARCH_RESULTS_CONVERSATION
3706c570db71b8adc43d7dc2f31e6fa63cf50c1426eAndrew Sapperstein                || mode == ViewMode.AD) {
371f5acda4a4b7c9e8ecacb41cb7d570ef426b6d4fcMindy Pereira            // Same as go back.
372c1fb9a9c2730178105977fca629e80951bfc3cdcAndy Huang            handleBackPress();
373f5acda4a4b7c9e8ecacb41cb7d570ef426b6d4fcMindy Pereira        }
374f5acda4a4b7c9e8ecacb41cb7d570ef426b6d4fcMindy Pereira        return true;
375f5acda4a4b7c9e8ecacb41cb7d570ef426b6d4fcMindy Pereira    }
376f5acda4a4b7c9e8ecacb41cb7d570ef426b6d4fcMindy Pereira
377ebeef1babe39de2c1d97429a93ea956c655cd377Alice Yang    private void transitionBackToConversationListMode() {
3789da85df06175d25c52a09e08df3b02d1fd9cc6b7Vikram Aggarwal        final int mode = mViewMode.getMode();
37990d89e2194cecb6ff0179c8159870575edf7365eVikram Aggarwal        enableCabMode();
38012b3ee458e04ac7e0b69302e671d10b24a5c98cfAndy Huang        mConversationListVisible = true;
38168f2e222b4ffccd9f67f02b3a9cfdb3841a7eb43Mindy Pereira        if (mode == ViewMode.SEARCH_RESULTS_CONVERSATION) {
38268f2e222b4ffccd9f67f02b3a9cfdb3841a7eb43Mindy Pereira            mViewMode.enterSearchResultsListMode();
38368f2e222b4ffccd9f67f02b3a9cfdb3841a7eb43Mindy Pereira        } else {
38468f2e222b4ffccd9f67f02b3a9cfdb3841a7eb43Mindy Pereira            mViewMode.enterConversationListMode();
38568f2e222b4ffccd9f67f02b3a9cfdb3841a7eb43Mindy Pereira        }
386ebeef1babe39de2c1d97429a93ea956c655cd377Alice Yang
387ebeef1babe39de2c1d97429a93ea956c655cd377Alice Yang        final Folder folder = mFolder != null ? mFolder : mInbox;
388ebeef1babe39de2c1d97429a93ea956c655cd377Alice Yang        onFolderChanged(folder, true /* force */);
389ebeef1babe39de2c1d97429a93ea956c655cd377Alice Yang
3907dd054e39986de84a213c56a3c11ac94731402e6Vikram Aggarwal        onConversationVisibilityChanged(false);
3919f119c72042e4d0382017d5ddcee9aa2113b6425Paul Westbrook        onConversationListVisibilityChanged(true);
392f5acda4a4b7c9e8ecacb41cb7d570ef426b6d4fcMindy Pereira    }
393b849dfbda3c917f078a5c09f03906886c27ecbecMindy Pereira
394b849dfbda3c917f078a5c09f03906886c27ecbecMindy Pereira    @Override
395b849dfbda3c917f078a5c09f03906886c27ecbecMindy Pereira    public boolean shouldShowFirstConversation() {
396b849dfbda3c917f078a5c09f03906886c27ecbecMindy Pereira        return false;
397b849dfbda3c917f078a5c09f03906886c27ecbecMindy Pereira    }
398fbe4019a262f6b1934a44e598009ae63dc5745eeMindy Pereira
399fbe4019a262f6b1934a44e598009ae63dc5745eeMindy Pereira    @Override
400d3367499e56116854ed637b1036fd71057ac0f49Mindy Pereira    public void onUndoAvailable(ToastBarOperation op) {
4010963ef8394e1f0bca3f931f930b127b00790361aMindy Pereira        if (op != null && mAccount.supportsCapability(UIProvider.AccountCapabilities.UNDO)) {
4027f602f7a64f176894ccb7942a6642f22584c3894Vikram Aggarwal            final int mode = mViewMode.getMode();
403dbab8fab0c98dc2d56bbe17c7436719129952b7bMindy Pereira            final ConversationListFragment convList = getConversationListFragment();
4040963ef8394e1f0bca3f931f930b127b00790361aMindy Pereira            switch (mode) {
405b466bcf49502a1178cf7362a81470f3231d8892bMindy Pereira                case ViewMode.SEARCH_RESULTS_CONVERSATION:
4060963ef8394e1f0bca3f931f930b127b00790361aMindy Pereira                case ViewMode.CONVERSATION:
407f8ccdcfc26f362d9c20771e2295a0c0e8d1195f3Andrew Sapperstein                    mToastBar.show(getUndoClickedListener(
408f8ccdcfc26f362d9c20771e2295a0c0e8d1195f3Andrew Sapperstein                            convList != null ? convList.getAnimatedAdapter() : null),
409c2c9dc14aa184db1f05b8c060b27d97dda5a3ca4Andrew Sapperstein                            0,
410c59dd8270215f97d39697dae9e69976bcfe3642bmindyp                            Utils.convertHtmlToPlainText
4116a3d5ce0b18f58fcfa1af0315dc8ddc7331c2c5fScott Kennedy                                (op.getDescription(mActivity.getActivityContext())),
412c2c9dc14aa184db1f05b8c060b27d97dda5a3ca4Andrew Sapperstein                            true, /* showActionIcon */
413c2c9dc14aa184db1f05b8c060b27d97dda5a3ca4Andrew Sapperstein                            R.string.undo,
414d3367499e56116854ed637b1036fd71057ac0f49Mindy Pereira                            true,  /* replaceVisibleToast */
415d3367499e56116854ed637b1036fd71057ac0f49Mindy Pereira                            op);
4160963ef8394e1f0bca3f931f930b127b00790361aMindy Pereira                    break;
417b466bcf49502a1178cf7362a81470f3231d8892bMindy Pereira                case ViewMode.SEARCH_RESULTS_LIST:
4180963ef8394e1f0bca3f931f930b127b00790361aMindy Pereira                case ViewMode.CONVERSATION_LIST:
4196902dcf8688d7d0691639f49365a78a3a78fe9e3Vikram Aggarwal                    if (convList != null) {
420c2c9dc14aa184db1f05b8c060b27d97dda5a3ca4Andrew Sapperstein                        mToastBar.show(
421c2c9dc14aa184db1f05b8c060b27d97dda5a3ca4Andrew Sapperstein                                getUndoClickedListener(convList.getAnimatedAdapter()),
422c2c9dc14aa184db1f05b8c060b27d97dda5a3ca4Andrew Sapperstein                                0,
423c59dd8270215f97d39697dae9e69976bcfe3642bmindyp                                Utils.convertHtmlToPlainText
4246a3d5ce0b18f58fcfa1af0315dc8ddc7331c2c5fScott Kennedy                                    (op.getDescription(mActivity.getActivityContext())),
425c2c9dc14aa184db1f05b8c060b27d97dda5a3ca4Andrew Sapperstein                                true, /* showActionIcon */
426c2c9dc14aa184db1f05b8c060b27d97dda5a3ca4Andrew Sapperstein                                R.string.undo,
427d3367499e56116854ed637b1036fd71057ac0f49Mindy Pereira                                true,  /* replaceVisibleToast */
428d3367499e56116854ed637b1036fd71057ac0f49Mindy Pereira                                op);
4294765c5c90802d0abcf2b05c4967e7dd7d2284f9aMindy Pereira                    } else {
4304765c5c90802d0abcf2b05c4967e7dd7d2284f9aMindy Pereira                        mActivity.setPendingToastOperation(op);
4316902dcf8688d7d0691639f49365a78a3a78fe9e3Vikram Aggarwal                    }
4320963ef8394e1f0bca3f931f930b127b00790361aMindy Pereira                    break;
4330963ef8394e1f0bca3f931f930b127b00790361aMindy Pereira            }
4340963ef8394e1f0bca3f931f930b127b00790361aMindy Pereira        }
4350963ef8394e1f0bca3f931f930b127b00790361aMindy Pereira    }
436c2c9dc14aa184db1f05b8c060b27d97dda5a3ca4Andrew Sapperstein
437c2c9dc14aa184db1f05b8c060b27d97dda5a3ca4Andrew Sapperstein    @Override
438d243d459b64003c5171ac5ff606729e525161be6Mark Wei    protected void hideOrRepositionToastBar(boolean animated) {
439f8ccdcfc26f362d9c20771e2295a0c0e8d1195f3Andrew Sapperstein        mToastBar.hide(animated, false /* actionClicked */);
440d243d459b64003c5171ac5ff606729e525161be6Mark Wei    }
441d243d459b64003c5171ac5ff606729e525161be6Mark Wei
442d243d459b64003c5171ac5ff606729e525161be6Mark Wei    @Override
4439d7519d18e8ddbcdd59b37eec7c85210fca0e8c2Andrew Sapperstein    public void onError(final Folder folder, boolean replaceVisibleToast) {
444c2c9dc14aa184db1f05b8c060b27d97dda5a3ca4Andrew Sapperstein        final int mode = mViewMode.getMode();
445c2c9dc14aa184db1f05b8c060b27d97dda5a3ca4Andrew Sapperstein        switch (mode) {
446c2c9dc14aa184db1f05b8c060b27d97dda5a3ca4Andrew Sapperstein            case ViewMode.SEARCH_RESULTS_LIST:
447c2c9dc14aa184db1f05b8c060b27d97dda5a3ca4Andrew Sapperstein            case ViewMode.CONVERSATION_LIST:
4489d7519d18e8ddbcdd59b37eec7c85210fca0e8c2Andrew Sapperstein                showErrorToast(folder, replaceVisibleToast);
449c2c9dc14aa184db1f05b8c060b27d97dda5a3ca4Andrew Sapperstein                break;
450c2c9dc14aa184db1f05b8c060b27d97dda5a3ca4Andrew Sapperstein            default:
451c2c9dc14aa184db1f05b8c060b27d97dda5a3ca4Andrew Sapperstein                break;
452c2c9dc14aa184db1f05b8c060b27d97dda5a3ca4Andrew Sapperstein        }
453c2c9dc14aa184db1f05b8c060b27d97dda5a3ca4Andrew Sapperstein    }
45430745b6e9c4d280ac578d1186fbc0cec9bd2a838Paul Westbrook
4558c887ef97607ad5c2c94d1d3b902afe6d5ef95a0Paul Westbrook    @Override
4568c887ef97607ad5c2c94d1d3b902afe6d5ef95a0Paul Westbrook    public boolean isDrawerEnabled() {
4578c887ef97607ad5c2c94d1d3b902afe6d5ef95a0Paul Westbrook        // The drawer is enabled for one pane mode
4588c887ef97607ad5c2c94d1d3b902afe6d5ef95a0Paul Westbrook        return true;
4598c887ef97607ad5c2c94d1d3b902afe6d5ef95a0Paul Westbrook    }
460feb5b1ef0c9489c1ea727177f8bd423250b64990Scott Kennedy
461feb5b1ef0c9489c1ea727177f8bd423250b64990Scott Kennedy    @Override
462feb5b1ef0c9489c1ea727177f8bd423250b64990Scott Kennedy    public int getFolderListViewChoiceMode() {
463feb5b1ef0c9489c1ea727177f8bd423250b64990Scott Kennedy        // By default, we do not want to allow any item to be selected in the folder list
464feb5b1ef0c9489c1ea727177f8bd423250b64990Scott Kennedy        return ListView.CHOICE_MODE_NONE;
465feb5b1ef0c9489c1ea727177f8bd423250b64990Scott Kennedy    }
466103319aaed26bce257de55b2fe93d4f78d3c59b9Scott Kennedy
467103319aaed26bce257de55b2fe93d4f78d3c59b9Scott Kennedy    @Override
468e0d01fb7379225a0f058999d9da9050f2fcc6945Scott Kennedy    public void launchFragment(final Fragment fragment, final int selectPosition) {
469ebeef1babe39de2c1d97429a93ea956c655cd377Alice Yang        replaceFragment(fragment, FragmentTransaction.TRANSIT_FRAGMENT_OPEN,
470103319aaed26bce257de55b2fe93d4f78d3c59b9Scott Kennedy                TAG_CUSTOM_FRAGMENT, R.id.content_pane);
471103319aaed26bce257de55b2fe93d4f78d3c59b9Scott Kennedy    }
472a55b36cb6b75ce8096812183651e89115300975aVikram Aggarwal}
473