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