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