ViewMode.java revision 6f92de64bbdf1ea6c4cd9774fc96921a10c266d7
16f92de64bbdf1ea6c4cd9774fc96921a10c266d7Mindy Pereira/** 26f92de64bbdf1ea6c4cd9774fc96921a10c266d7Mindy Pereira * Copyright (c) 2011, Google Inc. 36f92de64bbdf1ea6c4cd9774fc96921a10c266d7Mindy Pereira * 46f92de64bbdf1ea6c4cd9774fc96921a10c266d7Mindy Pereira * Licensed under the Apache License, Version 2.0 (the "License"); 56f92de64bbdf1ea6c4cd9774fc96921a10c266d7Mindy Pereira * you may not use this file except in compliance with the License. 66f92de64bbdf1ea6c4cd9774fc96921a10c266d7Mindy Pereira * You may obtain a copy of the License at 76f92de64bbdf1ea6c4cd9774fc96921a10c266d7Mindy Pereira * 86f92de64bbdf1ea6c4cd9774fc96921a10c266d7Mindy Pereira * http://www.apache.org/licenses/LICENSE-2.0 96f92de64bbdf1ea6c4cd9774fc96921a10c266d7Mindy Pereira * 106f92de64bbdf1ea6c4cd9774fc96921a10c266d7Mindy Pereira * Unless required by applicable law or agreed to in writing, software 116f92de64bbdf1ea6c4cd9774fc96921a10c266d7Mindy Pereira * distributed under the License is distributed on an "AS IS" BASIS, 126f92de64bbdf1ea6c4cd9774fc96921a10c266d7Mindy Pereira * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 136f92de64bbdf1ea6c4cd9774fc96921a10c266d7Mindy Pereira * See the License for the specific language governing permissions and 146f92de64bbdf1ea6c4cd9774fc96921a10c266d7Mindy Pereira * limitations under the License. 156f92de64bbdf1ea6c4cd9774fc96921a10c266d7Mindy Pereira */ 166f92de64bbdf1ea6c4cd9774fc96921a10c266d7Mindy Pereira 176f92de64bbdf1ea6c4cd9774fc96921a10c266d7Mindy Pereirapackage com.android.email; 186f92de64bbdf1ea6c4cd9774fc96921a10c266d7Mindy Pereira 196f92de64bbdf1ea6c4cd9774fc96921a10c266d7Mindy Pereiraimport com.android.email.utils.Utils; 206f92de64bbdf1ea6c4cd9774fc96921a10c266d7Mindy Pereiraimport com.google.common.collect.Lists; 216f92de64bbdf1ea6c4cd9774fc96921a10c266d7Mindy Pereira 226f92de64bbdf1ea6c4cd9774fc96921a10c266d7Mindy Pereiraimport android.content.Context; 236f92de64bbdf1ea6c4cd9774fc96921a10c266d7Mindy Pereiraimport android.os.Bundle; 246f92de64bbdf1ea6c4cd9774fc96921a10c266d7Mindy Pereira 256f92de64bbdf1ea6c4cd9774fc96921a10c266d7Mindy Pereiraimport java.util.ArrayList; 266f92de64bbdf1ea6c4cd9774fc96921a10c266d7Mindy Pereira 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 { 346f92de64bbdf1ea6c4cd9774fc96921a10c266d7Mindy Pereira // Key used to save this {@link ViewMode}. 356f92de64bbdf1ea6c4cd9774fc96921a10c266d7Mindy Pereira private static final String VIEW_MODE_KEY = "view-mode"; 366f92de64bbdf1ea6c4cd9774fc96921a10c266d7Mindy Pereira 376f92de64bbdf1ea6c4cd9774fc96921a10c266d7Mindy Pereira public static final int MODE_UNKNOWN = 0; 386f92de64bbdf1ea6c4cd9774fc96921a10c266d7Mindy Pereira public static final int MODE_LABEL_LIST = 1; 396f92de64bbdf1ea6c4cd9774fc96921a10c266d7Mindy Pereira public static final int MODE_CONVERSATION_LIST = 2; 406f92de64bbdf1ea6c4cd9774fc96921a10c266d7Mindy Pereira public static final int MODE_CONVERSATION = 3; 416f92de64bbdf1ea6c4cd9774fc96921a10c266d7Mindy Pereira 426f92de64bbdf1ea6c4cd9774fc96921a10c266d7Mindy Pereira private int mMode = MODE_UNKNOWN; 436f92de64bbdf1ea6c4cd9774fc96921a10c266d7Mindy Pereira private final boolean mTwoPane; 446f92de64bbdf1ea6c4cd9774fc96921a10c266d7Mindy Pereira private final ArrayList<ModeChangeListener> mListeners = Lists.newArrayList(); 456f92de64bbdf1ea6c4cd9774fc96921a10c266d7Mindy Pereira 466f92de64bbdf1ea6c4cd9774fc96921a10c266d7Mindy Pereira public ViewMode(Context context) { 476f92de64bbdf1ea6c4cd9774fc96921a10c266d7Mindy Pereira mTwoPane = Utils.useTabletUI(context); 486f92de64bbdf1ea6c4cd9774fc96921a10c266d7Mindy Pereira } 496f92de64bbdf1ea6c4cd9774fc96921a10c266d7Mindy Pereira 506f92de64bbdf1ea6c4cd9774fc96921a10c266d7Mindy Pereira /** 516f92de64bbdf1ea6c4cd9774fc96921a10c266d7Mindy Pereira * Requests a transition of the mode to show a conversation as the prominent view. 526f92de64bbdf1ea6c4cd9774fc96921a10c266d7Mindy Pereira * @return Whether or not a change occured. 536f92de64bbdf1ea6c4cd9774fc96921a10c266d7Mindy Pereira */ 546f92de64bbdf1ea6c4cd9774fc96921a10c266d7Mindy Pereira public boolean transitionToConversationMode() { 556f92de64bbdf1ea6c4cd9774fc96921a10c266d7Mindy Pereira return setModeInternal(MODE_CONVERSATION); 566f92de64bbdf1ea6c4cd9774fc96921a10c266d7Mindy Pereira } 576f92de64bbdf1ea6c4cd9774fc96921a10c266d7Mindy Pereira 586f92de64bbdf1ea6c4cd9774fc96921a10c266d7Mindy Pereira /** 596f92de64bbdf1ea6c4cd9774fc96921a10c266d7Mindy Pereira * Requests a transition of the mode to show the conversation list as the prominent view. 606f92de64bbdf1ea6c4cd9774fc96921a10c266d7Mindy Pereira * @return Whether or not a change occured. 616f92de64bbdf1ea6c4cd9774fc96921a10c266d7Mindy Pereira */ 626f92de64bbdf1ea6c4cd9774fc96921a10c266d7Mindy Pereira public boolean transitionToConversationListMode() { 636f92de64bbdf1ea6c4cd9774fc96921a10c266d7Mindy Pereira return setModeInternal(MODE_CONVERSATION_LIST); 646f92de64bbdf1ea6c4cd9774fc96921a10c266d7Mindy Pereira } 656f92de64bbdf1ea6c4cd9774fc96921a10c266d7Mindy Pereira 666f92de64bbdf1ea6c4cd9774fc96921a10c266d7Mindy Pereira /** 676f92de64bbdf1ea6c4cd9774fc96921a10c266d7Mindy Pereira * Requests a transition of the mode to show the label list as the prominent view. 686f92de64bbdf1ea6c4cd9774fc96921a10c266d7Mindy Pereira * @return Whether or not a change occured. 696f92de64bbdf1ea6c4cd9774fc96921a10c266d7Mindy Pereira */ 706f92de64bbdf1ea6c4cd9774fc96921a10c266d7Mindy Pereira public boolean transitionToLabelListMode() { 716f92de64bbdf1ea6c4cd9774fc96921a10c266d7Mindy Pereira return setModeInternal(MODE_LABEL_LIST); 726f92de64bbdf1ea6c4cd9774fc96921a10c266d7Mindy Pereira } 736f92de64bbdf1ea6c4cd9774fc96921a10c266d7Mindy Pereira 746f92de64bbdf1ea6c4cd9774fc96921a10c266d7Mindy Pereira /** 756f92de64bbdf1ea6c4cd9774fc96921a10c266d7Mindy Pereira * Sets the internal mode. 766f92de64bbdf1ea6c4cd9774fc96921a10c266d7Mindy Pereira * @return Whether or not a change occured. 776f92de64bbdf1ea6c4cd9774fc96921a10c266d7Mindy Pereira */ 786f92de64bbdf1ea6c4cd9774fc96921a10c266d7Mindy Pereira private boolean setModeInternal(int mode) { 796f92de64bbdf1ea6c4cd9774fc96921a10c266d7Mindy Pereira if (mMode == mode) { 806f92de64bbdf1ea6c4cd9774fc96921a10c266d7Mindy Pereira return false; 816f92de64bbdf1ea6c4cd9774fc96921a10c266d7Mindy Pereira } 826f92de64bbdf1ea6c4cd9774fc96921a10c266d7Mindy Pereira 836f92de64bbdf1ea6c4cd9774fc96921a10c266d7Mindy Pereira mMode = mode; 846f92de64bbdf1ea6c4cd9774fc96921a10c266d7Mindy Pereira dispatchModeChange(); 856f92de64bbdf1ea6c4cd9774fc96921a10c266d7Mindy Pereira return true; 866f92de64bbdf1ea6c4cd9774fc96921a10c266d7Mindy Pereira } 876f92de64bbdf1ea6c4cd9774fc96921a10c266d7Mindy Pereira 886f92de64bbdf1ea6c4cd9774fc96921a10c266d7Mindy Pereira /** 896f92de64bbdf1ea6c4cd9774fc96921a10c266d7Mindy Pereira * @return The current mode. 906f92de64bbdf1ea6c4cd9774fc96921a10c266d7Mindy Pereira */ 916f92de64bbdf1ea6c4cd9774fc96921a10c266d7Mindy Pereira public int getMode() { 926f92de64bbdf1ea6c4cd9774fc96921a10c266d7Mindy Pereira return mMode; 936f92de64bbdf1ea6c4cd9774fc96921a10c266d7Mindy Pereira } 946f92de64bbdf1ea6c4cd9774fc96921a10c266d7Mindy Pereira 956f92de64bbdf1ea6c4cd9774fc96921a10c266d7Mindy Pereira /** 966f92de64bbdf1ea6c4cd9774fc96921a10c266d7Mindy Pereira * @return Whether or not to display 2 pane. 976f92de64bbdf1ea6c4cd9774fc96921a10c266d7Mindy Pereira */ 986f92de64bbdf1ea6c4cd9774fc96921a10c266d7Mindy Pereira public boolean isTwoPane() { 996f92de64bbdf1ea6c4cd9774fc96921a10c266d7Mindy Pereira return mTwoPane; 1006f92de64bbdf1ea6c4cd9774fc96921a10c266d7Mindy Pereira } 1016f92de64bbdf1ea6c4cd9774fc96921a10c266d7Mindy Pereira 1026f92de64bbdf1ea6c4cd9774fc96921a10c266d7Mindy Pereira public boolean isConversationMode() { 1036f92de64bbdf1ea6c4cd9774fc96921a10c266d7Mindy Pereira return mMode == MODE_CONVERSATION; 1046f92de64bbdf1ea6c4cd9774fc96921a10c266d7Mindy Pereira } 1056f92de64bbdf1ea6c4cd9774fc96921a10c266d7Mindy Pereira 1066f92de64bbdf1ea6c4cd9774fc96921a10c266d7Mindy Pereira public boolean isConversationListMode() { 1076f92de64bbdf1ea6c4cd9774fc96921a10c266d7Mindy Pereira return mMode == MODE_CONVERSATION_LIST; 1086f92de64bbdf1ea6c4cd9774fc96921a10c266d7Mindy Pereira } 1096f92de64bbdf1ea6c4cd9774fc96921a10c266d7Mindy Pereira 1106f92de64bbdf1ea6c4cd9774fc96921a10c266d7Mindy Pereira public boolean isLabelListMode() { 1116f92de64bbdf1ea6c4cd9774fc96921a10c266d7Mindy Pereira return mMode == MODE_LABEL_LIST; 1126f92de64bbdf1ea6c4cd9774fc96921a10c266d7Mindy Pereira } 1136f92de64bbdf1ea6c4cd9774fc96921a10c266d7Mindy Pereira 1146f92de64bbdf1ea6c4cd9774fc96921a10c266d7Mindy Pereira public void handleSaveInstanceState(Bundle outState) { 1156f92de64bbdf1ea6c4cd9774fc96921a10c266d7Mindy Pereira outState.putInt(VIEW_MODE_KEY, mMode); 1166f92de64bbdf1ea6c4cd9774fc96921a10c266d7Mindy Pereira } 1176f92de64bbdf1ea6c4cd9774fc96921a10c266d7Mindy Pereira 1186f92de64bbdf1ea6c4cd9774fc96921a10c266d7Mindy Pereira public void handleRestore(Bundle inState) { 1196f92de64bbdf1ea6c4cd9774fc96921a10c266d7Mindy Pereira int mode = inState.getInt(VIEW_MODE_KEY, MODE_UNKNOWN); 1206f92de64bbdf1ea6c4cd9774fc96921a10c266d7Mindy Pereira setModeInternal(mode); 1216f92de64bbdf1ea6c4cd9774fc96921a10c266d7Mindy Pereira } 1226f92de64bbdf1ea6c4cd9774fc96921a10c266d7Mindy Pereira 1236f92de64bbdf1ea6c4cd9774fc96921a10c266d7Mindy Pereira /** 1246f92de64bbdf1ea6c4cd9774fc96921a10c266d7Mindy Pereira * A listener for changes on a ViewMode. 1256f92de64bbdf1ea6c4cd9774fc96921a10c266d7Mindy Pereira */ 1266f92de64bbdf1ea6c4cd9774fc96921a10c266d7Mindy Pereira public interface ModeChangeListener { 1276f92de64bbdf1ea6c4cd9774fc96921a10c266d7Mindy Pereira /** 1286f92de64bbdf1ea6c4cd9774fc96921a10c266d7Mindy Pereira * Handles a mode change. 1296f92de64bbdf1ea6c4cd9774fc96921a10c266d7Mindy Pereira */ 1306f92de64bbdf1ea6c4cd9774fc96921a10c266d7Mindy Pereira void onViewModeChanged(ViewMode mode); 1316f92de64bbdf1ea6c4cd9774fc96921a10c266d7Mindy Pereira } 1326f92de64bbdf1ea6c4cd9774fc96921a10c266d7Mindy Pereira 1336f92de64bbdf1ea6c4cd9774fc96921a10c266d7Mindy Pereira /** 1346f92de64bbdf1ea6c4cd9774fc96921a10c266d7Mindy Pereira * Adds a listener from this view mode. 1356f92de64bbdf1ea6c4cd9774fc96921a10c266d7Mindy Pereira * Must happen in the UI thread. 1366f92de64bbdf1ea6c4cd9774fc96921a10c266d7Mindy Pereira */ 1376f92de64bbdf1ea6c4cd9774fc96921a10c266d7Mindy Pereira public void addListener(ModeChangeListener listener) { 1386f92de64bbdf1ea6c4cd9774fc96921a10c266d7Mindy Pereira mListeners.add(listener); 1396f92de64bbdf1ea6c4cd9774fc96921a10c266d7Mindy Pereira } 1406f92de64bbdf1ea6c4cd9774fc96921a10c266d7Mindy Pereira 1416f92de64bbdf1ea6c4cd9774fc96921a10c266d7Mindy Pereira /** 1426f92de64bbdf1ea6c4cd9774fc96921a10c266d7Mindy Pereira * Removes a listener from this view mode. 1436f92de64bbdf1ea6c4cd9774fc96921a10c266d7Mindy Pereira * Must happen in the UI thread. 1446f92de64bbdf1ea6c4cd9774fc96921a10c266d7Mindy Pereira */ 1456f92de64bbdf1ea6c4cd9774fc96921a10c266d7Mindy Pereira public void removeListener(ModeChangeListener listener) { 1466f92de64bbdf1ea6c4cd9774fc96921a10c266d7Mindy Pereira mListeners.remove(listener); 1476f92de64bbdf1ea6c4cd9774fc96921a10c266d7Mindy Pereira } 1486f92de64bbdf1ea6c4cd9774fc96921a10c266d7Mindy Pereira 1496f92de64bbdf1ea6c4cd9774fc96921a10c266d7Mindy Pereira /** 1506f92de64bbdf1ea6c4cd9774fc96921a10c266d7Mindy Pereira * Dispatches a change event for the mode. 1516f92de64bbdf1ea6c4cd9774fc96921a10c266d7Mindy Pereira * Always happens in the UI thread. 1526f92de64bbdf1ea6c4cd9774fc96921a10c266d7Mindy Pereira */ 1536f92de64bbdf1ea6c4cd9774fc96921a10c266d7Mindy Pereira private void dispatchModeChange() { 1546f92de64bbdf1ea6c4cd9774fc96921a10c266d7Mindy Pereira ArrayList<ModeChangeListener> list = new ArrayList<ModeChangeListener>(mListeners); 1556f92de64bbdf1ea6c4cd9774fc96921a10c266d7Mindy Pereira for (ModeChangeListener listener : list) { 1566f92de64bbdf1ea6c4cd9774fc96921a10c266d7Mindy Pereira listener.onViewModeChanged(this); 1576f92de64bbdf1ea6c4cd9774fc96921a10c266d7Mindy Pereira } 1586f92de64bbdf1ea6c4cd9774fc96921a10c266d7Mindy Pereira } 1596f92de64bbdf1ea6c4cd9774fc96921a10c266d7Mindy Pereira} 160