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