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
206c570db71b8adc43d7dc2f31e6fa63cf50c1426eAndrew Sappersteinimport android.os.Bundle;
216c570db71b8adc43d7dc2f31e6fa63cf50c1426eAndrew Sapperstein
22761522c1ac7a8fa05acde714f0e26fde47f3415fAndy Huangimport com.android.mail.analytics.Analytics;
23e6459424b3e46d768865c908af1caa932f783095Andy Huangimport com.android.mail.utils.LogUtils;
246f92de64bbdf1ea6c4cd9774fc96921a10c266d7Mindy Pereiraimport com.google.common.collect.Lists;
256f92de64bbdf1ea6c4cd9774fc96921a10c266d7Mindy Pereira
266f92de64bbdf1ea6c4cd9774fc96921a10c266d7Mindy Pereiraimport java.util.ArrayList;
276f92de64bbdf1ea6c4cd9774fc96921a10c266d7Mindy Pereira
286f92de64bbdf1ea6c4cd9774fc96921a10c266d7Mindy Pereira/**
296f92de64bbdf1ea6c4cd9774fc96921a10c266d7Mindy Pereira * Represents the view mode for the tablet Gmail activity.
306f92de64bbdf1ea6c4cd9774fc96921a10c266d7Mindy Pereira * Transitions between modes should be done through this central object, and UI components that are
316f92de64bbdf1ea6c4cd9774fc96921a10c266d7Mindy Pereira * dependent on the mode should listen to changes on this object.
326f92de64bbdf1ea6c4cd9774fc96921a10c266d7Mindy Pereira */
336f92de64bbdf1ea6c4cd9774fc96921a10c266d7Mindy Pereirapublic class ViewMode {
341ddcf0f2bf44d3c9db89112ef52510d9b2433ac4Vikram Aggarwal    /**
35fa131a2ff399fd1d544f759b063268fb4e8a3e70Vikram Aggarwal     * A listener for changes on a ViewMode. To listen to mode changes, implement this
36fa131a2ff399fd1d544f759b063268fb4e8a3e70Vikram Aggarwal     * interface and register your object with the single ViewMode held by the ActivityController
37fa131a2ff399fd1d544f759b063268fb4e8a3e70Vikram Aggarwal     * instance. On mode changes, the onViewModeChanged method will be called with the new mode.
381ddcf0f2bf44d3c9db89112ef52510d9b2433ac4Vikram Aggarwal     */
39b9e1a353c6a173a2885642dbcc1939f3281f29f7Vikram Aggarwal    public interface ModeChangeListener {
40b9e1a353c6a173a2885642dbcc1939f3281f29f7Vikram Aggarwal        /**
41fa131a2ff399fd1d544f759b063268fb4e8a3e70Vikram Aggarwal         * Called when the mode has changed.
42b9e1a353c6a173a2885642dbcc1939f3281f29f7Vikram Aggarwal         */
43fa131a2ff399fd1d544f759b063268fb4e8a3e70Vikram Aggarwal        void onViewModeChanged(int newMode);
44b9e1a353c6a173a2885642dbcc1939f3281f29f7Vikram Aggarwal    }
45b9e1a353c6a173a2885642dbcc1939f3281f29f7Vikram Aggarwal
461ddcf0f2bf44d3c9db89112ef52510d9b2433ac4Vikram Aggarwal    /**
4791d8d26212f741ec33568f3bc9943f8289a576c8Vikram Aggarwal     * Mode when showing a single conversation.
481ddcf0f2bf44d3c9db89112ef52510d9b2433ac4Vikram Aggarwal     */
498ffe4320a17c3f4234f473e8f0ce083732064aa9Vikram Aggarwal    public static final int CONVERSATION = 1;
501ddcf0f2bf44d3c9db89112ef52510d9b2433ac4Vikram Aggarwal    /**
511ddcf0f2bf44d3c9db89112ef52510d9b2433ac4Vikram Aggarwal     * Mode when showing a list of conversations
521ddcf0f2bf44d3c9db89112ef52510d9b2433ac4Vikram Aggarwal     */
538ffe4320a17c3f4234f473e8f0ce083732064aa9Vikram Aggarwal    public static final int CONVERSATION_LIST = 2;
541ddcf0f2bf44d3c9db89112ef52510d9b2433ac4Vikram Aggarwal    /**
551ddcf0f2bf44d3c9db89112ef52510d9b2433ac4Vikram Aggarwal     * Mode when showing results from user search.
561ddcf0f2bf44d3c9db89112ef52510d9b2433ac4Vikram Aggarwal     */
57aded57845c51f128fc5dbd8e992697823775ce5aScott Kennedy    public static final int SEARCH_RESULTS_LIST = 3;
5868f2e222b4ffccd9f67f02b3a9cfdb3841a7eb43Mindy Pereira    /**
5968f2e222b4ffccd9f67f02b3a9cfdb3841a7eb43Mindy Pereira     * Mode when showing results from user search.
6068f2e222b4ffccd9f67f02b3a9cfdb3841a7eb43Mindy Pereira     */
61aded57845c51f128fc5dbd8e992697823775ce5aScott Kennedy    public static final int SEARCH_RESULTS_CONVERSATION = 4;
62b9e1a353c6a173a2885642dbcc1939f3281f29f7Vikram Aggarwal    /**
632d50bcdca57756ecad20d21da0d936243215b79cPaul Westbrook     * Mode when showing the "waiting for sync" message.
642d50bcdca57756ecad20d21da0d936243215b79cPaul Westbrook     */
65aded57845c51f128fc5dbd8e992697823775ce5aScott Kennedy    public static final int WAITING_FOR_ACCOUNT_INITIALIZATION = 5;
662d50bcdca57756ecad20d21da0d936243215b79cPaul Westbrook    /**
676c570db71b8adc43d7dc2f31e6fa63cf50c1426eAndrew Sapperstein     * Mode when showing ads.
686c570db71b8adc43d7dc2f31e6fa63cf50c1426eAndrew Sapperstein     */
696c570db71b8adc43d7dc2f31e6fa63cf50c1426eAndrew Sapperstein    public static final int AD = 6;
706c570db71b8adc43d7dc2f31e6fa63cf50c1426eAndrew Sapperstein    /**
71b9e1a353c6a173a2885642dbcc1939f3281f29f7Vikram Aggarwal     * Uncertain mode. The mode has not been initialized.
72b9e1a353c6a173a2885642dbcc1939f3281f29f7Vikram Aggarwal     */
738ffe4320a17c3f4234f473e8f0ce083732064aa9Vikram Aggarwal    public static final int UNKNOWN = 0;
7455920575c86c02fe5c4e095b7dfe48b04c1361dfVikram Aggarwal
75b9e1a353c6a173a2885642dbcc1939f3281f29f7Vikram Aggarwal    // Key used to save this {@link ViewMode}.
76b9e1a353c6a173a2885642dbcc1939f3281f29f7Vikram Aggarwal    private static final String VIEW_MODE_KEY = "view-mode";
776f92de64bbdf1ea6c4cd9774fc96921a10c266d7Mindy Pereira    private final ArrayList<ModeChangeListener> mListeners = Lists.newArrayList();
78fa131a2ff399fd1d544f759b063268fb4e8a3e70Vikram Aggarwal    /**
79fa131a2ff399fd1d544f759b063268fb4e8a3e70Vikram Aggarwal     * The actual mode the activity is in. We start out with an UNKNOWN mode, and require entering
80fa131a2ff399fd1d544f759b063268fb4e8a3e70Vikram Aggarwal     * a valid mode after the object has been created.
81fa131a2ff399fd1d544f759b063268fb4e8a3e70Vikram Aggarwal     */
8291d8d26212f741ec33568f3bc9943f8289a576c8Vikram Aggarwal    private int mMode = UNKNOWN;
836f92de64bbdf1ea6c4cd9774fc96921a10c266d7Mindy Pereira
84e6459424b3e46d768865c908af1caa932f783095Andy Huang    public static final String LOG_TAG = "ViewMode";
85e6459424b3e46d768865c908af1caa932f783095Andy Huang
86761522c1ac7a8fa05acde714f0e26fde47f3415fAndy Huang    // friendly names (not user-facing) for each view mode, indexed by ordinal value.
87761522c1ac7a8fa05acde714f0e26fde47f3415fAndy Huang    private static final String[] MODE_NAMES = {
88761522c1ac7a8fa05acde714f0e26fde47f3415fAndy Huang        "Unknown",
89761522c1ac7a8fa05acde714f0e26fde47f3415fAndy Huang        "Conversation",
90761522c1ac7a8fa05acde714f0e26fde47f3415fAndy Huang        "Conversation list",
91761522c1ac7a8fa05acde714f0e26fde47f3415fAndy Huang        "Search results list",
92761522c1ac7a8fa05acde714f0e26fde47f3415fAndy Huang        "Search results conversation",
93761522c1ac7a8fa05acde714f0e26fde47f3415fAndy Huang        "Waiting for sync",
94761522c1ac7a8fa05acde714f0e26fde47f3415fAndy Huang        "Ad"
95761522c1ac7a8fa05acde714f0e26fde47f3415fAndy Huang    };
96761522c1ac7a8fa05acde714f0e26fde47f3415fAndy Huang
973b965d78774a42358ce6bbdcc43b4c8df130a60eScott Kennedy    public ViewMode() {
98fa131a2ff399fd1d544f759b063268fb4e8a3e70Vikram Aggarwal        // Do nothing
996f92de64bbdf1ea6c4cd9774fc96921a10c266d7Mindy Pereira    }
1006f92de64bbdf1ea6c4cd9774fc96921a10c266d7Mindy Pereira
101e6459424b3e46d768865c908af1caa932f783095Andy Huang    @Override
102e6459424b3e46d768865c908af1caa932f783095Andy Huang    public String toString() {
103761522c1ac7a8fa05acde714f0e26fde47f3415fAndy Huang        return "[mode=" + MODE_NAMES[mMode] + "]";
104761522c1ac7a8fa05acde714f0e26fde47f3415fAndy Huang    }
105761522c1ac7a8fa05acde714f0e26fde47f3415fAndy Huang
106761522c1ac7a8fa05acde714f0e26fde47f3415fAndy Huang    public String getModeString() {
107761522c1ac7a8fa05acde714f0e26fde47f3415fAndy Huang        return MODE_NAMES[mMode];
108e6459424b3e46d768865c908af1caa932f783095Andy Huang    }
109e6459424b3e46d768865c908af1caa932f783095Andy Huang
1106f92de64bbdf1ea6c4cd9774fc96921a10c266d7Mindy Pereira    /**
111d7a12cd5b5c2639b653d8c671b04844ef02ee01dVikram Aggarwal     * Adds a listener from this view mode.
112b9e1a353c6a173a2885642dbcc1939f3281f29f7Vikram Aggarwal     * Must happen in the UI thread.
1136f92de64bbdf1ea6c4cd9774fc96921a10c266d7Mindy Pereira     */
114b9e1a353c6a173a2885642dbcc1939f3281f29f7Vikram Aggarwal    public void addListener(ModeChangeListener listener) {
115b9e1a353c6a173a2885642dbcc1939f3281f29f7Vikram Aggarwal        mListeners.add(listener);
1166f92de64bbdf1ea6c4cd9774fc96921a10c266d7Mindy Pereira    }
1176f92de64bbdf1ea6c4cd9774fc96921a10c266d7Mindy Pereira
1186f92de64bbdf1ea6c4cd9774fc96921a10c266d7Mindy Pereira    /**
119b9e1a353c6a173a2885642dbcc1939f3281f29f7Vikram Aggarwal     * Dispatches a change event for the mode.
120b9e1a353c6a173a2885642dbcc1939f3281f29f7Vikram Aggarwal     * Always happens in the UI thread.
1216f92de64bbdf1ea6c4cd9774fc96921a10c266d7Mindy Pereira     */
1223825f3d2284b2b57fadcfe6a4ebd9992f3c5c7bbAndy Huang    private void dispatchModeChange() {
123b9e1a353c6a173a2885642dbcc1939f3281f29f7Vikram Aggarwal        ArrayList<ModeChangeListener> list = new ArrayList<ModeChangeListener>(mListeners);
124b9e1a353c6a173a2885642dbcc1939f3281f29f7Vikram Aggarwal        for (ModeChangeListener listener : list) {
1252175d0a93263672d4498458c81b404b0999134baVikram Aggarwal            assert (listener != null);
1263825f3d2284b2b57fadcfe6a4ebd9992f3c5c7bbAndy Huang            listener.onViewModeChanged(mMode);
1276f92de64bbdf1ea6c4cd9774fc96921a10c266d7Mindy Pereira        }
1286f92de64bbdf1ea6c4cd9774fc96921a10c266d7Mindy Pereira    }
1296f92de64bbdf1ea6c4cd9774fc96921a10c266d7Mindy Pereira
1306f92de64bbdf1ea6c4cd9774fc96921a10c266d7Mindy Pereira    /**
131fa131a2ff399fd1d544f759b063268fb4e8a3e70Vikram Aggarwal     * Requests a transition of the mode to show the conversation list as the prominent view.
132e6459424b3e46d768865c908af1caa932f783095Andy Huang     *
1336f92de64bbdf1ea6c4cd9774fc96921a10c266d7Mindy Pereira     */
134e6459424b3e46d768865c908af1caa932f783095Andy Huang    public void enterConversationListMode() {
135e6459424b3e46d768865c908af1caa932f783095Andy Huang        setModeInternal(CONVERSATION_LIST);
1366f92de64bbdf1ea6c4cd9774fc96921a10c266d7Mindy Pereira    }
1376f92de64bbdf1ea6c4cd9774fc96921a10c266d7Mindy Pereira
138fa131a2ff399fd1d544f759b063268fb4e8a3e70Vikram Aggarwal    /**
139fa131a2ff399fd1d544f759b063268fb4e8a3e70Vikram Aggarwal     * Requests a transition of the mode to show a conversation as the prominent view.
140e6459424b3e46d768865c908af1caa932f783095Andy Huang     *
141fa131a2ff399fd1d544f759b063268fb4e8a3e70Vikram Aggarwal     */
142e6459424b3e46d768865c908af1caa932f783095Andy Huang    public void enterConversationMode() {
143e6459424b3e46d768865c908af1caa932f783095Andy Huang        setModeInternal(CONVERSATION);
1446f92de64bbdf1ea6c4cd9774fc96921a10c266d7Mindy Pereira    }
1456f92de64bbdf1ea6c4cd9774fc96921a10c266d7Mindy Pereira
146fa131a2ff399fd1d544f759b063268fb4e8a3e70Vikram Aggarwal    /**
14768f2e222b4ffccd9f67f02b3a9cfdb3841a7eb43Mindy Pereira     * Requests a transition of the mode to show a list of search results as the
14868f2e222b4ffccd9f67f02b3a9cfdb3841a7eb43Mindy Pereira     * prominent view.
14968f2e222b4ffccd9f67f02b3a9cfdb3841a7eb43Mindy Pereira     *
15068f2e222b4ffccd9f67f02b3a9cfdb3841a7eb43Mindy Pereira     */
151e6459424b3e46d768865c908af1caa932f783095Andy Huang    public void enterSearchResultsListMode() {
152e6459424b3e46d768865c908af1caa932f783095Andy Huang        setModeInternal(SEARCH_RESULTS_LIST);
15368f2e222b4ffccd9f67f02b3a9cfdb3841a7eb43Mindy Pereira    }
15468f2e222b4ffccd9f67f02b3a9cfdb3841a7eb43Mindy Pereira
15568f2e222b4ffccd9f67f02b3a9cfdb3841a7eb43Mindy Pereira    /**
15668f2e222b4ffccd9f67f02b3a9cfdb3841a7eb43Mindy Pereira     * Requests a transition of the mode to show a conversation that was part of
15768f2e222b4ffccd9f67f02b3a9cfdb3841a7eb43Mindy Pereira     * search results.
15868f2e222b4ffccd9f67f02b3a9cfdb3841a7eb43Mindy Pereira     *
15968f2e222b4ffccd9f67f02b3a9cfdb3841a7eb43Mindy Pereira     */
160e6459424b3e46d768865c908af1caa932f783095Andy Huang    public void enterSearchResultsConversationMode() {
161e6459424b3e46d768865c908af1caa932f783095Andy Huang        setModeInternal(SEARCH_RESULTS_CONVERSATION);
16268f2e222b4ffccd9f67f02b3a9cfdb3841a7eb43Mindy Pereira    }
16368f2e222b4ffccd9f67f02b3a9cfdb3841a7eb43Mindy Pereira
16468f2e222b4ffccd9f67f02b3a9cfdb3841a7eb43Mindy Pereira    /**
1652d50bcdca57756ecad20d21da0d936243215b79cPaul Westbrook     * Requests a transition of the mode to show the "waiting for sync" messages
1662d50bcdca57756ecad20d21da0d936243215b79cPaul Westbrook     *
1672d50bcdca57756ecad20d21da0d936243215b79cPaul Westbrook     */
168e6459424b3e46d768865c908af1caa932f783095Andy Huang    public void enterWaitingForInitializationMode() {
169e6459424b3e46d768865c908af1caa932f783095Andy Huang        setModeInternal(WAITING_FOR_ACCOUNT_INITIALIZATION);
1702d50bcdca57756ecad20d21da0d936243215b79cPaul Westbrook    }
1712d50bcdca57756ecad20d21da0d936243215b79cPaul Westbrook
1722d50bcdca57756ecad20d21da0d936243215b79cPaul Westbrook    /**
1736c570db71b8adc43d7dc2f31e6fa63cf50c1426eAndrew Sapperstein     * Requests a transition of the mode to show an ad.
1746c570db71b8adc43d7dc2f31e6fa63cf50c1426eAndrew Sapperstein     */
1756c570db71b8adc43d7dc2f31e6fa63cf50c1426eAndrew Sapperstein    public void enterAdMode() {
1766c570db71b8adc43d7dc2f31e6fa63cf50c1426eAndrew Sapperstein        setModeInternal(AD);
1776c570db71b8adc43d7dc2f31e6fa63cf50c1426eAndrew Sapperstein    }
1786c570db71b8adc43d7dc2f31e6fa63cf50c1426eAndrew Sapperstein
1796c570db71b8adc43d7dc2f31e6fa63cf50c1426eAndrew Sapperstein    /**
180fa131a2ff399fd1d544f759b063268fb4e8a3e70Vikram Aggarwal     * @return The current mode.
181fa131a2ff399fd1d544f759b063268fb4e8a3e70Vikram Aggarwal     */
182fa131a2ff399fd1d544f759b063268fb4e8a3e70Vikram Aggarwal    public int getMode() {
183fa131a2ff399fd1d544f759b063268fb4e8a3e70Vikram Aggarwal        return mMode;
184b9e1a353c6a173a2885642dbcc1939f3281f29f7Vikram Aggarwal    }
185b9e1a353c6a173a2885642dbcc1939f3281f29f7Vikram Aggarwal
186fa131a2ff399fd1d544f759b063268fb4e8a3e70Vikram Aggarwal    /**
187b466bcf49502a1178cf7362a81470f3231d8892bMindy Pereira     * Return whether the current mode is considered a list mode.
188b466bcf49502a1178cf7362a81470f3231d8892bMindy Pereira     */
189b466bcf49502a1178cf7362a81470f3231d8892bMindy Pereira    public boolean isListMode() {
190a3ed834c959ece3453c1b34953fabecb3b19c424Andy Huang        return isListMode(mMode);
191a3ed834c959ece3453c1b34953fabecb3b19c424Andy Huang    }
192a3ed834c959ece3453c1b34953fabecb3b19c424Andy Huang
193c5796fd595ffe3ea74fb69dfad1ea0bfe82f1eb4Rohan Shah    public static boolean isListMode(final int mode) {
194a3ed834c959ece3453c1b34953fabecb3b19c424Andy Huang        return mode == CONVERSATION_LIST || mode == SEARCH_RESULTS_LIST;
195a3ed834c959ece3453c1b34953fabecb3b19c424Andy Huang    }
196a3ed834c959ece3453c1b34953fabecb3b19c424Andy Huang
197a3ed834c959ece3453c1b34953fabecb3b19c424Andy Huang    public boolean isConversationMode() {
198a3ed834c959ece3453c1b34953fabecb3b19c424Andy Huang        return isConversationMode(mMode);
199a3ed834c959ece3453c1b34953fabecb3b19c424Andy Huang    }
200a3ed834c959ece3453c1b34953fabecb3b19c424Andy Huang
201c5796fd595ffe3ea74fb69dfad1ea0bfe82f1eb4Rohan Shah    public static boolean isConversationMode(final int mode) {
202a3ed834c959ece3453c1b34953fabecb3b19c424Andy Huang        return mode == CONVERSATION || mode == SEARCH_RESULTS_CONVERSATION;
203b466bcf49502a1178cf7362a81470f3231d8892bMindy Pereira    }
204b466bcf49502a1178cf7362a81470f3231d8892bMindy Pereira
205c5796fd595ffe3ea74fb69dfad1ea0bfe82f1eb4Rohan Shah    public static boolean isSearchMode(final int mode) {
206c5796fd595ffe3ea74fb69dfad1ea0bfe82f1eb4Rohan Shah        return mode == SEARCH_RESULTS_LIST || mode == SEARCH_RESULTS_CONVERSATION;
207c5796fd595ffe3ea74fb69dfad1ea0bfe82f1eb4Rohan Shah    }
208c5796fd595ffe3ea74fb69dfad1ea0bfe82f1eb4Rohan Shah
209a88304d638bfe9ba9a29b7c3f9c4f60d23a9b461Rohan Shah    public boolean isWaitingForSync() {
210c5796fd595ffe3ea74fb69dfad1ea0bfe82f1eb4Rohan Shah        return isWaitingForSync(mMode);
211c5796fd595ffe3ea74fb69dfad1ea0bfe82f1eb4Rohan Shah    }
212c5796fd595ffe3ea74fb69dfad1ea0bfe82f1eb4Rohan Shah
213c5796fd595ffe3ea74fb69dfad1ea0bfe82f1eb4Rohan Shah    public static boolean isWaitingForSync(final int mode) {
214c5796fd595ffe3ea74fb69dfad1ea0bfe82f1eb4Rohan Shah        return mode == WAITING_FOR_ACCOUNT_INITIALIZATION;
215a88304d638bfe9ba9a29b7c3f9c4f60d23a9b461Rohan Shah    }
216a88304d638bfe9ba9a29b7c3f9c4f60d23a9b461Rohan Shah
2176c570db71b8adc43d7dc2f31e6fa63cf50c1426eAndrew Sapperstein    public boolean isAdMode() {
2186c570db71b8adc43d7dc2f31e6fa63cf50c1426eAndrew Sapperstein        return isAdMode(mMode);
2196c570db71b8adc43d7dc2f31e6fa63cf50c1426eAndrew Sapperstein    }
2206c570db71b8adc43d7dc2f31e6fa63cf50c1426eAndrew Sapperstein
2216c570db71b8adc43d7dc2f31e6fa63cf50c1426eAndrew Sapperstein    public static boolean isAdMode(final int mode) {
2226c570db71b8adc43d7dc2f31e6fa63cf50c1426eAndrew Sapperstein        return mode == AD;
2236c570db71b8adc43d7dc2f31e6fa63cf50c1426eAndrew Sapperstein    }
2246c570db71b8adc43d7dc2f31e6fa63cf50c1426eAndrew Sapperstein
225b466bcf49502a1178cf7362a81470f3231d8892bMindy Pereira    /**
226fa131a2ff399fd1d544f759b063268fb4e8a3e70Vikram Aggarwal     * Restoring from a saved state restores only the mode. It does not restore the listeners of
227fa131a2ff399fd1d544f759b063268fb4e8a3e70Vikram Aggarwal     * this object.
228fa131a2ff399fd1d544f759b063268fb4e8a3e70Vikram Aggarwal     * @param inState
229fa131a2ff399fd1d544f759b063268fb4e8a3e70Vikram Aggarwal     */
230fa131a2ff399fd1d544f759b063268fb4e8a3e70Vikram Aggarwal    public void handleRestore(Bundle inState) {
231649b9ea3653da73fac0c33c8fb0af18baad12ac3Vikram Aggarwal        if (inState == null) {
232649b9ea3653da73fac0c33c8fb0af18baad12ac3Vikram Aggarwal            return;
233649b9ea3653da73fac0c33c8fb0af18baad12ac3Vikram Aggarwal        }
234649b9ea3653da73fac0c33c8fb0af18baad12ac3Vikram Aggarwal        // Restore the previous mode, and UNKNOWN if nothing exists.
235649b9ea3653da73fac0c33c8fb0af18baad12ac3Vikram Aggarwal        final int newMode = inState.getInt(VIEW_MODE_KEY, UNKNOWN);
236649b9ea3653da73fac0c33c8fb0af18baad12ac3Vikram Aggarwal        if (newMode != UNKNOWN) {
237649b9ea3653da73fac0c33c8fb0af18baad12ac3Vikram Aggarwal            setModeInternal(newMode);
238649b9ea3653da73fac0c33c8fb0af18baad12ac3Vikram Aggarwal        }
2396f92de64bbdf1ea6c4cd9774fc96921a10c266d7Mindy Pereira    }
2406f92de64bbdf1ea6c4cd9774fc96921a10c266d7Mindy Pereira
241b9e1a353c6a173a2885642dbcc1939f3281f29f7Vikram Aggarwal    /**
242fa131a2ff399fd1d544f759b063268fb4e8a3e70Vikram Aggarwal     * Save the existing mode only. Does not save the existing listeners.
243fa131a2ff399fd1d544f759b063268fb4e8a3e70Vikram Aggarwal     * @param outState
244b9e1a353c6a173a2885642dbcc1939f3281f29f7Vikram Aggarwal     */
245fa131a2ff399fd1d544f759b063268fb4e8a3e70Vikram Aggarwal    public void handleSaveInstanceState(Bundle outState) {
246649b9ea3653da73fac0c33c8fb0af18baad12ac3Vikram Aggarwal        if (outState == null) {
247649b9ea3653da73fac0c33c8fb0af18baad12ac3Vikram Aggarwal            return;
248649b9ea3653da73fac0c33c8fb0af18baad12ac3Vikram Aggarwal        }
249fa131a2ff399fd1d544f759b063268fb4e8a3e70Vikram Aggarwal        outState.putInt(VIEW_MODE_KEY, mMode);
2506f92de64bbdf1ea6c4cd9774fc96921a10c266d7Mindy Pereira    }
2516f92de64bbdf1ea6c4cd9774fc96921a10c266d7Mindy Pereira
252b9e1a353c6a173a2885642dbcc1939f3281f29f7Vikram Aggarwal    /**
253b9e1a353c6a173a2885642dbcc1939f3281f29f7Vikram Aggarwal     * Removes a listener from this view mode.
254b9e1a353c6a173a2885642dbcc1939f3281f29f7Vikram Aggarwal     * Must happen in the UI thread.
255b9e1a353c6a173a2885642dbcc1939f3281f29f7Vikram Aggarwal     */
256b9e1a353c6a173a2885642dbcc1939f3281f29f7Vikram Aggarwal    public void removeListener(ModeChangeListener listener) {
257b9e1a353c6a173a2885642dbcc1939f3281f29f7Vikram Aggarwal        mListeners.remove(listener);
2586f92de64bbdf1ea6c4cd9774fc96921a10c266d7Mindy Pereira    }
2596f92de64bbdf1ea6c4cd9774fc96921a10c266d7Mindy Pereira
2606f92de64bbdf1ea6c4cd9774fc96921a10c266d7Mindy Pereira    /**
261b9e1a353c6a173a2885642dbcc1939f3281f29f7Vikram Aggarwal     * Sets the internal mode.
262fa131a2ff399fd1d544f759b063268fb4e8a3e70Vikram Aggarwal     * @return Whether or not a change occurred.
2636f92de64bbdf1ea6c4cd9774fc96921a10c266d7Mindy Pereira     */
26491d8d26212f741ec33568f3bc9943f8289a576c8Vikram Aggarwal    private boolean setModeInternal(int mode) {
265b9e1a353c6a173a2885642dbcc1939f3281f29f7Vikram Aggarwal        if (mMode == mode) {
266e6459424b3e46d768865c908af1caa932f783095Andy Huang            if (LogUtils.isLoggable(LOG_TAG, LogUtils.DEBUG)) {
267e6459424b3e46d768865c908af1caa932f783095Andy Huang                LogUtils.d(LOG_TAG, new Error(), "ViewMode: debouncing change attempt mode=%s",
268e6459424b3e46d768865c908af1caa932f783095Andy Huang                        mode);
269e6459424b3e46d768865c908af1caa932f783095Andy Huang            } else {
270e6459424b3e46d768865c908af1caa932f783095Andy Huang                LogUtils.i(LOG_TAG, "ViewMode: debouncing change attempt mode=%s", mode);
271e6459424b3e46d768865c908af1caa932f783095Andy Huang            }
272b9e1a353c6a173a2885642dbcc1939f3281f29f7Vikram Aggarwal            return false;
273b9e1a353c6a173a2885642dbcc1939f3281f29f7Vikram Aggarwal        }
274e6459424b3e46d768865c908af1caa932f783095Andy Huang
275e6459424b3e46d768865c908af1caa932f783095Andy Huang        if (LogUtils.isLoggable(LOG_TAG, LogUtils.DEBUG)) {
276e6459424b3e46d768865c908af1caa932f783095Andy Huang            LogUtils.d(LOG_TAG, new Error(), "ViewMode: executing change old=%s new=%s", mMode,
277e6459424b3e46d768865c908af1caa932f783095Andy Huang                    mode);
278e6459424b3e46d768865c908af1caa932f783095Andy Huang        } else {
279e6459424b3e46d768865c908af1caa932f783095Andy Huang            LogUtils.i(LOG_TAG, "ViewMode: executing change old=%s new=%s", mMode, mode);
280e6459424b3e46d768865c908af1caa932f783095Andy Huang        }
281e6459424b3e46d768865c908af1caa932f783095Andy Huang
2823825f3d2284b2b57fadcfe6a4ebd9992f3c5c7bbAndy Huang        mMode = mode;
2833825f3d2284b2b57fadcfe6a4ebd9992f3c5c7bbAndy Huang        dispatchModeChange();
284761522c1ac7a8fa05acde714f0e26fde47f3415fAndy Huang        Analytics.getInstance().sendView("ViewMode" + toString());
285b9e1a353c6a173a2885642dbcc1939f3281f29f7Vikram Aggarwal        return true;
2866f92de64bbdf1ea6c4cd9774fc96921a10c266d7Mindy Pereira    }
2876f92de64bbdf1ea6c4cd9774fc96921a10c266d7Mindy Pereira}
288