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