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