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