1a5fc6f006f67867417b7a427de6e7394c4312decTodd Kennedy/* 2a5fc6f006f67867417b7a427de6e7394c4312decTodd Kennedy * Copyright (C) 2015 The Android Open Source Project 3a5fc6f006f67867417b7a427de6e7394c4312decTodd Kennedy * 4a5fc6f006f67867417b7a427de6e7394c4312decTodd Kennedy * Licensed under the Apache License, Version 2.0 (the "License"); 5a5fc6f006f67867417b7a427de6e7394c4312decTodd Kennedy * you may not use this file except in compliance with the License. 6a5fc6f006f67867417b7a427de6e7394c4312decTodd Kennedy * You may obtain a copy of the License at 7a5fc6f006f67867417b7a427de6e7394c4312decTodd Kennedy * 8a5fc6f006f67867417b7a427de6e7394c4312decTodd Kennedy * http://www.apache.org/licenses/LICENSE-2.0 9a5fc6f006f67867417b7a427de6e7394c4312decTodd Kennedy * 10a5fc6f006f67867417b7a427de6e7394c4312decTodd Kennedy * Unless required by applicable law or agreed to in writing, software 11a5fc6f006f67867417b7a427de6e7394c4312decTodd Kennedy * distributed under the License is distributed on an "AS IS" BASIS, 12a5fc6f006f67867417b7a427de6e7394c4312decTodd Kennedy * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13a5fc6f006f67867417b7a427de6e7394c4312decTodd Kennedy * See the License for the specific language governing permissions and 14a5fc6f006f67867417b7a427de6e7394c4312decTodd Kennedy * limitations under the License. 15a5fc6f006f67867417b7a427de6e7394c4312decTodd Kennedy */ 16a5fc6f006f67867417b7a427de6e7394c4312decTodd Kennedy 17a5fc6f006f67867417b7a427de6e7394c4312decTodd Kennedypackage android.app; 18a5fc6f006f67867417b7a427de6e7394c4312decTodd Kennedy 19970b59cbe377e23e9c681a5cef30c01f730c7377Svetoslavimport android.annotation.NonNull; 20a5fc6f006f67867417b7a427de6e7394c4312decTodd Kennedyimport android.annotation.Nullable; 21a5fc6f006f67867417b7a427de6e7394c4312decTodd Kennedyimport android.content.Context; 22a5fc6f006f67867417b7a427de6e7394c4312decTodd Kennedyimport android.content.Intent; 23a0c2dc3cf56bf9c90af517f4cd12ef80d375a85aClara Bayarriimport android.content.IntentSender; 24a5fc6f006f67867417b7a427de6e7394c4312decTodd Kennedyimport android.os.Bundle; 25a5fc6f006f67867417b7a427de6e7394c4312decTodd Kennedyimport android.os.Handler; 26a5fc6f006f67867417b7a427de6e7394c4312decTodd Kennedyimport android.util.ArrayMap; 27a5fc6f006f67867417b7a427de6e7394c4312decTodd Kennedyimport android.view.LayoutInflater; 28a5fc6f006f67867417b7a427de6e7394c4312decTodd Kennedyimport android.view.View; 29a5fc6f006f67867417b7a427de6e7394c4312decTodd Kennedy 30a5fc6f006f67867417b7a427de6e7394c4312decTodd Kennedyimport java.io.FileDescriptor; 31a5fc6f006f67867417b7a427de6e7394c4312decTodd Kennedyimport java.io.PrintWriter; 32a5fc6f006f67867417b7a427de6e7394c4312decTodd Kennedy 33a5fc6f006f67867417b7a427de6e7394c4312decTodd Kennedy/** 34a5fc6f006f67867417b7a427de6e7394c4312decTodd Kennedy * Integration points with the Fragment host. 35a5fc6f006f67867417b7a427de6e7394c4312decTodd Kennedy * <p> 36a5fc6f006f67867417b7a427de6e7394c4312decTodd Kennedy * Fragments may be hosted by any object; such as an {@link Activity}. In order to 37a5fc6f006f67867417b7a427de6e7394c4312decTodd Kennedy * host fragments, implement {@link FragmentHostCallback}, overriding the methods 38a5fc6f006f67867417b7a427de6e7394c4312decTodd Kennedy * applicable to the host. 39a5fc6f006f67867417b7a427de6e7394c4312decTodd Kennedy */ 40a5fc6f006f67867417b7a427de6e7394c4312decTodd Kennedypublic abstract class FragmentHostCallback<E> extends FragmentContainer { 41a5fc6f006f67867417b7a427de6e7394c4312decTodd Kennedy private final Activity mActivity; 42a5fc6f006f67867417b7a427de6e7394c4312decTodd Kennedy final Context mContext; 43a5fc6f006f67867417b7a427de6e7394c4312decTodd Kennedy private final Handler mHandler; 44a5fc6f006f67867417b7a427de6e7394c4312decTodd Kennedy final int mWindowAnimations; 45a5fc6f006f67867417b7a427de6e7394c4312decTodd Kennedy final FragmentManagerImpl mFragmentManager = new FragmentManagerImpl(); 462ee19c7f46ab488f19380f4c70904a1ac00fee9aTodd Kennedy /** The loader managers for individual fragments [i.e. Fragment#getLoaderManager()] */ 47a5fc6f006f67867417b7a427de6e7394c4312decTodd Kennedy private ArrayMap<String, LoaderManager> mAllLoaderManagers; 482ee19c7f46ab488f19380f4c70904a1ac00fee9aTodd Kennedy /** Whether or not fragment loaders should retain their state */ 492ee19c7f46ab488f19380f4c70904a1ac00fee9aTodd Kennedy private boolean mRetainLoaders; 502ee19c7f46ab488f19380f4c70904a1ac00fee9aTodd Kennedy /** The loader manger for the fragment host [i.e. Activity#getLoaderManager()] */ 51a5fc6f006f67867417b7a427de6e7394c4312decTodd Kennedy private LoaderManagerImpl mLoaderManager; 52a5fc6f006f67867417b7a427de6e7394c4312decTodd Kennedy private boolean mCheckedForLoaderManager; 532ee19c7f46ab488f19380f4c70904a1ac00fee9aTodd Kennedy /** Whether or not the fragment host loader manager was started */ 54a5fc6f006f67867417b7a427de6e7394c4312decTodd Kennedy private boolean mLoadersStarted; 55a5fc6f006f67867417b7a427de6e7394c4312decTodd Kennedy 56a5fc6f006f67867417b7a427de6e7394c4312decTodd Kennedy public FragmentHostCallback(Context context, Handler handler, int windowAnimations) { 57a5fc6f006f67867417b7a427de6e7394c4312decTodd Kennedy this(null /*activity*/, context, handler, windowAnimations); 58a5fc6f006f67867417b7a427de6e7394c4312decTodd Kennedy } 59a5fc6f006f67867417b7a427de6e7394c4312decTodd Kennedy 60a5fc6f006f67867417b7a427de6e7394c4312decTodd Kennedy FragmentHostCallback(Activity activity) { 61a5fc6f006f67867417b7a427de6e7394c4312decTodd Kennedy this(activity, activity /*context*/, activity.mHandler, 0 /*windowAnimations*/); 62a5fc6f006f67867417b7a427de6e7394c4312decTodd Kennedy } 63a5fc6f006f67867417b7a427de6e7394c4312decTodd Kennedy 64a5fc6f006f67867417b7a427de6e7394c4312decTodd Kennedy FragmentHostCallback(Activity activity, Context context, Handler handler, 65a5fc6f006f67867417b7a427de6e7394c4312decTodd Kennedy int windowAnimations) { 66a5fc6f006f67867417b7a427de6e7394c4312decTodd Kennedy mActivity = activity; 67a5fc6f006f67867417b7a427de6e7394c4312decTodd Kennedy mContext = context; 68a5fc6f006f67867417b7a427de6e7394c4312decTodd Kennedy mHandler = handler; 69a5fc6f006f67867417b7a427de6e7394c4312decTodd Kennedy mWindowAnimations = windowAnimations; 70a5fc6f006f67867417b7a427de6e7394c4312decTodd Kennedy } 71a5fc6f006f67867417b7a427de6e7394c4312decTodd Kennedy 72a5fc6f006f67867417b7a427de6e7394c4312decTodd Kennedy /** 73a5fc6f006f67867417b7a427de6e7394c4312decTodd Kennedy * Print internal state into the given stream. 74a5fc6f006f67867417b7a427de6e7394c4312decTodd Kennedy * 75a5fc6f006f67867417b7a427de6e7394c4312decTodd Kennedy * @param prefix Desired prefix to prepend at each line of output. 76a5fc6f006f67867417b7a427de6e7394c4312decTodd Kennedy * @param fd The raw file descriptor that the dump is being sent to. 77a5fc6f006f67867417b7a427de6e7394c4312decTodd Kennedy * @param writer The PrintWriter to which you should dump your state. This will be closed 78a5fc6f006f67867417b7a427de6e7394c4312decTodd Kennedy * for you after you return. 79a5fc6f006f67867417b7a427de6e7394c4312decTodd Kennedy * @param args additional arguments to the dump request. 80a5fc6f006f67867417b7a427de6e7394c4312decTodd Kennedy */ 81a5fc6f006f67867417b7a427de6e7394c4312decTodd Kennedy public void onDump(String prefix, FileDescriptor fd, PrintWriter writer, String[] args) { 82a5fc6f006f67867417b7a427de6e7394c4312decTodd Kennedy } 83a5fc6f006f67867417b7a427de6e7394c4312decTodd Kennedy 84a5fc6f006f67867417b7a427de6e7394c4312decTodd Kennedy /** 85a5fc6f006f67867417b7a427de6e7394c4312decTodd Kennedy * Return {@code true} if the fragment's state needs to be saved. 86a5fc6f006f67867417b7a427de6e7394c4312decTodd Kennedy */ 87a5fc6f006f67867417b7a427de6e7394c4312decTodd Kennedy public boolean onShouldSaveFragmentState(Fragment fragment) { 88a5fc6f006f67867417b7a427de6e7394c4312decTodd Kennedy return true; 89a5fc6f006f67867417b7a427de6e7394c4312decTodd Kennedy } 90a5fc6f006f67867417b7a427de6e7394c4312decTodd Kennedy 91a5fc6f006f67867417b7a427de6e7394c4312decTodd Kennedy /** 92a5fc6f006f67867417b7a427de6e7394c4312decTodd Kennedy * Return a {@link LayoutInflater}. 93a5fc6f006f67867417b7a427de6e7394c4312decTodd Kennedy * See {@link Activity#getLayoutInflater()}. 94a5fc6f006f67867417b7a427de6e7394c4312decTodd Kennedy */ 95a5fc6f006f67867417b7a427de6e7394c4312decTodd Kennedy public LayoutInflater onGetLayoutInflater() { 96a5fc6f006f67867417b7a427de6e7394c4312decTodd Kennedy return (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 97a5fc6f006f67867417b7a427de6e7394c4312decTodd Kennedy } 98a5fc6f006f67867417b7a427de6e7394c4312decTodd Kennedy 99a5fc6f006f67867417b7a427de6e7394c4312decTodd Kennedy /** 100a5fc6f006f67867417b7a427de6e7394c4312decTodd Kennedy * Return {@code true} if the FragmentManager's LayoutInflaterFactory should be used. 101a5fc6f006f67867417b7a427de6e7394c4312decTodd Kennedy */ 102a5fc6f006f67867417b7a427de6e7394c4312decTodd Kennedy public boolean onUseFragmentManagerInflaterFactory() { 103a5fc6f006f67867417b7a427de6e7394c4312decTodd Kennedy return false; 104a5fc6f006f67867417b7a427de6e7394c4312decTodd Kennedy } 105a5fc6f006f67867417b7a427de6e7394c4312decTodd Kennedy 106a5fc6f006f67867417b7a427de6e7394c4312decTodd Kennedy /** 107a5fc6f006f67867417b7a427de6e7394c4312decTodd Kennedy * Return the object that's currently hosting the fragment. If a {@link Fragment} 108a5fc6f006f67867417b7a427de6e7394c4312decTodd Kennedy * is hosted by a {@link Activity}, the object returned here should be the same 109a5fc6f006f67867417b7a427de6e7394c4312decTodd Kennedy * object returned from {@link Fragment#getActivity()}. 110a5fc6f006f67867417b7a427de6e7394c4312decTodd Kennedy */ 111a5fc6f006f67867417b7a427de6e7394c4312decTodd Kennedy @Nullable 112a5fc6f006f67867417b7a427de6e7394c4312decTodd Kennedy public abstract E onGetHost(); 113a5fc6f006f67867417b7a427de6e7394c4312decTodd Kennedy 114a5fc6f006f67867417b7a427de6e7394c4312decTodd Kennedy /** 115a5fc6f006f67867417b7a427de6e7394c4312decTodd Kennedy * Invalidates the activity's options menu. 116a5fc6f006f67867417b7a427de6e7394c4312decTodd Kennedy * See {@link Activity#invalidateOptionsMenu()} 117a5fc6f006f67867417b7a427de6e7394c4312decTodd Kennedy */ 118a5fc6f006f67867417b7a427de6e7394c4312decTodd Kennedy public void onInvalidateOptionsMenu() { 119a5fc6f006f67867417b7a427de6e7394c4312decTodd Kennedy } 120a5fc6f006f67867417b7a427de6e7394c4312decTodd Kennedy 121a5fc6f006f67867417b7a427de6e7394c4312decTodd Kennedy /** 122a5fc6f006f67867417b7a427de6e7394c4312decTodd Kennedy * Starts a new {@link Activity} from the given fragment. 123a5fc6f006f67867417b7a427de6e7394c4312decTodd Kennedy * See {@link Activity#startActivityForResult(Intent, int)}. 124a5fc6f006f67867417b7a427de6e7394c4312decTodd Kennedy */ 125a5fc6f006f67867417b7a427de6e7394c4312decTodd Kennedy public void onStartActivityFromFragment(Fragment fragment, Intent intent, int requestCode, 126a5fc6f006f67867417b7a427de6e7394c4312decTodd Kennedy Bundle options) { 127a5fc6f006f67867417b7a427de6e7394c4312decTodd Kennedy if (requestCode != -1) { 128a5fc6f006f67867417b7a427de6e7394c4312decTodd Kennedy throw new IllegalStateException( 129a5fc6f006f67867417b7a427de6e7394c4312decTodd Kennedy "Starting activity with a requestCode requires a FragmentActivity host"); 130a5fc6f006f67867417b7a427de6e7394c4312decTodd Kennedy } 131a5fc6f006f67867417b7a427de6e7394c4312decTodd Kennedy mContext.startActivity(intent); 132a5fc6f006f67867417b7a427de6e7394c4312decTodd Kennedy } 133a5fc6f006f67867417b7a427de6e7394c4312decTodd Kennedy 134a5fc6f006f67867417b7a427de6e7394c4312decTodd Kennedy /** 135a0c2dc3cf56bf9c90af517f4cd12ef80d375a85aClara Bayarri * Starts a new {@link IntentSender} from the given fragment. 136a0c2dc3cf56bf9c90af517f4cd12ef80d375a85aClara Bayarri * See {@link Activity#startIntentSender(IntentSender, Intent, int, int, int, Bundle)}. 137a0c2dc3cf56bf9c90af517f4cd12ef80d375a85aClara Bayarri */ 138a0c2dc3cf56bf9c90af517f4cd12ef80d375a85aClara Bayarri public void onStartIntentSenderFromFragment(Fragment fragment, IntentSender intent, 139a0c2dc3cf56bf9c90af517f4cd12ef80d375a85aClara Bayarri int requestCode, @Nullable Intent fillInIntent, int flagsMask, int flagsValues, 140a0c2dc3cf56bf9c90af517f4cd12ef80d375a85aClara Bayarri int extraFlags, Bundle options) throws IntentSender.SendIntentException { 141a0c2dc3cf56bf9c90af517f4cd12ef80d375a85aClara Bayarri if (requestCode != -1) { 142a0c2dc3cf56bf9c90af517f4cd12ef80d375a85aClara Bayarri throw new IllegalStateException( 143a0c2dc3cf56bf9c90af517f4cd12ef80d375a85aClara Bayarri "Starting intent sender with a requestCode requires a FragmentActivity host"); 144a0c2dc3cf56bf9c90af517f4cd12ef80d375a85aClara Bayarri } 145a0c2dc3cf56bf9c90af517f4cd12ef80d375a85aClara Bayarri mContext.startIntentSender(intent, fillInIntent, flagsMask, flagsValues, extraFlags, 146a0c2dc3cf56bf9c90af517f4cd12ef80d375a85aClara Bayarri options); 147a0c2dc3cf56bf9c90af517f4cd12ef80d375a85aClara Bayarri } 148a0c2dc3cf56bf9c90af517f4cd12ef80d375a85aClara Bayarri 149a0c2dc3cf56bf9c90af517f4cd12ef80d375a85aClara Bayarri /** 150970b59cbe377e23e9c681a5cef30c01f730c7377Svetoslav * Requests permissions from the given fragment. 151970b59cbe377e23e9c681a5cef30c01f730c7377Svetoslav * See {@link Activity#requestPermissions(String[], int)} 152970b59cbe377e23e9c681a5cef30c01f730c7377Svetoslav */ 153970b59cbe377e23e9c681a5cef30c01f730c7377Svetoslav public void onRequestPermissionsFromFragment(@NonNull Fragment fragment, 154970b59cbe377e23e9c681a5cef30c01f730c7377Svetoslav @NonNull String[] permissions, int requestCode) { 155970b59cbe377e23e9c681a5cef30c01f730c7377Svetoslav } 156970b59cbe377e23e9c681a5cef30c01f730c7377Svetoslav 157970b59cbe377e23e9c681a5cef30c01f730c7377Svetoslav /** 158a5fc6f006f67867417b7a427de6e7394c4312decTodd Kennedy * Return {@code true} if there are window animations. 159a5fc6f006f67867417b7a427de6e7394c4312decTodd Kennedy */ 160a5fc6f006f67867417b7a427de6e7394c4312decTodd Kennedy public boolean onHasWindowAnimations() { 161a5fc6f006f67867417b7a427de6e7394c4312decTodd Kennedy return true; 162a5fc6f006f67867417b7a427de6e7394c4312decTodd Kennedy } 163a5fc6f006f67867417b7a427de6e7394c4312decTodd Kennedy 164a5fc6f006f67867417b7a427de6e7394c4312decTodd Kennedy /** 165a5fc6f006f67867417b7a427de6e7394c4312decTodd Kennedy * Return the window animations. 166a5fc6f006f67867417b7a427de6e7394c4312decTodd Kennedy */ 167a5fc6f006f67867417b7a427de6e7394c4312decTodd Kennedy public int onGetWindowAnimations() { 168a5fc6f006f67867417b7a427de6e7394c4312decTodd Kennedy return mWindowAnimations; 169a5fc6f006f67867417b7a427de6e7394c4312decTodd Kennedy } 170a5fc6f006f67867417b7a427de6e7394c4312decTodd Kennedy 171434bd65ca61ff5cec46fce9fbe866d8ee40579daTodd Kennedy /** 172434bd65ca61ff5cec46fce9fbe866d8ee40579daTodd Kennedy * Called when a {@link Fragment} is being attached to this host, immediately 173434bd65ca61ff5cec46fce9fbe866d8ee40579daTodd Kennedy * after the call to its {@link Fragment#onAttach(Context)} method and before 174434bd65ca61ff5cec46fce9fbe866d8ee40579daTodd Kennedy * {@link Fragment#onCreate(Bundle)}. 175434bd65ca61ff5cec46fce9fbe866d8ee40579daTodd Kennedy */ 176434bd65ca61ff5cec46fce9fbe866d8ee40579daTodd Kennedy public void onAttachFragment(Fragment fragment) { 177434bd65ca61ff5cec46fce9fbe866d8ee40579daTodd Kennedy } 178434bd65ca61ff5cec46fce9fbe866d8ee40579daTodd Kennedy 179a5fc6f006f67867417b7a427de6e7394c4312decTodd Kennedy @Nullable 180a5fc6f006f67867417b7a427de6e7394c4312decTodd Kennedy @Override 181a5fc6f006f67867417b7a427de6e7394c4312decTodd Kennedy public View onFindViewById(int id) { 182a5fc6f006f67867417b7a427de6e7394c4312decTodd Kennedy return null; 183a5fc6f006f67867417b7a427de6e7394c4312decTodd Kennedy } 184a5fc6f006f67867417b7a427de6e7394c4312decTodd Kennedy 185a5fc6f006f67867417b7a427de6e7394c4312decTodd Kennedy @Override 186a5fc6f006f67867417b7a427de6e7394c4312decTodd Kennedy public boolean onHasView() { 187a5fc6f006f67867417b7a427de6e7394c4312decTodd Kennedy return true; 188a5fc6f006f67867417b7a427de6e7394c4312decTodd Kennedy } 189a5fc6f006f67867417b7a427de6e7394c4312decTodd Kennedy 1902ee19c7f46ab488f19380f4c70904a1ac00fee9aTodd Kennedy boolean getRetainLoaders() { 1912ee19c7f46ab488f19380f4c70904a1ac00fee9aTodd Kennedy return mRetainLoaders; 1922ee19c7f46ab488f19380f4c70904a1ac00fee9aTodd Kennedy } 1932ee19c7f46ab488f19380f4c70904a1ac00fee9aTodd Kennedy 194a5fc6f006f67867417b7a427de6e7394c4312decTodd Kennedy Activity getActivity() { 195a5fc6f006f67867417b7a427de6e7394c4312decTodd Kennedy return mActivity; 196a5fc6f006f67867417b7a427de6e7394c4312decTodd Kennedy } 197a5fc6f006f67867417b7a427de6e7394c4312decTodd Kennedy 198a5fc6f006f67867417b7a427de6e7394c4312decTodd Kennedy Context getContext() { 199a5fc6f006f67867417b7a427de6e7394c4312decTodd Kennedy return mContext; 200a5fc6f006f67867417b7a427de6e7394c4312decTodd Kennedy } 201a5fc6f006f67867417b7a427de6e7394c4312decTodd Kennedy 202a5fc6f006f67867417b7a427de6e7394c4312decTodd Kennedy Handler getHandler() { 203a5fc6f006f67867417b7a427de6e7394c4312decTodd Kennedy return mHandler; 204a5fc6f006f67867417b7a427de6e7394c4312decTodd Kennedy } 205a5fc6f006f67867417b7a427de6e7394c4312decTodd Kennedy 206a5fc6f006f67867417b7a427de6e7394c4312decTodd Kennedy FragmentManagerImpl getFragmentManagerImpl() { 207a5fc6f006f67867417b7a427de6e7394c4312decTodd Kennedy return mFragmentManager; 208a5fc6f006f67867417b7a427de6e7394c4312decTodd Kennedy } 209a5fc6f006f67867417b7a427de6e7394c4312decTodd Kennedy 210a5fc6f006f67867417b7a427de6e7394c4312decTodd Kennedy LoaderManagerImpl getLoaderManagerImpl() { 211a5fc6f006f67867417b7a427de6e7394c4312decTodd Kennedy if (mLoaderManager != null) { 212a5fc6f006f67867417b7a427de6e7394c4312decTodd Kennedy return mLoaderManager; 213a5fc6f006f67867417b7a427de6e7394c4312decTodd Kennedy } 214a5fc6f006f67867417b7a427de6e7394c4312decTodd Kennedy mCheckedForLoaderManager = true; 215a5fc6f006f67867417b7a427de6e7394c4312decTodd Kennedy mLoaderManager = getLoaderManager("(root)", mLoadersStarted, true /*create*/); 216a5fc6f006f67867417b7a427de6e7394c4312decTodd Kennedy return mLoaderManager; 217a5fc6f006f67867417b7a427de6e7394c4312decTodd Kennedy } 218a5fc6f006f67867417b7a427de6e7394c4312decTodd Kennedy 219a5fc6f006f67867417b7a427de6e7394c4312decTodd Kennedy void inactivateFragment(String who) { 220a5fc6f006f67867417b7a427de6e7394c4312decTodd Kennedy //Log.v(TAG, "invalidateSupportFragment: who=" + who); 221a5fc6f006f67867417b7a427de6e7394c4312decTodd Kennedy if (mAllLoaderManagers != null) { 222a5fc6f006f67867417b7a427de6e7394c4312decTodd Kennedy LoaderManagerImpl lm = (LoaderManagerImpl) mAllLoaderManagers.get(who); 223a5fc6f006f67867417b7a427de6e7394c4312decTodd Kennedy if (lm != null && !lm.mRetaining) { 224a5fc6f006f67867417b7a427de6e7394c4312decTodd Kennedy lm.doDestroy(); 225a5fc6f006f67867417b7a427de6e7394c4312decTodd Kennedy mAllLoaderManagers.remove(who); 226a5fc6f006f67867417b7a427de6e7394c4312decTodd Kennedy } 227a5fc6f006f67867417b7a427de6e7394c4312decTodd Kennedy } 228a5fc6f006f67867417b7a427de6e7394c4312decTodd Kennedy } 229a5fc6f006f67867417b7a427de6e7394c4312decTodd Kennedy 230a5fc6f006f67867417b7a427de6e7394c4312decTodd Kennedy void doLoaderStart() { 231a5fc6f006f67867417b7a427de6e7394c4312decTodd Kennedy if (mLoadersStarted) { 232a5fc6f006f67867417b7a427de6e7394c4312decTodd Kennedy return; 233a5fc6f006f67867417b7a427de6e7394c4312decTodd Kennedy } 234a5fc6f006f67867417b7a427de6e7394c4312decTodd Kennedy mLoadersStarted = true; 235a5fc6f006f67867417b7a427de6e7394c4312decTodd Kennedy 236a5fc6f006f67867417b7a427de6e7394c4312decTodd Kennedy if (mLoaderManager != null) { 237a5fc6f006f67867417b7a427de6e7394c4312decTodd Kennedy mLoaderManager.doStart(); 238a5fc6f006f67867417b7a427de6e7394c4312decTodd Kennedy } else if (!mCheckedForLoaderManager) { 239a5fc6f006f67867417b7a427de6e7394c4312decTodd Kennedy mLoaderManager = getLoaderManager("(root)", mLoadersStarted, false); 240a5fc6f006f67867417b7a427de6e7394c4312decTodd Kennedy } 241a5fc6f006f67867417b7a427de6e7394c4312decTodd Kennedy mCheckedForLoaderManager = true; 242a5fc6f006f67867417b7a427de6e7394c4312decTodd Kennedy } 243a5fc6f006f67867417b7a427de6e7394c4312decTodd Kennedy 244a5fc6f006f67867417b7a427de6e7394c4312decTodd Kennedy void doLoaderStop(boolean retain) { 2452ee19c7f46ab488f19380f4c70904a1ac00fee9aTodd Kennedy mRetainLoaders = retain; 2462ee19c7f46ab488f19380f4c70904a1ac00fee9aTodd Kennedy 247a5fc6f006f67867417b7a427de6e7394c4312decTodd Kennedy if (mLoaderManager == null) { 248a5fc6f006f67867417b7a427de6e7394c4312decTodd Kennedy return; 249a5fc6f006f67867417b7a427de6e7394c4312decTodd Kennedy } 250a5fc6f006f67867417b7a427de6e7394c4312decTodd Kennedy 251a5fc6f006f67867417b7a427de6e7394c4312decTodd Kennedy if (!mLoadersStarted) { 252a5fc6f006f67867417b7a427de6e7394c4312decTodd Kennedy return; 253a5fc6f006f67867417b7a427de6e7394c4312decTodd Kennedy } 254a5fc6f006f67867417b7a427de6e7394c4312decTodd Kennedy mLoadersStarted = false; 255a5fc6f006f67867417b7a427de6e7394c4312decTodd Kennedy 256a5fc6f006f67867417b7a427de6e7394c4312decTodd Kennedy if (retain) { 257a5fc6f006f67867417b7a427de6e7394c4312decTodd Kennedy mLoaderManager.doRetain(); 258a5fc6f006f67867417b7a427de6e7394c4312decTodd Kennedy } else { 259a5fc6f006f67867417b7a427de6e7394c4312decTodd Kennedy mLoaderManager.doStop(); 260a5fc6f006f67867417b7a427de6e7394c4312decTodd Kennedy } 261a5fc6f006f67867417b7a427de6e7394c4312decTodd Kennedy } 262a5fc6f006f67867417b7a427de6e7394c4312decTodd Kennedy 263a5fc6f006f67867417b7a427de6e7394c4312decTodd Kennedy void doLoaderRetain() { 264a5fc6f006f67867417b7a427de6e7394c4312decTodd Kennedy if (mLoaderManager == null) { 265a5fc6f006f67867417b7a427de6e7394c4312decTodd Kennedy return; 266a5fc6f006f67867417b7a427de6e7394c4312decTodd Kennedy } 267a5fc6f006f67867417b7a427de6e7394c4312decTodd Kennedy mLoaderManager.doRetain(); 268a5fc6f006f67867417b7a427de6e7394c4312decTodd Kennedy } 269a5fc6f006f67867417b7a427de6e7394c4312decTodd Kennedy 270a5fc6f006f67867417b7a427de6e7394c4312decTodd Kennedy void doLoaderDestroy() { 271a5fc6f006f67867417b7a427de6e7394c4312decTodd Kennedy if (mLoaderManager == null) { 272a5fc6f006f67867417b7a427de6e7394c4312decTodd Kennedy return; 273a5fc6f006f67867417b7a427de6e7394c4312decTodd Kennedy } 274a5fc6f006f67867417b7a427de6e7394c4312decTodd Kennedy mLoaderManager.doDestroy(); 275a5fc6f006f67867417b7a427de6e7394c4312decTodd Kennedy } 276a5fc6f006f67867417b7a427de6e7394c4312decTodd Kennedy 277a5fc6f006f67867417b7a427de6e7394c4312decTodd Kennedy void reportLoaderStart() { 278a5fc6f006f67867417b7a427de6e7394c4312decTodd Kennedy if (mAllLoaderManagers != null) { 279a5fc6f006f67867417b7a427de6e7394c4312decTodd Kennedy final int N = mAllLoaderManagers.size(); 280a5fc6f006f67867417b7a427de6e7394c4312decTodd Kennedy LoaderManagerImpl loaders[] = new LoaderManagerImpl[N]; 281a5fc6f006f67867417b7a427de6e7394c4312decTodd Kennedy for (int i=N-1; i>=0; i--) { 282a5fc6f006f67867417b7a427de6e7394c4312decTodd Kennedy loaders[i] = (LoaderManagerImpl) mAllLoaderManagers.valueAt(i); 283a5fc6f006f67867417b7a427de6e7394c4312decTodd Kennedy } 284a5fc6f006f67867417b7a427de6e7394c4312decTodd Kennedy for (int i=0; i<N; i++) { 285a5fc6f006f67867417b7a427de6e7394c4312decTodd Kennedy LoaderManagerImpl lm = loaders[i]; 286a5fc6f006f67867417b7a427de6e7394c4312decTodd Kennedy lm.finishRetain(); 287a5fc6f006f67867417b7a427de6e7394c4312decTodd Kennedy lm.doReportStart(); 288a5fc6f006f67867417b7a427de6e7394c4312decTodd Kennedy } 289a5fc6f006f67867417b7a427de6e7394c4312decTodd Kennedy } 290a5fc6f006f67867417b7a427de6e7394c4312decTodd Kennedy } 291a5fc6f006f67867417b7a427de6e7394c4312decTodd Kennedy 292a5fc6f006f67867417b7a427de6e7394c4312decTodd Kennedy LoaderManagerImpl getLoaderManager(String who, boolean started, boolean create) { 293a5fc6f006f67867417b7a427de6e7394c4312decTodd Kennedy if (mAllLoaderManagers == null) { 294a5fc6f006f67867417b7a427de6e7394c4312decTodd Kennedy mAllLoaderManagers = new ArrayMap<String, LoaderManager>(); 295a5fc6f006f67867417b7a427de6e7394c4312decTodd Kennedy } 296a5fc6f006f67867417b7a427de6e7394c4312decTodd Kennedy LoaderManagerImpl lm = (LoaderManagerImpl) mAllLoaderManagers.get(who); 297a5fc6f006f67867417b7a427de6e7394c4312decTodd Kennedy if (lm == null) { 298a5fc6f006f67867417b7a427de6e7394c4312decTodd Kennedy if (create) { 299a5fc6f006f67867417b7a427de6e7394c4312decTodd Kennedy lm = new LoaderManagerImpl(who, this, started); 300a5fc6f006f67867417b7a427de6e7394c4312decTodd Kennedy mAllLoaderManagers.put(who, lm); 301a5fc6f006f67867417b7a427de6e7394c4312decTodd Kennedy } 302a5fc6f006f67867417b7a427de6e7394c4312decTodd Kennedy } else { 303a5fc6f006f67867417b7a427de6e7394c4312decTodd Kennedy lm.updateHostController(this); 304a5fc6f006f67867417b7a427de6e7394c4312decTodd Kennedy } 305a5fc6f006f67867417b7a427de6e7394c4312decTodd Kennedy return lm; 306a5fc6f006f67867417b7a427de6e7394c4312decTodd Kennedy } 307a5fc6f006f67867417b7a427de6e7394c4312decTodd Kennedy 308a5fc6f006f67867417b7a427de6e7394c4312decTodd Kennedy ArrayMap<String, LoaderManager> retainLoaderNonConfig() { 309a5fc6f006f67867417b7a427de6e7394c4312decTodd Kennedy boolean retainLoaders = false; 310a5fc6f006f67867417b7a427de6e7394c4312decTodd Kennedy if (mAllLoaderManagers != null) { 311cbade7f4d3ed06636cdf0f2e2317a9e49b46852aAdam Powell // Restart any loader managers that were already stopped so that they 312cbade7f4d3ed06636cdf0f2e2317a9e49b46852aAdam Powell // will be ready to retain 313a5fc6f006f67867417b7a427de6e7394c4312decTodd Kennedy final int N = mAllLoaderManagers.size(); 314a5fc6f006f67867417b7a427de6e7394c4312decTodd Kennedy LoaderManagerImpl loaders[] = new LoaderManagerImpl[N]; 315a5fc6f006f67867417b7a427de6e7394c4312decTodd Kennedy for (int i=N-1; i>=0; i--) { 316a5fc6f006f67867417b7a427de6e7394c4312decTodd Kennedy loaders[i] = (LoaderManagerImpl) mAllLoaderManagers.valueAt(i); 317a5fc6f006f67867417b7a427de6e7394c4312decTodd Kennedy } 318cbade7f4d3ed06636cdf0f2e2317a9e49b46852aAdam Powell final boolean doRetainLoaders = getRetainLoaders(); 319a5fc6f006f67867417b7a427de6e7394c4312decTodd Kennedy for (int i=0; i<N; i++) { 320a5fc6f006f67867417b7a427de6e7394c4312decTodd Kennedy LoaderManagerImpl lm = loaders[i]; 321cbade7f4d3ed06636cdf0f2e2317a9e49b46852aAdam Powell if (!lm.mRetaining && doRetainLoaders) { 322cbade7f4d3ed06636cdf0f2e2317a9e49b46852aAdam Powell if (!lm.mStarted) { 323cbade7f4d3ed06636cdf0f2e2317a9e49b46852aAdam Powell lm.doStart(); 324cbade7f4d3ed06636cdf0f2e2317a9e49b46852aAdam Powell } 325cbade7f4d3ed06636cdf0f2e2317a9e49b46852aAdam Powell lm.doRetain(); 326cbade7f4d3ed06636cdf0f2e2317a9e49b46852aAdam Powell } 327a5fc6f006f67867417b7a427de6e7394c4312decTodd Kennedy if (lm.mRetaining) { 328a5fc6f006f67867417b7a427de6e7394c4312decTodd Kennedy retainLoaders = true; 329a5fc6f006f67867417b7a427de6e7394c4312decTodd Kennedy } else { 330a5fc6f006f67867417b7a427de6e7394c4312decTodd Kennedy lm.doDestroy(); 331a5fc6f006f67867417b7a427de6e7394c4312decTodd Kennedy mAllLoaderManagers.remove(lm.mWho); 332a5fc6f006f67867417b7a427de6e7394c4312decTodd Kennedy } 333a5fc6f006f67867417b7a427de6e7394c4312decTodd Kennedy } 334a5fc6f006f67867417b7a427de6e7394c4312decTodd Kennedy } 335a5fc6f006f67867417b7a427de6e7394c4312decTodd Kennedy 336a5fc6f006f67867417b7a427de6e7394c4312decTodd Kennedy if (retainLoaders) { 337a5fc6f006f67867417b7a427de6e7394c4312decTodd Kennedy return mAllLoaderManagers; 338a5fc6f006f67867417b7a427de6e7394c4312decTodd Kennedy } 339a5fc6f006f67867417b7a427de6e7394c4312decTodd Kennedy return null; 340a5fc6f006f67867417b7a427de6e7394c4312decTodd Kennedy } 341a5fc6f006f67867417b7a427de6e7394c4312decTodd Kennedy 342a5fc6f006f67867417b7a427de6e7394c4312decTodd Kennedy void restoreLoaderNonConfig(ArrayMap<String, LoaderManager> loaderManagers) { 343a5fc6f006f67867417b7a427de6e7394c4312decTodd Kennedy mAllLoaderManagers = loaderManagers; 344a5fc6f006f67867417b7a427de6e7394c4312decTodd Kennedy } 345a5fc6f006f67867417b7a427de6e7394c4312decTodd Kennedy 346a5fc6f006f67867417b7a427de6e7394c4312decTodd Kennedy void dumpLoaders(String prefix, FileDescriptor fd, PrintWriter writer, String[] args) { 347a5fc6f006f67867417b7a427de6e7394c4312decTodd Kennedy writer.print(prefix); writer.print("mLoadersStarted="); 348a5fc6f006f67867417b7a427de6e7394c4312decTodd Kennedy writer.println(mLoadersStarted); 349a5fc6f006f67867417b7a427de6e7394c4312decTodd Kennedy if (mLoaderManager != null) { 350a5fc6f006f67867417b7a427de6e7394c4312decTodd Kennedy writer.print(prefix); writer.print("Loader Manager "); 351a5fc6f006f67867417b7a427de6e7394c4312decTodd Kennedy writer.print(Integer.toHexString(System.identityHashCode(mLoaderManager))); 352a5fc6f006f67867417b7a427de6e7394c4312decTodd Kennedy writer.println(":"); 353a5fc6f006f67867417b7a427de6e7394c4312decTodd Kennedy mLoaderManager.dump(prefix + " ", fd, writer, args); 354a5fc6f006f67867417b7a427de6e7394c4312decTodd Kennedy } 355a5fc6f006f67867417b7a427de6e7394c4312decTodd Kennedy } 356a5fc6f006f67867417b7a427de6e7394c4312decTodd Kennedy} 357