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
1907fe63e5de3cbc36a213178faede137cf648170aDan Sandlerimport java.util.ArrayList;
2007fe63e5de3cbc36a213178faede137cf648170aDan Sandler
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/**
3137d1814ed7a15257f6ea206049597a2c494e4ef1Kevin Hufnagle * Base class for maintaining global application state. You can provide your own
3237d1814ed7a15257f6ea206049597a2c494e4ef1Kevin Hufnagle * implementation by creating a subclass and specifying the fully-qualified name
3337d1814ed7a15257f6ea206049597a2c494e4ef1Kevin Hufnagle * of this subclass as the <code>"android:name"</code> attribute in your
3437d1814ed7a15257f6ea206049597a2c494e4ef1Kevin Hufnagle * AndroidManifest.xml's <code>&lt;application&gt;</code> tag. The Application
3537d1814ed7a15257f6ea206049597a2c494e4ef1Kevin Hufnagle * class, or your subclass of the Application class, is instantiated before any
3637d1814ed7a15257f6ea206049597a2c494e4ef1Kevin Hufnagle * other class when the process for your application/package is created.
3775951d7c86242f150e5d17ac745458996e97cc72Kevin Hufnagle *
3837d1814ed7a15257f6ea206049597a2c494e4ef1Kevin Hufnagle * <p class="note"><strong>Note: </strong>There is normally no need to subclass
3937d1814ed7a15257f6ea206049597a2c494e4ef1Kevin Hufnagle * Application.  In most situations, static singletons can provide the same
4037d1814ed7a15257f6ea206049597a2c494e4ef1Kevin Hufnagle * functionality in a more modular way.  If your singleton needs a global
4137d1814ed7a15257f6ea206049597a2c494e4ef1Kevin Hufnagle * context (for example to register broadcast receivers), include
427025d8e4b96f14a92f9bb20902732f43d1c93e7bDianne Hackborn * {@link android.content.Context#getApplicationContext() Context.getApplicationContext()}
4337d1814ed7a15257f6ea206049597a2c494e4ef1Kevin Hufnagle * as a {@link android.content.Context} argument when invoking your singleton's
4437d1814ed7a15257f6ea206049597a2c494e4ef1Kevin Hufnagle * <code>getInstance()</code> method.
4537d1814ed7a15257f6ea206049597a2c494e4ef1Kevin Hufnagle * </p>
469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
47c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackbornpublic class Application extends ContextWrapper implements ComponentCallbacks2 {
48c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn    private ArrayList<ComponentCallbacks> mComponentCallbacks =
49c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn            new ArrayList<ComponentCallbacks>();
50c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn    private ArrayList<ActivityLifecycleCallbacks> mActivityLifecycleCallbacks =
51c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn            new ArrayList<ActivityLifecycleCallbacks>();
52f977201257b6d3ccddd6fd107b1d8200916e97a7Dianne Hackborn    private ArrayList<OnProvideAssistDataListener> mAssistCallbacks = null;
53c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn
545fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn    /** @hide */
555fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn    public LoadedApk mLoadedApk;
56c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn
57c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn    public interface ActivityLifecycleCallbacks {
58c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn        void onActivityCreated(Activity activity, Bundle savedInstanceState);
59c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn        void onActivityStarted(Activity activity);
60c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn        void onActivityResumed(Activity activity);
61c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn        void onActivityPaused(Activity activity);
62c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn        void onActivityStopped(Activity activity);
63c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn        void onActivitySaveInstanceState(Activity activity, Bundle outState);
64c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn        void onActivityDestroyed(Activity activity);
65c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn    }
66c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn
67f9c5e0fe837a3090820da502ecaabc5accc00aceDianne Hackborn    /**
68f977201257b6d3ccddd6fd107b1d8200916e97a7Dianne Hackborn     * Callback interface for use with {@link Application#registerOnProvideAssistDataListener}
69f977201257b6d3ccddd6fd107b1d8200916e97a7Dianne Hackborn     * and {@link Application#unregisterOnProvideAssistDataListener}.
70f9c5e0fe837a3090820da502ecaabc5accc00aceDianne Hackborn     */
71f977201257b6d3ccddd6fd107b1d8200916e97a7Dianne Hackborn    public interface OnProvideAssistDataListener {
72f9c5e0fe837a3090820da502ecaabc5accc00aceDianne Hackborn        /**
73f9c5e0fe837a3090820da502ecaabc5accc00aceDianne Hackborn         * This is called when the user is requesting an assist, to build a full
74f9c5e0fe837a3090820da502ecaabc5accc00aceDianne Hackborn         * {@link Intent#ACTION_ASSIST} Intent with all of the context of the current
75f9c5e0fe837a3090820da502ecaabc5accc00aceDianne Hackborn         * application.  You can override this method to place into the bundle anything
76f9c5e0fe837a3090820da502ecaabc5accc00aceDianne Hackborn         * you would like to appear in the {@link Intent#EXTRA_ASSIST_CONTEXT} part
77f9c5e0fe837a3090820da502ecaabc5accc00aceDianne Hackborn         * of the assist Intent.
78f9c5e0fe837a3090820da502ecaabc5accc00aceDianne Hackborn         */
79f9c5e0fe837a3090820da502ecaabc5accc00aceDianne Hackborn        public void onProvideAssistData(Activity activity, Bundle data);
80f9c5e0fe837a3090820da502ecaabc5accc00aceDianne Hackborn    }
81f9c5e0fe837a3090820da502ecaabc5accc00aceDianne Hackborn
829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public Application() {
839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        super(null);
849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
878e61185918b9b4ef8de6ecffb0d77afaeb336abdJacob Nordfalk     * Called when the application is starting, before any activity, service,
888e61185918b9b4ef8de6ecffb0d77afaeb336abdJacob Nordfalk     * or receiver objects (excluding content providers) have been created.
8975951d7c86242f150e5d17ac745458996e97cc72Kevin Hufnagle     * Implementations should be as quick as possible (for example using
908e61185918b9b4ef8de6ecffb0d77afaeb336abdJacob Nordfalk     * lazy initialization of state) since the time spent in this function
918e61185918b9b4ef8de6ecffb0d77afaeb336abdJacob Nordfalk     * directly impacts the performance of starting the first activity,
928e61185918b9b4ef8de6ecffb0d77afaeb336abdJacob Nordfalk     * service, or receiver in a process.
939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * If you override this method, be sure to call super.onCreate().
949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
95add70268b193cd83e4ea2b35fabca2d4f5808828John Reck    @CallSuper
969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void onCreate() {
979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1007025d8e4b96f14a92f9bb20902732f43d1c93e7bDianne Hackborn     * This method is for use in emulated process environments.  It will
1017025d8e4b96f14a92f9bb20902732f43d1c93e7bDianne Hackborn     * never be called on a production Android device, where processes are
1027025d8e4b96f14a92f9bb20902732f43d1c93e7bDianne Hackborn     * removed by simply killing them; no user code (including this callback)
1037025d8e4b96f14a92f9bb20902732f43d1c93e7bDianne Hackborn     * is executed when doing so.
1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
105add70268b193cd83e4ea2b35fabca2d4f5808828John Reck    @CallSuper
1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void onTerminate() {
1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
108c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn
109add70268b193cd83e4ea2b35fabca2d4f5808828John Reck    @CallSuper
1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void onConfigurationChanged(Configuration newConfig) {
111c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn        Object[] callbacks = collectComponentCallbacks();
112c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn        if (callbacks != null) {
113c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn            for (int i=0; i<callbacks.length; i++) {
114c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn                ((ComponentCallbacks)callbacks[i]).onConfigurationChanged(newConfig);
115c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn            }
116c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn        }
1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
118c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn
119add70268b193cd83e4ea2b35fabca2d4f5808828John Reck    @CallSuper
1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void onLowMemory() {
121c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn        Object[] callbacks = collectComponentCallbacks();
122c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn        if (callbacks != null) {
123c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn            for (int i=0; i<callbacks.length; i++) {
124c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn                ((ComponentCallbacks)callbacks[i]).onLowMemory();
125c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn            }
126c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn        }
127c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn    }
128c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn
129add70268b193cd83e4ea2b35fabca2d4f5808828John Reck    @CallSuper
130c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn    public void onTrimMemory(int level) {
131c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn        Object[] callbacks = collectComponentCallbacks();
132c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn        if (callbacks != null) {
133c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn            for (int i=0; i<callbacks.length; i++) {
134c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn                Object c = callbacks[i];
135c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn                if (c instanceof ComponentCallbacks2) {
136c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn                    ((ComponentCallbacks2)c).onTrimMemory(level);
137c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn                }
138c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn            }
139c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn        }
140c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn    }
141c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn
142c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn    public void registerComponentCallbacks(ComponentCallbacks callback) {
143c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn        synchronized (mComponentCallbacks) {
144c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn            mComponentCallbacks.add(callback);
145c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn        }
146c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn    }
147c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn
148c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn    public void unregisterComponentCallbacks(ComponentCallbacks callback) {
149c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn        synchronized (mComponentCallbacks) {
150c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn            mComponentCallbacks.remove(callback);
151c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn        }
152c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn    }
153c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn
154c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn    public void registerActivityLifecycleCallbacks(ActivityLifecycleCallbacks callback) {
155c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn        synchronized (mActivityLifecycleCallbacks) {
156c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn            mActivityLifecycleCallbacks.add(callback);
157c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn        }
158c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn    }
159c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn
160c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn    public void unregisterActivityLifecycleCallbacks(ActivityLifecycleCallbacks callback) {
161c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn        synchronized (mActivityLifecycleCallbacks) {
162c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn            mActivityLifecycleCallbacks.remove(callback);
163c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn        }
1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
165f9c5e0fe837a3090820da502ecaabc5accc00aceDianne Hackborn
166f977201257b6d3ccddd6fd107b1d8200916e97a7Dianne Hackborn    public void registerOnProvideAssistDataListener(OnProvideAssistDataListener callback) {
167f9c5e0fe837a3090820da502ecaabc5accc00aceDianne Hackborn        synchronized (this) {
168f9c5e0fe837a3090820da502ecaabc5accc00aceDianne Hackborn            if (mAssistCallbacks == null) {
169f977201257b6d3ccddd6fd107b1d8200916e97a7Dianne Hackborn                mAssistCallbacks = new ArrayList<OnProvideAssistDataListener>();
170f9c5e0fe837a3090820da502ecaabc5accc00aceDianne Hackborn            }
171f9c5e0fe837a3090820da502ecaabc5accc00aceDianne Hackborn            mAssistCallbacks.add(callback);
172f9c5e0fe837a3090820da502ecaabc5accc00aceDianne Hackborn        }
173f9c5e0fe837a3090820da502ecaabc5accc00aceDianne Hackborn    }
174f9c5e0fe837a3090820da502ecaabc5accc00aceDianne Hackborn
175f977201257b6d3ccddd6fd107b1d8200916e97a7Dianne Hackborn    public void unregisterOnProvideAssistDataListener(OnProvideAssistDataListener callback) {
176f9c5e0fe837a3090820da502ecaabc5accc00aceDianne Hackborn        synchronized (this) {
177f9c5e0fe837a3090820da502ecaabc5accc00aceDianne Hackborn            if (mAssistCallbacks != null) {
178f9c5e0fe837a3090820da502ecaabc5accc00aceDianne Hackborn                mAssistCallbacks.remove(callback);
179f9c5e0fe837a3090820da502ecaabc5accc00aceDianne Hackborn            }
180f9c5e0fe837a3090820da502ecaabc5accc00aceDianne Hackborn        }
181f9c5e0fe837a3090820da502ecaabc5accc00aceDianne Hackborn    }
182f9c5e0fe837a3090820da502ecaabc5accc00aceDianne Hackborn
1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // ------------------ Internal API ------------------
18475951d7c86242f150e5d17ac745458996e97cc72Kevin Hufnagle
1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @hide
1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /* package */ final void attach(Context context) {
1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        attachBaseContext(context);
1905fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn        mLoadedApk = ContextImpl.getImpl(context).mPackageInfo;
1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
192c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn
193c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn    /* package */ void dispatchActivityCreated(Activity activity, Bundle savedInstanceState) {
194c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn        Object[] callbacks = collectActivityLifecycleCallbacks();
195c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn        if (callbacks != null) {
196c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn            for (int i=0; i<callbacks.length; i++) {
197c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn                ((ActivityLifecycleCallbacks)callbacks[i]).onActivityCreated(activity,
198c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn                        savedInstanceState);
199c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn            }
200c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn        }
201c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn    }
202c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn
203c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn    /* package */ void dispatchActivityStarted(Activity activity) {
204c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn        Object[] callbacks = collectActivityLifecycleCallbacks();
205c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn        if (callbacks != null) {
206c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn            for (int i=0; i<callbacks.length; i++) {
207c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn                ((ActivityLifecycleCallbacks)callbacks[i]).onActivityStarted(activity);
208c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn            }
209c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn        }
210c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn    }
211c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn
212c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn    /* package */ void dispatchActivityResumed(Activity activity) {
213c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn        Object[] callbacks = collectActivityLifecycleCallbacks();
214c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn        if (callbacks != null) {
215c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn            for (int i=0; i<callbacks.length; i++) {
216c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn                ((ActivityLifecycleCallbacks)callbacks[i]).onActivityResumed(activity);
217c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn            }
218c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn        }
219c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn    }
220c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn
221c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn    /* package */ void dispatchActivityPaused(Activity activity) {
222c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn        Object[] callbacks = collectActivityLifecycleCallbacks();
223c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn        if (callbacks != null) {
224c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn            for (int i=0; i<callbacks.length; i++) {
225c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn                ((ActivityLifecycleCallbacks)callbacks[i]).onActivityPaused(activity);
226c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn            }
227c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn        }
228c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn    }
229c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn
230c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn    /* package */ void dispatchActivityStopped(Activity activity) {
231c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn        Object[] callbacks = collectActivityLifecycleCallbacks();
232c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn        if (callbacks != null) {
233c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn            for (int i=0; i<callbacks.length; i++) {
234c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn                ((ActivityLifecycleCallbacks)callbacks[i]).onActivityStopped(activity);
235c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn            }
236c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn        }
237c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn    }
238c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn
239c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn    /* package */ void dispatchActivitySaveInstanceState(Activity activity, Bundle outState) {
240c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn        Object[] callbacks = collectActivityLifecycleCallbacks();
241c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn        if (callbacks != null) {
242c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn            for (int i=0; i<callbacks.length; i++) {
243c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn                ((ActivityLifecycleCallbacks)callbacks[i]).onActivitySaveInstanceState(activity,
244c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn                        outState);
245c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn            }
246c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn        }
247c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn    }
248c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn
249c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn    /* package */ void dispatchActivityDestroyed(Activity activity) {
250c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn        Object[] callbacks = collectActivityLifecycleCallbacks();
251c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn        if (callbacks != null) {
252c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn            for (int i=0; i<callbacks.length; i++) {
253c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn                ((ActivityLifecycleCallbacks)callbacks[i]).onActivityDestroyed(activity);
254c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn            }
255c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn        }
256c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn    }
257c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn
258c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn    private Object[] collectComponentCallbacks() {
259c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn        Object[] callbacks = null;
260c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn        synchronized (mComponentCallbacks) {
261c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn            if (mComponentCallbacks.size() > 0) {
262c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn                callbacks = mComponentCallbacks.toArray();
263c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn            }
264c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn        }
265c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn        return callbacks;
266c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn    }
267c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn
268c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn    private Object[] collectActivityLifecycleCallbacks() {
269c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn        Object[] callbacks = null;
270c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn        synchronized (mActivityLifecycleCallbacks) {
271c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn            if (mActivityLifecycleCallbacks.size() > 0) {
272c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn                callbacks = mActivityLifecycleCallbacks.toArray();
273c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn            }
274c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn        }
275c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn        return callbacks;
276c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn    }
277f9c5e0fe837a3090820da502ecaabc5accc00aceDianne Hackborn
278f9c5e0fe837a3090820da502ecaabc5accc00aceDianne Hackborn    /* package */ void dispatchOnProvideAssistData(Activity activity, Bundle data) {
279f9c5e0fe837a3090820da502ecaabc5accc00aceDianne Hackborn        Object[] callbacks;
280f9c5e0fe837a3090820da502ecaabc5accc00aceDianne Hackborn        synchronized (this) {
281f9c5e0fe837a3090820da502ecaabc5accc00aceDianne Hackborn            if (mAssistCallbacks == null) {
282f9c5e0fe837a3090820da502ecaabc5accc00aceDianne Hackborn                return;
283f9c5e0fe837a3090820da502ecaabc5accc00aceDianne Hackborn            }
284f9c5e0fe837a3090820da502ecaabc5accc00aceDianne Hackborn            callbacks = mAssistCallbacks.toArray();
285f9c5e0fe837a3090820da502ecaabc5accc00aceDianne Hackborn        }
286f9c5e0fe837a3090820da502ecaabc5accc00aceDianne Hackborn        if (callbacks != null) {
287f9c5e0fe837a3090820da502ecaabc5accc00aceDianne Hackborn            for (int i=0; i<callbacks.length; i++) {
288f977201257b6d3ccddd6fd107b1d8200916e97a7Dianne Hackborn                ((OnProvideAssistDataListener)callbacks[i]).onProvideAssistData(activity, data);
289f9c5e0fe837a3090820da502ecaabc5accc00aceDianne Hackborn            }
290f9c5e0fe837a3090820da502ecaabc5accc00aceDianne Hackborn        }
291f9c5e0fe837a3090820da502ecaabc5accc00aceDianne Hackborn    }
29237d1814ed7a15257f6ea206049597a2c494e4ef1Kevin Hufnagle}