1d608cf6e08769bf320c1b595cbbd9a7664160449Todd Kennedy/* 2d608cf6e08769bf320c1b595cbbd9a7664160449Todd Kennedy * Copyright (C) 2015 The Android Open Source Project 3d608cf6e08769bf320c1b595cbbd9a7664160449Todd Kennedy * 4d608cf6e08769bf320c1b595cbbd9a7664160449Todd Kennedy * Licensed under the Apache License, Version 2.0 (the "License"); 5d608cf6e08769bf320c1b595cbbd9a7664160449Todd Kennedy * you may not use this file except in compliance with the License. 6d608cf6e08769bf320c1b595cbbd9a7664160449Todd Kennedy * You may obtain a copy of the License at 7d608cf6e08769bf320c1b595cbbd9a7664160449Todd Kennedy * 8d608cf6e08769bf320c1b595cbbd9a7664160449Todd Kennedy * http://www.apache.org/licenses/LICENSE-2.0 9d608cf6e08769bf320c1b595cbbd9a7664160449Todd Kennedy * 10d608cf6e08769bf320c1b595cbbd9a7664160449Todd Kennedy * Unless required by applicable law or agreed to in writing, software 11d608cf6e08769bf320c1b595cbbd9a7664160449Todd Kennedy * distributed under the License is distributed on an "AS IS" BASIS, 12d608cf6e08769bf320c1b595cbbd9a7664160449Todd Kennedy * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13d608cf6e08769bf320c1b595cbbd9a7664160449Todd Kennedy * See the License for the specific language governing permissions and 14d608cf6e08769bf320c1b595cbbd9a7664160449Todd Kennedy * limitations under the License. 15d608cf6e08769bf320c1b595cbbd9a7664160449Todd Kennedy */ 16d608cf6e08769bf320c1b595cbbd9a7664160449Todd Kennedy 17d608cf6e08769bf320c1b595cbbd9a7664160449Todd Kennedypackage android.support.v4.app; 18d608cf6e08769bf320c1b595cbbd9a7664160449Todd Kennedy 19d608cf6e08769bf320c1b595cbbd9a7664160449Todd Kennedyimport android.app.Activity; 20d608cf6e08769bf320c1b595cbbd9a7664160449Todd Kennedyimport android.content.Context; 21d608cf6e08769bf320c1b595cbbd9a7664160449Todd Kennedyimport android.content.Intent; 22d608cf6e08769bf320c1b595cbbd9a7664160449Todd Kennedyimport android.os.Handler; 23e1e957f536c20ebe2a7e6c417ccb2fd8f7fa845bSvetoslavimport android.support.annotation.NonNull; 24d608cf6e08769bf320c1b595cbbd9a7664160449Todd Kennedyimport android.support.annotation.Nullable; 25d608cf6e08769bf320c1b595cbbd9a7664160449Todd Kennedyimport android.support.v4.util.SimpleArrayMap; 26d608cf6e08769bf320c1b595cbbd9a7664160449Todd Kennedyimport android.view.LayoutInflater; 27d608cf6e08769bf320c1b595cbbd9a7664160449Todd Kennedyimport android.view.View; 28d608cf6e08769bf320c1b595cbbd9a7664160449Todd Kennedy 29d608cf6e08769bf320c1b595cbbd9a7664160449Todd Kennedyimport java.io.FileDescriptor; 30d608cf6e08769bf320c1b595cbbd9a7664160449Todd Kennedyimport java.io.PrintWriter; 31d608cf6e08769bf320c1b595cbbd9a7664160449Todd Kennedy 32d608cf6e08769bf320c1b595cbbd9a7664160449Todd Kennedy/** 338491eb62f621cd5de4b4caed839be09c77011f53Todd Kennedy * Integration points with the Fragment host. 348491eb62f621cd5de4b4caed839be09c77011f53Todd Kennedy * <p> 358491eb62f621cd5de4b4caed839be09c77011f53Todd Kennedy * Fragments may be hosted by any object; such as an {@link Activity}. In order to 368491eb62f621cd5de4b4caed839be09c77011f53Todd Kennedy * host fragments, implement {@link FragmentHostCallback}, overriding the methods 378491eb62f621cd5de4b4caed839be09c77011f53Todd Kennedy * applicable to the host. 38d608cf6e08769bf320c1b595cbbd9a7664160449Todd Kennedy */ 398491eb62f621cd5de4b4caed839be09c77011f53Todd Kennedypublic abstract class FragmentHostCallback<E> extends FragmentContainer { 40d608cf6e08769bf320c1b595cbbd9a7664160449Todd Kennedy private final Activity mActivity; 41d608cf6e08769bf320c1b595cbbd9a7664160449Todd Kennedy final Context mContext; 42d608cf6e08769bf320c1b595cbbd9a7664160449Todd Kennedy private final Handler mHandler; 43d608cf6e08769bf320c1b595cbbd9a7664160449Todd Kennedy final int mWindowAnimations; 44d608cf6e08769bf320c1b595cbbd9a7664160449Todd Kennedy final FragmentManagerImpl mFragmentManager = new FragmentManagerImpl(); 45d608cf6e08769bf320c1b595cbbd9a7664160449Todd Kennedy private SimpleArrayMap<String, LoaderManager> mAllLoaderManagers; 46d608cf6e08769bf320c1b595cbbd9a7664160449Todd Kennedy private LoaderManagerImpl mLoaderManager; 47d608cf6e08769bf320c1b595cbbd9a7664160449Todd Kennedy private boolean mCheckedForLoaderManager; 48d608cf6e08769bf320c1b595cbbd9a7664160449Todd Kennedy private boolean mLoadersStarted; 49d608cf6e08769bf320c1b595cbbd9a7664160449Todd Kennedy 508491eb62f621cd5de4b4caed839be09c77011f53Todd Kennedy public FragmentHostCallback(Context context, Handler handler, int windowAnimations) { 51d608cf6e08769bf320c1b595cbbd9a7664160449Todd Kennedy this(null /*activity*/, context, handler, windowAnimations); 52d608cf6e08769bf320c1b595cbbd9a7664160449Todd Kennedy } 53d608cf6e08769bf320c1b595cbbd9a7664160449Todd Kennedy 548491eb62f621cd5de4b4caed839be09c77011f53Todd Kennedy FragmentHostCallback(FragmentActivity activity) { 55d608cf6e08769bf320c1b595cbbd9a7664160449Todd Kennedy this(activity, activity /*context*/, activity.mHandler, 0 /*windowAnimations*/); 56d608cf6e08769bf320c1b595cbbd9a7664160449Todd Kennedy } 57d608cf6e08769bf320c1b595cbbd9a7664160449Todd Kennedy 588491eb62f621cd5de4b4caed839be09c77011f53Todd Kennedy FragmentHostCallback(Activity activity, Context context, Handler handler, 59d608cf6e08769bf320c1b595cbbd9a7664160449Todd Kennedy int windowAnimations) { 60d608cf6e08769bf320c1b595cbbd9a7664160449Todd Kennedy mActivity = activity; 61d608cf6e08769bf320c1b595cbbd9a7664160449Todd Kennedy mContext = context; 62d608cf6e08769bf320c1b595cbbd9a7664160449Todd Kennedy mHandler = handler; 63d608cf6e08769bf320c1b595cbbd9a7664160449Todd Kennedy mWindowAnimations = windowAnimations; 64d608cf6e08769bf320c1b595cbbd9a7664160449Todd Kennedy } 65d608cf6e08769bf320c1b595cbbd9a7664160449Todd Kennedy 66d608cf6e08769bf320c1b595cbbd9a7664160449Todd Kennedy /** 67d608cf6e08769bf320c1b595cbbd9a7664160449Todd Kennedy * Print internal state into the given stream. 68d608cf6e08769bf320c1b595cbbd9a7664160449Todd Kennedy * 69d608cf6e08769bf320c1b595cbbd9a7664160449Todd Kennedy * @param prefix Desired prefix to prepend at each line of output. 70d608cf6e08769bf320c1b595cbbd9a7664160449Todd Kennedy * @param fd The raw file descriptor that the dump is being sent to. 71d608cf6e08769bf320c1b595cbbd9a7664160449Todd Kennedy * @param writer The PrintWriter to which you should dump your state. This will be closed 72d608cf6e08769bf320c1b595cbbd9a7664160449Todd Kennedy * for you after you return. 73d608cf6e08769bf320c1b595cbbd9a7664160449Todd Kennedy * @param args additional arguments to the dump request. 74d608cf6e08769bf320c1b595cbbd9a7664160449Todd Kennedy */ 758491eb62f621cd5de4b4caed839be09c77011f53Todd Kennedy public void onDump(String prefix, FileDescriptor fd, PrintWriter writer, String[] args) { 76d608cf6e08769bf320c1b595cbbd9a7664160449Todd Kennedy } 77d608cf6e08769bf320c1b595cbbd9a7664160449Todd Kennedy 78d608cf6e08769bf320c1b595cbbd9a7664160449Todd Kennedy /** 79d608cf6e08769bf320c1b595cbbd9a7664160449Todd Kennedy * Return {@code true} if the fragment's state needs to be saved. 80d608cf6e08769bf320c1b595cbbd9a7664160449Todd Kennedy */ 818491eb62f621cd5de4b4caed839be09c77011f53Todd Kennedy public boolean onShouldSaveFragmentState(Fragment fragment) { 82d608cf6e08769bf320c1b595cbbd9a7664160449Todd Kennedy return true; 83d608cf6e08769bf320c1b595cbbd9a7664160449Todd Kennedy } 84d608cf6e08769bf320c1b595cbbd9a7664160449Todd Kennedy 85d608cf6e08769bf320c1b595cbbd9a7664160449Todd Kennedy /** 86d608cf6e08769bf320c1b595cbbd9a7664160449Todd Kennedy * Return a {@link LayoutInflater}. 87d608cf6e08769bf320c1b595cbbd9a7664160449Todd Kennedy * See {@link Activity#getLayoutInflater()}. 88d608cf6e08769bf320c1b595cbbd9a7664160449Todd Kennedy */ 898491eb62f621cd5de4b4caed839be09c77011f53Todd Kennedy public LayoutInflater onGetLayoutInflater() { 90d608cf6e08769bf320c1b595cbbd9a7664160449Todd Kennedy return (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 91d608cf6e08769bf320c1b595cbbd9a7664160449Todd Kennedy } 92d608cf6e08769bf320c1b595cbbd9a7664160449Todd Kennedy 93d608cf6e08769bf320c1b595cbbd9a7664160449Todd Kennedy /** 94edaa101bfa72b5e5a5b14b9e6c66579eaed5e8ccTodd Kennedy * Return the object that's currently hosting the fragment. If a {@link Fragment} 95edaa101bfa72b5e5a5b14b9e6c66579eaed5e8ccTodd Kennedy * is hosted by a {@link FragmentActivity}, the object returned here should be 96edaa101bfa72b5e5a5b14b9e6c66579eaed5e8ccTodd Kennedy * the same object returned from {@link Fragment#getActivity()}. 97edaa101bfa72b5e5a5b14b9e6c66579eaed5e8ccTodd Kennedy */ 98edaa101bfa72b5e5a5b14b9e6c66579eaed5e8ccTodd Kennedy @Nullable 994f08e623f23cbb89881f35d3472b78d388b76dc9Todd Kennedy public abstract E onGetHost(); 100edaa101bfa72b5e5a5b14b9e6c66579eaed5e8ccTodd Kennedy 101edaa101bfa72b5e5a5b14b9e6c66579eaed5e8ccTodd Kennedy /** 102d608cf6e08769bf320c1b595cbbd9a7664160449Todd Kennedy * Invalidates the activity's options menu. 103d608cf6e08769bf320c1b595cbbd9a7664160449Todd Kennedy * See {@link FragmentActivity#supportInvalidateOptionsMenu()} 104d608cf6e08769bf320c1b595cbbd9a7664160449Todd Kennedy */ 1058491eb62f621cd5de4b4caed839be09c77011f53Todd Kennedy public void onSupportInvalidateOptionsMenu() { 106d608cf6e08769bf320c1b595cbbd9a7664160449Todd Kennedy } 107d608cf6e08769bf320c1b595cbbd9a7664160449Todd Kennedy 108d608cf6e08769bf320c1b595cbbd9a7664160449Todd Kennedy /** 109d608cf6e08769bf320c1b595cbbd9a7664160449Todd Kennedy * Starts a new {@link Activity} from the given fragment. 110d608cf6e08769bf320c1b595cbbd9a7664160449Todd Kennedy * See {@link FragmentActivity#startActivityForResult(Intent, int)}. 111d608cf6e08769bf320c1b595cbbd9a7664160449Todd Kennedy */ 1128491eb62f621cd5de4b4caed839be09c77011f53Todd Kennedy public void onStartActivityFromFragment(Fragment fragment, Intent intent, int requestCode) { 113d608cf6e08769bf320c1b595cbbd9a7664160449Todd Kennedy if (requestCode != -1) { 114d608cf6e08769bf320c1b595cbbd9a7664160449Todd Kennedy throw new IllegalStateException( 115d608cf6e08769bf320c1b595cbbd9a7664160449Todd Kennedy "Starting activity with a requestCode requires a FragmentActivity host"); 116d608cf6e08769bf320c1b595cbbd9a7664160449Todd Kennedy } 117d608cf6e08769bf320c1b595cbbd9a7664160449Todd Kennedy mContext.startActivity(intent); 118d608cf6e08769bf320c1b595cbbd9a7664160449Todd Kennedy } 119d608cf6e08769bf320c1b595cbbd9a7664160449Todd Kennedy 120d608cf6e08769bf320c1b595cbbd9a7664160449Todd Kennedy /** 121e1e957f536c20ebe2a7e6c417ccb2fd8f7fa845bSvetoslav * Requests permissions from the given fragment. 122e1e957f536c20ebe2a7e6c417ccb2fd8f7fa845bSvetoslav * See {@link FragmentActivity#requestPermissions(String[], int)} 123e1e957f536c20ebe2a7e6c417ccb2fd8f7fa845bSvetoslav */ 124e1e957f536c20ebe2a7e6c417ccb2fd8f7fa845bSvetoslav public void onRequestPermissionsFromFragment(@NonNull Fragment fragment, 125e1e957f536c20ebe2a7e6c417ccb2fd8f7fa845bSvetoslav @NonNull String[] permissions, int requestCode) { 126e1e957f536c20ebe2a7e6c417ccb2fd8f7fa845bSvetoslav } 127e1e957f536c20ebe2a7e6c417ccb2fd8f7fa845bSvetoslav 128e1e957f536c20ebe2a7e6c417ccb2fd8f7fa845bSvetoslav /** 129e1e957f536c20ebe2a7e6c417ccb2fd8f7fa845bSvetoslav * Checks wehter to show permission rationale UI from a fragment. 130e1e957f536c20ebe2a7e6c417ccb2fd8f7fa845bSvetoslav * See {@link FragmentActivity#shouldShowRequestPermissionRationale(String)} 131e1e957f536c20ebe2a7e6c417ccb2fd8f7fa845bSvetoslav */ 132e1e957f536c20ebe2a7e6c417ccb2fd8f7fa845bSvetoslav public boolean onShouldShowRequestPermissionRationale(@NonNull String permission) { 133e1e957f536c20ebe2a7e6c417ccb2fd8f7fa845bSvetoslav return false; 134e1e957f536c20ebe2a7e6c417ccb2fd8f7fa845bSvetoslav } 135e1e957f536c20ebe2a7e6c417ccb2fd8f7fa845bSvetoslav 136e1e957f536c20ebe2a7e6c417ccb2fd8f7fa845bSvetoslav /** 137d608cf6e08769bf320c1b595cbbd9a7664160449Todd Kennedy * Return {@code true} if there are window animations. 138d608cf6e08769bf320c1b595cbbd9a7664160449Todd Kennedy */ 1398491eb62f621cd5de4b4caed839be09c77011f53Todd Kennedy public boolean onHasWindowAnimations() { 140d608cf6e08769bf320c1b595cbbd9a7664160449Todd Kennedy return true; 141d608cf6e08769bf320c1b595cbbd9a7664160449Todd Kennedy } 142d608cf6e08769bf320c1b595cbbd9a7664160449Todd Kennedy 143d608cf6e08769bf320c1b595cbbd9a7664160449Todd Kennedy /** 144d608cf6e08769bf320c1b595cbbd9a7664160449Todd Kennedy * Return the window animations. 145d608cf6e08769bf320c1b595cbbd9a7664160449Todd Kennedy */ 1468491eb62f621cd5de4b4caed839be09c77011f53Todd Kennedy public int onGetWindowAnimations() { 147d608cf6e08769bf320c1b595cbbd9a7664160449Todd Kennedy return mWindowAnimations; 148d608cf6e08769bf320c1b595cbbd9a7664160449Todd Kennedy } 149d608cf6e08769bf320c1b595cbbd9a7664160449Todd Kennedy 150d608cf6e08769bf320c1b595cbbd9a7664160449Todd Kennedy @Nullable 151d608cf6e08769bf320c1b595cbbd9a7664160449Todd Kennedy @Override 1528491eb62f621cd5de4b4caed839be09c77011f53Todd Kennedy public View onFindViewById(int id) { 153d608cf6e08769bf320c1b595cbbd9a7664160449Todd Kennedy return null; 154d608cf6e08769bf320c1b595cbbd9a7664160449Todd Kennedy } 155d608cf6e08769bf320c1b595cbbd9a7664160449Todd Kennedy 156d608cf6e08769bf320c1b595cbbd9a7664160449Todd Kennedy @Override 1578491eb62f621cd5de4b4caed839be09c77011f53Todd Kennedy public boolean onHasView() { 158d608cf6e08769bf320c1b595cbbd9a7664160449Todd Kennedy return true; 159d608cf6e08769bf320c1b595cbbd9a7664160449Todd Kennedy } 160d608cf6e08769bf320c1b595cbbd9a7664160449Todd Kennedy 161d608cf6e08769bf320c1b595cbbd9a7664160449Todd Kennedy Activity getActivity() { 162d608cf6e08769bf320c1b595cbbd9a7664160449Todd Kennedy return mActivity; 163d608cf6e08769bf320c1b595cbbd9a7664160449Todd Kennedy } 164d608cf6e08769bf320c1b595cbbd9a7664160449Todd Kennedy 165d608cf6e08769bf320c1b595cbbd9a7664160449Todd Kennedy Context getContext() { 166d608cf6e08769bf320c1b595cbbd9a7664160449Todd Kennedy return mContext; 167d608cf6e08769bf320c1b595cbbd9a7664160449Todd Kennedy } 168d608cf6e08769bf320c1b595cbbd9a7664160449Todd Kennedy 169d608cf6e08769bf320c1b595cbbd9a7664160449Todd Kennedy Handler getHandler() { 170d608cf6e08769bf320c1b595cbbd9a7664160449Todd Kennedy return mHandler; 171d608cf6e08769bf320c1b595cbbd9a7664160449Todd Kennedy } 172d608cf6e08769bf320c1b595cbbd9a7664160449Todd Kennedy 173d608cf6e08769bf320c1b595cbbd9a7664160449Todd Kennedy FragmentManagerImpl getFragmentManagerImpl() { 174d608cf6e08769bf320c1b595cbbd9a7664160449Todd Kennedy return mFragmentManager; 175d608cf6e08769bf320c1b595cbbd9a7664160449Todd Kennedy } 176d608cf6e08769bf320c1b595cbbd9a7664160449Todd Kennedy 177d608cf6e08769bf320c1b595cbbd9a7664160449Todd Kennedy LoaderManagerImpl getLoaderManagerImpl() { 178d608cf6e08769bf320c1b595cbbd9a7664160449Todd Kennedy if (mLoaderManager != null) { 179d608cf6e08769bf320c1b595cbbd9a7664160449Todd Kennedy return mLoaderManager; 180d608cf6e08769bf320c1b595cbbd9a7664160449Todd Kennedy } 181d608cf6e08769bf320c1b595cbbd9a7664160449Todd Kennedy mCheckedForLoaderManager = true; 182d608cf6e08769bf320c1b595cbbd9a7664160449Todd Kennedy mLoaderManager = getLoaderManager("(root)", mLoadersStarted, true /*create*/); 183d608cf6e08769bf320c1b595cbbd9a7664160449Todd Kennedy return mLoaderManager; 184d608cf6e08769bf320c1b595cbbd9a7664160449Todd Kennedy } 185d608cf6e08769bf320c1b595cbbd9a7664160449Todd Kennedy 186d608cf6e08769bf320c1b595cbbd9a7664160449Todd Kennedy void inactivateFragment(String who) { 187d608cf6e08769bf320c1b595cbbd9a7664160449Todd Kennedy //Log.v(TAG, "invalidateSupportFragment: who=" + who); 188d608cf6e08769bf320c1b595cbbd9a7664160449Todd Kennedy if (mAllLoaderManagers != null) { 189d608cf6e08769bf320c1b595cbbd9a7664160449Todd Kennedy LoaderManagerImpl lm = (LoaderManagerImpl) mAllLoaderManagers.get(who); 190d608cf6e08769bf320c1b595cbbd9a7664160449Todd Kennedy if (lm != null && !lm.mRetaining) { 191d608cf6e08769bf320c1b595cbbd9a7664160449Todd Kennedy lm.doDestroy(); 192d608cf6e08769bf320c1b595cbbd9a7664160449Todd Kennedy mAllLoaderManagers.remove(who); 193d608cf6e08769bf320c1b595cbbd9a7664160449Todd Kennedy } 194d608cf6e08769bf320c1b595cbbd9a7664160449Todd Kennedy } 195d608cf6e08769bf320c1b595cbbd9a7664160449Todd Kennedy } 196d608cf6e08769bf320c1b595cbbd9a7664160449Todd Kennedy 197b979cb86fa389effb7cd79fa045550c10b7b4819Todd Kennedy void onAttachFragment(Fragment fragment) { 198d608cf6e08769bf320c1b595cbbd9a7664160449Todd Kennedy } 199d608cf6e08769bf320c1b595cbbd9a7664160449Todd Kennedy 200d608cf6e08769bf320c1b595cbbd9a7664160449Todd Kennedy void doLoaderStart() { 201d608cf6e08769bf320c1b595cbbd9a7664160449Todd Kennedy if (mLoadersStarted) { 202d608cf6e08769bf320c1b595cbbd9a7664160449Todd Kennedy return; 203d608cf6e08769bf320c1b595cbbd9a7664160449Todd Kennedy } 204d608cf6e08769bf320c1b595cbbd9a7664160449Todd Kennedy mLoadersStarted = true; 205d608cf6e08769bf320c1b595cbbd9a7664160449Todd Kennedy 206d608cf6e08769bf320c1b595cbbd9a7664160449Todd Kennedy if (mLoaderManager != null) { 207d608cf6e08769bf320c1b595cbbd9a7664160449Todd Kennedy mLoaderManager.doStart(); 208d608cf6e08769bf320c1b595cbbd9a7664160449Todd Kennedy } else if (!mCheckedForLoaderManager) { 209d608cf6e08769bf320c1b595cbbd9a7664160449Todd Kennedy mLoaderManager = getLoaderManager("(root)", mLoadersStarted, false); 210d608cf6e08769bf320c1b595cbbd9a7664160449Todd Kennedy // the returned loader manager may be a new one, so we have to start it 211d608cf6e08769bf320c1b595cbbd9a7664160449Todd Kennedy if ((mLoaderManager != null) && (!mLoaderManager.mStarted)) { 212d608cf6e08769bf320c1b595cbbd9a7664160449Todd Kennedy mLoaderManager.doStart(); 213d608cf6e08769bf320c1b595cbbd9a7664160449Todd Kennedy } 214d608cf6e08769bf320c1b595cbbd9a7664160449Todd Kennedy } 215d608cf6e08769bf320c1b595cbbd9a7664160449Todd Kennedy mCheckedForLoaderManager = true; 216d608cf6e08769bf320c1b595cbbd9a7664160449Todd Kennedy } 217d608cf6e08769bf320c1b595cbbd9a7664160449Todd Kennedy 218d608cf6e08769bf320c1b595cbbd9a7664160449Todd Kennedy // retain -- whether to stop the loader or retain it 219d608cf6e08769bf320c1b595cbbd9a7664160449Todd Kennedy void doLoaderStop(boolean retain) { 220d608cf6e08769bf320c1b595cbbd9a7664160449Todd Kennedy if (mLoaderManager == null) { 221d608cf6e08769bf320c1b595cbbd9a7664160449Todd Kennedy return; 222d608cf6e08769bf320c1b595cbbd9a7664160449Todd Kennedy } 223d608cf6e08769bf320c1b595cbbd9a7664160449Todd Kennedy 224d608cf6e08769bf320c1b595cbbd9a7664160449Todd Kennedy if (!mLoadersStarted) { 225d608cf6e08769bf320c1b595cbbd9a7664160449Todd Kennedy return; 226d608cf6e08769bf320c1b595cbbd9a7664160449Todd Kennedy } 227d608cf6e08769bf320c1b595cbbd9a7664160449Todd Kennedy mLoadersStarted = false; 228d608cf6e08769bf320c1b595cbbd9a7664160449Todd Kennedy 229d608cf6e08769bf320c1b595cbbd9a7664160449Todd Kennedy if (retain) { 230d608cf6e08769bf320c1b595cbbd9a7664160449Todd Kennedy mLoaderManager.doRetain(); 231d608cf6e08769bf320c1b595cbbd9a7664160449Todd Kennedy } else { 232d608cf6e08769bf320c1b595cbbd9a7664160449Todd Kennedy mLoaderManager.doStop(); 233d608cf6e08769bf320c1b595cbbd9a7664160449Todd Kennedy } 234d608cf6e08769bf320c1b595cbbd9a7664160449Todd Kennedy } 235d608cf6e08769bf320c1b595cbbd9a7664160449Todd Kennedy 236d608cf6e08769bf320c1b595cbbd9a7664160449Todd Kennedy void doLoaderRetain() { 237d608cf6e08769bf320c1b595cbbd9a7664160449Todd Kennedy if (mLoaderManager == null) { 238d608cf6e08769bf320c1b595cbbd9a7664160449Todd Kennedy return; 239d608cf6e08769bf320c1b595cbbd9a7664160449Todd Kennedy } 240d608cf6e08769bf320c1b595cbbd9a7664160449Todd Kennedy mLoaderManager.doRetain(); 241d608cf6e08769bf320c1b595cbbd9a7664160449Todd Kennedy } 242d608cf6e08769bf320c1b595cbbd9a7664160449Todd Kennedy 243d608cf6e08769bf320c1b595cbbd9a7664160449Todd Kennedy void doLoaderDestroy() { 244d608cf6e08769bf320c1b595cbbd9a7664160449Todd Kennedy if (mLoaderManager == null) { 245d608cf6e08769bf320c1b595cbbd9a7664160449Todd Kennedy return; 246d608cf6e08769bf320c1b595cbbd9a7664160449Todd Kennedy } 247d608cf6e08769bf320c1b595cbbd9a7664160449Todd Kennedy mLoaderManager.doDestroy(); 248d608cf6e08769bf320c1b595cbbd9a7664160449Todd Kennedy } 249d608cf6e08769bf320c1b595cbbd9a7664160449Todd Kennedy 250d608cf6e08769bf320c1b595cbbd9a7664160449Todd Kennedy void reportLoaderStart() { 251d608cf6e08769bf320c1b595cbbd9a7664160449Todd Kennedy if (mAllLoaderManagers != null) { 252d608cf6e08769bf320c1b595cbbd9a7664160449Todd Kennedy final int N = mAllLoaderManagers.size(); 253d608cf6e08769bf320c1b595cbbd9a7664160449Todd Kennedy LoaderManagerImpl loaders[] = new LoaderManagerImpl[N]; 254d608cf6e08769bf320c1b595cbbd9a7664160449Todd Kennedy for (int i=N-1; i>=0; i--) { 255d608cf6e08769bf320c1b595cbbd9a7664160449Todd Kennedy loaders[i] = (LoaderManagerImpl) mAllLoaderManagers.valueAt(i); 256d608cf6e08769bf320c1b595cbbd9a7664160449Todd Kennedy } 257d608cf6e08769bf320c1b595cbbd9a7664160449Todd Kennedy for (int i=0; i<N; i++) { 258d608cf6e08769bf320c1b595cbbd9a7664160449Todd Kennedy LoaderManagerImpl lm = loaders[i]; 259d608cf6e08769bf320c1b595cbbd9a7664160449Todd Kennedy lm.finishRetain(); 260d608cf6e08769bf320c1b595cbbd9a7664160449Todd Kennedy lm.doReportStart(); 261d608cf6e08769bf320c1b595cbbd9a7664160449Todd Kennedy } 262d608cf6e08769bf320c1b595cbbd9a7664160449Todd Kennedy } 263d608cf6e08769bf320c1b595cbbd9a7664160449Todd Kennedy } 264d608cf6e08769bf320c1b595cbbd9a7664160449Todd Kennedy 265d608cf6e08769bf320c1b595cbbd9a7664160449Todd Kennedy LoaderManagerImpl getLoaderManager(String who, boolean started, boolean create) { 266d608cf6e08769bf320c1b595cbbd9a7664160449Todd Kennedy if (mAllLoaderManagers == null) { 267d608cf6e08769bf320c1b595cbbd9a7664160449Todd Kennedy mAllLoaderManagers = new SimpleArrayMap<String, LoaderManager>(); 268d608cf6e08769bf320c1b595cbbd9a7664160449Todd Kennedy } 269d608cf6e08769bf320c1b595cbbd9a7664160449Todd Kennedy LoaderManagerImpl lm = (LoaderManagerImpl) mAllLoaderManagers.get(who); 270d608cf6e08769bf320c1b595cbbd9a7664160449Todd Kennedy if (lm == null) { 271d608cf6e08769bf320c1b595cbbd9a7664160449Todd Kennedy if (create) { 272d608cf6e08769bf320c1b595cbbd9a7664160449Todd Kennedy lm = new LoaderManagerImpl(who, this, started); 273d608cf6e08769bf320c1b595cbbd9a7664160449Todd Kennedy mAllLoaderManagers.put(who, lm); 274d608cf6e08769bf320c1b595cbbd9a7664160449Todd Kennedy } 275d608cf6e08769bf320c1b595cbbd9a7664160449Todd Kennedy } else { 276d608cf6e08769bf320c1b595cbbd9a7664160449Todd Kennedy lm.updateHostController(this); 277d608cf6e08769bf320c1b595cbbd9a7664160449Todd Kennedy } 278d608cf6e08769bf320c1b595cbbd9a7664160449Todd Kennedy return lm; 279d608cf6e08769bf320c1b595cbbd9a7664160449Todd Kennedy } 280d608cf6e08769bf320c1b595cbbd9a7664160449Todd Kennedy 281d608cf6e08769bf320c1b595cbbd9a7664160449Todd Kennedy SimpleArrayMap<String, LoaderManager> retainLoaderNonConfig() { 282d608cf6e08769bf320c1b595cbbd9a7664160449Todd Kennedy boolean retainLoaders = false; 283d608cf6e08769bf320c1b595cbbd9a7664160449Todd Kennedy if (mAllLoaderManagers != null) { 284d608cf6e08769bf320c1b595cbbd9a7664160449Todd Kennedy // prune out any loader managers that were already stopped and so 285d608cf6e08769bf320c1b595cbbd9a7664160449Todd Kennedy // have nothing useful to retain. 286d608cf6e08769bf320c1b595cbbd9a7664160449Todd Kennedy final int N = mAllLoaderManagers.size(); 287d608cf6e08769bf320c1b595cbbd9a7664160449Todd Kennedy LoaderManagerImpl loaders[] = new LoaderManagerImpl[N]; 288d608cf6e08769bf320c1b595cbbd9a7664160449Todd Kennedy for (int i=N-1; i>=0; i--) { 289d608cf6e08769bf320c1b595cbbd9a7664160449Todd Kennedy loaders[i] = (LoaderManagerImpl) mAllLoaderManagers.valueAt(i); 290d608cf6e08769bf320c1b595cbbd9a7664160449Todd Kennedy } 291d608cf6e08769bf320c1b595cbbd9a7664160449Todd Kennedy for (int i=0; i<N; i++) { 292d608cf6e08769bf320c1b595cbbd9a7664160449Todd Kennedy LoaderManagerImpl lm = loaders[i]; 293d608cf6e08769bf320c1b595cbbd9a7664160449Todd Kennedy if (lm.mRetaining) { 294d608cf6e08769bf320c1b595cbbd9a7664160449Todd Kennedy retainLoaders = true; 295d608cf6e08769bf320c1b595cbbd9a7664160449Todd Kennedy } else { 296d608cf6e08769bf320c1b595cbbd9a7664160449Todd Kennedy lm.doDestroy(); 297d608cf6e08769bf320c1b595cbbd9a7664160449Todd Kennedy mAllLoaderManagers.remove(lm.mWho); 298d608cf6e08769bf320c1b595cbbd9a7664160449Todd Kennedy } 299d608cf6e08769bf320c1b595cbbd9a7664160449Todd Kennedy } 300d608cf6e08769bf320c1b595cbbd9a7664160449Todd Kennedy } 301d608cf6e08769bf320c1b595cbbd9a7664160449Todd Kennedy 302d608cf6e08769bf320c1b595cbbd9a7664160449Todd Kennedy if (retainLoaders) { 303d608cf6e08769bf320c1b595cbbd9a7664160449Todd Kennedy return mAllLoaderManagers; 304d608cf6e08769bf320c1b595cbbd9a7664160449Todd Kennedy } 305d608cf6e08769bf320c1b595cbbd9a7664160449Todd Kennedy return null; 306d608cf6e08769bf320c1b595cbbd9a7664160449Todd Kennedy } 307d608cf6e08769bf320c1b595cbbd9a7664160449Todd Kennedy 308d608cf6e08769bf320c1b595cbbd9a7664160449Todd Kennedy void restoreLoaderNonConfig(SimpleArrayMap<String, LoaderManager> loaderManagers) { 309d608cf6e08769bf320c1b595cbbd9a7664160449Todd Kennedy mAllLoaderManagers = loaderManagers; 310d608cf6e08769bf320c1b595cbbd9a7664160449Todd Kennedy } 311d608cf6e08769bf320c1b595cbbd9a7664160449Todd Kennedy 312d608cf6e08769bf320c1b595cbbd9a7664160449Todd Kennedy void dumpLoaders(String prefix, FileDescriptor fd, PrintWriter writer, String[] args) { 313d608cf6e08769bf320c1b595cbbd9a7664160449Todd Kennedy writer.print(prefix); writer.print("mLoadersStarted="); 314d608cf6e08769bf320c1b595cbbd9a7664160449Todd Kennedy writer.println(mLoadersStarted); 315d608cf6e08769bf320c1b595cbbd9a7664160449Todd Kennedy if (mLoaderManager != null) { 316d608cf6e08769bf320c1b595cbbd9a7664160449Todd Kennedy writer.print(prefix); writer.print("Loader Manager "); 317d608cf6e08769bf320c1b595cbbd9a7664160449Todd Kennedy writer.print(Integer.toHexString(System.identityHashCode(mLoaderManager))); 318d608cf6e08769bf320c1b595cbbd9a7664160449Todd Kennedy writer.println(":"); 319d608cf6e08769bf320c1b595cbbd9a7664160449Todd Kennedy mLoaderManager.dump(prefix + " ", fd, writer, args); 320d608cf6e08769bf320c1b595cbbd9a7664160449Todd Kennedy } 321d608cf6e08769bf320c1b595cbbd9a7664160449Todd Kennedy } 322d608cf6e08769bf320c1b595cbbd9a7664160449Todd Kennedy} 323