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