ViewMode.java revision e6459424b3e46d768865c908af1caa932f783095
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
20e6459424b3e46d768865c908af1caa932f783095Andy Huangimport com.android.mail.utils.LogUtils;
216f92de64bbdf1ea6c4cd9774fc96921a10c266d7Mindy Pereiraimport com.google.common.collect.Lists;
226f92de64bbdf1ea6c4cd9774fc96921a10c266d7Mindy Pereira
236f92de64bbdf1ea6c4cd9774fc96921a10c266d7Mindy Pereiraimport android.content.Context;
246f92de64bbdf1ea6c4cd9774fc96921a10c266d7Mindy Pereiraimport android.os.Bundle;
256f92de64bbdf1ea6c4cd9774fc96921a10c266d7Mindy Pereiraimport java.util.ArrayList;
266f92de64bbdf1ea6c4cd9774fc96921a10c266d7Mindy Pereira
276f92de64bbdf1ea6c4cd9774fc96921a10c266d7Mindy Pereira/**
286f92de64bbdf1ea6c4cd9774fc96921a10c266d7Mindy Pereira * Represents the view mode for the tablet Gmail activity.
296f92de64bbdf1ea6c4cd9774fc96921a10c266d7Mindy Pereira * Transitions between modes should be done through this central object, and UI components that are
306f92de64bbdf1ea6c4cd9774fc96921a10c266d7Mindy Pereira * dependent on the mode should listen to changes on this object.
316f92de64bbdf1ea6c4cd9774fc96921a10c266d7Mindy Pereira */
326f92de64bbdf1ea6c4cd9774fc96921a10c266d7Mindy Pereirapublic class ViewMode {
331ddcf0f2bf44d3c9db89112ef52510d9b2433ac4Vikram Aggarwal    /**
34fa131a2ff399fd1d544f759b063268fb4e8a3e70Vikram Aggarwal     * A listener for changes on a ViewMode. To listen to mode changes, implement this
35fa131a2ff399fd1d544f759b063268fb4e8a3e70Vikram Aggarwal     * interface and register your object with the single ViewMode held by the ActivityController
36fa131a2ff399fd1d544f759b063268fb4e8a3e70Vikram Aggarwal     * instance. On mode changes, the onViewModeChanged method will be called with the new mode.
371ddcf0f2bf44d3c9db89112ef52510d9b2433ac4Vikram Aggarwal     */
38b9e1a353c6a173a2885642dbcc1939f3281f29f7Vikram Aggarwal    public interface ModeChangeListener {
39b9e1a353c6a173a2885642dbcc1939f3281f29f7Vikram Aggarwal        /**
40fa131a2ff399fd1d544f759b063268fb4e8a3e70Vikram Aggarwal         * Called when the mode has changed.
41b9e1a353c6a173a2885642dbcc1939f3281f29f7Vikram Aggarwal         */
42fa131a2ff399fd1d544f759b063268fb4e8a3e70Vikram Aggarwal        void onViewModeChanged(int newMode);
43b9e1a353c6a173a2885642dbcc1939f3281f29f7Vikram Aggarwal    }
44b9e1a353c6a173a2885642dbcc1939f3281f29f7Vikram Aggarwal
451ddcf0f2bf44d3c9db89112ef52510d9b2433ac4Vikram Aggarwal    /**
4691d8d26212f741ec33568f3bc9943f8289a576c8Vikram Aggarwal     * Mode when showing a single conversation.
471ddcf0f2bf44d3c9db89112ef52510d9b2433ac4Vikram Aggarwal     */
488ffe4320a17c3f4234f473e8f0ce083732064aa9Vikram Aggarwal    public static final int CONVERSATION = 1;
491ddcf0f2bf44d3c9db89112ef52510d9b2433ac4Vikram Aggarwal    /**
501ddcf0f2bf44d3c9db89112ef52510d9b2433ac4Vikram Aggarwal     * Mode when showing a list of conversations
511ddcf0f2bf44d3c9db89112ef52510d9b2433ac4Vikram Aggarwal     */
528ffe4320a17c3f4234f473e8f0ce083732064aa9Vikram Aggarwal    public static final int CONVERSATION_LIST = 2;
531ddcf0f2bf44d3c9db89112ef52510d9b2433ac4Vikram Aggarwal    /**
54b9e1a353c6a173a2885642dbcc1939f3281f29f7Vikram Aggarwal     * Mode when showing a list of folders.
551ddcf0f2bf44d3c9db89112ef52510d9b2433ac4Vikram Aggarwal     */
568ffe4320a17c3f4234f473e8f0ce083732064aa9Vikram Aggarwal    public static final int FOLDER_LIST = 3;
571ddcf0f2bf44d3c9db89112ef52510d9b2433ac4Vikram Aggarwal    /**
581ddcf0f2bf44d3c9db89112ef52510d9b2433ac4Vikram Aggarwal     * Mode when showing results from user search.
591ddcf0f2bf44d3c9db89112ef52510d9b2433ac4Vikram Aggarwal     */
6068f2e222b4ffccd9f67f02b3a9cfdb3841a7eb43Mindy Pereira    public static final int SEARCH_RESULTS_LIST = 4;
6168f2e222b4ffccd9f67f02b3a9cfdb3841a7eb43Mindy Pereira    /**
6268f2e222b4ffccd9f67f02b3a9cfdb3841a7eb43Mindy Pereira     * Mode when showing results from user search.
6368f2e222b4ffccd9f67f02b3a9cfdb3841a7eb43Mindy Pereira     */
6468f2e222b4ffccd9f67f02b3a9cfdb3841a7eb43Mindy Pereira    public static final int SEARCH_RESULTS_CONVERSATION = 5;
65b9e1a353c6a173a2885642dbcc1939f3281f29f7Vikram Aggarwal    /**
662d50bcdca57756ecad20d21da0d936243215b79cPaul Westbrook     * Mode when showing the "waiting for sync" message.
672d50bcdca57756ecad20d21da0d936243215b79cPaul Westbrook     */
682d50bcdca57756ecad20d21da0d936243215b79cPaul Westbrook    public static final int WAITING_FOR_ACCOUNT_INITIALIZATION = 6;
692d50bcdca57756ecad20d21da0d936243215b79cPaul Westbrook    /**
70b9e1a353c6a173a2885642dbcc1939f3281f29f7Vikram Aggarwal     * Uncertain mode. The mode has not been initialized.
71b9e1a353c6a173a2885642dbcc1939f3281f29f7Vikram Aggarwal     */
728ffe4320a17c3f4234f473e8f0ce083732064aa9Vikram Aggarwal    public static final int UNKNOWN = 0;
7355920575c86c02fe5c4e095b7dfe48b04c1361dfVikram Aggarwal
74b9e1a353c6a173a2885642dbcc1939f3281f29f7Vikram Aggarwal    // Key used to save this {@link ViewMode}.
75b9e1a353c6a173a2885642dbcc1939f3281f29f7Vikram Aggarwal    private static final String VIEW_MODE_KEY = "view-mode";
766f92de64bbdf1ea6c4cd9774fc96921a10c266d7Mindy Pereira    private final ArrayList<ModeChangeListener> mListeners = Lists.newArrayList();
77fa131a2ff399fd1d544f759b063268fb4e8a3e70Vikram Aggarwal    /**
78fa131a2ff399fd1d544f759b063268fb4e8a3e70Vikram Aggarwal     * The actual mode the activity is in. We start out with an UNKNOWN mode, and require entering
79fa131a2ff399fd1d544f759b063268fb4e8a3e70Vikram Aggarwal     * a valid mode after the object has been created.
80fa131a2ff399fd1d544f759b063268fb4e8a3e70Vikram Aggarwal     */
8191d8d26212f741ec33568f3bc9943f8289a576c8Vikram Aggarwal    private int mMode = UNKNOWN;
826f92de64bbdf1ea6c4cd9774fc96921a10c266d7Mindy Pereira
83e6459424b3e46d768865c908af1caa932f783095Andy Huang    public static final String LOG_TAG = "ViewMode";
84e6459424b3e46d768865c908af1caa932f783095Andy Huang
856f92de64bbdf1ea6c4cd9774fc96921a10c266d7Mindy Pereira    public ViewMode(Context context) {
86fa131a2ff399fd1d544f759b063268fb4e8a3e70Vikram Aggarwal        // Do nothing
876f92de64bbdf1ea6c4cd9774fc96921a10c266d7Mindy Pereira    }
886f92de64bbdf1ea6c4cd9774fc96921a10c266d7Mindy Pereira
89e6459424b3e46d768865c908af1caa932f783095Andy Huang    @Override
90e6459424b3e46d768865c908af1caa932f783095Andy Huang    public String toString() {
91e6459424b3e46d768865c908af1caa932f783095Andy Huang        return "[mode=" + mMode + "]";
92e6459424b3e46d768865c908af1caa932f783095Andy Huang    }
93e6459424b3e46d768865c908af1caa932f783095Andy Huang
946f92de64bbdf1ea6c4cd9774fc96921a10c266d7Mindy Pereira    /**
95d7a12cd5b5c2639b653d8c671b04844ef02ee01dVikram Aggarwal     * Adds a listener from this view mode.
96b9e1a353c6a173a2885642dbcc1939f3281f29f7Vikram Aggarwal     * Must happen in the UI thread.
976f92de64bbdf1ea6c4cd9774fc96921a10c266d7Mindy Pereira     */
98b9e1a353c6a173a2885642dbcc1939f3281f29f7Vikram Aggarwal    public void addListener(ModeChangeListener listener) {
99b9e1a353c6a173a2885642dbcc1939f3281f29f7Vikram Aggarwal        mListeners.add(listener);
1006f92de64bbdf1ea6c4cd9774fc96921a10c266d7Mindy Pereira    }
1016f92de64bbdf1ea6c4cd9774fc96921a10c266d7Mindy Pereira
1026f92de64bbdf1ea6c4cd9774fc96921a10c266d7Mindy Pereira    /**
103b9e1a353c6a173a2885642dbcc1939f3281f29f7Vikram Aggarwal     * Dispatches a change event for the mode.
104b9e1a353c6a173a2885642dbcc1939f3281f29f7Vikram Aggarwal     * Always happens in the UI thread.
1056f92de64bbdf1ea6c4cd9774fc96921a10c266d7Mindy Pereira     */
1063825f3d2284b2b57fadcfe6a4ebd9992f3c5c7bbAndy Huang    private void dispatchModeChange() {
107b9e1a353c6a173a2885642dbcc1939f3281f29f7Vikram Aggarwal        ArrayList<ModeChangeListener> list = new ArrayList<ModeChangeListener>(mListeners);
108b9e1a353c6a173a2885642dbcc1939f3281f29f7Vikram Aggarwal        for (ModeChangeListener listener : list) {
1092175d0a93263672d4498458c81b404b0999134baVikram Aggarwal            assert (listener != null);
1103825f3d2284b2b57fadcfe6a4ebd9992f3c5c7bbAndy Huang            listener.onViewModeChanged(mMode);
1116f92de64bbdf1ea6c4cd9774fc96921a10c266d7Mindy Pereira        }
1126f92de64bbdf1ea6c4cd9774fc96921a10c266d7Mindy Pereira    }
1136f92de64bbdf1ea6c4cd9774fc96921a10c266d7Mindy Pereira
1146f92de64bbdf1ea6c4cd9774fc96921a10c266d7Mindy Pereira    /**
115fa131a2ff399fd1d544f759b063268fb4e8a3e70Vikram Aggarwal     * Requests a transition of the mode to show the conversation list as the prominent view.
116e6459424b3e46d768865c908af1caa932f783095Andy Huang     *
1176f92de64bbdf1ea6c4cd9774fc96921a10c266d7Mindy Pereira     */
118e6459424b3e46d768865c908af1caa932f783095Andy Huang    public void enterConversationListMode() {
119e6459424b3e46d768865c908af1caa932f783095Andy Huang        setModeInternal(CONVERSATION_LIST);
1206f92de64bbdf1ea6c4cd9774fc96921a10c266d7Mindy Pereira    }
1216f92de64bbdf1ea6c4cd9774fc96921a10c266d7Mindy Pereira
122fa131a2ff399fd1d544f759b063268fb4e8a3e70Vikram Aggarwal    /**
123fa131a2ff399fd1d544f759b063268fb4e8a3e70Vikram Aggarwal     * Requests a transition of the mode to show a conversation as the prominent view.
124e6459424b3e46d768865c908af1caa932f783095Andy Huang     *
125fa131a2ff399fd1d544f759b063268fb4e8a3e70Vikram Aggarwal     */
126e6459424b3e46d768865c908af1caa932f783095Andy Huang    public void enterConversationMode() {
127e6459424b3e46d768865c908af1caa932f783095Andy Huang        setModeInternal(CONVERSATION);
1286f92de64bbdf1ea6c4cd9774fc96921a10c266d7Mindy Pereira    }
1296f92de64bbdf1ea6c4cd9774fc96921a10c266d7Mindy Pereira
130fa131a2ff399fd1d544f759b063268fb4e8a3e70Vikram Aggarwal    /**
131fa131a2ff399fd1d544f759b063268fb4e8a3e70Vikram Aggarwal     * Requests a transition of the mode to show the folder list as the prominent view.
132e6459424b3e46d768865c908af1caa932f783095Andy Huang     *
133fa131a2ff399fd1d544f759b063268fb4e8a3e70Vikram Aggarwal     */
134e6459424b3e46d768865c908af1caa932f783095Andy Huang    public void enterFolderListMode() {
135e6459424b3e46d768865c908af1caa932f783095Andy Huang        setModeInternal(FOLDER_LIST);
1366f92de64bbdf1ea6c4cd9774fc96921a10c266d7Mindy Pereira    }
1376f92de64bbdf1ea6c4cd9774fc96921a10c266d7Mindy Pereira
138fa131a2ff399fd1d544f759b063268fb4e8a3e70Vikram Aggarwal    /**
13968f2e222b4ffccd9f67f02b3a9cfdb3841a7eb43Mindy Pereira     * Requests a transition of the mode to show a list of search results as the
14068f2e222b4ffccd9f67f02b3a9cfdb3841a7eb43Mindy Pereira     * prominent view.
14168f2e222b4ffccd9f67f02b3a9cfdb3841a7eb43Mindy Pereira     *
14268f2e222b4ffccd9f67f02b3a9cfdb3841a7eb43Mindy Pereira     */
143e6459424b3e46d768865c908af1caa932f783095Andy Huang    public void enterSearchResultsListMode() {
144e6459424b3e46d768865c908af1caa932f783095Andy Huang        setModeInternal(SEARCH_RESULTS_LIST);
14568f2e222b4ffccd9f67f02b3a9cfdb3841a7eb43Mindy Pereira    }
14668f2e222b4ffccd9f67f02b3a9cfdb3841a7eb43Mindy Pereira
14768f2e222b4ffccd9f67f02b3a9cfdb3841a7eb43Mindy Pereira    /**
14868f2e222b4ffccd9f67f02b3a9cfdb3841a7eb43Mindy Pereira     * Requests a transition of the mode to show a conversation that was part of
14968f2e222b4ffccd9f67f02b3a9cfdb3841a7eb43Mindy Pereira     * search results.
15068f2e222b4ffccd9f67f02b3a9cfdb3841a7eb43Mindy Pereira     *
15168f2e222b4ffccd9f67f02b3a9cfdb3841a7eb43Mindy Pereira     */
152e6459424b3e46d768865c908af1caa932f783095Andy Huang    public void enterSearchResultsConversationMode() {
153e6459424b3e46d768865c908af1caa932f783095Andy Huang        setModeInternal(SEARCH_RESULTS_CONVERSATION);
15468f2e222b4ffccd9f67f02b3a9cfdb3841a7eb43Mindy Pereira    }
15568f2e222b4ffccd9f67f02b3a9cfdb3841a7eb43Mindy Pereira
15668f2e222b4ffccd9f67f02b3a9cfdb3841a7eb43Mindy Pereira    /**
1572d50bcdca57756ecad20d21da0d936243215b79cPaul Westbrook     * Requests a transition of the mode to show the "waiting for sync" messages
1582d50bcdca57756ecad20d21da0d936243215b79cPaul Westbrook     *
1592d50bcdca57756ecad20d21da0d936243215b79cPaul Westbrook     */
160e6459424b3e46d768865c908af1caa932f783095Andy Huang    public void enterWaitingForInitializationMode() {
161e6459424b3e46d768865c908af1caa932f783095Andy Huang        setModeInternal(WAITING_FOR_ACCOUNT_INITIALIZATION);
1622d50bcdca57756ecad20d21da0d936243215b79cPaul Westbrook    }
1632d50bcdca57756ecad20d21da0d936243215b79cPaul Westbrook
1642d50bcdca57756ecad20d21da0d936243215b79cPaul Westbrook    /**
165fa131a2ff399fd1d544f759b063268fb4e8a3e70Vikram Aggarwal     * @return The current mode.
166fa131a2ff399fd1d544f759b063268fb4e8a3e70Vikram Aggarwal     */
167fa131a2ff399fd1d544f759b063268fb4e8a3e70Vikram Aggarwal    public int getMode() {
168fa131a2ff399fd1d544f759b063268fb4e8a3e70Vikram Aggarwal        return mMode;
169b9e1a353c6a173a2885642dbcc1939f3281f29f7Vikram Aggarwal    }
170b9e1a353c6a173a2885642dbcc1939f3281f29f7Vikram Aggarwal
171fa131a2ff399fd1d544f759b063268fb4e8a3e70Vikram Aggarwal    /**
172b466bcf49502a1178cf7362a81470f3231d8892bMindy Pereira     * Return whether the current mode is considered a list mode.
173b466bcf49502a1178cf7362a81470f3231d8892bMindy Pereira     */
174b466bcf49502a1178cf7362a81470f3231d8892bMindy Pereira    public boolean isListMode() {
175a3ed834c959ece3453c1b34953fabecb3b19c424Andy Huang        return isListMode(mMode);
176a3ed834c959ece3453c1b34953fabecb3b19c424Andy Huang    }
177a3ed834c959ece3453c1b34953fabecb3b19c424Andy Huang
178c5796fd595ffe3ea74fb69dfad1ea0bfe82f1eb4Rohan Shah    public static boolean isListMode(final int mode) {
179a3ed834c959ece3453c1b34953fabecb3b19c424Andy Huang        return mode == CONVERSATION_LIST || mode == SEARCH_RESULTS_LIST;
180a3ed834c959ece3453c1b34953fabecb3b19c424Andy Huang    }
181a3ed834c959ece3453c1b34953fabecb3b19c424Andy Huang
182a3ed834c959ece3453c1b34953fabecb3b19c424Andy Huang    public boolean isConversationMode() {
183a3ed834c959ece3453c1b34953fabecb3b19c424Andy Huang        return isConversationMode(mMode);
184a3ed834c959ece3453c1b34953fabecb3b19c424Andy Huang    }
185a3ed834c959ece3453c1b34953fabecb3b19c424Andy Huang
186c5796fd595ffe3ea74fb69dfad1ea0bfe82f1eb4Rohan Shah    public static boolean isConversationMode(final int mode) {
187a3ed834c959ece3453c1b34953fabecb3b19c424Andy Huang        return mode == CONVERSATION || mode == SEARCH_RESULTS_CONVERSATION;
188b466bcf49502a1178cf7362a81470f3231d8892bMindy Pereira    }
189b466bcf49502a1178cf7362a81470f3231d8892bMindy Pereira
190c5796fd595ffe3ea74fb69dfad1ea0bfe82f1eb4Rohan Shah    public static boolean isSearchMode(final int mode) {
191c5796fd595ffe3ea74fb69dfad1ea0bfe82f1eb4Rohan Shah        return mode == SEARCH_RESULTS_LIST || mode == SEARCH_RESULTS_CONVERSATION;
192c5796fd595ffe3ea74fb69dfad1ea0bfe82f1eb4Rohan Shah    }
193c5796fd595ffe3ea74fb69dfad1ea0bfe82f1eb4Rohan Shah
194a88304d638bfe9ba9a29b7c3f9c4f60d23a9b461Rohan Shah    public boolean isWaitingForSync() {
195c5796fd595ffe3ea74fb69dfad1ea0bfe82f1eb4Rohan Shah        return isWaitingForSync(mMode);
196c5796fd595ffe3ea74fb69dfad1ea0bfe82f1eb4Rohan Shah    }
197c5796fd595ffe3ea74fb69dfad1ea0bfe82f1eb4Rohan Shah
198c5796fd595ffe3ea74fb69dfad1ea0bfe82f1eb4Rohan Shah    public static boolean isWaitingForSync(final int mode) {
199c5796fd595ffe3ea74fb69dfad1ea0bfe82f1eb4Rohan Shah        return mode == WAITING_FOR_ACCOUNT_INITIALIZATION;
200a88304d638bfe9ba9a29b7c3f9c4f60d23a9b461Rohan Shah    }
201a88304d638bfe9ba9a29b7c3f9c4f60d23a9b461Rohan Shah
202b466bcf49502a1178cf7362a81470f3231d8892bMindy Pereira    /**
203fa131a2ff399fd1d544f759b063268fb4e8a3e70Vikram Aggarwal     * Restoring from a saved state restores only the mode. It does not restore the listeners of
204fa131a2ff399fd1d544f759b063268fb4e8a3e70Vikram Aggarwal     * this object.
205fa131a2ff399fd1d544f759b063268fb4e8a3e70Vikram Aggarwal     * @param inState
206fa131a2ff399fd1d544f759b063268fb4e8a3e70Vikram Aggarwal     */
207fa131a2ff399fd1d544f759b063268fb4e8a3e70Vikram Aggarwal    public void handleRestore(Bundle inState) {
208649b9ea3653da73fac0c33c8fb0af18baad12ac3Vikram Aggarwal        if (inState == null) {
209649b9ea3653da73fac0c33c8fb0af18baad12ac3Vikram Aggarwal            return;
210649b9ea3653da73fac0c33c8fb0af18baad12ac3Vikram Aggarwal        }
211649b9ea3653da73fac0c33c8fb0af18baad12ac3Vikram Aggarwal        // Restore the previous mode, and UNKNOWN if nothing exists.
212649b9ea3653da73fac0c33c8fb0af18baad12ac3Vikram Aggarwal        final int newMode = inState.getInt(VIEW_MODE_KEY, UNKNOWN);
213649b9ea3653da73fac0c33c8fb0af18baad12ac3Vikram Aggarwal        if (newMode != UNKNOWN) {
214649b9ea3653da73fac0c33c8fb0af18baad12ac3Vikram Aggarwal            setModeInternal(newMode);
215649b9ea3653da73fac0c33c8fb0af18baad12ac3Vikram Aggarwal        }
2166f92de64bbdf1ea6c4cd9774fc96921a10c266d7Mindy Pereira    }
2176f92de64bbdf1ea6c4cd9774fc96921a10c266d7Mindy Pereira
218b9e1a353c6a173a2885642dbcc1939f3281f29f7Vikram Aggarwal    /**
219fa131a2ff399fd1d544f759b063268fb4e8a3e70Vikram Aggarwal     * Save the existing mode only. Does not save the existing listeners.
220fa131a2ff399fd1d544f759b063268fb4e8a3e70Vikram Aggarwal     * @param outState
221b9e1a353c6a173a2885642dbcc1939f3281f29f7Vikram Aggarwal     */
222fa131a2ff399fd1d544f759b063268fb4e8a3e70Vikram Aggarwal    public void handleSaveInstanceState(Bundle outState) {
223649b9ea3653da73fac0c33c8fb0af18baad12ac3Vikram Aggarwal        if (outState == null) {
224649b9ea3653da73fac0c33c8fb0af18baad12ac3Vikram Aggarwal            return;
225649b9ea3653da73fac0c33c8fb0af18baad12ac3Vikram Aggarwal        }
226fa131a2ff399fd1d544f759b063268fb4e8a3e70Vikram Aggarwal        outState.putInt(VIEW_MODE_KEY, mMode);
2276f92de64bbdf1ea6c4cd9774fc96921a10c266d7Mindy Pereira    }
2286f92de64bbdf1ea6c4cd9774fc96921a10c266d7Mindy Pereira
229b9e1a353c6a173a2885642dbcc1939f3281f29f7Vikram Aggarwal    /**
230b9e1a353c6a173a2885642dbcc1939f3281f29f7Vikram Aggarwal     * Removes a listener from this view mode.
231b9e1a353c6a173a2885642dbcc1939f3281f29f7Vikram Aggarwal     * Must happen in the UI thread.
232b9e1a353c6a173a2885642dbcc1939f3281f29f7Vikram Aggarwal     */
233b9e1a353c6a173a2885642dbcc1939f3281f29f7Vikram Aggarwal    public void removeListener(ModeChangeListener listener) {
234b9e1a353c6a173a2885642dbcc1939f3281f29f7Vikram Aggarwal        mListeners.remove(listener);
2356f92de64bbdf1ea6c4cd9774fc96921a10c266d7Mindy Pereira    }
2366f92de64bbdf1ea6c4cd9774fc96921a10c266d7Mindy Pereira
2376f92de64bbdf1ea6c4cd9774fc96921a10c266d7Mindy Pereira    /**
238b9e1a353c6a173a2885642dbcc1939f3281f29f7Vikram Aggarwal     * Sets the internal mode.
239fa131a2ff399fd1d544f759b063268fb4e8a3e70Vikram Aggarwal     * @return Whether or not a change occurred.
2406f92de64bbdf1ea6c4cd9774fc96921a10c266d7Mindy Pereira     */
24191d8d26212f741ec33568f3bc9943f8289a576c8Vikram Aggarwal    private boolean setModeInternal(int mode) {
242b9e1a353c6a173a2885642dbcc1939f3281f29f7Vikram Aggarwal        if (mMode == mode) {
243e6459424b3e46d768865c908af1caa932f783095Andy Huang            if (LogUtils.isLoggable(LOG_TAG, LogUtils.DEBUG)) {
244e6459424b3e46d768865c908af1caa932f783095Andy Huang                LogUtils.d(LOG_TAG, new Error(), "ViewMode: debouncing change attempt mode=%s",
245e6459424b3e46d768865c908af1caa932f783095Andy Huang                        mode);
246e6459424b3e46d768865c908af1caa932f783095Andy Huang            } else {
247e6459424b3e46d768865c908af1caa932f783095Andy Huang                LogUtils.i(LOG_TAG, "ViewMode: debouncing change attempt mode=%s", mode);
248e6459424b3e46d768865c908af1caa932f783095Andy Huang            }
249b9e1a353c6a173a2885642dbcc1939f3281f29f7Vikram Aggarwal            return false;
250b9e1a353c6a173a2885642dbcc1939f3281f29f7Vikram Aggarwal        }
251e6459424b3e46d768865c908af1caa932f783095Andy Huang
252e6459424b3e46d768865c908af1caa932f783095Andy Huang        if (LogUtils.isLoggable(LOG_TAG, LogUtils.DEBUG)) {
253e6459424b3e46d768865c908af1caa932f783095Andy Huang            LogUtils.d(LOG_TAG, new Error(), "ViewMode: executing change old=%s new=%s", mMode,
254e6459424b3e46d768865c908af1caa932f783095Andy Huang                    mode);
255e6459424b3e46d768865c908af1caa932f783095Andy Huang        } else {
256e6459424b3e46d768865c908af1caa932f783095Andy Huang            LogUtils.i(LOG_TAG, "ViewMode: executing change old=%s new=%s", mMode, mode);
257e6459424b3e46d768865c908af1caa932f783095Andy Huang        }
258e6459424b3e46d768865c908af1caa932f783095Andy Huang
2593825f3d2284b2b57fadcfe6a4ebd9992f3c5c7bbAndy Huang        mMode = mode;
2603825f3d2284b2b57fadcfe6a4ebd9992f3c5c7bbAndy Huang        dispatchModeChange();
261b9e1a353c6a173a2885642dbcc1939f3281f29f7Vikram Aggarwal        return true;
2626f92de64bbdf1ea6c4cd9774fc96921a10c266d7Mindy Pereira    }
2636f92de64bbdf1ea6c4cd9774fc96921a10c266d7Mindy Pereira}
264