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