ViewMode.java revision a88304d638bfe9ba9a29b7c3f9c4f60d23a9b461
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 17349e0e991fe8880852b936a0f8d7d57c5b36f2154Vikram Aggarwal public static final boolean isListMode(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 18149e0e991fe8880852b936a0f8d7d57c5b36f2154Vikram Aggarwal public static final boolean isConversationMode(int mode) { 182a3ed834c959ece3453c1b34953fabecb3b19c424Andy Huang return mode == CONVERSATION || mode == SEARCH_RESULTS_CONVERSATION; 183b466bcf49502a1178cf7362a81470f3231d8892bMindy Pereira } 184b466bcf49502a1178cf7362a81470f3231d8892bMindy Pereira 185a88304d638bfe9ba9a29b7c3f9c4f60d23a9b461Rohan Shah public boolean isWaitingForSync() { 186a88304d638bfe9ba9a29b7c3f9c4f60d23a9b461Rohan Shah return mMode == WAITING_FOR_ACCOUNT_INITIALIZATION; 187a88304d638bfe9ba9a29b7c3f9c4f60d23a9b461Rohan Shah } 188a88304d638bfe9ba9a29b7c3f9c4f60d23a9b461Rohan Shah 189b466bcf49502a1178cf7362a81470f3231d8892bMindy Pereira /** 190fa131a2ff399fd1d544f759b063268fb4e8a3e70Vikram Aggarwal * Restoring from a saved state restores only the mode. It does not restore the listeners of 191fa131a2ff399fd1d544f759b063268fb4e8a3e70Vikram Aggarwal * this object. 192fa131a2ff399fd1d544f759b063268fb4e8a3e70Vikram Aggarwal * @param inState 193fa131a2ff399fd1d544f759b063268fb4e8a3e70Vikram Aggarwal */ 194fa131a2ff399fd1d544f759b063268fb4e8a3e70Vikram Aggarwal public void handleRestore(Bundle inState) { 195649b9ea3653da73fac0c33c8fb0af18baad12ac3Vikram Aggarwal if (inState == null) { 196649b9ea3653da73fac0c33c8fb0af18baad12ac3Vikram Aggarwal return; 197649b9ea3653da73fac0c33c8fb0af18baad12ac3Vikram Aggarwal } 198649b9ea3653da73fac0c33c8fb0af18baad12ac3Vikram Aggarwal // Restore the previous mode, and UNKNOWN if nothing exists. 199649b9ea3653da73fac0c33c8fb0af18baad12ac3Vikram Aggarwal final int newMode = inState.getInt(VIEW_MODE_KEY, UNKNOWN); 200649b9ea3653da73fac0c33c8fb0af18baad12ac3Vikram Aggarwal if (newMode != UNKNOWN) { 201649b9ea3653da73fac0c33c8fb0af18baad12ac3Vikram Aggarwal setModeInternal(newMode); 202649b9ea3653da73fac0c33c8fb0af18baad12ac3Vikram Aggarwal } 2036f92de64bbdf1ea6c4cd9774fc96921a10c266d7Mindy Pereira } 2046f92de64bbdf1ea6c4cd9774fc96921a10c266d7Mindy Pereira 205b9e1a353c6a173a2885642dbcc1939f3281f29f7Vikram Aggarwal /** 206fa131a2ff399fd1d544f759b063268fb4e8a3e70Vikram Aggarwal * Save the existing mode only. Does not save the existing listeners. 207fa131a2ff399fd1d544f759b063268fb4e8a3e70Vikram Aggarwal * @param outState 208b9e1a353c6a173a2885642dbcc1939f3281f29f7Vikram Aggarwal */ 209fa131a2ff399fd1d544f759b063268fb4e8a3e70Vikram Aggarwal public void handleSaveInstanceState(Bundle outState) { 210649b9ea3653da73fac0c33c8fb0af18baad12ac3Vikram Aggarwal if (outState == null) { 211649b9ea3653da73fac0c33c8fb0af18baad12ac3Vikram Aggarwal return; 212649b9ea3653da73fac0c33c8fb0af18baad12ac3Vikram Aggarwal } 213fa131a2ff399fd1d544f759b063268fb4e8a3e70Vikram Aggarwal outState.putInt(VIEW_MODE_KEY, mMode); 2146f92de64bbdf1ea6c4cd9774fc96921a10c266d7Mindy Pereira } 2156f92de64bbdf1ea6c4cd9774fc96921a10c266d7Mindy Pereira 216b9e1a353c6a173a2885642dbcc1939f3281f29f7Vikram Aggarwal /** 217b9e1a353c6a173a2885642dbcc1939f3281f29f7Vikram Aggarwal * Removes a listener from this view mode. 218b9e1a353c6a173a2885642dbcc1939f3281f29f7Vikram Aggarwal * Must happen in the UI thread. 219b9e1a353c6a173a2885642dbcc1939f3281f29f7Vikram Aggarwal */ 220b9e1a353c6a173a2885642dbcc1939f3281f29f7Vikram Aggarwal public void removeListener(ModeChangeListener listener) { 221b9e1a353c6a173a2885642dbcc1939f3281f29f7Vikram Aggarwal mListeners.remove(listener); 2226f92de64bbdf1ea6c4cd9774fc96921a10c266d7Mindy Pereira } 2236f92de64bbdf1ea6c4cd9774fc96921a10c266d7Mindy Pereira 2246f92de64bbdf1ea6c4cd9774fc96921a10c266d7Mindy Pereira /** 225b9e1a353c6a173a2885642dbcc1939f3281f29f7Vikram Aggarwal * Sets the internal mode. 226fa131a2ff399fd1d544f759b063268fb4e8a3e70Vikram Aggarwal * @return Whether or not a change occurred. 2276f92de64bbdf1ea6c4cd9774fc96921a10c266d7Mindy Pereira */ 22891d8d26212f741ec33568f3bc9943f8289a576c8Vikram Aggarwal private boolean setModeInternal(int mode) { 229b9e1a353c6a173a2885642dbcc1939f3281f29f7Vikram Aggarwal if (mMode == mode) { 230b9e1a353c6a173a2885642dbcc1939f3281f29f7Vikram Aggarwal return false; 231b9e1a353c6a173a2885642dbcc1939f3281f29f7Vikram Aggarwal } 2323825f3d2284b2b57fadcfe6a4ebd9992f3c5c7bbAndy Huang mMode = mode; 2333825f3d2284b2b57fadcfe6a4ebd9992f3c5c7bbAndy Huang dispatchModeChange(); 234b9e1a353c6a173a2885642dbcc1939f3281f29f7Vikram Aggarwal return true; 2356f92de64bbdf1ea6c4cd9774fc96921a10c266d7Mindy Pereira } 2366f92de64bbdf1ea6c4cd9774fc96921a10c266d7Mindy Pereira} 237