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.DragEvent; 26 import android.view.KeyEvent; 27 import android.view.Menu; 28 import android.view.MenuItem; 29 import android.view.MotionEvent; 30 import android.view.View; 31 32 import com.android.mail.ConversationListContext; 33 import com.android.mail.browse.ConversationCursor.ConversationListener; 34 import com.android.mail.browse.ConversationListFooterView; 35 import com.android.mail.providers.Account; 36 import com.android.mail.providers.Folder; 37 import com.android.mail.ui.ViewMode.ModeChangeListener; 38 39 /** 40 * An Activity controller knows how to combine views and listeners into a functioning activity. 41 * ActivityControllers are delegates that implement methods by calling underlying views to modify, 42 * or respond to user action. 43 * 44 * There are two ways of adding methods to this interface: 45 * <ul> 46 * <li>When the methods pertain to a single logical grouping: consider adding a new 47 * interface and putting all the methods in that interface. As an example, 48 * look at {@link AccountController}. The controller implements this, 49 * and returns itself in 50 * {@link com.android.mail.ui.ControllableActivity#getAccountController()}. This allows 51 * for account-specific methods to be added without creating new methods in this interface 52 * .</li> 53 * <li>Methods that relate to an activity can be added directly. As an example, 54 * look at {@link #onActivityResult(int, int, android.content.Intent)} which is identical to 55 * its declaration in {@link android.app.Activity}.</li> 56 * <li>Everything else. As an example, look at {@link #isDrawerEnabled()}. Try to avoid 57 * this path because an implementation has to provided in many classes: 58 * {@link MailActivity}, {@link FolderSelectionActivity}, and the controllers.</li> 59 * </ul> 60 */ 61 public interface ActivityController extends LayoutListener, 62 ModeChangeListener, ConversationListCallbacks, 63 FolderChangeListener, ConversationSetObserver, ConversationListener, FolderSelector, 64 UndoListener, ConversationUpdater, ErrorListener, FolderController, AccountController, 65 ConversationPositionTracker.Callbacks, ConversationListFooterView.FooterViewClickListener, 66 RecentFolderController, FragmentLauncher, KeyboardNavigationController { 67 68 // As far as possible, the methods here that correspond to Activity lifecycle have the same name 69 // as their counterpart in the Activity lifecycle. 70 71 /** 72 * Returns the current account. 73 */ getCurrentAccount()74 Account getCurrentAccount(); 75 76 /** 77 * Returns the current conversation list context. 78 */ getCurrentListContext()79 ConversationListContext getCurrentListContext(); 80 81 /** 82 * @see android.app.Activity#onActivityResult 83 * @param requestCode 84 * @param resultCode 85 * @param data 86 */ onActivityResult(int requestCode, int resultCode, Intent data)87 void onActivityResult(int requestCode, int resultCode, Intent data); 88 89 /** 90 * Called by the Mail activity when the back button is pressed. Returning true consumes the 91 * event and disallows the calling method from trying to handle the back button any other way. 92 * 93 * @see android.app.Activity#onBackPressed() 94 * @return true if the back press was handled and the event was consumed. Return false if the 95 * event was not consumed. 96 */ onBackPressed()97 boolean onBackPressed(); 98 99 /** 100 * Called by the Mail activity when the up button is pressed. 101 * @return 102 */ onUpPressed()103 boolean onUpPressed(); 104 105 /** 106 * Called when the root activity calls onCreate. Any initialization needs to 107 * be done here. Subclasses need to call their parents' onCreate method, since it performs 108 * valuable initialization common to all subclasses. 109 * 110 * This was called initialize in Gmail. 111 * 112 * @see android.app.Activity#onCreate 113 * @param savedState 114 * @return true if the controller was able to initialize successfully, false otherwise. 115 */ onCreate(Bundle savedState)116 boolean onCreate(Bundle savedState); 117 118 /** 119 * @see android.app.Activity#onPostCreate 120 */ onPostCreate(Bundle savedState)121 void onPostCreate(Bundle savedState); 122 123 /** 124 * @see android.app.Activity#onConfigurationChanged 125 */ onConfigurationChanged(Configuration newConfig)126 void onConfigurationChanged(Configuration newConfig); 127 128 /** 129 * @see android.app.Activity#onStart 130 */ onStart()131 void onStart(); 132 133 /** 134 * Called when the the root activity calls onRestart 135 * @see android.app.Activity#onRestart 136 */ onRestart()137 void onRestart(); 138 139 /** 140 * @see android.app.Activity#onCreateDialog(int, Bundle) 141 * @param id 142 * @param bundle 143 * @return 144 */ onCreateDialog(int id, Bundle bundle)145 Dialog onCreateDialog(int id, Bundle bundle); 146 147 /** 148 * @see android.app.Activity#onCreateOptionsMenu(Menu) 149 * @param menu 150 * @return 151 */ onCreateOptionsMenu(Menu menu)152 boolean onCreateOptionsMenu(Menu menu); 153 154 /** 155 * @see android.app.Activity#onKeyDown(int, KeyEvent) 156 * @param keyCode 157 * @param event 158 * @return 159 */ onKeyDown(int keyCode, KeyEvent event)160 boolean onKeyDown(int keyCode, KeyEvent event); 161 162 /** 163 * Called by Mail activity when menu items are selected 164 * @see android.app.Activity#onOptionsItemSelected(MenuItem) 165 * @param item 166 * @return 167 */ onOptionsItemSelected(MenuItem item)168 boolean onOptionsItemSelected(MenuItem item); 169 170 /** 171 * Called by the Mail activity on Activity pause. 172 * @see android.app.Activity#onPause 173 */ onPause()174 void onPause(); 175 176 /** 177 * @see android.app.Activity#onDestroy 178 */ onDestroy()179 void onDestroy(); 180 181 /** 182 * @see android.app.Activity#onPrepareDialog 183 * @param id 184 * @param dialog 185 * @param bundle 186 */ onPrepareDialog(int id, Dialog dialog, Bundle bundle)187 void onPrepareDialog(int id, Dialog dialog, Bundle bundle); 188 189 /** 190 * Called by the Mail activity when menu items need to be prepared. 191 * @see android.app.Activity#onPrepareOptionsMenu(Menu) 192 * @param menu 193 * @return 194 */ onPrepareOptionsMenu(Menu menu)195 boolean onPrepareOptionsMenu(Menu menu); 196 197 /** 198 * Called by the Mail activity on Activity resume. 199 * @see android.app.Activity#onResume 200 */ onResume()201 void onResume(); 202 203 /** 204 * @see android.app.Activity#onRestoreInstanceState 205 */ onRestoreInstanceState(Bundle savedInstanceState)206 void onRestoreInstanceState(Bundle savedInstanceState); 207 208 /** 209 * @see android.app.Activity#onSaveInstanceState 210 * @param outState 211 */ onSaveInstanceState(Bundle outState)212 void onSaveInstanceState(Bundle outState); 213 214 /** 215 * Begin a search with the given query string. 216 */ executeSearch(String query)217 void executeSearch(String query); 218 219 /** 220 * Called by the Mail activity on Activity stop. 221 * @see android.app.Activity#onStop 222 */ onStop()223 void onStop(); 224 225 /** 226 * Called by the Mail activity when window focus changes. 227 * @see android.app.Activity#onWindowFocusChanged(boolean) 228 * @param hasFocus 229 */ onWindowFocusChanged(boolean hasFocus)230 void onWindowFocusChanged(boolean hasFocus); 231 232 /** 233 * Show the conversation List with the list context provided here. On certain layouts, this 234 * might show more than just the conversation list. For instance, on tablets this might show 235 * the conversations along with the conversation list. 236 * @param listContext context providing information on what conversation list to display. 237 */ showConversationList(ConversationListContext listContext)238 void showConversationList(ConversationListContext listContext); 239 240 /** 241 * Show the wait for account initialization mode. 242 */ showWaitForInitialization()243 public void showWaitForInitialization(); 244 245 /** 246 * Handle a touch event. 247 */ onTouchEvent(MotionEvent event)248 void onTouchEvent(MotionEvent event); 249 250 /** 251 * Returns whether the first conversation in the conversation list should be 252 * automatically selected and shown. 253 */ shouldShowFirstConversation()254 boolean shouldShowFirstConversation(); 255 256 /** 257 * Get the selected set of conversations. Guaranteed to return non-null, this should return 258 * an empty set if no conversation is currently selected. 259 * @return 260 */ getSelectedSet()261 public ConversationSelectionSet getSelectedSet(); 262 263 /** 264 * Start search mode if the account being view supports the search capability. 265 */ startSearch()266 void startSearch(); 267 268 /** 269 * Exit the search mode, popping off one activity so that the back stack is fine. 270 */ exitSearchMode()271 void exitSearchMode(); 272 273 /** 274 * Supports dragging conversations to a folder. 275 */ supportsDrag(DragEvent event, Folder folder)276 boolean supportsDrag(DragEvent event, Folder folder); 277 278 /** 279 * Handles dropping conversations to a folder. 280 */ handleDrop(DragEvent event, Folder folder)281 void handleDrop(DragEvent event, Folder folder); 282 283 /** 284 * Load the default inbox associated with the current account. 285 */ loadAccountInbox()286 public void loadAccountInbox(); 287 288 /** 289 * Return the folder currently being viewed by the activity. 290 */ getHierarchyFolder()291 public Folder getHierarchyFolder(); 292 293 /** 294 * Set the folder currently selected in the folder selection hierarchy fragments. 295 */ setHierarchyFolder(Folder folder)296 void setHierarchyFolder(Folder folder); 297 298 /** 299 * Handles the animation end of the animated adapter. 300 */ onAnimationEnd(AnimatedAdapter animatedAdapter)301 void onAnimationEnd(AnimatedAdapter animatedAdapter); 302 303 /** 304 * Called when the user has started a drag/ drop gesture. 305 */ startDragMode()306 void startDragMode(); 307 308 /** 309 * Called when the user has ended drag/drop. 310 */ stopDragMode()311 void stopDragMode(); 312 313 /** 314 * Called when Accessibility is enabled or disabled. 315 */ onAccessibilityStateChanged()316 void onAccessibilityStateChanged(); 317 318 /** 319 * Called to determine if the drawer is enabled for this controller/activity instance. 320 * Note: the value returned should not change for this controller instance. 321 */ isDrawerEnabled()322 boolean isDrawerEnabled(); 323 324 /** 325 * Called to determine if menu items in the action bar should be hidden. 326 * Currently this is used for when the drawer is open to hide certain 327 * items that are not applicable while the drawer is open. 328 */ shouldHideMenuItems()329 boolean shouldHideMenuItems(); 330 getDrawerController()331 DrawerController getDrawerController(); 332 333 /** 334 * Called to determine the layout resource to use for the activity's content view. 335 * @return Resource ID 336 */ getContentViewResource()337 @LayoutRes int getContentViewResource(); 338 getNavigationViewClickListener()339 View.OnClickListener getNavigationViewClickListener(); 340 } 341