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