ViewMode.java revision c5796fd595ffe3ea74fb69dfad1ea0bfe82f1eb4
15e5ac748eadbb17eee84b39a424b8b9270ade46cVikram Aggarwal/*
25e5ac748eadbb17eee84b39a424b8b9270ade46cVikram Aggarwal * Copyright (C) 2012 Google Inc.
35e5ac748eadbb17eee84b39a424b8b9270ade46cVikram Aggarwal * Licensed to The Android Open Source Project.
46f92de64bbdf1ea6c4cd9774fc96921a10c266d7Mindy Pereira *
56f92de64bbdf1ea6c4cd9774fc96921a10c266d7Mindy Pereira * Licensed under the Apache License, Version 2.0 (the "License");
66f92de64bbdf1ea6c4cd9774fc96921a10c266d7Mindy Pereira * you may not use this file except in compliance with the License.
76f92de64bbdf1ea6c4cd9774fc96921a10c266d7Mindy Pereira * You may obtain a copy of the License at
86f92de64bbdf1ea6c4cd9774fc96921a10c266d7Mindy Pereira *
95e5ac748eadbb17eee84b39a424b8b9270ade46cVikram Aggarwal *      http://www.apache.org/licenses/LICENSE-2.0
106f92de64bbdf1ea6c4cd9774fc96921a10c266d7Mindy Pereira *
116f92de64bbdf1ea6c4cd9774fc96921a10c266d7Mindy Pereira * Unless required by applicable law or agreed to in writing, software
126f92de64bbdf1ea6c4cd9774fc96921a10c266d7Mindy Pereira * distributed under the License is distributed on an "AS IS" BASIS,
136f92de64bbdf1ea6c4cd9774fc96921a10c266d7Mindy Pereira * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
146f92de64bbdf1ea6c4cd9774fc96921a10c266d7Mindy Pereira * See the License for the specific language governing permissions and
156f92de64bbdf1ea6c4cd9774fc96921a10c266d7Mindy Pereira * limitations under the License.
166f92de64bbdf1ea6c4cd9774fc96921a10c266d7Mindy Pereira */
176f92de64bbdf1ea6c4cd9774fc96921a10c266d7Mindy Pereira
181ddcf0f2bf44d3c9db89112ef52510d9b2433ac4Vikram Aggarwalpackage com.android.mail.ui;
196f92de64bbdf1ea6c4cd9774fc96921a10c266d7Mindy Pereira
206f92de64bbdf1ea6c4cd9774fc96921a10c266d7Mindy Pereiraimport com.google.common.collect.Lists;
216f92de64bbdf1ea6c4cd9774fc96921a10c266d7Mindy Pereira
226f92de64bbdf1ea6c4cd9774fc96921a10c266d7Mindy Pereiraimport android.content.Context;
236f92de64bbdf1ea6c4cd9774fc96921a10c266d7Mindy Pereiraimport android.os.Bundle;
246f92de64bbdf1ea6c4cd9774fc96921a10c266d7Mindy Pereiraimport java.util.ArrayList;
256f92de64bbdf1ea6c4cd9774fc96921a10c266d7Mindy Pereira
266f92de64bbdf1ea6c4cd9774fc96921a10c266d7Mindy Pereira/**
276f92de64bbdf1ea6c4cd9774fc96921a10c266d7Mindy Pereira * Represents the view mode for the tablet Gmail activity.
286f92de64bbdf1ea6c4cd9774fc96921a10c266d7Mindy Pereira * Transitions between modes should be done through this central object, and UI components that are
296f92de64bbdf1ea6c4cd9774fc96921a10c266d7Mindy Pereira * dependent on the mode should listen to changes on this object.
306f92de64bbdf1ea6c4cd9774fc96921a10c266d7Mindy Pereira */
316f92de64bbdf1ea6c4cd9774fc96921a10c266d7Mindy Pereirapublic class ViewMode {
321ddcf0f2bf44d3c9db89112ef52510d9b2433ac4Vikram Aggarwal    /**
33fa131a2ff399fd1d544f759b063268fb4e8a3e70Vikram Aggarwal     * A listener for changes on a ViewMode. To listen to mode changes, implement this
34fa131a2ff399fd1d544f759b063268fb4e8a3e70Vikram Aggarwal     * interface and register your object with the single ViewMode held by the ActivityController
35fa131a2ff399fd1d544f759b063268fb4e8a3e70Vikram Aggarwal     * instance. On mode changes, the onViewModeChanged method will be called with the new mode.
361ddcf0f2bf44d3c9db89112ef52510d9b2433ac4Vikram Aggarwal     */
37b9e1a353c6a173a2885642dbcc1939f3281f29f7Vikram Aggarwal    public interface ModeChangeListener {
38b9e1a353c6a173a2885642dbcc1939f3281f29f7Vikram Aggarwal        /**
39fa131a2ff399fd1d544f759b063268fb4e8a3e70Vikram Aggarwal         * Called when the mode has changed.
40b9e1a353c6a173a2885642dbcc1939f3281f29f7Vikram Aggarwal         */
41fa131a2ff399fd1d544f759b063268fb4e8a3e70Vikram Aggarwal        void onViewModeChanged(int newMode);
42b9e1a353c6a173a2885642dbcc1939f3281f29f7Vikram Aggarwal    }
43b9e1a353c6a173a2885642dbcc1939f3281f29f7Vikram Aggarwal
441ddcf0f2bf44d3c9db89112ef52510d9b2433ac4Vikram Aggarwal    /**
4591d8d26212f741ec33568f3bc9943f8289a576c8Vikram Aggarwal     * Mode when showing a single conversation.
461ddcf0f2bf44d3c9db89112ef52510d9b2433ac4Vikram Aggarwal     */
478ffe4320a17c3f4234f473e8f0ce083732064aa9Vikram Aggarwal    public static final int CONVERSATION = 1;
481ddcf0f2bf44d3c9db89112ef52510d9b2433ac4Vikram Aggarwal    /**
491ddcf0f2bf44d3c9db89112ef52510d9b2433ac4Vikram Aggarwal     * Mode when showing a list of conversations
501ddcf0f2bf44d3c9db89112ef52510d9b2433ac4Vikram Aggarwal     */
518ffe4320a17c3f4234f473e8f0ce083732064aa9Vikram Aggarwal    public static final int CONVERSATION_LIST = 2;
521ddcf0f2bf44d3c9db89112ef52510d9b2433ac4Vikram Aggarwal    /**
53b9e1a353c6a173a2885642dbcc1939f3281f29f7Vikram Aggarwal     * Mode when showing a list of folders.
541ddcf0f2bf44d3c9db89112ef52510d9b2433ac4Vikram Aggarwal     */
558ffe4320a17c3f4234f473e8f0ce083732064aa9Vikram Aggarwal    public static final int FOLDER_LIST = 3;
561ddcf0f2bf44d3c9db89112ef52510d9b2433ac4Vikram Aggarwal    /**
571ddcf0f2bf44d3c9db89112ef52510d9b2433ac4Vikram Aggarwal     * Mode when showing results from user search.
581ddcf0f2bf44d3c9db89112ef52510d9b2433ac4Vikram Aggarwal     */
5968f2e222b4ffccd9f67f02b3a9cfdb3841a7eb43Mindy Pereira    public static final int SEARCH_RESULTS_LIST = 4;
6068f2e222b4ffccd9f67f02b3a9cfdb3841a7eb43Mindy Pereira    /**
6168f2e222b4ffccd9f67f02b3a9cfdb3841a7eb43Mindy Pereira     * Mode when showing results from user search.
6268f2e222b4ffccd9f67f02b3a9cfdb3841a7eb43Mindy Pereira     */
6368f2e222b4ffccd9f67f02b3a9cfdb3841a7eb43Mindy Pereira    public static final int SEARCH_RESULTS_CONVERSATION = 5;
64b9e1a353c6a173a2885642dbcc1939f3281f29f7Vikram Aggarwal    /**
652d50bcdca57756ecad20d21da0d936243215b79cPaul Westbrook     * Mode when showing the "waiting for sync" message.
662d50bcdca57756ecad20d21da0d936243215b79cPaul Westbrook     */
672d50bcdca57756ecad20d21da0d936243215b79cPaul Westbrook    public static final int WAITING_FOR_ACCOUNT_INITIALIZATION = 6;
682d50bcdca57756ecad20d21da0d936243215b79cPaul Westbrook    /**
69b9e1a353c6a173a2885642dbcc1939f3281f29f7Vikram Aggarwal     * Uncertain mode. The mode has not been initialized.
70b9e1a353c6a173a2885642dbcc1939f3281f29f7Vikram Aggarwal     */
718ffe4320a17c3f4234f473e8f0ce083732064aa9Vikram Aggarwal    public static final int UNKNOWN = 0;
7255920575c86c02fe5c4e095b7dfe48b04c1361dfVikram Aggarwal
73b9e1a353c6a173a2885642dbcc1939f3281f29f7Vikram Aggarwal    // Key used to save this {@link ViewMode}.
74b9e1a353c6a173a2885642dbcc1939f3281f29f7Vikram Aggarwal    private static final String VIEW_MODE_KEY = "view-mode";
756f92de64bbdf1ea6c4cd9774fc96921a10c266d7Mindy Pereira    private final ArrayList<ModeChangeListener> mListeners = Lists.newArrayList();
76fa131a2ff399fd1d544f759b063268fb4e8a3e70Vikram Aggarwal    /**
77fa131a2ff399fd1d544f759b063268fb4e8a3e70Vikram Aggarwal     * The actual mode the activity is in. We start out with an UNKNOWN mode, and require entering
78fa131a2ff399fd1d544f759b063268fb4e8a3e70Vikram Aggarwal     * a valid mode after the object has been created.
79fa131a2ff399fd1d544f759b063268fb4e8a3e70Vikram Aggarwal     */
8091d8d26212f741ec33568f3bc9943f8289a576c8Vikram Aggarwal    private int mMode = UNKNOWN;
816f92de64bbdf1ea6c4cd9774fc96921a10c266d7Mindy Pereira
826f92de64bbdf1ea6c4cd9774fc96921a10c266d7Mindy Pereira    public ViewMode(Context context) {
83fa131a2ff399fd1d544f759b063268fb4e8a3e70Vikram Aggarwal        // Do nothing
846f92de64bbdf1ea6c4cd9774fc96921a10c266d7Mindy Pereira    }
856f92de64bbdf1ea6c4cd9774fc96921a10c266d7Mindy Pereira
866f92de64bbdf1ea6c4cd9774fc96921a10c266d7Mindy Pereira    /**
87d7a12cd5b5c2639b653d8c671b04844ef02ee01dVikram Aggarwal     * Adds a listener from this view mode.
88b9e1a353c6a173a2885642dbcc1939f3281f29f7Vikram Aggarwal     * Must happen in the UI thread.
896f92de64bbdf1ea6c4cd9774fc96921a10c266d7Mindy Pereira     */
90b9e1a353c6a173a2885642dbcc1939f3281f29f7Vikram Aggarwal    public void addListener(ModeChangeListener listener) {
91b9e1a353c6a173a2885642dbcc1939f3281f29f7Vikram Aggarwal        mListeners.add(listener);
926f92de64bbdf1ea6c4cd9774fc96921a10c266d7Mindy Pereira    }
936f92de64bbdf1ea6c4cd9774fc96921a10c266d7Mindy Pereira
946f92de64bbdf1ea6c4cd9774fc96921a10c266d7Mindy Pereira    /**
95b9e1a353c6a173a2885642dbcc1939f3281f29f7Vikram Aggarwal     * Dispatches a change event for the mode.
96b9e1a353c6a173a2885642dbcc1939f3281f29f7Vikram Aggarwal     * Always happens in the UI thread.
976f92de64bbdf1ea6c4cd9774fc96921a10c266d7Mindy Pereira     */
983825f3d2284b2b57fadcfe6a4ebd9992f3c5c7bbAndy Huang    private void dispatchModeChange() {
99b9e1a353c6a173a2885642dbcc1939f3281f29f7Vikram Aggarwal        ArrayList<ModeChangeListener> list = new ArrayList<ModeChangeListener>(mListeners);
100b9e1a353c6a173a2885642dbcc1939f3281f29f7Vikram Aggarwal        for (ModeChangeListener listener : list) {
1012175d0a93263672d4498458c81b404b0999134baVikram Aggarwal            assert (listener != null);
1023825f3d2284b2b57fadcfe6a4ebd9992f3c5c7bbAndy Huang            listener.onViewModeChanged(mMode);
1036f92de64bbdf1ea6c4cd9774fc96921a10c266d7Mindy Pereira        }
1046f92de64bbdf1ea6c4cd9774fc96921a10c266d7Mindy Pereira    }
1056f92de64bbdf1ea6c4cd9774fc96921a10c266d7Mindy Pereira
1066f92de64bbdf1ea6c4cd9774fc96921a10c266d7Mindy Pereira    /**
107fa131a2ff399fd1d544f759b063268fb4e8a3e70Vikram Aggarwal     * Requests a transition of the mode to show the conversation list as the prominent view.
108fa131a2ff399fd1d544f759b063268fb4e8a3e70Vikram Aggarwal     * @return Whether or not a change occurred.
1096f92de64bbdf1ea6c4cd9774fc96921a10c266d7Mindy Pereira     */
110fa131a2ff399fd1d544f759b063268fb4e8a3e70Vikram Aggarwal    public boolean enterConversationListMode() {
111fa131a2ff399fd1d544f759b063268fb4e8a3e70Vikram Aggarwal        return setModeInternal(CONVERSATION_LIST);
1126f92de64bbdf1ea6c4cd9774fc96921a10c266d7Mindy Pereira    }
1136f92de64bbdf1ea6c4cd9774fc96921a10c266d7Mindy Pereira
114fa131a2ff399fd1d544f759b063268fb4e8a3e70Vikram Aggarwal    /**
115fa131a2ff399fd1d544f759b063268fb4e8a3e70Vikram Aggarwal     * Requests a transition of the mode to show a conversation as the prominent view.
116fa131a2ff399fd1d544f759b063268fb4e8a3e70Vikram Aggarwal     * @return Whether or not a change occurred.
117fa131a2ff399fd1d544f759b063268fb4e8a3e70Vikram Aggarwal     */
118fa131a2ff399fd1d544f759b063268fb4e8a3e70Vikram Aggarwal    public boolean enterConversationMode() {
119fa131a2ff399fd1d544f759b063268fb4e8a3e70Vikram Aggarwal        return setModeInternal(CONVERSATION);
1206f92de64bbdf1ea6c4cd9774fc96921a10c266d7Mindy Pereira    }
1216f92de64bbdf1ea6c4cd9774fc96921a10c266d7Mindy Pereira
122fa131a2ff399fd1d544f759b063268fb4e8a3e70Vikram Aggarwal    /**
123fa131a2ff399fd1d544f759b063268fb4e8a3e70Vikram Aggarwal     * Requests a transition of the mode to show the folder list as the prominent view.
124fa131a2ff399fd1d544f759b063268fb4e8a3e70Vikram Aggarwal     * @return Whether or not a change occurred.
125fa131a2ff399fd1d544f759b063268fb4e8a3e70Vikram Aggarwal     */
126fa131a2ff399fd1d544f759b063268fb4e8a3e70Vikram Aggarwal    public boolean enterFolderListMode() {
127fa131a2ff399fd1d544f759b063268fb4e8a3e70Vikram Aggarwal        return setModeInternal(FOLDER_LIST);
1286f92de64bbdf1ea6c4cd9774fc96921a10c266d7Mindy Pereira    }
1296f92de64bbdf1ea6c4cd9774fc96921a10c266d7Mindy Pereira
130fa131a2ff399fd1d544f759b063268fb4e8a3e70Vikram Aggarwal    /**
13168f2e222b4ffccd9f67f02b3a9cfdb3841a7eb43Mindy Pereira     * Requests a transition of the mode to show a list of search results as the
13268f2e222b4ffccd9f67f02b3a9cfdb3841a7eb43Mindy Pereira     * prominent view.
13368f2e222b4ffccd9f67f02b3a9cfdb3841a7eb43Mindy Pereira     *
13468f2e222b4ffccd9f67f02b3a9cfdb3841a7eb43Mindy Pereira     * @return Whether or not a change occurred.
13568f2e222b4ffccd9f67f02b3a9cfdb3841a7eb43Mindy Pereira     */
13668f2e222b4ffccd9f67f02b3a9cfdb3841a7eb43Mindy Pereira    public boolean enterSearchResultsListMode() {
13768f2e222b4ffccd9f67f02b3a9cfdb3841a7eb43Mindy Pereira        return setModeInternal(SEARCH_RESULTS_LIST);
13868f2e222b4ffccd9f67f02b3a9cfdb3841a7eb43Mindy Pereira    }
13968f2e222b4ffccd9f67f02b3a9cfdb3841a7eb43Mindy Pereira
14068f2e222b4ffccd9f67f02b3a9cfdb3841a7eb43Mindy Pereira    /**
14168f2e222b4ffccd9f67f02b3a9cfdb3841a7eb43Mindy Pereira     * Requests a transition of the mode to show a conversation that was part of
14268f2e222b4ffccd9f67f02b3a9cfdb3841a7eb43Mindy Pereira     * search results.
14368f2e222b4ffccd9f67f02b3a9cfdb3841a7eb43Mindy Pereira     *
14468f2e222b4ffccd9f67f02b3a9cfdb3841a7eb43Mindy Pereira     * @return Whether or not a change occurred.
14568f2e222b4ffccd9f67f02b3a9cfdb3841a7eb43Mindy Pereira     */
14668f2e222b4ffccd9f67f02b3a9cfdb3841a7eb43Mindy Pereira    public boolean enterSearchResultsConversationMode() {
14768f2e222b4ffccd9f67f02b3a9cfdb3841a7eb43Mindy Pereira        return setModeInternal(SEARCH_RESULTS_CONVERSATION);
14868f2e222b4ffccd9f67f02b3a9cfdb3841a7eb43Mindy Pereira    }
14968f2e222b4ffccd9f67f02b3a9cfdb3841a7eb43Mindy Pereira
15068f2e222b4ffccd9f67f02b3a9cfdb3841a7eb43Mindy Pereira    /**
1512d50bcdca57756ecad20d21da0d936243215b79cPaul Westbrook     * Requests a transition of the mode to show the "waiting for sync" messages
1522d50bcdca57756ecad20d21da0d936243215b79cPaul Westbrook     *
1532d50bcdca57756ecad20d21da0d936243215b79cPaul Westbrook     * @return Whether or not a change occurred.
1542d50bcdca57756ecad20d21da0d936243215b79cPaul Westbrook     */
1552d50bcdca57756ecad20d21da0d936243215b79cPaul Westbrook    public boolean enterWaitingForInitializationMode() {
1562d50bcdca57756ecad20d21da0d936243215b79cPaul Westbrook        return setModeInternal(WAITING_FOR_ACCOUNT_INITIALIZATION);
1572d50bcdca57756ecad20d21da0d936243215b79cPaul Westbrook    }
1582d50bcdca57756ecad20d21da0d936243215b79cPaul Westbrook
1592d50bcdca57756ecad20d21da0d936243215b79cPaul Westbrook    /**
160fa131a2ff399fd1d544f759b063268fb4e8a3e70Vikram Aggarwal     * @return The current mode.
161fa131a2ff399fd1d544f759b063268fb4e8a3e70Vikram Aggarwal     */
162fa131a2ff399fd1d544f759b063268fb4e8a3e70Vikram Aggarwal    public int getMode() {
163fa131a2ff399fd1d544f759b063268fb4e8a3e70Vikram Aggarwal        return mMode;
164b9e1a353c6a173a2885642dbcc1939f3281f29f7Vikram Aggarwal    }
165b9e1a353c6a173a2885642dbcc1939f3281f29f7Vikram Aggarwal
166fa131a2ff399fd1d544f759b063268fb4e8a3e70Vikram Aggarwal    /**
167b466bcf49502a1178cf7362a81470f3231d8892bMindy Pereira     * Return whether the current mode is considered a list mode.
168b466bcf49502a1178cf7362a81470f3231d8892bMindy Pereira     */
169b466bcf49502a1178cf7362a81470f3231d8892bMindy Pereira    public boolean isListMode() {
170a3ed834c959ece3453c1b34953fabecb3b19c424Andy Huang        return isListMode(mMode);
171a3ed834c959ece3453c1b34953fabecb3b19c424Andy Huang    }
172a3ed834c959ece3453c1b34953fabecb3b19c424Andy Huang
173c5796fd595ffe3ea74fb69dfad1ea0bfe82f1eb4Rohan Shah    public static boolean isListMode(final int mode) {
174a3ed834c959ece3453c1b34953fabecb3b19c424Andy Huang        return mode == CONVERSATION_LIST || mode == SEARCH_RESULTS_LIST;
175a3ed834c959ece3453c1b34953fabecb3b19c424Andy Huang    }
176a3ed834c959ece3453c1b34953fabecb3b19c424Andy Huang
177a3ed834c959ece3453c1b34953fabecb3b19c424Andy Huang    public boolean isConversationMode() {
178a3ed834c959ece3453c1b34953fabecb3b19c424Andy Huang        return isConversationMode(mMode);
179a3ed834c959ece3453c1b34953fabecb3b19c424Andy Huang    }
180a3ed834c959ece3453c1b34953fabecb3b19c424Andy Huang
181c5796fd595ffe3ea74fb69dfad1ea0bfe82f1eb4Rohan Shah    public static boolean isConversationMode(final int mode) {
182a3ed834c959ece3453c1b34953fabecb3b19c424Andy Huang        return mode == CONVERSATION || mode == SEARCH_RESULTS_CONVERSATION;
183b466bcf49502a1178cf7362a81470f3231d8892bMindy Pereira    }
184b466bcf49502a1178cf7362a81470f3231d8892bMindy Pereira
185c5796fd595ffe3ea74fb69dfad1ea0bfe82f1eb4Rohan Shah    public static boolean isSearchMode(final int mode) {
186c5796fd595ffe3ea74fb69dfad1ea0bfe82f1eb4Rohan Shah        return mode == SEARCH_RESULTS_LIST || mode == SEARCH_RESULTS_CONVERSATION;
187c5796fd595ffe3ea74fb69dfad1ea0bfe82f1eb4Rohan Shah    }
188c5796fd595ffe3ea74fb69dfad1ea0bfe82f1eb4Rohan Shah
189a88304d638bfe9ba9a29b7c3f9c4f60d23a9b461Rohan Shah    public boolean isWaitingForSync() {
190c5796fd595ffe3ea74fb69dfad1ea0bfe82f1eb4Rohan Shah        return isWaitingForSync(mMode);
191c5796fd595ffe3ea74fb69dfad1ea0bfe82f1eb4Rohan Shah    }
192c5796fd595ffe3ea74fb69dfad1ea0bfe82f1eb4Rohan Shah
193c5796fd595ffe3ea74fb69dfad1ea0bfe82f1eb4Rohan Shah    public static boolean isWaitingForSync(final int mode) {
194c5796fd595ffe3ea74fb69dfad1ea0bfe82f1eb4Rohan Shah        return mode == WAITING_FOR_ACCOUNT_INITIALIZATION;
195a88304d638bfe9ba9a29b7c3f9c4f60d23a9b461Rohan Shah    }
196a88304d638bfe9ba9a29b7c3f9c4f60d23a9b461Rohan Shah
197b466bcf49502a1178cf7362a81470f3231d8892bMindy Pereira    /**
198fa131a2ff399fd1d544f759b063268fb4e8a3e70Vikram Aggarwal     * Restoring from a saved state restores only the mode. It does not restore the listeners of
199fa131a2ff399fd1d544f759b063268fb4e8a3e70Vikram Aggarwal     * this object.
200fa131a2ff399fd1d544f759b063268fb4e8a3e70Vikram Aggarwal     * @param inState
201fa131a2ff399fd1d544f759b063268fb4e8a3e70Vikram Aggarwal     */
202fa131a2ff399fd1d544f759b063268fb4e8a3e70Vikram Aggarwal    public void handleRestore(Bundle inState) {
203649b9ea3653da73fac0c33c8fb0af18baad12ac3Vikram Aggarwal        if (inState == null) {
204649b9ea3653da73fac0c33c8fb0af18baad12ac3Vikram Aggarwal            return;
205649b9ea3653da73fac0c33c8fb0af18baad12ac3Vikram Aggarwal        }
206649b9ea3653da73fac0c33c8fb0af18baad12ac3Vikram Aggarwal        // Restore the previous mode, and UNKNOWN if nothing exists.
207649b9ea3653da73fac0c33c8fb0af18baad12ac3Vikram Aggarwal        final int newMode = inState.getInt(VIEW_MODE_KEY, UNKNOWN);
208649b9ea3653da73fac0c33c8fb0af18baad12ac3Vikram Aggarwal        if (newMode != UNKNOWN) {
209649b9ea3653da73fac0c33c8fb0af18baad12ac3Vikram Aggarwal            setModeInternal(newMode);
210649b9ea3653da73fac0c33c8fb0af18baad12ac3Vikram Aggarwal        }
2116f92de64bbdf1ea6c4cd9774fc96921a10c266d7Mindy Pereira    }
2126f92de64bbdf1ea6c4cd9774fc96921a10c266d7Mindy Pereira
213b9e1a353c6a173a2885642dbcc1939f3281f29f7Vikram Aggarwal    /**
214fa131a2ff399fd1d544f759b063268fb4e8a3e70Vikram Aggarwal     * Save the existing mode only. Does not save the existing listeners.
215fa131a2ff399fd1d544f759b063268fb4e8a3e70Vikram Aggarwal     * @param outState
216b9e1a353c6a173a2885642dbcc1939f3281f29f7Vikram Aggarwal     */
217fa131a2ff399fd1d544f759b063268fb4e8a3e70Vikram Aggarwal    public void handleSaveInstanceState(Bundle outState) {
218649b9ea3653da73fac0c33c8fb0af18baad12ac3Vikram Aggarwal        if (outState == null) {
219649b9ea3653da73fac0c33c8fb0af18baad12ac3Vikram Aggarwal            return;
220649b9ea3653da73fac0c33c8fb0af18baad12ac3Vikram Aggarwal        }
221fa131a2ff399fd1d544f759b063268fb4e8a3e70Vikram Aggarwal        outState.putInt(VIEW_MODE_KEY, mMode);
2226f92de64bbdf1ea6c4cd9774fc96921a10c266d7Mindy Pereira    }
2236f92de64bbdf1ea6c4cd9774fc96921a10c266d7Mindy Pereira
224b9e1a353c6a173a2885642dbcc1939f3281f29f7Vikram Aggarwal    /**
225b9e1a353c6a173a2885642dbcc1939f3281f29f7Vikram Aggarwal     * Removes a listener from this view mode.
226b9e1a353c6a173a2885642dbcc1939f3281f29f7Vikram Aggarwal     * Must happen in the UI thread.
227b9e1a353c6a173a2885642dbcc1939f3281f29f7Vikram Aggarwal     */
228b9e1a353c6a173a2885642dbcc1939f3281f29f7Vikram Aggarwal    public void removeListener(ModeChangeListener listener) {
229b9e1a353c6a173a2885642dbcc1939f3281f29f7Vikram Aggarwal        mListeners.remove(listener);
2306f92de64bbdf1ea6c4cd9774fc96921a10c266d7Mindy Pereira    }
2316f92de64bbdf1ea6c4cd9774fc96921a10c266d7Mindy Pereira
2326f92de64bbdf1ea6c4cd9774fc96921a10c266d7Mindy Pereira    /**
233b9e1a353c6a173a2885642dbcc1939f3281f29f7Vikram Aggarwal     * Sets the internal mode.
234fa131a2ff399fd1d544f759b063268fb4e8a3e70Vikram Aggarwal     * @return Whether or not a change occurred.
2356f92de64bbdf1ea6c4cd9774fc96921a10c266d7Mindy Pereira     */
23691d8d26212f741ec33568f3bc9943f8289a576c8Vikram Aggarwal    private boolean setModeInternal(int mode) {
237b9e1a353c6a173a2885642dbcc1939f3281f29f7Vikram Aggarwal        if (mMode == mode) {
238b9e1a353c6a173a2885642dbcc1939f3281f29f7Vikram Aggarwal            return false;
239b9e1a353c6a173a2885642dbcc1939f3281f29f7Vikram Aggarwal        }
2403825f3d2284b2b57fadcfe6a4ebd9992f3c5c7bbAndy Huang        mMode = mode;
2413825f3d2284b2b57fadcfe6a4ebd9992f3c5c7bbAndy Huang        dispatchModeChange();
242b9e1a353c6a173a2885642dbcc1939f3281f29f7Vikram Aggarwal        return true;
2436f92de64bbdf1ea6c4cd9774fc96921a10c266d7Mindy Pereira    }
2446f92de64bbdf1ea6c4cd9774fc96921a10c266d7Mindy Pereira}
245