1/*
2 * Copyright (C) 2012 Google Inc.
3 * Licensed to The Android Open Source Project.
4 *
5 * Licensed under the Apache License, Version 2.0 (the "License");
6 * you may not use this file except in compliance with the License.
7 * You may obtain a copy of the License at
8 *
9 *      http://www.apache.org/licenses/LICENSE-2.0
10 *
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
16 */
17
18package com.android.mail.ui;
19
20import android.app.LoaderManager.LoaderCallbacks;
21import android.database.DataSetObserver;
22import android.os.Bundle;
23import android.os.Parcelable;
24
25import com.android.mail.browse.ConversationCursor;
26import com.android.mail.providers.Conversation;
27import com.android.mail.providers.Folder;
28
29/**
30 * A controller interface that is to receive user initiated events and handle them.
31 */
32public interface ConversationListCallbacks {
33    /**
34     * Show the conversation provided here. If the conversation is null, this is a request to pop
35     * <em>out</em> of conversation view mode and head back to conversation list mode, or whatever
36     * should best show in its place.
37     * @param conversation conversation to display, possibly null.
38     * @param inLoaderCallbacks whether we are in the scope of a {@link LoaderCallbacks} method
39     * (when fragment transactions are disallowed)
40     */
41    void onConversationSelected(Conversation conversation, boolean inLoaderCallbacks);
42
43    /**
44     * Possibly show the conversation provided here depending on implementation.
45     * Used mainly by two-pane landscape mode when we are navigating with the keyboard.
46     */
47    void onConversationFocused(Conversation conversation);
48
49    /**
50     * Called whenever CAB mode has been entered via long press or selecting a sender image.
51     */
52    void onCabModeEntered();
53
54    /**
55     * Called whenever CAB mode has been exited.
56     */
57    void onCabModeExited();
58
59    ConversationCursor getConversationListCursor();
60
61    Conversation getCurrentConversation();
62    void setCurrentConversation(Conversation c);
63    void onConversationViewSwitched(Conversation c);
64
65    /**
66     * Returns whether the initial conversation has begun but not finished loading. If this returns
67     * true, you can register to be told when the load in progress finishes
68     * ({@link #registerConversationLoadedObserver(DataSetObserver)}).
69     * <p>
70     * This flag only applies to the first conversation in a set (e.g. when using ViewPager).
71     *
72     * @return true if the initial conversation has begun but not finished loading
73     */
74    boolean isInitialConversationLoading();
75    void registerConversationLoadedObserver(DataSetObserver observer);
76    void unregisterConversationLoadedObserver(DataSetObserver observer);
77    /**
78     * Coordinates actions that might occur in response to a conversation that has finished loading
79     * and is now user-visible.
80     */
81    void onConversationSeen();
82
83    void registerConversationListObserver(DataSetObserver observer);
84    void unregisterConversationListObserver(DataSetObserver observer);
85
86    /**
87     * Commit any destructive action leave behind items so that it is no longer
88     * possible to undo them.
89     */
90    void commitDestructiveActions(boolean animate);
91
92    /**
93     * Detect if there are any animations occurring in the conversation list.
94     */
95    boolean isAnimating();
96
97    /**
98     * Tell the controller that the conversation view has entered detached mode.
99     */
100    void setDetachedMode();
101
102    /**
103     * @return true if the List fragment should start up with list swipes disabled entirely
104     * (with no UI reaction)
105     */
106    boolean shouldPreventListSwipesEntirely();
107
108    String CONVERSATION_LIST_SCROLL_POSITION_INDEX = "index";
109    String CONVERSATION_LIST_SCROLL_POSITION_OFFSET = "offset";
110
111    /**
112     * Gets the last save scroll position of the conversation list for the specified Folder.
113     *
114     * @return A {@link Bundle} containing two ints,
115     *         {@link #CONVERSATION_LIST_SCROLL_POSITION_INDEX} and
116     *         {@link #CONVERSATION_LIST_SCROLL_POSITION_OFFSET}, or <code>null</code>
117     */
118    Parcelable getConversationListScrollPosition(String folderUri);
119
120    /**
121     * Sets the last save scroll position of the conversation list for the specified Folder for
122     * restoration on returning to this list.
123     *
124     * @param savedPosition A {@link Bundle} containing two ints,
125     *            {@link #CONVERSATION_LIST_SCROLL_POSITION_INDEX} and
126     *            {@link #CONVERSATION_LIST_SCROLL_POSITION_OFFSET}
127     */
128    void setConversationListScrollPosition(String folderUri, Parcelable savedPosition);
129
130    /**
131     * Is the user peeking the current conversation or actually viewing it.
132     */
133    boolean isCurrentConversationJustPeeking();
134
135    /**
136     * Set up the empty icon depending on the current empty folder.
137     * @param isEmpty if false, then instead of showing the default empty icon, shows the no
138     *   selected message icon.
139     * @return true if the icon is setup, false otherwise.
140     */
141    boolean setupEmptyIconView(Folder folder, boolean isEmpty);
142}
143