blob: a1c845832049495776c2b47d4dbe7f41d255be10 [file] [log] [blame] [view]
Dan Sandlerfd390c62020-09-03 16:44:49 -04001# How double-click power launches the camera
Alejandro Nijamkin93c38282022-07-03 16:09:44 -07002_Last update: July 2022_
Dan Sandlerfd390c62020-09-03 16:44:49 -04003
4## Sequence of events
Alejandro Nijamkin93c38282022-07-03 16:09:44 -070051. [PhoneWindowManager.java](/services/core/java/com/android/server/policy/PhoneWindowManager.java) is responsible for all power button presses (see `interceptPowerKeyDown`)
62. Even though `PhoneWindowManager` has a lot of logic to detect all manner of power button multi-presses and gestures, it also checks with `GestureLauncherService`, which is also [offered the chance](/services/core/java/com/android/server/policy/PhoneWindowManager.java#943) to [intercept](/services/core/java/com/android/server/GestureLauncherService.java) the power key
73. `GestureLauncherService` is responsible for the camera timeout, and if it detects one, it [forwards it to the StatusBarManagerService](/services/core/java/com/android/server/GestureLauncherService.java) (which hands it off to SystemUI)
84. Inside SystemUI, `onCameraLaunchDetected` in [CentralSurfacesCommandQueueCallbacks.java](/packages/SystemUI/src/com/android/systemui/statusbar/phone/CentralSurfacesCommandQueueCallbacks.java) looks at the keyguard state and determines
Dan Sandlerfd390c62020-09-03 16:44:49 -04009 1. whether the camera is even allowed
10 2. whether the screen is on; if not, we need to delay until that happens
Dan Sandlerf22cf3d2021-03-23 23:38:00 -040011 3. whether the device is locked (defined as "keyguard is showing").
Alejandro Nijamkin93c38282022-07-03 16:09:44 -0700125. If the device is unlocked (no keyguard), the camera is launched immediately
136. If the keyguard is up, however, [NotificationPanelViewController.launchCamera](/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelViewController.java) takes over to handle the "secure camera" (a different intent, usually directing to the same app, but giving that app the cue to not allow access to the photo roll, etc).
147. If the intent would have to launch a resolver (because the user has multiple camera apps installed and has not chosen one to always launch for the `SECURE_CAMERA_INTENT`, then - in order to show the resolver, the lockscreen "bouncer" (authentication method) is first presented
158. Otherwise (just one secure camera), it is launched
Dan Sandlerfd390c62020-09-03 16:44:49 -040016
Alejandro Nijamkin93c38282022-07-03 16:09:44 -070017## Which intent launches the camera app?
18[CameraGestureHelper](/packages/SystemUI/src/com/android/systemui/camera/CameraGestureHelper.kt) encapsulate this logic. Roughly:
19* If the keyguard is not showing (device is unlocked)
20 * `CameraIntents.getInsecureCameraIntent()`, defined to be `MediaStore.INTENT_ACTION_STILL_IMAGE_CAMERA`.
21* If the keyguard is showing (device is locked)
22 * one of `CameraIntents.getInsecureCameraIntent()` or `CameraIntents.getSecureCameraIntent()`, which are `MediaStore.INTENT_ACTION_STILL_IMAGE_CAMERA` and `MediaStore.INTENT_ACTION_STILL_IMAGE_CAMERA_SECURE`, respectively
23* Note that starting in Android 12, as required by some OEMs, if the special string resource `config_cameraGesturePackage` is nonempty, this will be treated as a package name to be added to the insecure camera intent, constraining the invocation to that single app and typically preventing implicit intent resolution. This package must be on the device or the camera gesture will no longer work properly