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 18 package com.android.mail.ui; 19 20 import android.app.Dialog; 21 import android.content.Intent; 22 import android.content.res.Configuration; 23 import android.os.Bundle; 24 import android.support.annotation.LayoutRes; 25 import android.view.KeyEvent; 26 import android.view.Menu; 27 import android.view.MenuItem; 28 import android.view.MotionEvent; 29 import android.view.View; 30 31 import com.android.mail.browse.ConversationCursor.ConversationListener; 32 import com.android.mail.browse.ConversationListFooterView; 33 import com.android.mail.providers.Folder; 34 import com.android.mail.ui.ViewMode.ModeChangeListener; 35 36 /** 37 * An Activity controller knows how to combine views and listeners into a functioning activity. 38 * ActivityControllers are delegates that implement methods by calling underlying views to modify, 39 * or respond to user action. 40 * 41 * There are two ways of adding methods to this interface: 42 * <ul> 43 * <li>When the methods pertain to a single logical grouping: consider adding a new 44 * interface and putting all the methods in that interface. As an example, 45 * look at {@link AccountController}. The controller implements this, 46 * and returns itself in 47 * {@link com.android.mail.ui.ControllableActivity#getAccountController()}. This allows 48 * for account-specific methods to be added without creating new methods in this interface 49 * .</li> 50 * <li>Methods that relate to an activity can be added directly. As an example, 51 * look at {@link #onActivityResult(int, int, android.content.Intent)} which is identical to 52 * its declaration in {@link android.app.Activity}.</li> 53 * <li>Everything else. As an example, look at {@link #isDrawerEnabled()}. Try to avoid 54 * this path because an implementation has to provided in many classes: 55 * {@link MailActivity}, {@link FolderSelectionActivity}, and the controllers.</li> 56 * </ul> 57 */ 58 public interface ActivityController extends LayoutListener, 59 ModeChangeListener, ConversationListCallbacks, 60 ConversationSetObserver, ConversationListener, FolderSelector, 61 UndoListener, ConversationUpdater, ErrorListener, FolderController, AccountController, 62 ConversationPositionTracker.Callbacks, ConversationListFooterView.FooterViewClickListener, 63 RecentFolderController, FragmentLauncher, KeyboardNavigationController { 64 65 // As far as possible, the methods here that correspond to Activity lifecycle have the same name 66 // as their counterpart in the Activity lifecycle. 67 68 69 /** 70 * @see android.app.Activity#onActivityResult 71 * @param requestCode 72 * @param resultCode 73 * @param data 74 */ 75 void onActivityResult(int requestCode, int resultCode, Intent data); 76 77 /** 78 * Called by the Mail activity when the back button is pressed. Returning true consumes the 79 * event and disallows the calling method from trying to handle the back button any other way. 80 * 81 * @see android.app.Activity#onBackPressed() 82 * @return true if the back press was handled and the event was consumed. Return false if the 83 * event was not consumed. 84 */ 85 boolean onBackPressed(); 86 87 /** 88 * Called when the root activity calls onCreate. Any initialization needs to 89 * be done here. Subclasses need to call their parents' onCreate method, since it performs 90 * valuable initialization common to all subclasses. 91 * 92 * This was called initialize in Gmail. 93 * 94 * @see android.app.Activity#onCreate 95 * @param savedState 96 */ 97 void onCreate(Bundle savedState); 98 99 /** 100 * @see android.app.Activity#onPostCreate 101 */ 102 void onPostCreate(Bundle savedState); 103 104 /** 105 * @see android.app.Activity#onConfigurationChanged 106 */ 107 void onConfigurationChanged(Configuration newConfig); 108 109 /** 110 * @see android.app.Activity#onStart 111 */ 112 void onStart(); 113 114 /** 115 * Called when the the root activity calls onRestart 116 * @see android.app.Activity#onRestart 117 */ 118 void onRestart(); 119 120 /** 121 * @see android.app.Activity#onCreateDialog(int, Bundle) 122 * @param id 123 * @param bundle 124 * @return 125 */ 126 Dialog onCreateDialog(int id, Bundle bundle); 127 128 /** 129 * @see android.app.Activity#onCreateOptionsMenu(Menu) 130 * @param menu 131 * @return 132 */ 133 boolean onCreateOptionsMenu(Menu menu); 134 135 /** 136 * @see android.app.Activity#onKeyDown(int, KeyEvent) 137 * @param keyCode 138 * @param event 139 * @return 140 */ 141 boolean onKeyDown(int keyCode, KeyEvent event); 142 143 /** 144 * Called by Mail activity when menu items are selected 145 * @see android.app.Activity#onOptionsItemSelected(MenuItem) 146 * @param item 147 * @return 148 */ 149 boolean onOptionsItemSelected(MenuItem item); 150 151 /** 152 * Called by the Mail activity on Activity pause. 153 * @see android.app.Activity#onPause 154 */ 155 void onPause(); 156 157 /** 158 * @see android.app.Activity#onDestroy 159 */ 160 void onDestroy(); 161 162 /** 163 * @see android.app.Activity#onPrepareDialog 164 * @param id 165 * @param dialog 166 * @param bundle 167 */ 168 void onPrepareDialog(int id, Dialog dialog, Bundle bundle); 169 170 /** 171 * Called by the Mail activity when menu items need to be prepared. 172 * @see android.app.Activity#onPrepareOptionsMenu(Menu) 173 * @param menu 174 * @return 175 */ 176 void onPrepareOptionsMenu(Menu menu); 177 178 /** 179 * Called by the Mail activity on Activity resume. 180 * @see android.app.Activity#onResume 181 */ 182 void onResume(); 183 184 /** 185 * @see android.app.Activity#onRestoreInstanceState 186 */ 187 void onRestoreInstanceState(Bundle savedInstanceState); 188 189 /** 190 * @see android.app.Activity#onSaveInstanceState 191 * @param outState 192 */ 193 void onSaveInstanceState(Bundle outState); 194 195 /** 196 * Begin a search with the given query string. 197 */ 198 void executeSearch(String query); 199 200 /** 201 * Called by the Mail activity on Activity stop. 202 * @see android.app.Activity#onStop 203 */ 204 void onStop(); 205 206 /** 207 * Called by the Mail activity when window focus changes. 208 * @see android.app.Activity#onWindowFocusChanged(boolean) 209 * @param hasFocus 210 */ 211 void onWindowFocusChanged(boolean hasFocus); 212 213 /** 214 * Handle a touch event. 215 */ 216 void onTouchEvent(MotionEvent event); 217 218 /** 219 * Returns whether the first conversation in the conversation list should be 220 * automatically selected and shown. 221 */ 222 boolean shouldShowFirstConversation(); 223 224 /** 225 * Get the selected set of conversations. Guaranteed to return non-null, this should return 226 * an empty set if no conversation is currently selected. 227 * @return 228 */ 229 public ConversationCheckedSet getCheckedSet(); 230 231 /** 232 * Start search mode if the account being view supports the search capability. 233 */ 234 void startSearch(); 235 236 /** 237 * Return the folder currently being viewed by the activity. 238 */ 239 public Folder getHierarchyFolder(); 240 241 /** 242 * Handles the animation end of the animated adapter. 243 */ 244 void onAnimationEnd(AnimatedAdapter animatedAdapter); 245 246 /** 247 * Called when Accessibility is enabled or disabled. 248 */ 249 void onAccessibilityStateChanged(); 250 251 /** 252 * Called to determine if the drawer is enabled for this controller/activity instance. 253 * Note: the value returned should not change for this controller instance. 254 */ 255 boolean isDrawerEnabled(); 256 257 /** 258 * Called to determine if menu items in the action bar should be hidden. 259 * Currently this is used for when the drawer is open to hide certain 260 * items that are not applicable while the drawer is open. 261 */ 262 boolean shouldHideMenuItems(); 263 264 DrawerController getDrawerController(); 265 266 /** 267 * Called to determine the layout resource to use for the activity's content view. 268 * @return Resource ID 269 */ 270 @LayoutRes int getContentViewResource(); 271 272 View.OnClickListener getNavigationViewClickListener(); 273 274 /** 275 * If the search bar should always be visible on top of the screen (e.g. search result list). 276 * @param viewMode the new view mode. This is passed as a parameter because we don't know 277 * which onViewModeChanged callback gets called first, so the view modes might differ. 278 */ 279 boolean shouldShowSearchBarByDefault(int viewMode); 280 281 /** 282 * If we should show the search menu item. 283 */ 284 boolean shouldShowSearchMenuItem(); 285 286 /** 287 * Attach layout listener so our custom toolbar can listen to thread list layout events. 288 */ 289 void addConversationListLayoutListener(TwoPaneLayout.ConversationListLayoutListener listener); 290 } 291