1 /* 2 * Copyright (C) 2020 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.Nullable; 20 import android.annotation.RequiresPermission; 21 import android.content.ComponentName; 22 import android.content.Intent; 23 import android.content.res.Configuration; 24 import android.content.res.Resources; 25 import android.os.Bundle; 26 import android.os.IBinder; 27 import android.os.PersistableBundle; 28 import android.os.RemoteException; 29 import android.util.Singleton; 30 import android.view.RemoteAnimationDefinition; 31 import android.window.SizeConfigurationBuckets; 32 33 import com.android.internal.policy.IKeyguardDismissCallback; 34 35 /** 36 * Provides the activity associated operations that communicate with system. 37 * 38 * @hide 39 */ 40 public class ActivityClient { ActivityClient()41 private ActivityClient() {} 42 43 /** Reports the main thread is idle after the activity is resumed. */ activityIdle(IBinder token, Configuration config, boolean stopProfiling)44 public void activityIdle(IBinder token, Configuration config, boolean stopProfiling) { 45 try { 46 getActivityClientController().activityIdle(token, config, stopProfiling); 47 } catch (RemoteException e) { 48 e.rethrowFromSystemServer(); 49 } 50 } 51 52 /** Reports {@link Activity#onResume()} is done. */ activityResumed(IBinder token, boolean handleSplashScreenExit)53 public void activityResumed(IBinder token, boolean handleSplashScreenExit) { 54 try { 55 getActivityClientController().activityResumed(token, handleSplashScreenExit); 56 } catch (RemoteException e) { 57 e.rethrowFromSystemServer(); 58 } 59 } 60 61 /** Reports {@link android.app.servertransaction.RefreshCallbackItem} is executed. */ activityRefreshed(IBinder token)62 public void activityRefreshed(IBinder token) { 63 try { 64 getActivityClientController().activityRefreshed(token); 65 } catch (RemoteException e) { 66 e.rethrowFromSystemServer(); 67 } 68 } 69 70 /** 71 * Reports after {@link Activity#onTopResumedActivityChanged(boolean)} is called for losing the 72 * top most position. 73 */ activityTopResumedStateLost()74 public void activityTopResumedStateLost() { 75 try { 76 getActivityClientController().activityTopResumedStateLost(); 77 } catch (RemoteException e) { 78 e.rethrowFromSystemServer(); 79 } 80 } 81 82 /** Reports {@link Activity#onPause()} is done. */ activityPaused(IBinder token)83 public void activityPaused(IBinder token) { 84 try { 85 getActivityClientController().activityPaused(token); 86 } catch (RemoteException e) { 87 e.rethrowFromSystemServer(); 88 } 89 } 90 91 /** Reports {@link Activity#onStop()} is done. */ activityStopped(IBinder token, Bundle state, PersistableBundle persistentState, CharSequence description)92 public void activityStopped(IBinder token, Bundle state, PersistableBundle persistentState, 93 CharSequence description) { 94 try { 95 getActivityClientController().activityStopped(token, state, persistentState, 96 description); 97 } catch (RemoteException e) { 98 e.rethrowFromSystemServer(); 99 } 100 } 101 102 /** Reports {@link Activity#onDestroy()} is done. */ activityDestroyed(IBinder token)103 public void activityDestroyed(IBinder token) { 104 try { 105 getActivityClientController().activityDestroyed(token); 106 } catch (RemoteException e) { 107 e.rethrowFromSystemServer(); 108 } 109 } 110 111 /** Reports the activity starts local relaunch. */ activityLocalRelaunch(IBinder token)112 public void activityLocalRelaunch(IBinder token) { 113 try { 114 getActivityClientController().activityLocalRelaunch(token); 115 } catch (RemoteException e) { 116 e.rethrowFromSystemServer(); 117 } 118 } 119 120 /** Reports the activity has completed relaunched. */ activityRelaunched(IBinder token)121 public void activityRelaunched(IBinder token) { 122 try { 123 getActivityClientController().activityRelaunched(token); 124 } catch (RemoteException e) { 125 e.rethrowFromSystemServer(); 126 } 127 } 128 reportSizeConfigurations(IBinder token, SizeConfigurationBuckets sizeConfigurations)129 void reportSizeConfigurations(IBinder token, SizeConfigurationBuckets sizeConfigurations) { 130 try { 131 getActivityClientController().reportSizeConfigurations(token, sizeConfigurations); 132 } catch (RemoteException e) { 133 e.rethrowFromSystemServer(); 134 } 135 } 136 moveActivityTaskToBack(IBinder token, boolean nonRoot)137 public boolean moveActivityTaskToBack(IBinder token, boolean nonRoot) { 138 try { 139 return getActivityClientController().moveActivityTaskToBack(token, nonRoot); 140 } catch (RemoteException e) { 141 throw e.rethrowFromSystemServer(); 142 } 143 } 144 shouldUpRecreateTask(IBinder token, String destAffinity)145 boolean shouldUpRecreateTask(IBinder token, String destAffinity) { 146 try { 147 return getActivityClientController().shouldUpRecreateTask(token, destAffinity); 148 } catch (RemoteException e) { 149 throw e.rethrowFromSystemServer(); 150 } 151 } 152 navigateUpTo(IBinder token, Intent destIntent, String resolvedType, int resultCode, Intent resultData)153 boolean navigateUpTo(IBinder token, Intent destIntent, String resolvedType, int resultCode, 154 Intent resultData) { 155 try { 156 return getActivityClientController().navigateUpTo(token, destIntent, resolvedType, 157 resultCode, resultData); 158 } catch (RemoteException e) { 159 throw e.rethrowFromSystemServer(); 160 } 161 } 162 releaseActivityInstance(IBinder token)163 boolean releaseActivityInstance(IBinder token) { 164 try { 165 return getActivityClientController().releaseActivityInstance(token); 166 } catch (RemoteException e) { 167 throw e.rethrowFromSystemServer(); 168 } 169 } 170 finishActivity(IBinder token, int resultCode, Intent resultData, int finishTask)171 public boolean finishActivity(IBinder token, int resultCode, Intent resultData, 172 int finishTask) { 173 try { 174 return getActivityClientController().finishActivity(token, resultCode, resultData, 175 finishTask); 176 } catch (RemoteException e) { 177 throw e.rethrowFromSystemServer(); 178 } 179 } 180 finishActivityAffinity(IBinder token)181 boolean finishActivityAffinity(IBinder token) { 182 try { 183 return getActivityClientController().finishActivityAffinity(token); 184 } catch (RemoteException e) { 185 throw e.rethrowFromSystemServer(); 186 } 187 } 188 finishSubActivity(IBinder token, String resultWho, int requestCode)189 void finishSubActivity(IBinder token, String resultWho, int requestCode) { 190 try { 191 getActivityClientController().finishSubActivity(token, resultWho, requestCode); 192 } catch (RemoteException e) { 193 e.rethrowFromSystemServer(); 194 } 195 } 196 197 @RequiresPermission(android.Manifest.permission.MANAGE_MEDIA_PROJECTION) setForceSendResultForMediaProjection(IBinder token)198 void setForceSendResultForMediaProjection(IBinder token) { 199 try { 200 getActivityClientController().setForceSendResultForMediaProjection(token); 201 } catch (RemoteException e) { 202 throw e.rethrowFromSystemServer(); 203 } 204 } 205 isTopOfTask(IBinder token)206 public boolean isTopOfTask(IBinder token) { 207 try { 208 return getActivityClientController().isTopOfTask(token); 209 } catch (RemoteException e) { 210 throw e.rethrowFromSystemServer(); 211 } 212 } 213 willActivityBeVisible(IBinder token)214 boolean willActivityBeVisible(IBinder token) { 215 try { 216 return getActivityClientController().willActivityBeVisible(token); 217 } catch (RemoteException e) { 218 throw e.rethrowFromSystemServer(); 219 } 220 } 221 getDisplayId(IBinder token)222 public int getDisplayId(IBinder token) { 223 try { 224 return getActivityClientController().getDisplayId(token); 225 } catch (RemoteException e) { 226 throw e.rethrowFromSystemServer(); 227 } 228 } 229 getTaskForActivity(IBinder token, boolean onlyRoot)230 public int getTaskForActivity(IBinder token, boolean onlyRoot) { 231 try { 232 return getActivityClientController().getTaskForActivity(token, onlyRoot); 233 } catch (RemoteException e) { 234 throw e.rethrowFromSystemServer(); 235 } 236 } 237 238 /** 239 * Returns the {@link Configuration} of the task which hosts the Activity, or {@code null} if 240 * the task {@link Configuration} cannot be obtained. 241 */ 242 @Nullable getTaskConfiguration(IBinder activityToken)243 public Configuration getTaskConfiguration(IBinder activityToken) { 244 try { 245 return getActivityClientController().getTaskConfiguration(activityToken); 246 } catch (RemoteException e) { 247 throw e.rethrowFromSystemServer(); 248 } 249 } 250 251 /** 252 * Returns the non-finishing activity token below in the same task if it belongs to the same 253 * process. 254 */ 255 @Nullable getActivityTokenBelow(IBinder activityToken)256 public IBinder getActivityTokenBelow(IBinder activityToken) { 257 try { 258 return getActivityClientController().getActivityTokenBelow(activityToken); 259 } catch (RemoteException e) { 260 throw e.rethrowFromSystemServer(); 261 } 262 } 263 getCallingActivity(IBinder token)264 ComponentName getCallingActivity(IBinder token) { 265 try { 266 return getActivityClientController().getCallingActivity(token); 267 } catch (RemoteException e) { 268 throw e.rethrowFromSystemServer(); 269 } 270 } 271 getCallingPackage(IBinder token)272 String getCallingPackage(IBinder token) { 273 try { 274 return getActivityClientController().getCallingPackage(token); 275 } catch (RemoteException e) { 276 throw e.rethrowFromSystemServer(); 277 } 278 } 279 getLaunchedFromUid(IBinder token)280 public int getLaunchedFromUid(IBinder token) { 281 try { 282 return getActivityClientController().getLaunchedFromUid(token); 283 } catch (RemoteException e) { 284 throw e.rethrowFromSystemServer(); 285 } 286 } 287 getLaunchedFromPackage(IBinder token)288 public String getLaunchedFromPackage(IBinder token) { 289 try { 290 return getActivityClientController().getLaunchedFromPackage(token); 291 } catch (RemoteException e) { 292 throw e.rethrowFromSystemServer(); 293 } 294 } 295 setRequestedOrientation(IBinder token, int requestedOrientation)296 public void setRequestedOrientation(IBinder token, int requestedOrientation) { 297 try { 298 getActivityClientController().setRequestedOrientation(token, requestedOrientation); 299 } catch (RemoteException e) { 300 e.rethrowFromSystemServer(); 301 } 302 } 303 getRequestedOrientation(IBinder token)304 int getRequestedOrientation(IBinder token) { 305 try { 306 return getActivityClientController().getRequestedOrientation(token); 307 } catch (RemoteException e) { 308 throw e.rethrowFromSystemServer(); 309 } 310 } 311 convertFromTranslucent(IBinder token)312 boolean convertFromTranslucent(IBinder token) { 313 try { 314 return getActivityClientController().convertFromTranslucent(token); 315 } catch (RemoteException e) { 316 throw e.rethrowFromSystemServer(); 317 } 318 } 319 convertToTranslucent(IBinder token, Bundle options)320 boolean convertToTranslucent(IBinder token, Bundle options) { 321 try { 322 return getActivityClientController().convertToTranslucent(token, options); 323 } catch (RemoteException e) { 324 throw e.rethrowFromSystemServer(); 325 } 326 } 327 reportActivityFullyDrawn(IBinder token, boolean restoredFromBundle)328 void reportActivityFullyDrawn(IBinder token, boolean restoredFromBundle) { 329 try { 330 getActivityClientController().reportActivityFullyDrawn(token, restoredFromBundle); 331 } catch (RemoteException e) { 332 e.rethrowFromSystemServer(); 333 } 334 } 335 isImmersive(IBinder token)336 boolean isImmersive(IBinder token) { 337 try { 338 return getActivityClientController().isImmersive(token); 339 } catch (RemoteException e) { 340 throw e.rethrowFromSystemServer(); 341 } 342 } 343 setImmersive(IBinder token, boolean immersive)344 void setImmersive(IBinder token, boolean immersive) { 345 try { 346 getActivityClientController().setImmersive(token, immersive); 347 } catch (RemoteException e) { 348 e.rethrowFromSystemServer(); 349 } 350 } 351 enterPictureInPictureMode(IBinder token, PictureInPictureParams params)352 boolean enterPictureInPictureMode(IBinder token, PictureInPictureParams params) { 353 try { 354 return getActivityClientController().enterPictureInPictureMode(token, params); 355 } catch (RemoteException e) { 356 throw e.rethrowFromSystemServer(); 357 } 358 } 359 setPictureInPictureParams(IBinder token, PictureInPictureParams params)360 void setPictureInPictureParams(IBinder token, PictureInPictureParams params) { 361 try { 362 getActivityClientController().setPictureInPictureParams(token, params); 363 } catch (RemoteException e) { 364 e.rethrowFromSystemServer(); 365 } 366 } 367 setShouldDockBigOverlays(IBinder token, boolean shouldDockBigOverlays)368 void setShouldDockBigOverlays(IBinder token, boolean shouldDockBigOverlays) { 369 try { 370 getActivityClientController().setShouldDockBigOverlays(token, shouldDockBigOverlays); 371 } catch (RemoteException e) { 372 e.rethrowFromSystemServer(); 373 } 374 } 375 toggleFreeformWindowingMode(IBinder token)376 void toggleFreeformWindowingMode(IBinder token) { 377 try { 378 getActivityClientController().toggleFreeformWindowingMode(token); 379 } catch (RemoteException e) { 380 e.rethrowFromSystemServer(); 381 } 382 } 383 startLockTaskModeByToken(IBinder token)384 void startLockTaskModeByToken(IBinder token) { 385 try { 386 getActivityClientController().startLockTaskModeByToken(token); 387 } catch (RemoteException e) { 388 e.rethrowFromSystemServer(); 389 } 390 } 391 stopLockTaskModeByToken(IBinder token)392 void stopLockTaskModeByToken(IBinder token) { 393 try { 394 getActivityClientController().stopLockTaskModeByToken(token); 395 } catch (RemoteException e) { 396 e.rethrowFromSystemServer(); 397 } 398 } 399 showLockTaskEscapeMessage(IBinder token)400 void showLockTaskEscapeMessage(IBinder token) { 401 try { 402 getActivityClientController().showLockTaskEscapeMessage(token); 403 } catch (RemoteException e) { 404 e.rethrowFromSystemServer(); 405 } 406 } 407 setTaskDescription(IBinder token, ActivityManager.TaskDescription td)408 void setTaskDescription(IBinder token, ActivityManager.TaskDescription td) { 409 try { 410 getActivityClientController().setTaskDescription(token, td); 411 } catch (RemoteException e) { 412 e.rethrowFromSystemServer(); 413 } 414 } 415 showAssistFromActivity(IBinder token, Bundle args)416 boolean showAssistFromActivity(IBinder token, Bundle args) { 417 try { 418 return getActivityClientController().showAssistFromActivity(token, args); 419 } catch (RemoteException e) { 420 throw e.rethrowFromSystemServer(); 421 } 422 } 423 isRootVoiceInteraction(IBinder token)424 boolean isRootVoiceInteraction(IBinder token) { 425 try { 426 return getActivityClientController().isRootVoiceInteraction(token); 427 } catch (RemoteException e) { 428 throw e.rethrowFromSystemServer(); 429 } 430 } 431 startLocalVoiceInteraction(IBinder callingActivity, Bundle options)432 void startLocalVoiceInteraction(IBinder callingActivity, Bundle options) { 433 try { 434 getActivityClientController().startLocalVoiceInteraction(callingActivity, options); 435 } catch (RemoteException e) { 436 e.rethrowFromSystemServer(); 437 } 438 } 439 stopLocalVoiceInteraction(IBinder callingActivity)440 void stopLocalVoiceInteraction(IBinder callingActivity) { 441 try { 442 getActivityClientController().stopLocalVoiceInteraction(callingActivity); 443 } catch (RemoteException e) { 444 e.rethrowFromSystemServer(); 445 } 446 } 447 setShowWhenLocked(IBinder token, boolean showWhenLocked)448 void setShowWhenLocked(IBinder token, boolean showWhenLocked) { 449 try { 450 getActivityClientController().setShowWhenLocked(token, showWhenLocked); 451 } catch (RemoteException e) { 452 e.rethrowFromSystemServer(); 453 } 454 } 455 setInheritShowWhenLocked(IBinder token, boolean inheritShowWhenLocked)456 void setInheritShowWhenLocked(IBinder token, boolean inheritShowWhenLocked) { 457 try { 458 getActivityClientController().setInheritShowWhenLocked(token, inheritShowWhenLocked); 459 } catch (RemoteException e) { 460 e.rethrowFromSystemServer(); 461 } 462 } 463 setTurnScreenOn(IBinder token, boolean turnScreenOn)464 void setTurnScreenOn(IBinder token, boolean turnScreenOn) { 465 try { 466 getActivityClientController().setTurnScreenOn(token, turnScreenOn); 467 } catch (RemoteException e) { 468 e.rethrowFromSystemServer(); 469 } 470 } 471 setVrMode(IBinder token, boolean enabled, ComponentName packageName)472 int setVrMode(IBinder token, boolean enabled, ComponentName packageName) { 473 try { 474 return getActivityClientController().setVrMode(token, enabled, packageName); 475 } catch (RemoteException e) { 476 throw e.rethrowFromSystemServer(); 477 } 478 } 479 overridePendingTransition(IBinder token, String packageName, int enterAnim, int exitAnim, int backgroundColor)480 void overridePendingTransition(IBinder token, String packageName, int enterAnim, int exitAnim, 481 int backgroundColor) { 482 try { 483 getActivityClientController().overridePendingTransition(token, packageName, 484 enterAnim, exitAnim, backgroundColor); 485 } catch (RemoteException e) { 486 e.rethrowFromSystemServer(); 487 } 488 } 489 setRecentsScreenshotEnabled(IBinder token, boolean enabled)490 void setRecentsScreenshotEnabled(IBinder token, boolean enabled) { 491 try { 492 getActivityClientController().setRecentsScreenshotEnabled(token, enabled); 493 } catch (RemoteException e) { 494 e.rethrowFromSystemServer(); 495 } 496 } 497 498 /** 499 * Removes the outdated snapshot of the home task. 500 * 501 * @param homeToken The token of the home task, or null if you have the 502 * {@link android.Manifest.permission#MANAGE_ACTIVITY_TASKS} permission and 503 * want us to find the home task token for you. 504 */ invalidateHomeTaskSnapshot(IBinder homeToken)505 public void invalidateHomeTaskSnapshot(IBinder homeToken) { 506 try { 507 getActivityClientController().invalidateHomeTaskSnapshot(homeToken); 508 } catch (RemoteException e) { 509 e.rethrowFromSystemServer(); 510 } 511 } 512 dismissKeyguard(IBinder token, IKeyguardDismissCallback callback, CharSequence message)513 void dismissKeyguard(IBinder token, IKeyguardDismissCallback callback, 514 CharSequence message) { 515 try { 516 getActivityClientController().dismissKeyguard(token, callback, message); 517 } catch (RemoteException e) { 518 e.rethrowFromSystemServer(); 519 } 520 } 521 registerRemoteAnimations(IBinder token, RemoteAnimationDefinition definition)522 void registerRemoteAnimations(IBinder token, RemoteAnimationDefinition definition) { 523 try { 524 getActivityClientController().registerRemoteAnimations(token, definition); 525 } catch (RemoteException e) { 526 e.rethrowFromSystemServer(); 527 } 528 } 529 unregisterRemoteAnimations(IBinder token)530 void unregisterRemoteAnimations(IBinder token) { 531 try { 532 getActivityClientController().unregisterRemoteAnimations(token); 533 } catch (RemoteException e) { 534 e.rethrowFromSystemServer(); 535 } 536 } 537 onBackPressed(IBinder token, IRequestFinishCallback callback)538 void onBackPressed(IBinder token, IRequestFinishCallback callback) { 539 try { 540 getActivityClientController().onBackPressed(token, callback); 541 } catch (RemoteException e) { 542 e.rethrowFromSystemServer(); 543 } 544 } 545 546 /** 547 * Reports the splash screen view has attached to client. 548 */ reportSplashScreenAttached(IBinder token)549 void reportSplashScreenAttached(IBinder token) { 550 try { 551 getActivityClientController().splashScreenAttached(token); 552 } catch (RemoteException e) { 553 e.rethrowFromSystemServer(); 554 } 555 } 556 557 /** 558 * Shows or hides a Camera app compat toggle for stretched issues with the requested state. 559 * 560 * @param token The token for the window that needs a control. 561 * @param showControl Whether the control should be shown or hidden. 562 * @param transformationApplied Whether the treatment is already applied. 563 * @param callback The callback executed when the user clicks on a control. 564 */ requestCompatCameraControl(Resources res, IBinder token, boolean showControl, boolean transformationApplied, ICompatCameraControlCallback callback)565 void requestCompatCameraControl(Resources res, IBinder token, boolean showControl, 566 boolean transformationApplied, ICompatCameraControlCallback callback) { 567 if (!res.getBoolean(com.android.internal.R.bool 568 .config_isCameraCompatControlForStretchedIssuesEnabled)) { 569 return; 570 } 571 try { 572 getActivityClientController().requestCompatCameraControl( 573 token, showControl, transformationApplied, callback); 574 } catch (RemoteException e) { 575 e.rethrowFromSystemServer(); 576 } 577 } 578 getInstance()579 public static ActivityClient getInstance() { 580 return sInstance.get(); 581 } 582 583 /** 584 * If system server has passed the controller interface, store it so the subsequent access can 585 * speed up. 586 */ setActivityClientController( IActivityClientController activityClientController)587 public static IActivityClientController setActivityClientController( 588 IActivityClientController activityClientController) { 589 // No lock because it is no harm to encounter race condition. The thread safe Singleton#get 590 // will take over that case. 591 return INTERFACE_SINGLETON.mKnownInstance = activityClientController; 592 } 593 getActivityClientController()594 private static IActivityClientController getActivityClientController() { 595 final IActivityClientController controller = INTERFACE_SINGLETON.mKnownInstance; 596 return controller != null ? controller : INTERFACE_SINGLETON.get(); 597 } 598 599 private static final Singleton<ActivityClient> sInstance = new Singleton<ActivityClient>() { 600 @Override 601 protected ActivityClient create() { 602 return new ActivityClient(); 603 } 604 }; 605 606 private static final ActivityClientControllerSingleton INTERFACE_SINGLETON = 607 new ActivityClientControllerSingleton(); 608 609 private static class ActivityClientControllerSingleton 610 extends Singleton<IActivityClientController> { 611 /** 612 * A quick look up to reduce potential extra binder transactions. E.g. getting activity 613 * task manager from service manager and controller from activity task manager. 614 */ 615 IActivityClientController mKnownInstance; 616 617 @Override create()618 protected IActivityClientController create() { 619 try { 620 return ActivityTaskManager.getService().getActivityClientController(); 621 } catch (RemoteException e) { 622 throw e.rethrowFromSystemServer(); 623 } 624 } 625 } 626 } 627