[go: nahoru, domu]

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