Application.java revision add70268b193cd83e4ea2b35fabca2d4f5808828
19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/*
29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2006 The Android Open Source Project
39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you may not use this file except in compliance with the License.
69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You may obtain a copy of the License at
79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the License for the specific language governing permissions and
149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * limitations under the License.
159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpackage android.app;
189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
19c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackbornimport java.util.ArrayList;
20c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn
21add70268b193cd83e4ea2b35fabca2d4f5808828John Reckimport android.annotation.CallSuper;
229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.ComponentCallbacks;
23c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackbornimport android.content.ComponentCallbacks2;
249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.Context;
259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.ContextWrapper;
26f9c5e0fe837a3090820da502ecaabc5accc00aceDianne Hackbornimport android.content.Intent;
279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.res.Configuration;
28c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackbornimport android.os.Bundle;
299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/**
319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Base class for those who need to maintain global application state. You can
329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * provide your own implementation by specifying its name in your
339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * AndroidManifest.xml's <application> tag, which will cause that class
349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * to be instantiated for you when the process for your application/package is
359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * created.
367025d8e4b96f14a92f9bb20902732f43d1c93e7bDianne Hackborn *
377025d8e4b96f14a92f9bb20902732f43d1c93e7bDianne Hackborn * <p class="note">There is normally no need to subclass Application.  In
387025d8e4b96f14a92f9bb20902732f43d1c93e7bDianne Hackborn * most situation, static singletons can provide the same functionality in a
397025d8e4b96f14a92f9bb20902732f43d1c93e7bDianne Hackborn * more modular way.  If your singleton needs a global context (for example
407025d8e4b96f14a92f9bb20902732f43d1c93e7bDianne Hackborn * to register broadcast receivers), the function to retrieve it can be
417025d8e4b96f14a92f9bb20902732f43d1c93e7bDianne Hackborn * given a {@link android.content.Context} which internally uses
427025d8e4b96f14a92f9bb20902732f43d1c93e7bDianne Hackborn * {@link android.content.Context#getApplicationContext() Context.getApplicationContext()}
437025d8e4b96f14a92f9bb20902732f43d1c93e7bDianne Hackborn * when first constructing the singleton.</p>
449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
45c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackbornpublic class Application extends ContextWrapper implements ComponentCallbacks2 {
46c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn    private ArrayList<ComponentCallbacks> mComponentCallbacks =
47c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn            new ArrayList<ComponentCallbacks>();
48c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn    private ArrayList<ActivityLifecycleCallbacks> mActivityLifecycleCallbacks =
49c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn            new ArrayList<ActivityLifecycleCallbacks>();
50f977201257b6d3ccddd6fd107b1d8200916e97a7Dianne Hackborn    private ArrayList<OnProvideAssistDataListener> mAssistCallbacks = null;
51c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn
525fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn    /** @hide */
535fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn    public LoadedApk mLoadedApk;
54c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn
55c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn    public interface ActivityLifecycleCallbacks {
56c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn        void onActivityCreated(Activity activity, Bundle savedInstanceState);
57c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn        void onActivityStarted(Activity activity);
58c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn        void onActivityResumed(Activity activity);
59c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn        void onActivityPaused(Activity activity);
60c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn        void onActivityStopped(Activity activity);
61c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn        void onActivitySaveInstanceState(Activity activity, Bundle outState);
62c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn        void onActivityDestroyed(Activity activity);
63c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn    }
64c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn
65f9c5e0fe837a3090820da502ecaabc5accc00aceDianne Hackborn    /**
66f977201257b6d3ccddd6fd107b1d8200916e97a7Dianne Hackborn     * Callback interface for use with {@link Application#registerOnProvideAssistDataListener}
67f977201257b6d3ccddd6fd107b1d8200916e97a7Dianne Hackborn     * and {@link Application#unregisterOnProvideAssistDataListener}.
68f9c5e0fe837a3090820da502ecaabc5accc00aceDianne Hackborn     */
69f977201257b6d3ccddd6fd107b1d8200916e97a7Dianne Hackborn    public interface OnProvideAssistDataListener {
70f9c5e0fe837a3090820da502ecaabc5accc00aceDianne Hackborn        /**
71f9c5e0fe837a3090820da502ecaabc5accc00aceDianne Hackborn         * This is called when the user is requesting an assist, to build a full
72f9c5e0fe837a3090820da502ecaabc5accc00aceDianne Hackborn         * {@link Intent#ACTION_ASSIST} Intent with all of the context of the current
73f9c5e0fe837a3090820da502ecaabc5accc00aceDianne Hackborn         * application.  You can override this method to place into the bundle anything
74f9c5e0fe837a3090820da502ecaabc5accc00aceDianne Hackborn         * you would like to appear in the {@link Intent#EXTRA_ASSIST_CONTEXT} part
75f9c5e0fe837a3090820da502ecaabc5accc00aceDianne Hackborn         * of the assist Intent.
76f9c5e0fe837a3090820da502ecaabc5accc00aceDianne Hackborn         */
77f9c5e0fe837a3090820da502ecaabc5accc00aceDianne Hackborn        public void onProvideAssistData(Activity activity, Bundle data);
78f9c5e0fe837a3090820da502ecaabc5accc00aceDianne Hackborn    }
79f9c5e0fe837a3090820da502ecaabc5accc00aceDianne Hackborn
809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public Application() {
819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        super(null);
829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
858e61185918b9b4ef8de6ecffb0d77afaeb336abdJacob Nordfalk     * Called when the application is starting, before any activity, service,
868e61185918b9b4ef8de6ecffb0d77afaeb336abdJacob Nordfalk     * or receiver objects (excluding content providers) have been created.
878e61185918b9b4ef8de6ecffb0d77afaeb336abdJacob Nordfalk     * Implementations should be as quick as possible (for example using
888e61185918b9b4ef8de6ecffb0d77afaeb336abdJacob Nordfalk     * lazy initialization of state) since the time spent in this function
898e61185918b9b4ef8de6ecffb0d77afaeb336abdJacob Nordfalk     * directly impacts the performance of starting the first activity,
908e61185918b9b4ef8de6ecffb0d77afaeb336abdJacob Nordfalk     * service, or receiver in a process.
919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * If you override this method, be sure to call super.onCreate().
929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
93add70268b193cd83e4ea2b35fabca2d4f5808828John Reck    @CallSuper
949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void onCreate() {
959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
987025d8e4b96f14a92f9bb20902732f43d1c93e7bDianne Hackborn     * This method is for use in emulated process environments.  It will
997025d8e4b96f14a92f9bb20902732f43d1c93e7bDianne Hackborn     * never be called on a production Android device, where processes are
1007025d8e4b96f14a92f9bb20902732f43d1c93e7bDianne Hackborn     * removed by simply killing them; no user code (including this callback)
1017025d8e4b96f14a92f9bb20902732f43d1c93e7bDianne Hackborn     * is executed when doing so.
1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
103add70268b193cd83e4ea2b35fabca2d4f5808828John Reck    @CallSuper
1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void onTerminate() {
1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
106c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn
107add70268b193cd83e4ea2b35fabca2d4f5808828John Reck    @CallSuper
1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void onConfigurationChanged(Configuration newConfig) {
109c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn        Object[] callbacks = collectComponentCallbacks();
110c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn        if (callbacks != null) {
111c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn            for (int i=0; i<callbacks.length; i++) {
112c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn                ((ComponentCallbacks)callbacks[i]).onConfigurationChanged(newConfig);
113c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn            }
114c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn        }
1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
116c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn
117add70268b193cd83e4ea2b35fabca2d4f5808828John Reck    @CallSuper
1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void onLowMemory() {
119c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn        Object[] callbacks = collectComponentCallbacks();
120c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn        if (callbacks != null) {
121c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn            for (int i=0; i<callbacks.length; i++) {
122c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn                ((ComponentCallbacks)callbacks[i]).onLowMemory();
123c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn            }
124c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn        }
125c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn    }
126c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn
127add70268b193cd83e4ea2b35fabca2d4f5808828John Reck    @CallSuper
128c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn    public void onTrimMemory(int level) {
129c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn        Object[] callbacks = collectComponentCallbacks();
130c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn        if (callbacks != null) {
131c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn            for (int i=0; i<callbacks.length; i++) {
132c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn                Object c = callbacks[i];
133c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn                if (c instanceof ComponentCallbacks2) {
134c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn                    ((ComponentCallbacks2)c).onTrimMemory(level);
135c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn                }
136c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn            }
137c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn        }
138c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn    }
139c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn
140c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn    public void registerComponentCallbacks(ComponentCallbacks callback) {
141c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn        synchronized (mComponentCallbacks) {
142c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn            mComponentCallbacks.add(callback);
143c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn        }
144c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn    }
145c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn
146c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn    public void unregisterComponentCallbacks(ComponentCallbacks callback) {
147c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn        synchronized (mComponentCallbacks) {
148c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn            mComponentCallbacks.remove(callback);
149c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn        }
150c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn    }
151c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn
152c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn    public void registerActivityLifecycleCallbacks(ActivityLifecycleCallbacks callback) {
153c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn        synchronized (mActivityLifecycleCallbacks) {
154c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn            mActivityLifecycleCallbacks.add(callback);
155c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn        }
156c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn    }
157c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn
158c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn    public void unregisterActivityLifecycleCallbacks(ActivityLifecycleCallbacks callback) {
159c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn        synchronized (mActivityLifecycleCallbacks) {
160c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn            mActivityLifecycleCallbacks.remove(callback);
161c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn        }
1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
163f9c5e0fe837a3090820da502ecaabc5accc00aceDianne Hackborn
164f977201257b6d3ccddd6fd107b1d8200916e97a7Dianne Hackborn    public void registerOnProvideAssistDataListener(OnProvideAssistDataListener callback) {
165f9c5e0fe837a3090820da502ecaabc5accc00aceDianne Hackborn        synchronized (this) {
166f9c5e0fe837a3090820da502ecaabc5accc00aceDianne Hackborn            if (mAssistCallbacks == null) {
167f977201257b6d3ccddd6fd107b1d8200916e97a7Dianne Hackborn                mAssistCallbacks = new ArrayList<OnProvideAssistDataListener>();
168f9c5e0fe837a3090820da502ecaabc5accc00aceDianne Hackborn            }
169f9c5e0fe837a3090820da502ecaabc5accc00aceDianne Hackborn            mAssistCallbacks.add(callback);
170f9c5e0fe837a3090820da502ecaabc5accc00aceDianne Hackborn        }
171f9c5e0fe837a3090820da502ecaabc5accc00aceDianne Hackborn    }
172f9c5e0fe837a3090820da502ecaabc5accc00aceDianne Hackborn
173f977201257b6d3ccddd6fd107b1d8200916e97a7Dianne Hackborn    public void unregisterOnProvideAssistDataListener(OnProvideAssistDataListener callback) {
174f9c5e0fe837a3090820da502ecaabc5accc00aceDianne Hackborn        synchronized (this) {
175f9c5e0fe837a3090820da502ecaabc5accc00aceDianne Hackborn            if (mAssistCallbacks != null) {
176f9c5e0fe837a3090820da502ecaabc5accc00aceDianne Hackborn                mAssistCallbacks.remove(callback);
177f9c5e0fe837a3090820da502ecaabc5accc00aceDianne Hackborn            }
178f9c5e0fe837a3090820da502ecaabc5accc00aceDianne Hackborn        }
179f9c5e0fe837a3090820da502ecaabc5accc00aceDianne Hackborn    }
180f9c5e0fe837a3090820da502ecaabc5accc00aceDianne Hackborn
1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // ------------------ Internal API ------------------
1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @hide
1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /* package */ final void attach(Context context) {
1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        attachBaseContext(context);
1885fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn        mLoadedApk = ContextImpl.getImpl(context).mPackageInfo;
1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
190c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn
191c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn    /* package */ void dispatchActivityCreated(Activity activity, Bundle savedInstanceState) {
192c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn        Object[] callbacks = collectActivityLifecycleCallbacks();
193c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn        if (callbacks != null) {
194c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn            for (int i=0; i<callbacks.length; i++) {
195c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn                ((ActivityLifecycleCallbacks)callbacks[i]).onActivityCreated(activity,
196c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn                        savedInstanceState);
197c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn            }
198c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn        }
199c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn    }
200c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn
201c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn    /* package */ void dispatchActivityStarted(Activity activity) {
202c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn        Object[] callbacks = collectActivityLifecycleCallbacks();
203c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn        if (callbacks != null) {
204c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn            for (int i=0; i<callbacks.length; i++) {
205c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn                ((ActivityLifecycleCallbacks)callbacks[i]).onActivityStarted(activity);
206c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn            }
207c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn        }
208c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn    }
209c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn
210c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn    /* package */ void dispatchActivityResumed(Activity activity) {
211c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn        Object[] callbacks = collectActivityLifecycleCallbacks();
212c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn        if (callbacks != null) {
213c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn            for (int i=0; i<callbacks.length; i++) {
214c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn                ((ActivityLifecycleCallbacks)callbacks[i]).onActivityResumed(activity);
215c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn            }
216c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn        }
217c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn    }
218c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn
219c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn    /* package */ void dispatchActivityPaused(Activity activity) {
220c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn        Object[] callbacks = collectActivityLifecycleCallbacks();
221c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn        if (callbacks != null) {
222c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn            for (int i=0; i<callbacks.length; i++) {
223c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn                ((ActivityLifecycleCallbacks)callbacks[i]).onActivityPaused(activity);
224c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn            }
225c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn        }
226c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn    }
227c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn
228c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn    /* package */ void dispatchActivityStopped(Activity activity) {
229c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn        Object[] callbacks = collectActivityLifecycleCallbacks();
230c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn        if (callbacks != null) {
231c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn            for (int i=0; i<callbacks.length; i++) {
232c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn                ((ActivityLifecycleCallbacks)callbacks[i]).onActivityStopped(activity);
233c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn            }
234c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn        }
235c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn    }
236c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn
237c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn    /* package */ void dispatchActivitySaveInstanceState(Activity activity, Bundle outState) {
238c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn        Object[] callbacks = collectActivityLifecycleCallbacks();
239c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn        if (callbacks != null) {
240c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn            for (int i=0; i<callbacks.length; i++) {
241c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn                ((ActivityLifecycleCallbacks)callbacks[i]).onActivitySaveInstanceState(activity,
242c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn                        outState);
243c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn            }
244c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn        }
245c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn    }
246c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn
247c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn    /* package */ void dispatchActivityDestroyed(Activity activity) {
248c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn        Object[] callbacks = collectActivityLifecycleCallbacks();
249c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn        if (callbacks != null) {
250c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn            for (int i=0; i<callbacks.length; i++) {
251c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn                ((ActivityLifecycleCallbacks)callbacks[i]).onActivityDestroyed(activity);
252c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn            }
253c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn        }
254c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn    }
255c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn
256c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn    private Object[] collectComponentCallbacks() {
257c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn        Object[] callbacks = null;
258c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn        synchronized (mComponentCallbacks) {
259c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn            if (mComponentCallbacks.size() > 0) {
260c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn                callbacks = mComponentCallbacks.toArray();
261c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn            }
262c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn        }
263c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn        return callbacks;
264c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn    }
265c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn
266c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn    private Object[] collectActivityLifecycleCallbacks() {
267c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn        Object[] callbacks = null;
268c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn        synchronized (mActivityLifecycleCallbacks) {
269c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn            if (mActivityLifecycleCallbacks.size() > 0) {
270c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn                callbacks = mActivityLifecycleCallbacks.toArray();
271c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn            }
272c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn        }
273c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn        return callbacks;
274c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn    }
275f9c5e0fe837a3090820da502ecaabc5accc00aceDianne Hackborn
276f9c5e0fe837a3090820da502ecaabc5accc00aceDianne Hackborn    /* package */ void dispatchOnProvideAssistData(Activity activity, Bundle data) {
277f9c5e0fe837a3090820da502ecaabc5accc00aceDianne Hackborn        Object[] callbacks;
278f9c5e0fe837a3090820da502ecaabc5accc00aceDianne Hackborn        synchronized (this) {
279f9c5e0fe837a3090820da502ecaabc5accc00aceDianne Hackborn            if (mAssistCallbacks == null) {
280f9c5e0fe837a3090820da502ecaabc5accc00aceDianne Hackborn                return;
281f9c5e0fe837a3090820da502ecaabc5accc00aceDianne Hackborn            }
282f9c5e0fe837a3090820da502ecaabc5accc00aceDianne Hackborn            callbacks = mAssistCallbacks.toArray();
283f9c5e0fe837a3090820da502ecaabc5accc00aceDianne Hackborn        }
284f9c5e0fe837a3090820da502ecaabc5accc00aceDianne Hackborn        if (callbacks != null) {
285f9c5e0fe837a3090820da502ecaabc5accc00aceDianne Hackborn            for (int i=0; i<callbacks.length; i++) {
286f977201257b6d3ccddd6fd107b1d8200916e97a7Dianne Hackborn                ((OnProvideAssistDataListener)callbacks[i]).onProvideAssistData(activity, data);
287f9c5e0fe837a3090820da502ecaabc5accc00aceDianne Hackborn            }
288f9c5e0fe837a3090820da502ecaabc5accc00aceDianne Hackborn        }
289f9c5e0fe837a3090820da502ecaabc5accc00aceDianne Hackborn    }
2909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
291