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