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><application></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}