Home | History | Annotate | Download | only in app
      1 /*
      2  * Copyright (C) 2015 The Android Open Source Project
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 
     17 package android.app;
     18 
     19 import android.annotation.Nullable;
     20 import android.annotation.UnsupportedAppUsage;
     21 import android.content.Context;
     22 import android.content.res.Configuration;
     23 import android.os.Bundle;
     24 import android.os.Parcelable;
     25 import android.util.ArrayMap;
     26 import android.util.AttributeSet;
     27 import android.view.Menu;
     28 import android.view.MenuInflater;
     29 import android.view.MenuItem;
     30 import android.view.View;
     31 
     32 import java.io.FileDescriptor;
     33 import java.io.PrintWriter;
     34 import java.util.List;
     35 
     36 /**
     37  * Provides integration points with a {@link FragmentManager} for a fragment host.
     38  * <p>
     39  * It is the responsibility of the host to take care of the Fragment's lifecycle.
     40  * The methods provided by {@link FragmentController} are for that purpose.
     41  *
     42  * @deprecated Use the <a href="{@docRoot}tools/extras/support-library.html">Support Library</a>
     43  *      {@link android.support.v4.app.FragmentController}
     44  */
     45 @Deprecated
     46 public class FragmentController {
     47     @UnsupportedAppUsage
     48     private final FragmentHostCallback<?> mHost;
     49 
     50     /**
     51      * Returns a {@link FragmentController}.
     52      */
     53     public static final FragmentController createController(FragmentHostCallback<?> callbacks) {
     54         return new FragmentController(callbacks);
     55     }
     56 
     57     private FragmentController(FragmentHostCallback<?> callbacks) {
     58         mHost = callbacks;
     59     }
     60 
     61     /**
     62      * Returns a {@link FragmentManager} for this controller.
     63      */
     64     public FragmentManager getFragmentManager() {
     65         return mHost.getFragmentManagerImpl();
     66     }
     67 
     68     /**
     69      * Returns a {@link LoaderManager}.
     70      */
     71     public LoaderManager getLoaderManager() {
     72         return mHost.getLoaderManagerImpl();
     73     }
     74 
     75     /**
     76      * Returns a fragment with the given identifier.
     77      */
     78     @Nullable
     79     public Fragment findFragmentByWho(String who) {
     80         return mHost.mFragmentManager.findFragmentByWho(who);
     81     }
     82 
     83     /**
     84      * Attaches the host to the FragmentManager for this controller. The host must be
     85      * attached before the FragmentManager can be used to manage Fragments.
     86      * */
     87     public void attachHost(Fragment parent) {
     88         mHost.mFragmentManager.attachController(
     89                 mHost, mHost /*container*/, parent);
     90     }
     91 
     92     /**
     93      * Instantiates a Fragment's view.
     94      *
     95      * @param parent The parent that the created view will be placed
     96      * in; <em>note that this may be null</em>.
     97      * @param name Tag name to be inflated.
     98      * @param context The context the view is being created in.
     99      * @param attrs Inflation attributes as specified in XML file.
    100      *
    101      * @return view the newly created view
    102      */
    103     public View onCreateView(View parent, String name, Context context, AttributeSet attrs) {
    104         return mHost.mFragmentManager.onCreateView(parent, name, context, attrs);
    105     }
    106 
    107     /**
    108      * Marks the fragment state as unsaved. This allows for "state loss" detection.
    109      */
    110     public void noteStateNotSaved() {
    111         mHost.mFragmentManager.noteStateNotSaved();
    112     }
    113 
    114     /**
    115      * Saves the state for all Fragments.
    116      */
    117     public Parcelable saveAllState() {
    118         return mHost.mFragmentManager.saveAllState();
    119     }
    120 
    121     /**
    122      * Restores the saved state for all Fragments. The given Fragment list are Fragment
    123      * instances retained across configuration changes.
    124      *
    125      * @see #retainNonConfig()
    126      *
    127      * @deprecated use {@link #restoreAllState(Parcelable, FragmentManagerNonConfig)}
    128      */
    129     @Deprecated
    130     public void restoreAllState(Parcelable state, List<Fragment> nonConfigList) {
    131         mHost.mFragmentManager.restoreAllState(state,
    132                 new FragmentManagerNonConfig(nonConfigList, null));
    133     }
    134 
    135     /**
    136      * Restores the saved state for all Fragments. The given FragmentManagerNonConfig are Fragment
    137      * instances retained across configuration changes, including nested fragments
    138      *
    139      * @see #retainNestedNonConfig()
    140      */
    141     public void restoreAllState(Parcelable state, FragmentManagerNonConfig nonConfig) {
    142         mHost.mFragmentManager.restoreAllState(state, nonConfig);
    143     }
    144 
    145     /**
    146      * Returns a list of Fragments that have opted to retain their instance across
    147      * configuration changes.
    148      *
    149      * @deprecated use {@link #retainNestedNonConfig()} to also track retained
    150      *             nested child fragments
    151      */
    152     @Deprecated
    153     public List<Fragment> retainNonConfig() {
    154         return mHost.mFragmentManager.retainNonConfig().getFragments();
    155     }
    156 
    157     /**
    158      * Returns a nested tree of Fragments that have opted to retain their instance across
    159      * configuration changes.
    160      */
    161     public FragmentManagerNonConfig retainNestedNonConfig() {
    162         return mHost.mFragmentManager.retainNonConfig();
    163     }
    164 
    165     /**
    166      * Moves all Fragments managed by the controller's FragmentManager
    167      * into the create state.
    168      * <p>Call when Fragments should be created.
    169      *
    170      * @see Fragment#onCreate(Bundle)
    171      */
    172     public void dispatchCreate() {
    173         mHost.mFragmentManager.dispatchCreate();
    174     }
    175 
    176     /**
    177      * Moves all Fragments managed by the controller's FragmentManager
    178      * into the activity created state.
    179      * <p>Call when Fragments should be informed their host has been created.
    180      *
    181      * @see Fragment#onActivityCreated(Bundle)
    182      */
    183     public void dispatchActivityCreated() {
    184         mHost.mFragmentManager.dispatchActivityCreated();
    185     }
    186 
    187     /**
    188      * Moves all Fragments managed by the controller's FragmentManager
    189      * into the start state.
    190      * <p>Call when Fragments should be started.
    191      *
    192      * @see Fragment#onStart()
    193      */
    194     public void dispatchStart() {
    195         mHost.mFragmentManager.dispatchStart();
    196     }
    197 
    198     /**
    199      * Moves all Fragments managed by the controller's FragmentManager
    200      * into the resume state.
    201      * <p>Call when Fragments should be resumed.
    202      *
    203      * @see Fragment#onResume()
    204      */
    205     public void dispatchResume() {
    206         mHost.mFragmentManager.dispatchResume();
    207     }
    208 
    209     /**
    210      * Moves all Fragments managed by the controller's FragmentManager
    211      * into the pause state.
    212      * <p>Call when Fragments should be paused.
    213      *
    214      * @see Fragment#onPause()
    215      */
    216     public void dispatchPause() {
    217         mHost.mFragmentManager.dispatchPause();
    218     }
    219 
    220     /**
    221      * Moves all Fragments managed by the controller's FragmentManager
    222      * into the stop state.
    223      * <p>Call when Fragments should be stopped.
    224      *
    225      * @see Fragment#onStop()
    226      */
    227     public void dispatchStop() {
    228         mHost.mFragmentManager.dispatchStop();
    229     }
    230 
    231     /**
    232      * Moves all Fragments managed by the controller's FragmentManager
    233      * into the destroy view state.
    234      * <p>Call when the Fragment's views should be destroyed.
    235      *
    236      * @see Fragment#onDestroyView()
    237      */
    238     public void dispatchDestroyView() {
    239         mHost.mFragmentManager.dispatchDestroyView();
    240     }
    241 
    242     /**
    243      * Moves all Fragments managed by the controller's FragmentManager
    244      * into the destroy state.
    245      * <p>Call when Fragments should be destroyed.
    246      *
    247      * @see Fragment#onDestroy()
    248      */
    249     public void dispatchDestroy() {
    250         mHost.mFragmentManager.dispatchDestroy();
    251     }
    252 
    253     /**
    254      * Lets all Fragments managed by the controller's FragmentManager know the multi-window mode of
    255      * the activity changed.
    256      * <p>Call when the multi-window mode of the activity changed.
    257      *
    258      * @see Fragment#onMultiWindowModeChanged
    259      * @deprecated use {@link #dispatchMultiWindowModeChanged(boolean, Configuration)}
    260      */
    261     @Deprecated
    262     public void dispatchMultiWindowModeChanged(boolean isInMultiWindowMode) {
    263         mHost.mFragmentManager.dispatchMultiWindowModeChanged(isInMultiWindowMode);
    264     }
    265 
    266     /**
    267      * Lets all Fragments managed by the controller's FragmentManager know the multi-window mode of
    268      * the activity changed.
    269      * <p>Call when the multi-window mode of the activity changed.
    270      *
    271      * @see Fragment#onMultiWindowModeChanged
    272      */
    273     public void dispatchMultiWindowModeChanged(boolean isInMultiWindowMode,
    274             Configuration newConfig) {
    275         mHost.mFragmentManager.dispatchMultiWindowModeChanged(isInMultiWindowMode, newConfig);
    276     }
    277 
    278     /**
    279      * Lets all Fragments managed by the controller's FragmentManager know the picture-in-picture
    280      * mode of the activity changed.
    281      * <p>Call when the picture-in-picture mode of the activity changed.
    282      *
    283      * @see Fragment#onPictureInPictureModeChanged
    284      * @deprecated use {@link #dispatchPictureInPictureModeChanged(boolean, Configuration)}
    285      */
    286     @Deprecated
    287     public void dispatchPictureInPictureModeChanged(boolean isInPictureInPictureMode) {
    288         mHost.mFragmentManager.dispatchPictureInPictureModeChanged(isInPictureInPictureMode);
    289     }
    290 
    291     /**
    292      * Lets all Fragments managed by the controller's FragmentManager know the picture-in-picture
    293      * mode of the activity changed.
    294      * <p>Call when the picture-in-picture mode of the activity changed.
    295      *
    296      * @see Fragment#onPictureInPictureModeChanged
    297      */
    298     public void dispatchPictureInPictureModeChanged(boolean isInPictureInPictureMode,
    299             Configuration newConfig) {
    300         mHost.mFragmentManager.dispatchPictureInPictureModeChanged(isInPictureInPictureMode,
    301                 newConfig);
    302     }
    303 
    304     /**
    305      * Lets all Fragments managed by the controller's FragmentManager
    306      * know a configuration change occurred.
    307      * <p>Call when there is a configuration change.
    308      *
    309      * @see Fragment#onConfigurationChanged(Configuration)
    310      */
    311     public void dispatchConfigurationChanged(Configuration newConfig) {
    312         mHost.mFragmentManager.dispatchConfigurationChanged(newConfig);
    313     }
    314 
    315     /**
    316      * Lets all Fragments managed by the controller's FragmentManager
    317      * know the device is in a low memory condition.
    318      * <p>Call when the device is low on memory and Fragment's should trim
    319      * their memory usage.
    320      *
    321      * @see Fragment#onLowMemory()
    322      */
    323     public void dispatchLowMemory() {
    324         mHost.mFragmentManager.dispatchLowMemory();
    325     }
    326 
    327     /**
    328      * Lets all Fragments managed by the controller's FragmentManager
    329      * know they should trim their memory usage.
    330      * <p>Call when the Fragment can release allocated memory [such as if
    331      * the Fragment is in the background].
    332      *
    333      * @see Fragment#onTrimMemory(int)
    334      */
    335     public void dispatchTrimMemory(int level) {
    336         mHost.mFragmentManager.dispatchTrimMemory(level);
    337     }
    338 
    339     /**
    340      * Lets all Fragments managed by the controller's FragmentManager
    341      * know they should create an options menu.
    342      * <p>Call when the Fragment should create an options menu.
    343      *
    344      * @return {@code true} if the options menu contains items to display
    345      * @see Fragment#onCreateOptionsMenu(Menu, MenuInflater)
    346      */
    347     public boolean dispatchCreateOptionsMenu(Menu menu, MenuInflater inflater) {
    348         return mHost.mFragmentManager.dispatchCreateOptionsMenu(menu, inflater);
    349     }
    350 
    351     /**
    352      * Lets all Fragments managed by the controller's FragmentManager
    353      * know they should prepare their options menu for display.
    354      * <p>Call immediately before displaying the Fragment's options menu.
    355      *
    356      * @return {@code true} if the options menu contains items to display
    357      * @see Fragment#onPrepareOptionsMenu(Menu)
    358      */
    359     public boolean dispatchPrepareOptionsMenu(Menu menu) {
    360         return mHost.mFragmentManager.dispatchPrepareOptionsMenu(menu);
    361     }
    362 
    363     /**
    364      * Sends an option item selection event to the Fragments managed by the
    365      * controller's FragmentManager. Once the event has been consumed,
    366      * no additional handling will be performed.
    367      * <p>Call immediately after an options menu item has been selected
    368      *
    369      * @return {@code true} if the options menu selection event was consumed
    370      * @see Fragment#onOptionsItemSelected(MenuItem)
    371      */
    372     public boolean dispatchOptionsItemSelected(MenuItem item) {
    373         return mHost.mFragmentManager.dispatchOptionsItemSelected(item);
    374     }
    375 
    376     /**
    377      * Sends a context item selection event to the Fragments managed by the
    378      * controller's FragmentManager. Once the event has been consumed,
    379      * no additional handling will be performed.
    380      * <p>Call immediately after an options menu item has been selected
    381      *
    382      * @return {@code true} if the context menu selection event was consumed
    383      * @see Fragment#onContextItemSelected(MenuItem)
    384      */
    385     public boolean dispatchContextItemSelected(MenuItem item) {
    386         return mHost.mFragmentManager.dispatchContextItemSelected(item);
    387     }
    388 
    389     /**
    390      * Lets all Fragments managed by the controller's FragmentManager
    391      * know their options menu has closed.
    392      * <p>Call immediately after closing the Fragment's options menu.
    393      *
    394      * @see Fragment#onOptionsMenuClosed(Menu)
    395      */
    396     public void dispatchOptionsMenuClosed(Menu menu) {
    397         mHost.mFragmentManager.dispatchOptionsMenuClosed(menu);
    398     }
    399 
    400     /**
    401      * Execute any pending actions for the Fragments managed by the
    402      * controller's FragmentManager.
    403      * <p>Call when queued actions can be performed [eg when the
    404      * Fragment moves into a start or resume state].
    405      * @return {@code true} if queued actions were performed
    406      */
    407     public boolean execPendingActions() {
    408         return mHost.mFragmentManager.execPendingActions();
    409     }
    410 
    411     /**
    412      * Starts the loaders.
    413      */
    414     public void doLoaderStart() {
    415         mHost.doLoaderStart();
    416     }
    417 
    418     /**
    419      * Stops the loaders, optionally retaining their state. This is useful for keeping the
    420      * loader state across configuration changes.
    421      *
    422      * @param retain When {@code true}, the loaders aren't stopped, but, their instances
    423      * are retained in a started state
    424      */
    425     public void doLoaderStop(boolean retain) {
    426         mHost.doLoaderStop(retain);
    427     }
    428 
    429     /**
    430      * Destroys the loaders and, if their state is not being retained, removes them.
    431      */
    432     public void doLoaderDestroy() {
    433         mHost.doLoaderDestroy();
    434     }
    435 
    436     /**
    437      * Lets the loaders know the host is ready to receive notifications.
    438      */
    439     public void reportLoaderStart() {
    440         mHost.reportLoaderStart();
    441     }
    442 
    443     /**
    444      * Returns a list of LoaderManagers that have opted to retain their instance across
    445      * configuration changes.
    446      */
    447     public ArrayMap<String, LoaderManager> retainLoaderNonConfig() {
    448         return mHost.retainLoaderNonConfig();
    449     }
    450 
    451     /**
    452      * Restores the saved state for all LoaderManagers. The given LoaderManager list are
    453      * LoaderManager instances retained across configuration changes.
    454      *
    455      * @see #retainLoaderNonConfig()
    456      */
    457     public void restoreLoaderNonConfig(ArrayMap<String, LoaderManager> loaderManagers) {
    458         mHost.restoreLoaderNonConfig(loaderManagers);
    459     }
    460 
    461     /**
    462      * Dumps the current state of the loaders.
    463      */
    464     public void dumpLoaders(String prefix, FileDescriptor fd, PrintWriter writer, String[] args) {
    465         mHost.dumpLoaders(prefix, fd, writer, args);
    466     }
    467 }
    468