1 /*
2  * Copyright (C) 2006 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 package android.app;
18 
19 import android.annotation.CallSuper;
20 import android.annotation.NonNull;
21 import android.annotation.Nullable;
22 import android.compat.annotation.UnsupportedAppUsage;
23 import android.content.ComponentCallbacks;
24 import android.content.ComponentCallbacks2;
25 import android.content.Context;
26 import android.content.ContextWrapper;
27 import android.content.Intent;
28 import android.content.res.Configuration;
29 import android.os.Bundle;
30 import android.util.Log;
31 import android.view.autofill.AutofillManager;
32 
33 import java.util.ArrayList;
34 
35 /**
36  * Base class for maintaining global application state. You can provide your own
37  * implementation by creating a subclass and specifying the fully-qualified name
38  * of this subclass as the <code>"android:name"</code> attribute in your
39  * AndroidManifest.xml's <code>&lt;application&gt;</code> tag. The Application
40  * class, or your subclass of the Application class, is instantiated before any
41  * other class when the process for your application/package is created.
42  *
43  * <p class="note"><strong>Note: </strong>There is normally no need to subclass
44  * Application.  In most situations, static singletons can provide the same
45  * functionality in a more modular way.  If your singleton needs a global
46  * context (for example to register broadcast receivers), include
47  * {@link android.content.Context#getApplicationContext() Context.getApplicationContext()}
48  * as a {@link android.content.Context} argument when invoking your singleton's
49  * <code>getInstance()</code> method.
50  * </p>
51  */
52 public class Application extends ContextWrapper implements ComponentCallbacks2 {
53     private static final String TAG = "Application";
54     @UnsupportedAppUsage
55     private ArrayList<ComponentCallbacks> mComponentCallbacks =
56             new ArrayList<ComponentCallbacks>();
57     @UnsupportedAppUsage
58     private ArrayList<ActivityLifecycleCallbacks> mActivityLifecycleCallbacks =
59             new ArrayList<ActivityLifecycleCallbacks>();
60     @UnsupportedAppUsage
61     private ArrayList<OnProvideAssistDataListener> mAssistCallbacks = null;
62 
63     /** @hide */
64     @UnsupportedAppUsage
65     public LoadedApk mLoadedApk;
66 
67     public interface ActivityLifecycleCallbacks {
68 
69         /**
70          * Called as the first step of the Activity being created. This is always called before
71          * {@link Activity#onCreate}.
72          */
onActivityPreCreated(@onNull Activity activity, @Nullable Bundle savedInstanceState)73         default void onActivityPreCreated(@NonNull Activity activity,
74                 @Nullable Bundle savedInstanceState) {
75         }
76 
77         /**
78          * Called when the Activity calls {@link Activity#onCreate super.onCreate()}.
79          */
onActivityCreated(@onNull Activity activity, @Nullable Bundle savedInstanceState)80         void onActivityCreated(@NonNull Activity activity, @Nullable Bundle savedInstanceState);
81 
82         /**
83          * Called as the last step of the Activity being created. This is always called after
84          * {@link Activity#onCreate}.
85          */
onActivityPostCreated(@onNull Activity activity, @Nullable Bundle savedInstanceState)86         default void onActivityPostCreated(@NonNull Activity activity,
87                 @Nullable Bundle savedInstanceState) {
88         }
89 
90         /**
91          * Called as the first step of the Activity being started. This is always called before
92          * {@link Activity#onStart}.
93          */
onActivityPreStarted(@onNull Activity activity)94         default void onActivityPreStarted(@NonNull Activity activity) {
95         }
96 
97         /**
98          * Called when the Activity calls {@link Activity#onStart super.onStart()}.
99          */
onActivityStarted(@onNull Activity activity)100         void onActivityStarted(@NonNull Activity activity);
101 
102         /**
103          * Called as the last step of the Activity being started. This is always called after
104          * {@link Activity#onStart}.
105          */
onActivityPostStarted(@onNull Activity activity)106         default void onActivityPostStarted(@NonNull Activity activity) {
107         }
108 
109         /**
110          * Called as the first step of the Activity being resumed. This is always called before
111          * {@link Activity#onResume}.
112          */
onActivityPreResumed(@onNull Activity activity)113         default void onActivityPreResumed(@NonNull Activity activity) {
114         }
115 
116         /**
117          * Called when the Activity calls {@link Activity#onResume super.onResume()}.
118          */
onActivityResumed(@onNull Activity activity)119         void onActivityResumed(@NonNull Activity activity);
120 
121         /**
122          * Called as the last step of the Activity being resumed. This is always called after
123          * {@link Activity#onResume} and {@link Activity#onPostResume}.
124          */
onActivityPostResumed(@onNull Activity activity)125         default void onActivityPostResumed(@NonNull Activity activity) {
126         }
127 
128         /**
129          * Called as the first step of the Activity being paused. This is always called before
130          * {@link Activity#onPause}.
131          */
onActivityPrePaused(@onNull Activity activity)132         default void onActivityPrePaused(@NonNull Activity activity) {
133         }
134 
135         /**
136          * Called when the Activity calls {@link Activity#onPause super.onPause()}.
137          */
onActivityPaused(@onNull Activity activity)138         void onActivityPaused(@NonNull Activity activity);
139 
140         /**
141          * Called as the last step of the Activity being paused. This is always called after
142          * {@link Activity#onPause}.
143          */
onActivityPostPaused(@onNull Activity activity)144         default void onActivityPostPaused(@NonNull Activity activity) {
145         }
146 
147         /**
148          * Called as the first step of the Activity being stopped. This is always called before
149          * {@link Activity#onStop}.
150          */
onActivityPreStopped(@onNull Activity activity)151         default void onActivityPreStopped(@NonNull Activity activity) {
152         }
153 
154         /**
155          * Called when the Activity calls {@link Activity#onStop super.onStop()}.
156          */
onActivityStopped(@onNull Activity activity)157         void onActivityStopped(@NonNull Activity activity);
158 
159         /**
160          * Called as the last step of the Activity being stopped. This is always called after
161          * {@link Activity#onStop}.
162          */
onActivityPostStopped(@onNull Activity activity)163         default void onActivityPostStopped(@NonNull Activity activity) {
164         }
165 
166         /**
167          * Called as the first step of the Activity saving its instance state. This is always
168          * called before {@link Activity#onSaveInstanceState}.
169          */
onActivityPreSaveInstanceState(@onNull Activity activity, @NonNull Bundle outState)170         default void onActivityPreSaveInstanceState(@NonNull Activity activity,
171                 @NonNull Bundle outState) {
172         }
173 
174         /**
175          * Called when the Activity calls
176          * {@link Activity#onSaveInstanceState super.onSaveInstanceState()}.
177          */
onActivitySaveInstanceState(@onNull Activity activity, @NonNull Bundle outState)178         void onActivitySaveInstanceState(@NonNull Activity activity, @NonNull Bundle outState);
179 
180         /**
181          * Called as the last step of the Activity saving its instance state. This is always
182          * called after{@link Activity#onSaveInstanceState}.
183          */
onActivityPostSaveInstanceState(@onNull Activity activity, @NonNull Bundle outState)184         default void onActivityPostSaveInstanceState(@NonNull Activity activity,
185                 @NonNull Bundle outState) {
186         }
187 
188         /**
189          * Called as the first step of the Activity being destroyed. This is always called before
190          * {@link Activity#onDestroy}.
191          */
onActivityPreDestroyed(@onNull Activity activity)192         default void onActivityPreDestroyed(@NonNull Activity activity) {
193         }
194 
195         /**
196          * Called when the Activity calls {@link Activity#onDestroy super.onDestroy()}.
197          */
onActivityDestroyed(@onNull Activity activity)198         void onActivityDestroyed(@NonNull Activity activity);
199 
200         /**
201          * Called as the last step of the Activity being destroyed. This is always called after
202          * {@link Activity#onDestroy}.
203          */
onActivityPostDestroyed(@onNull Activity activity)204         default void onActivityPostDestroyed(@NonNull Activity activity) {
205         }
206     }
207 
208     /**
209      * Callback interface for use with {@link Application#registerOnProvideAssistDataListener}
210      * and {@link Application#unregisterOnProvideAssistDataListener}.
211      */
212     public interface OnProvideAssistDataListener {
213         /**
214          * This is called when the user is requesting an assist, to build a full
215          * {@link Intent#ACTION_ASSIST} Intent with all of the context of the current
216          * application.  You can override this method to place into the bundle anything
217          * you would like to appear in the {@link Intent#EXTRA_ASSIST_CONTEXT} part
218          * of the assist Intent.
219          */
onProvideAssistData(Activity activity, Bundle data)220         public void onProvideAssistData(Activity activity, Bundle data);
221     }
222 
Application()223     public Application() {
224         super(null);
225     }
226 
227     /**
228      * Called when the application is starting, before any activity, service,
229      * or receiver objects (excluding content providers) have been created.
230      *
231      * <p>Implementations should be as quick as possible (for example using
232      * lazy initialization of state) since the time spent in this function
233      * directly impacts the performance of starting the first activity,
234      * service, or receiver in a process.</p>
235      *
236      * <p>If you override this method, be sure to call {@code super.onCreate()}.</p>
237      *
238      * <p class="note">Be aware that direct boot may also affect callback order on
239      * Android {@link android.os.Build.VERSION_CODES#N} and later devices.
240      * Until the user unlocks the device, only direct boot aware components are
241      * allowed to run. You should consider that all direct boot unaware
242      * components, including such {@link android.content.ContentProvider}, are
243      * disabled until user unlock happens, especially when component callback
244      * order matters.</p>
245      */
246     @CallSuper
onCreate()247     public void onCreate() {
248     }
249 
250     /**
251      * This method is for use in emulated process environments.  It will
252      * never be called on a production Android device, where processes are
253      * removed by simply killing them; no user code (including this callback)
254      * is executed when doing so.
255      */
256     @CallSuper
onTerminate()257     public void onTerminate() {
258     }
259 
260     @CallSuper
onConfigurationChanged(@onNull Configuration newConfig)261     public void onConfigurationChanged(@NonNull Configuration newConfig) {
262         Object[] callbacks = collectComponentCallbacks();
263         if (callbacks != null) {
264             for (int i=0; i<callbacks.length; i++) {
265                 ((ComponentCallbacks)callbacks[i]).onConfigurationChanged(newConfig);
266             }
267         }
268     }
269 
270     @CallSuper
onLowMemory()271     public void onLowMemory() {
272         Object[] callbacks = collectComponentCallbacks();
273         if (callbacks != null) {
274             for (int i=0; i<callbacks.length; i++) {
275                 ((ComponentCallbacks)callbacks[i]).onLowMemory();
276             }
277         }
278     }
279 
280     @CallSuper
onTrimMemory(int level)281     public void onTrimMemory(int level) {
282         Object[] callbacks = collectComponentCallbacks();
283         if (callbacks != null) {
284             for (int i=0; i<callbacks.length; i++) {
285                 Object c = callbacks[i];
286                 if (c instanceof ComponentCallbacks2) {
287                     ((ComponentCallbacks2)c).onTrimMemory(level);
288                 }
289             }
290         }
291     }
292 
registerComponentCallbacks(ComponentCallbacks callback)293     public void registerComponentCallbacks(ComponentCallbacks callback) {
294         synchronized (mComponentCallbacks) {
295             mComponentCallbacks.add(callback);
296         }
297     }
298 
unregisterComponentCallbacks(ComponentCallbacks callback)299     public void unregisterComponentCallbacks(ComponentCallbacks callback) {
300         synchronized (mComponentCallbacks) {
301             mComponentCallbacks.remove(callback);
302         }
303     }
304 
registerActivityLifecycleCallbacks(ActivityLifecycleCallbacks callback)305     public void registerActivityLifecycleCallbacks(ActivityLifecycleCallbacks callback) {
306         synchronized (mActivityLifecycleCallbacks) {
307             mActivityLifecycleCallbacks.add(callback);
308         }
309     }
310 
unregisterActivityLifecycleCallbacks(ActivityLifecycleCallbacks callback)311     public void unregisterActivityLifecycleCallbacks(ActivityLifecycleCallbacks callback) {
312         synchronized (mActivityLifecycleCallbacks) {
313             mActivityLifecycleCallbacks.remove(callback);
314         }
315     }
316 
registerOnProvideAssistDataListener(OnProvideAssistDataListener callback)317     public void registerOnProvideAssistDataListener(OnProvideAssistDataListener callback) {
318         synchronized (this) {
319             if (mAssistCallbacks == null) {
320                 mAssistCallbacks = new ArrayList<OnProvideAssistDataListener>();
321             }
322             mAssistCallbacks.add(callback);
323         }
324     }
325 
unregisterOnProvideAssistDataListener(OnProvideAssistDataListener callback)326     public void unregisterOnProvideAssistDataListener(OnProvideAssistDataListener callback) {
327         synchronized (this) {
328             if (mAssistCallbacks != null) {
329                 mAssistCallbacks.remove(callback);
330             }
331         }
332     }
333 
334     /**
335      * Returns the name of the current process. A package's default process name
336      * is the same as its package name. Non-default processes will look like
337      * "$PACKAGE_NAME:$NAME", where $NAME corresponds to an android:process
338      * attribute within AndroidManifest.xml.
339      */
getProcessName()340     public static String getProcessName() {
341         return ActivityThread.currentProcessName();
342     }
343 
344     // ------------------ Internal API ------------------
345 
346     /**
347      * @hide
348      */
349     @UnsupportedAppUsage
attach(Context context)350     /* package */ final void attach(Context context) {
351         attachBaseContext(context);
352         mLoadedApk = ContextImpl.getImpl(context).mPackageInfo;
353     }
354 
355     @UnsupportedAppUsage
dispatchActivityPreCreated(@onNull Activity activity, @Nullable Bundle savedInstanceState)356         /* package */ void dispatchActivityPreCreated(@NonNull Activity activity,
357             @Nullable Bundle savedInstanceState) {
358         Object[] callbacks = collectActivityLifecycleCallbacks();
359         if (callbacks != null) {
360             for (int i = 0; i < callbacks.length; i++) {
361                 ((ActivityLifecycleCallbacks) callbacks[i]).onActivityPreCreated(activity,
362                         savedInstanceState);
363             }
364         }
365     }
366 
367     @UnsupportedAppUsage
dispatchActivityCreated(@onNull Activity activity, @Nullable Bundle savedInstanceState)368     /* package */ void dispatchActivityCreated(@NonNull Activity activity,
369             @Nullable Bundle savedInstanceState) {
370         Object[] callbacks = collectActivityLifecycleCallbacks();
371         if (callbacks != null) {
372             for (int i=0; i<callbacks.length; i++) {
373                 ((ActivityLifecycleCallbacks)callbacks[i]).onActivityCreated(activity,
374                         savedInstanceState);
375             }
376         }
377     }
378 
379     @UnsupportedAppUsage
dispatchActivityPostCreated(@onNull Activity activity, @Nullable Bundle savedInstanceState)380         /* package */ void dispatchActivityPostCreated(@NonNull Activity activity,
381             @Nullable Bundle savedInstanceState) {
382         Object[] callbacks = collectActivityLifecycleCallbacks();
383         if (callbacks != null) {
384             for (int i = 0; i < callbacks.length; i++) {
385                 ((ActivityLifecycleCallbacks) callbacks[i]).onActivityPostCreated(activity,
386                         savedInstanceState);
387             }
388         }
389     }
390 
391     @UnsupportedAppUsage
dispatchActivityPreStarted(@onNull Activity activity)392         /* package */ void dispatchActivityPreStarted(@NonNull Activity activity) {
393         Object[] callbacks = collectActivityLifecycleCallbacks();
394         if (callbacks != null) {
395             for (int i = 0; i < callbacks.length; i++) {
396                 ((ActivityLifecycleCallbacks) callbacks[i]).onActivityPreStarted(activity);
397             }
398         }
399     }
400 
401     @UnsupportedAppUsage
dispatchActivityStarted(@onNull Activity activity)402     /* package */ void dispatchActivityStarted(@NonNull Activity activity) {
403         Object[] callbacks = collectActivityLifecycleCallbacks();
404         if (callbacks != null) {
405             for (int i=0; i<callbacks.length; i++) {
406                 ((ActivityLifecycleCallbacks)callbacks[i]).onActivityStarted(activity);
407             }
408         }
409     }
410 
411     @UnsupportedAppUsage
dispatchActivityPostStarted(@onNull Activity activity)412         /* package */ void dispatchActivityPostStarted(@NonNull Activity activity) {
413         Object[] callbacks = collectActivityLifecycleCallbacks();
414         if (callbacks != null) {
415             for (int i = 0; i < callbacks.length; i++) {
416                 ((ActivityLifecycleCallbacks) callbacks[i]).onActivityPostStarted(activity);
417             }
418         }
419     }
420 
421     @UnsupportedAppUsage
dispatchActivityPreResumed(@onNull Activity activity)422         /* package */ void dispatchActivityPreResumed(@NonNull Activity activity) {
423         Object[] callbacks = collectActivityLifecycleCallbacks();
424         if (callbacks != null) {
425             for (int i = 0; i < callbacks.length; i++) {
426                 ((ActivityLifecycleCallbacks) callbacks[i]).onActivityPreResumed(activity);
427             }
428         }
429     }
430 
431     @UnsupportedAppUsage
dispatchActivityResumed(@onNull Activity activity)432     /* package */ void dispatchActivityResumed(@NonNull Activity activity) {
433         Object[] callbacks = collectActivityLifecycleCallbacks();
434         if (callbacks != null) {
435             for (int i=0; i<callbacks.length; i++) {
436                 ((ActivityLifecycleCallbacks)callbacks[i]).onActivityResumed(activity);
437             }
438         }
439     }
440 
441     @UnsupportedAppUsage
dispatchActivityPostResumed(@onNull Activity activity)442         /* package */ void dispatchActivityPostResumed(@NonNull Activity activity) {
443         Object[] callbacks = collectActivityLifecycleCallbacks();
444         if (callbacks != null) {
445             for (int i = 0; i < callbacks.length; i++) {
446                 ((ActivityLifecycleCallbacks) callbacks[i]).onActivityPostResumed(activity);
447             }
448         }
449     }
450 
451     @UnsupportedAppUsage
dispatchActivityPrePaused(@onNull Activity activity)452         /* package */ void dispatchActivityPrePaused(@NonNull Activity activity) {
453         Object[] callbacks = collectActivityLifecycleCallbacks();
454         if (callbacks != null) {
455             for (int i = 0; i < callbacks.length; i++) {
456                 ((ActivityLifecycleCallbacks) callbacks[i]).onActivityPrePaused(activity);
457             }
458         }
459     }
460 
461     @UnsupportedAppUsage
dispatchActivityPaused(@onNull Activity activity)462     /* package */ void dispatchActivityPaused(@NonNull Activity activity) {
463         Object[] callbacks = collectActivityLifecycleCallbacks();
464         if (callbacks != null) {
465             for (int i=0; i<callbacks.length; i++) {
466                 ((ActivityLifecycleCallbacks)callbacks[i]).onActivityPaused(activity);
467             }
468         }
469     }
470 
471     @UnsupportedAppUsage
dispatchActivityPostPaused(@onNull Activity activity)472         /* package */ void dispatchActivityPostPaused(@NonNull Activity activity) {
473         Object[] callbacks = collectActivityLifecycleCallbacks();
474         if (callbacks != null) {
475             for (int i = 0; i < callbacks.length; i++) {
476                 ((ActivityLifecycleCallbacks) callbacks[i]).onActivityPostPaused(activity);
477             }
478         }
479     }
480 
481     @UnsupportedAppUsage
dispatchActivityPreStopped(@onNull Activity activity)482         /* package */ void dispatchActivityPreStopped(@NonNull Activity activity) {
483         Object[] callbacks = collectActivityLifecycleCallbacks();
484         if (callbacks != null) {
485             for (int i = 0; i < callbacks.length; i++) {
486                 ((ActivityLifecycleCallbacks) callbacks[i]).onActivityPreStopped(activity);
487             }
488         }
489     }
490 
491     @UnsupportedAppUsage
dispatchActivityStopped(@onNull Activity activity)492     /* package */ void dispatchActivityStopped(@NonNull Activity activity) {
493         Object[] callbacks = collectActivityLifecycleCallbacks();
494         if (callbacks != null) {
495             for (int i=0; i<callbacks.length; i++) {
496                 ((ActivityLifecycleCallbacks)callbacks[i]).onActivityStopped(activity);
497             }
498         }
499     }
500 
501     @UnsupportedAppUsage
dispatchActivityPostStopped(@onNull Activity activity)502         /* package */ void dispatchActivityPostStopped(@NonNull Activity activity) {
503         Object[] callbacks = collectActivityLifecycleCallbacks();
504         if (callbacks != null) {
505             for (int i = 0; i < callbacks.length; i++) {
506                 ((ActivityLifecycleCallbacks) callbacks[i]).onActivityPostStopped(activity);
507             }
508         }
509     }
510 
511     @UnsupportedAppUsage
dispatchActivityPreSaveInstanceState(@onNull Activity activity, @NonNull Bundle outState)512         /* package */ void dispatchActivityPreSaveInstanceState(@NonNull Activity activity,
513             @NonNull Bundle outState) {
514         Object[] callbacks = collectActivityLifecycleCallbacks();
515         if (callbacks != null) {
516             for (int i = 0; i < callbacks.length; i++) {
517                 ((ActivityLifecycleCallbacks) callbacks[i]).onActivityPreSaveInstanceState(
518                         activity, outState);
519             }
520         }
521     }
522 
523     @UnsupportedAppUsage
dispatchActivitySaveInstanceState(@onNull Activity activity, @NonNull Bundle outState)524     /* package */ void dispatchActivitySaveInstanceState(@NonNull Activity activity,
525             @NonNull Bundle outState) {
526         Object[] callbacks = collectActivityLifecycleCallbacks();
527         if (callbacks != null) {
528             for (int i=0; i<callbacks.length; i++) {
529                 ((ActivityLifecycleCallbacks)callbacks[i]).onActivitySaveInstanceState(activity,
530                         outState);
531             }
532         }
533     }
534 
535     @UnsupportedAppUsage
dispatchActivityPostSaveInstanceState(@onNull Activity activity, @NonNull Bundle outState)536         /* package */ void dispatchActivityPostSaveInstanceState(@NonNull Activity activity,
537             @NonNull Bundle outState) {
538         Object[] callbacks = collectActivityLifecycleCallbacks();
539         if (callbacks != null) {
540             for (int i = 0; i < callbacks.length; i++) {
541                 ((ActivityLifecycleCallbacks) callbacks[i]).onActivityPostSaveInstanceState(
542                         activity, outState);
543             }
544         }
545     }
546 
547     @UnsupportedAppUsage
dispatchActivityPreDestroyed(@onNull Activity activity)548         /* package */ void dispatchActivityPreDestroyed(@NonNull Activity activity) {
549         Object[] callbacks = collectActivityLifecycleCallbacks();
550         if (callbacks != null) {
551             for (int i = 0; i < callbacks.length; i++) {
552                 ((ActivityLifecycleCallbacks) callbacks[i]).onActivityPreDestroyed(activity);
553             }
554         }
555     }
556 
557     @UnsupportedAppUsage
dispatchActivityDestroyed(@onNull Activity activity)558     /* package */ void dispatchActivityDestroyed(@NonNull Activity activity) {
559         Object[] callbacks = collectActivityLifecycleCallbacks();
560         if (callbacks != null) {
561             for (int i=0; i<callbacks.length; i++) {
562                 ((ActivityLifecycleCallbacks)callbacks[i]).onActivityDestroyed(activity);
563             }
564         }
565     }
566 
567     @UnsupportedAppUsage
dispatchActivityPostDestroyed(@onNull Activity activity)568         /* package */ void dispatchActivityPostDestroyed(@NonNull Activity activity) {
569         Object[] callbacks = collectActivityLifecycleCallbacks();
570         if (callbacks != null) {
571             for (int i = 0; i < callbacks.length; i++) {
572                 ((ActivityLifecycleCallbacks) callbacks[i]).onActivityPostDestroyed(activity);
573             }
574         }
575     }
576 
collectComponentCallbacks()577     private Object[] collectComponentCallbacks() {
578         Object[] callbacks = null;
579         synchronized (mComponentCallbacks) {
580             if (mComponentCallbacks.size() > 0) {
581                 callbacks = mComponentCallbacks.toArray();
582             }
583         }
584         return callbacks;
585     }
586 
587     @UnsupportedAppUsage
collectActivityLifecycleCallbacks()588     private Object[] collectActivityLifecycleCallbacks() {
589         Object[] callbacks = null;
590         synchronized (mActivityLifecycleCallbacks) {
591             if (mActivityLifecycleCallbacks.size() > 0) {
592                 callbacks = mActivityLifecycleCallbacks.toArray();
593             }
594         }
595         return callbacks;
596     }
597 
dispatchOnProvideAssistData(Activity activity, Bundle data)598     /* package */ void dispatchOnProvideAssistData(Activity activity, Bundle data) {
599         Object[] callbacks;
600         synchronized (this) {
601             if (mAssistCallbacks == null) {
602                 return;
603             }
604             callbacks = mAssistCallbacks.toArray();
605         }
606         if (callbacks != null) {
607             for (int i=0; i<callbacks.length; i++) {
608                 ((OnProvideAssistDataListener)callbacks[i]).onProvideAssistData(activity, data);
609             }
610         }
611     }
612 
613     /** @hide */
614     @Override
getAutofillClient()615     public AutofillManager.AutofillClient getAutofillClient() {
616         final AutofillManager.AutofillClient client = super.getAutofillClient();
617         if (client != null) {
618             return client;
619         }
620         if (android.view.autofill.Helper.sVerbose) {
621             Log.v(TAG, "getAutofillClient(): null on super, trying to find activity thread");
622         }
623         // Okay, ppl use the application context when they should not. This breaks
624         // autofill among other things. We pick the focused activity since autofill
625         // interacts only with the currently focused activity and we need the fill
626         // client only if a call comes from the focused activity. Sigh...
627         final ActivityThread activityThread = ActivityThread.currentActivityThread();
628         if (activityThread == null) {
629             return null;
630         }
631         final int activityCount = activityThread.mActivities.size();
632         for (int i = 0; i < activityCount; i++) {
633             final ActivityThread.ActivityClientRecord record =
634                     activityThread.mActivities.valueAt(i);
635             if (record == null) {
636                 continue;
637             }
638             final Activity activity = record.activity;
639             if (activity == null) {
640                 continue;
641             }
642             if (activity.getWindow().getDecorView().hasFocus()) {
643                 if (android.view.autofill.Helper.sVerbose) {
644                     Log.v(TAG, "getAutofillClient(): found activity for " + this + ": " + activity);
645                 }
646                 return activity;
647             }
648         }
649         if (android.view.autofill.Helper.sVerbose) {
650             Log.v(TAG, "getAutofillClient(): none of the " + activityCount + " activities on "
651                     + this + " have focus");
652         }
653         return null;
654     }
655 }
656