summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--api/current.txt666
-rw-r--r--api/removed.txt20
-rw-r--r--api/system-current.txt107
-rw-r--r--api/test-current.txt28
-rw-r--r--cmds/idmap2/idmap2/Create.cpp8
-rw-r--r--cmds/idmap2/idmap2/Lookup.cpp23
-rw-r--r--cmds/idmap2/idmap2/Scan.cpp10
-rw-r--r--cmds/idmap2/idmap2d/Idmap2Service.cpp2
-rw-r--r--cmds/idmap2/include/idmap2/Policies.h4
-rw-r--r--cmds/idmap2/include/idmap2/ResourceUtils.h5
-rw-r--r--cmds/idmap2/include/idmap2/Result.h10
-rw-r--r--cmds/idmap2/libidmap2/Idmap.cpp8
-rw-r--r--cmds/idmap2/libidmap2/Policies.cpp7
-rw-r--r--cmds/idmap2/libidmap2/RawPrintVisitor.cpp2
-rw-r--r--cmds/idmap2/libidmap2/ResourceUtils.cpp22
-rw-r--r--cmds/idmap2/libidmap2/Result.cpp4
-rw-r--r--cmds/idmap2/libidmap2/ZipFile.cpp5
-rw-r--r--cmds/idmap2/tests/FileUtilsTests.cpp24
-rw-r--r--cmds/idmap2/tests/IdmapTests.cpp26
-rw-r--r--cmds/idmap2/tests/PoliciesTests.cpp56
-rw-r--r--cmds/idmap2/tests/ResultTests.cpp84
-rw-r--r--cmds/sm/src/com/android/commands/sm/Sm.java19
-rw-r--r--cmds/statsd/src/atoms.proto5
-rw-r--r--cmds/statsd/src/metrics/MetricProducer.h6
-rw-r--r--cmds/statsd/src/metrics/ValueMetricProducer.cpp2
-rw-r--r--config/hiddenapi-greylist.txt306
-rw-r--r--core/java/android/app/ActivityThread.java2
-rw-r--r--core/java/android/app/AppComponentFactory.java18
-rw-r--r--core/java/android/app/DownloadManager.java5
-rw-r--r--core/java/android/app/IActivityManager.aidl1
-rw-r--r--core/java/android/app/IActivityTaskManager.aidl1
-rw-r--r--core/java/android/app/ITaskStackListener.aidl10
-rw-r--r--core/java/android/app/Instrumentation.java8
-rw-r--r--core/java/android/app/LoadedApk.java26
-rw-r--r--core/java/android/app/Notification.java58
-rw-r--r--core/java/android/app/SearchDialog.java16
-rw-r--r--core/java/android/app/Service.java27
-rw-r--r--core/java/android/app/StatusBarManager.java7
-rw-r--r--core/java/android/app/TaskStackListener.java6
-rw-r--r--core/java/android/app/admin/DevicePolicyManager.java3
-rw-r--r--core/java/android/app/servertransaction/TopResumedActivityChangeItem.java22
-rw-r--r--core/java/android/app/servertransaction/WindowVisibilityItem.java3
-rw-r--r--core/java/android/app/usage/UsageStatsManager.java5
-rw-r--r--core/java/android/app/usage/UsageStatsManagerInternal.java6
-rw-r--r--core/java/android/content/LocusId.java2
-rw-r--r--core/java/android/content/pm/ApplicationInfo.java24
-rw-r--r--core/java/android/content/pm/PackageManagerInternal.java8
-rw-r--r--core/java/android/content/pm/PackageParser.java6
-rw-r--r--core/java/android/content/rollback/RollbackInfo.java18
-rw-r--r--core/java/android/database/BulkCursorNative.java2
-rw-r--r--core/java/android/database/Cursor.java3
-rw-r--r--core/java/android/hardware/biometrics/BiometricPrompt.java32
-rw-r--r--core/java/android/hardware/camera2/CameraCharacteristics.java232
-rw-r--r--core/java/android/hardware/camera2/CaptureRequest.java133
-rw-r--r--core/java/android/hardware/camera2/CaptureResult.java219
-rw-r--r--core/java/android/hardware/display/BrightnessConfiguration.java4
-rw-r--r--core/java/android/hardware/display/IDisplayManager.aidl1
-rw-r--r--core/java/android/hardware/input/IInputManager.aidl1
-rw-r--r--core/java/android/hardware/location/IActivityRecognitionHardwareClient.aidl1
-rw-r--r--core/java/android/net/ConnectivityManager.java6
-rw-r--r--core/java/android/net/IConnectivityManager.aidl13
-rw-r--r--core/java/android/net/INetworkPolicyManager.aidl7
-rw-r--r--core/java/android/net/INetworkStatsService.aidl13
-rw-r--r--core/java/android/net/INetworkStatsSession.aidl5
-rw-r--r--core/java/android/nfc/INfcAdapterExtras.aidl7
-rw-r--r--core/java/android/os/VibrationEffect.java2
-rw-r--r--core/java/android/os/storage/StorageManager.java4
-rw-r--r--core/java/android/provider/CalendarContract.java16
-rw-r--r--core/java/android/provider/DeviceConfig.java132
-rw-r--r--core/java/android/provider/MediaStore.java48
-rw-r--r--core/java/android/service/autofill/FillContext.java21
-rw-r--r--core/java/android/service/autofill/VisibilitySetterAction.java7
-rw-r--r--core/java/android/service/autofill/augmented/FillResponse.java18
-rw-r--r--core/java/android/service/carrier/CarrierMessagingClientService.java5
-rw-r--r--core/java/android/service/contentcapture/SnapshotData.java5
-rw-r--r--core/java/android/service/contentsuggestions/ContentSuggestionsService.java10
-rw-r--r--core/java/android/service/euicc/IDeleteSubscriptionCallback.aidl1
-rw-r--r--core/java/android/service/euicc/IEraseSubscriptionsCallback.aidl1
-rw-r--r--core/java/android/service/euicc/IGetDefaultDownloadableSubscriptionListCallback.aidl1
-rw-r--r--core/java/android/service/euicc/IGetDownloadableSubscriptionMetadataCallback.aidl1
-rw-r--r--core/java/android/service/euicc/IGetEidCallback.aidl1
-rw-r--r--core/java/android/service/euicc/IGetEuiccInfoCallback.aidl1
-rw-r--r--core/java/android/service/euicc/IGetEuiccProfileInfoListCallback.aidl1
-rw-r--r--core/java/android/service/euicc/IRetainSubscriptionsForFactoryResetCallback.aidl1
-rw-r--r--core/java/android/service/euicc/ISwitchToSubscriptionCallback.aidl1
-rw-r--r--core/java/android/service/euicc/IUpdateSubscriptionNicknameCallback.aidl1
-rw-r--r--core/java/android/service/vr/IVrManager.aidl2
-rw-r--r--core/java/android/service/wallpaper/IWallpaperEngine.aidl4
-rw-r--r--core/java/android/speech/IRecognitionListener.aidl1
-rw-r--r--core/java/android/util/FeatureFlagUtils.java2
-rw-r--r--core/java/android/view/GestureExclusionTracker.java125
-rw-r--r--core/java/android/view/IRecentsAnimationController.aidl4
-rw-r--r--core/java/android/view/IRecentsAnimationRunner.aidl2
-rw-r--r--core/java/android/view/IRemoteAnimationFinishedCallback.aidl1
-rw-r--r--core/java/android/view/IRemoteAnimationRunner.aidl2
-rw-r--r--core/java/android/view/IWindowManager.aidl27
-rw-r--r--core/java/android/view/IWindowSession.aidl9
-rw-r--r--core/java/android/view/RenderNodeAnimator.java1
-rw-r--r--core/java/android/view/SurfaceControl.java11
-rw-r--r--core/java/android/view/SurfaceView.java2
-rw-r--r--core/java/android/view/View.java125
-rw-r--r--core/java/android/view/ViewRootImpl.java82
-rw-r--r--core/java/android/view/ViewTreeObserver.java55
-rw-r--r--core/java/android/view/accessibility/AccessibilityCache.java14
-rw-r--r--core/java/android/view/animation/Animation.java26
-rw-r--r--core/java/android/view/contentcapture/ContentCaptureContext.java4
-rw-r--r--core/java/android/view/contentcapture/ContentCaptureEvent.java2
-rw-r--r--core/java/android/view/contentcapture/ContentCaptureSession.java1
-rw-r--r--core/java/android/view/contentcapture/ContentCaptureSessionId.java2
-rw-r--r--core/java/android/view/contentcapture/UserDataRemovalRequest.java3
-rw-r--r--core/java/android/webkit/IWebViewUpdateService.aidl3
-rw-r--r--core/java/android/webkit/WebViewProvider.java2
-rw-r--r--core/java/android/widget/ZoomControls.java6
-rw-r--r--core/java/com/android/internal/app/IAppOpsService.aidl5
-rw-r--r--core/java/com/android/internal/app/IBatteryStats.aidl4
-rw-r--r--core/java/com/android/internal/app/IVoiceInteractionManagerService.aidl1
-rw-r--r--core/java/com/android/internal/appwidget/IAppWidgetService.aidl4
-rw-r--r--core/java/com/android/internal/config/sysui/SystemUiDeviceConfigFlags.java8
-rw-r--r--core/java/com/android/internal/os/IDropBoxManagerService.aidl1
-rw-r--r--core/java/com/android/internal/policy/IKeyguardService.aidl2
-rw-r--r--core/java/com/android/internal/statusbar/IStatusBarService.aidl6
-rw-r--r--core/java/com/android/internal/widget/ILockSettings.aidl8
-rw-r--r--core/java/com/android/internal/widget/IRemoteViewsFactory.aidl8
-rw-r--r--core/jni/Android.bp2
-rw-r--r--core/jni/AndroidRuntime.cpp4
-rw-r--r--core/jni/android_media_AudioProductStrategies.cpp8
-rw-r--r--core/jni/android_media_AudioSystem.cpp79
-rw-r--r--core/jni/android_media_AudioVolumeGroupCallback.cpp175
-rw-r--r--core/jni/android_media_AudioVolumeGroupCallback.h44
-rw-r--r--core/jni/android_media_AudioVolumeGroups.cpp183
-rw-r--r--core/jni/android_view_InputEventReceiver.cpp3
-rw-r--r--core/jni/android_view_InputEventSender.cpp62
-rw-r--r--core/jni/android_view_Surface.cpp126
-rw-r--r--core/jni/android_view_SurfaceControl.cpp25
-rw-r--r--core/jni/include/android_runtime/android_view_Surface.h36
-rw-r--r--core/proto/android/server/activitymanagerservice.proto1
-rw-r--r--core/res/res/anim-ldrtl/cross_profile_apps_thumbnail_enter.xml4
-rw-r--r--core/res/res/anim-ldrtl/task_close_enter.xml1
-rw-r--r--core/res/res/anim-ldrtl/task_close_exit.xml1
-rw-r--r--core/res/res/anim-ldrtl/task_open_enter.xml1
-rw-r--r--core/res/res/anim-ldrtl/task_open_enter_cross_profile_apps.xml1
-rw-r--r--core/res/res/anim-ldrtl/task_open_exit.xml1
-rw-r--r--core/res/res/anim/cross_profile_apps_thumbnail_enter.xml4
-rw-r--r--core/res/res/anim/task_close_enter.xml1
-rw-r--r--core/res/res/anim/task_close_exit.xml1
-rw-r--r--core/res/res/anim/task_open_enter.xml1
-rw-r--r--core/res/res/anim/task_open_enter_cross_profile_apps.xml1
-rw-r--r--core/res/res/anim/task_open_exit.xml1
-rw-r--r--core/res/res/values/attrs.xml3
-rw-r--r--core/res/res/values/attrs_manifest.xml3
-rw-r--r--core/res/res/values/colors_device_defaults.xml2
-rw-r--r--core/res/res/values/config.xml4
-rw-r--r--core/res/res/values/public.xml1
-rw-r--r--core/res/res/values/themes_device_defaults.xml2
-rw-r--r--core/tests/coretests/src/android/provider/DeviceConfigTest.java125
-rw-r--r--core/tests/coretests/src/android/view/accessibility/AccessibilityCacheTest.java20
-rw-r--r--graphics/java/android/graphics/Bitmap.java1
-rw-r--r--graphics/java/android/graphics/RenderNode.java67
-rw-r--r--keystore/java/android/security/Credentials.java2
-rw-r--r--keystore/java/android/security/IKeyChainService.aidl1
-rw-r--r--libs/androidfw/AssetManager2.cpp9
-rw-r--r--libs/hwui/renderthread/VulkanManager.cpp30
-rw-r--r--location/java/android/location/IGeocodeProvider.aidl2
-rw-r--r--location/java/android/location/IGeofenceProvider.aidl1
-rw-r--r--location/java/android/location/ILocationListener.aidl4
-rw-r--r--location/java/android/location/ILocationManager.aidl1
-rw-r--r--location/java/android/location/INetInitiatedListener.aidl1
-rw-r--r--location/java/com/android/internal/location/ILocationProvider.aidl2
-rw-r--r--location/java/com/android/internal/location/ILocationProviderManager.aidl3
-rw-r--r--media/java/android/media/AudioManager.java151
-rw-r--r--media/java/android/media/AudioPlaybackCaptureConfiguration.java2
-rw-r--r--media/java/android/media/AudioPresentation.java41
-rw-r--r--media/java/android/media/AudioRecord.java9
-rw-r--r--media/java/android/media/AudioSystem.java35
-rw-r--r--media/java/android/media/IAudioFocusDispatcher.aidl1
-rw-r--r--media/java/android/media/IAudioService.aidl15
-rw-r--r--media/java/android/media/IMediaScannerService.aidl2
-rw-r--r--media/java/android/media/IRemoteDisplayCallback.aidl1
-rw-r--r--media/java/android/media/MediaHTTPConnection.java21
-rw-r--r--media/java/android/media/audiopolicy/AudioProductStrategies.java60
-rw-r--r--media/java/android/media/audiopolicy/AudioProductStrategy.java43
-rw-r--r--media/java/android/media/audiopolicy/AudioVolumeGroup.aidl18
-rw-r--r--media/java/android/media/audiopolicy/AudioVolumeGroup.java171
-rw-r--r--media/java/android/media/audiopolicy/AudioVolumeGroupChangeHandler.java167
-rw-r--r--media/java/android/media/audiopolicy/AudioVolumeGroups.aidl18
-rw-r--r--media/java/android/media/audiopolicy/AudioVolumeGroups.java135
-rw-r--r--media/java/android/media/projection/IMediaProjectionManager.aidl1
-rw-r--r--media/java/android/media/projection/MediaProjection.java11
-rw-r--r--media/java/android/media/tv/ITvRemoteServiceInput.aidl9
-rw-r--r--media/jni/android_media_ImageWriter.cpp131
-rw-r--r--packages/CaptivePortalLogin/AndroidManifest.xml4
-rw-r--r--packages/CarSystemUI/res/drawable/car_ic_selection_bg.xml2
-rw-r--r--packages/CarSystemUI/src/com/android/systemui/statusbar/car/CarStatusBar.java6
-rw-r--r--packages/NetworkStack/AndroidManifest.xml4
-rw-r--r--packages/NetworkStackPermissionStub/AndroidManifest.xml4
-rw-r--r--packages/SettingsLib/src/com/android/settingslib/graph/ThemedBatteryDrawable.kt44
-rw-r--r--packages/SettingsProvider/res/values/defaults.xml4
-rw-r--r--packages/SettingsProvider/src/com/android/providers/settings/DatabaseHelper.java3
-rw-r--r--packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java32
-rw-r--r--packages/SystemUI/plugin/src/com/android/systemui/plugins/ClockPlugin.java36
-rw-r--r--packages/SystemUI/res-keyguard/drawable/bubble_hour_hand.xml10
-rw-r--r--packages/SystemUI/res-keyguard/drawable/bubble_minute_hand.xml14
-rw-r--r--packages/SystemUI/res-keyguard/layout/bubble_clock.xml8
-rw-r--r--packages/SystemUI/res-keyguard/layout/default_clock_preview.xml30
-rw-r--r--packages/SystemUI/res/layout/notification_info.xml5
-rw-r--r--packages/SystemUI/res/values/strings.xml4
-rw-r--r--packages/SystemUI/shared/src/com/android/systemui/shared/system/TaskStackChangeListener.java15
-rw-r--r--packages/SystemUI/shared/src/com/android/systemui/shared/system/TaskStackChangeListeners.java16
-rw-r--r--packages/SystemUI/src/com/android/keyguard/KeyguardClockSwitch.java2
-rw-r--r--packages/SystemUI/src/com/android/keyguard/clock/BubbleClockController.java57
-rw-r--r--packages/SystemUI/src/com/android/keyguard/clock/ClockManager.java205
-rw-r--r--packages/SystemUI/src/com/android/keyguard/clock/DefaultClockController.java131
-rw-r--r--packages/SystemUI/src/com/android/keyguard/clock/StretchAnalogClockController.java51
-rw-r--r--packages/SystemUI/src/com/android/keyguard/clock/TypeClockController.java51
-rw-r--r--packages/SystemUI/src/com/android/systemui/HardwareUiLayout.java22
-rw-r--r--packages/SystemUI/src/com/android/systemui/bubbles/BubbleTouchHandler.java28
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/NotificationMediaManager.java28
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ExpandableNotificationRow.java7
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationContentInflater.java49
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationContentView.java214
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/notification/row/wrapper/NotificationMediaTemplateViewWrapper.java9
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarIconControllerImpl.java7
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarIconList.java19
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/policy/InflatedSmartReplies.java225
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/policy/SmartReplyView.java90
-rw-r--r--packages/SystemUI/tests/src/com/android/keyguard/clock/BubbleClockControllerTest.java4
-rw-r--r--packages/SystemUI/tests/src/com/android/keyguard/clock/ClockManagerTest.java5
-rw-r--r--packages/SystemUI/tests/src/com/android/keyguard/clock/StretchAnalogClockControllerTest.java4
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationContentViewTest.java240
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/InflatedSmartRepliesTest.java279
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/SmartReplyViewTest.java28
-rw-r--r--proto/src/wifi.proto42
-rw-r--r--services/autofill/java/com/android/server/autofill/Session.java2
-rw-r--r--services/contentsuggestions/java/com/android/server/contentsuggestions/ContentSuggestionsPerUserService.java16
-rw-r--r--services/core/java/com/android/server/ConnectivityService.java68
-rw-r--r--services/core/java/com/android/server/ExtconUEventObserver.java11
-rw-r--r--services/core/java/com/android/server/LocationManagerService.java138
-rw-r--r--services/core/java/com/android/server/StorageManagerService.java63
-rw-r--r--services/core/java/com/android/server/TelephonyRegistry.java4
-rw-r--r--services/core/java/com/android/server/am/ActiveServices.java21
-rw-r--r--services/core/java/com/android/server/am/ActivityManagerConstants.java12
-rw-r--r--services/core/java/com/android/server/am/ActivityManagerService.java7
-rw-r--r--services/core/java/com/android/server/am/AppCompactor.java37
-rw-r--r--services/core/java/com/android/server/audio/AudioService.java70
-rw-r--r--services/core/java/com/android/server/biometrics/ClientMonitor.java1
-rw-r--r--services/core/java/com/android/server/connectivity/Nat464Xlat.java239
-rw-r--r--services/core/java/com/android/server/connectivity/NetworkAgentInfo.java33
-rw-r--r--services/core/java/com/android/server/content/SyncManager.java13
-rw-r--r--services/core/java/com/android/server/display/AutomaticBrightnessController.java10
-rw-r--r--services/core/java/com/android/server/display/DisplayPowerController.java8
-rw-r--r--services/core/java/com/android/server/location/GnssLocationProvider.java24
-rw-r--r--services/core/java/com/android/server/media/projection/MediaProjectionManagerService.java10
-rw-r--r--services/core/java/com/android/server/net/NetworkStatsService.java46
-rw-r--r--services/core/java/com/android/server/pm/DynamicCodeLoggingService.java2
-rw-r--r--services/core/java/com/android/server/pm/PackageManagerService.java31
-rw-r--r--services/core/java/com/android/server/pm/Settings.java1
-rw-r--r--services/core/java/com/android/server/power/AttentionDetector.java28
-rw-r--r--services/core/java/com/android/server/power/PowerManagerService.java22
-rw-r--r--services/core/java/com/android/server/power/WirelessChargerDetector.java5
-rw-r--r--services/core/java/com/android/server/role/RoleManagerService.java19
-rw-r--r--services/core/java/com/android/server/rollback/AppDataRollbackHelper.java6
-rw-r--r--services/core/java/com/android/server/rollback/RollbackData.java51
-rw-r--r--services/core/java/com/android/server/rollback/RollbackManagerServiceImpl.java89
-rw-r--r--services/core/java/com/android/server/rollback/RollbackStore.java104
-rw-r--r--services/core/java/com/android/server/wm/ActivityRecord.java15
-rw-r--r--services/core/java/com/android/server/wm/ActivityStack.java3
-rw-r--r--services/core/java/com/android/server/wm/ActivityStackSupervisor.java102
-rw-r--r--services/core/java/com/android/server/wm/ActivityTaskManagerService.java9
-rw-r--r--services/core/java/com/android/server/wm/AppWindowThumbnail.java3
-rw-r--r--services/core/java/com/android/server/wm/AppWindowToken.java25
-rw-r--r--services/core/java/com/android/server/wm/KeyguardController.java21
-rw-r--r--services/core/java/com/android/server/wm/RootActivityContainer.java25
-rw-r--r--services/core/java/com/android/server/wm/Task.java2
-rw-r--r--services/core/java/com/android/server/wm/TaskChangeNotificationController.java17
-rw-r--r--services/core/java/com/android/server/wm/WindowAnimationSpec.java17
-rw-r--r--services/core/java/com/android/server/wm/WindowManagerService.java19
-rw-r--r--services/core/java/com/android/server/wm/WindowState.java3
-rw-r--r--services/core/jni/com_android_server_location_GnssLocationProvider.cpp14
-rw-r--r--services/java/com/android/server/SystemServer.java1
-rw-r--r--services/tests/mockingservicestests/src/com/android/server/am/AppCompactorTest.java125
-rw-r--r--services/tests/servicestests/src/com/android/server/power/AttentionDetectorTest.java28
-rw-r--r--services/tests/servicestests/src/com/android/server/power/PowerManagerServiceTest.java319
-rw-r--r--services/tests/servicestests/src/com/android/server/rollback/AppDataRollbackHelperTest.java16
-rw-r--r--services/tests/wmtests/src/com/android/server/wm/AppWindowTokenTests.java47
-rw-r--r--services/tests/wmtests/src/com/android/server/wm/SurfaceAnimationRunnerTest.java3
-rw-r--r--services/tests/wmtests/src/com/android/server/wm/WindowAnimationSpecTest.java30
-rw-r--r--services/tests/wmtests/src/com/android/server/wm/WindowTestUtils.java2
-rw-r--r--services/usage/java/com/android/server/usage/AppStandbyController.java102
-rw-r--r--services/usage/java/com/android/server/usage/UsageStatsService.java4
-rw-r--r--telecomm/java/android/telecom/ConnectionRequest.java26
-rw-r--r--telecomm/java/com/android/internal/telecom/ITelecomService.aidl1
-rw-r--r--telephony/java/android/provider/Telephony.java2
-rw-r--r--telephony/java/android/telephony/CellIdentityNr.java3
-rw-r--r--telephony/java/android/telephony/CellInfo.java5
-rw-r--r--telephony/java/android/telephony/PhoneStateListener.java2
-rw-r--r--telephony/java/android/telephony/PreciseDataConnectionState.java4
-rw-r--r--telephony/java/android/telephony/SubscriptionManager.java44
-rw-r--r--telephony/java/android/telephony/TelephonyManager.java1
-rw-r--r--telephony/java/android/telephony/UiccCardInfo.java9
-rw-r--r--telephony/java/android/telephony/ims/ImsConferenceState.java15
-rw-r--r--telephony/java/android/telephony/ims/ImsMmTelManager.java34
-rwxr-xr-xtelephony/java/android/telephony/mbms/vendor/IMbmsStreamingService.aidl4
-rw-r--r--telephony/java/com/android/ims/ImsConfigListener.aidl1
-rw-r--r--telephony/java/com/android/ims/internal/IImsCallSessionListener.aidl22
-rw-r--r--telephony/java/com/android/ims/internal/IImsRegistrationListener.aidl8
-rw-r--r--telephony/java/com/android/ims/internal/IImsUtListener.aidl7
-rw-r--r--telephony/java/com/android/ims/internal/IImsVideoCallCallback.aidl7
-rw-r--r--telephony/java/com/android/ims/internal/IImsVideoCallProvider.aidl1
-rw-r--r--telephony/java/com/android/ims/internal/uce/options/IOptionsListener.aidl6
-rw-r--r--telephony/java/com/android/ims/internal/uce/options/IOptionsService.aidl8
-rw-r--r--telephony/java/com/android/ims/internal/uce/presence/IPresenceListener.aidl9
-rw-r--r--telephony/java/com/android/ims/internal/uce/presence/IPresenceService.aidl8
-rw-r--r--telephony/java/com/android/ims/internal/uce/uceservice/IUceListener.aidl1
-rw-r--r--telephony/java/com/android/ims/internal/uce/uceservice/IUceService.aidl10
-rw-r--r--telephony/java/com/android/internal/telephony/ICarrierConfigLoader.aidl1
-rw-r--r--telephony/java/com/android/internal/telephony/IPhoneSubInfo.aidl2
-rw-r--r--telephony/java/com/android/internal/telephony/ITelephony.aidl30
-rw-r--r--telephony/java/com/android/internal/telephony/ITelephonyRegistry.aidl4
-rw-r--r--telephony/java/com/android/internal/telephony/IWapPushManager.aidl3
-rw-r--r--telephony/java/com/android/internal/telephony/RILConstants.java1
-rw-r--r--tests/DynamicCodeLoggerIntegrationTests/src/com/android/server/pm/dex/DynamicCodeLoggerIntegrationTests.java28
-rw-r--r--tests/HwAccelerationTest/src/com/android/test/hwui/PositionListenerActivity.java2
-rw-r--r--tests/net/java/com/android/server/ConnectivityServiceTest.java192
-rw-r--r--tests/net/java/com/android/server/connectivity/Nat464XlatTest.java195
-rw-r--r--tests/net/java/com/android/server/net/NetworkStatsServiceTest.java81
-rw-r--r--tools/apilint/apilint.py80
-rw-r--r--tools/apilint/apilint_test.py19
-rw-r--r--tools/bit/main.cpp136
-rw-r--r--tools/bit/make.cpp12
-rw-r--r--tools/bit/make.h2
-rw-r--r--tools/bit/util.cpp38
-rw-r--r--tools/bit/util.h5
-rw-r--r--wifi/java/android/net/wifi/IWifiManager.aidl3
-rw-r--r--wifi/java/android/net/wifi/WifiManager.java8
334 files changed, 7669 insertions, 2947 deletions
diff --git a/api/current.txt b/api/current.txt
index cb077aff6255..a888b08bc8e7 100644
--- a/api/current.txt
+++ b/api/current.txt
@@ -287,6 +287,7 @@ package android {
field public static final int alertDialogTheme = 16843529; // 0x1010309
field public static final int alignmentMode = 16843642; // 0x101037a
field public static final int allContactsName = 16843468; // 0x10102cc
+ field public static final int allowAudioPlaybackCapture = 16844199; // 0x10105a7
field public static final int allowBackup = 16843392; // 0x1010280
field public static final int allowClearUserData = 16842757; // 0x1010005
field public static final int allowEmbedded = 16843765; // 0x10103f5
@@ -4250,10 +4251,9 @@ package android.app {
public class AppComponentFactory {
ctor public AppComponentFactory();
- method public android.content.pm.ApplicationInfo getApplicationInfo();
method @NonNull public android.app.Activity instantiateActivity(@NonNull ClassLoader, @NonNull String, @Nullable android.content.Intent) throws java.lang.ClassNotFoundException, java.lang.IllegalAccessException, java.lang.InstantiationException;
method @NonNull public android.app.Application instantiateApplication(@NonNull ClassLoader, @NonNull String) throws java.lang.ClassNotFoundException, java.lang.IllegalAccessException, java.lang.InstantiationException;
- method @NonNull public ClassLoader instantiateClassLoader(@NonNull ClassLoader);
+ method @NonNull public ClassLoader instantiateClassLoader(@NonNull ClassLoader, @NonNull android.content.pm.ApplicationInfo);
method @NonNull public android.content.ContentProvider instantiateProvider(@NonNull ClassLoader, @NonNull String) throws java.lang.ClassNotFoundException, java.lang.IllegalAccessException, java.lang.InstantiationException;
method @NonNull public android.content.BroadcastReceiver instantiateReceiver(@NonNull ClassLoader, @NonNull String, @Nullable android.content.Intent) throws java.lang.ClassNotFoundException, java.lang.IllegalAccessException, java.lang.InstantiationException;
method @NonNull public android.app.Service instantiateService(@NonNull ClassLoader, @NonNull String, @Nullable android.content.Intent) throws java.lang.ClassNotFoundException, java.lang.IllegalAccessException, java.lang.InstantiationException;
@@ -5499,74 +5499,74 @@ package android.app {
ctor public Notification.Builder(android.content.Context, String);
ctor @Deprecated public Notification.Builder(android.content.Context);
method @Deprecated public android.app.Notification.Builder addAction(int, CharSequence, android.app.PendingIntent);
- method public android.app.Notification.Builder addAction(android.app.Notification.Action);
- method public android.app.Notification.Builder addExtras(android.os.Bundle);
+ method @NonNull public android.app.Notification.Builder addAction(android.app.Notification.Action);
+ method @NonNull public android.app.Notification.Builder addExtras(android.os.Bundle);
method @Deprecated public android.app.Notification.Builder addPerson(String);
- method public android.app.Notification.Builder addPerson(android.app.Person);
- method public android.app.Notification build();
+ method @NonNull public android.app.Notification.Builder addPerson(android.app.Person);
+ method @NonNull public android.app.Notification build();
method public android.widget.RemoteViews createBigContentView();
method public android.widget.RemoteViews createContentView();
method public android.widget.RemoteViews createHeadsUpContentView();
- method public android.app.Notification.Builder extend(android.app.Notification.Extender);
+ method @NonNull public android.app.Notification.Builder extend(android.app.Notification.Extender);
method public android.os.Bundle getExtras();
method @Deprecated public android.app.Notification getNotification();
method public android.app.Notification.Style getStyle();
- method public static android.app.Notification.Builder recoverBuilder(android.content.Context, android.app.Notification);
- method public android.app.Notification.Builder setActions(android.app.Notification.Action...);
- method public android.app.Notification.Builder setAllowSystemGeneratedContextualActions(boolean);
- method public android.app.Notification.Builder setAutoCancel(boolean);
- method public android.app.Notification.Builder setBadgeIconType(int);
- method public android.app.Notification.Builder setBubbleMetadata(android.app.Notification.BubbleMetadata);
- method public android.app.Notification.Builder setCategory(String);
- method public android.app.Notification.Builder setChannelId(String);
- method public android.app.Notification.Builder setChronometerCountDown(boolean);
- method public android.app.Notification.Builder setColor(@ColorInt int);
- method public android.app.Notification.Builder setColorized(boolean);
+ method @NonNull public static android.app.Notification.Builder recoverBuilder(android.content.Context, android.app.Notification);
+ method @NonNull public android.app.Notification.Builder setActions(android.app.Notification.Action...);
+ method @NonNull public android.app.Notification.Builder setAllowSystemGeneratedContextualActions(boolean);
+ method @NonNull public android.app.Notification.Builder setAutoCancel(boolean);
+ method @NonNull public android.app.Notification.Builder setBadgeIconType(int);
+ method @NonNull public android.app.Notification.Builder setBubbleMetadata(android.app.Notification.BubbleMetadata);
+ method @NonNull public android.app.Notification.Builder setCategory(String);
+ method @NonNull public android.app.Notification.Builder setChannelId(String);
+ method @NonNull public android.app.Notification.Builder setChronometerCountDown(boolean);
+ method @NonNull public android.app.Notification.Builder setColor(@ColorInt int);
+ method @NonNull public android.app.Notification.Builder setColorized(boolean);
method @Deprecated public android.app.Notification.Builder setContent(android.widget.RemoteViews);
method @Deprecated public android.app.Notification.Builder setContentInfo(CharSequence);
- method public android.app.Notification.Builder setContentIntent(android.app.PendingIntent);
- method public android.app.Notification.Builder setContentText(CharSequence);
- method public android.app.Notification.Builder setContentTitle(CharSequence);
- method public android.app.Notification.Builder setCustomBigContentView(android.widget.RemoteViews);
- method public android.app.Notification.Builder setCustomContentView(android.widget.RemoteViews);
- method public android.app.Notification.Builder setCustomHeadsUpContentView(android.widget.RemoteViews);
+ method @NonNull public android.app.Notification.Builder setContentIntent(android.app.PendingIntent);
+ method @NonNull public android.app.Notification.Builder setContentText(CharSequence);
+ method @NonNull public android.app.Notification.Builder setContentTitle(CharSequence);
+ method @NonNull public android.app.Notification.Builder setCustomBigContentView(android.widget.RemoteViews);
+ method @NonNull public android.app.Notification.Builder setCustomContentView(android.widget.RemoteViews);
+ method @NonNull public android.app.Notification.Builder setCustomHeadsUpContentView(android.widget.RemoteViews);
method @Deprecated public android.app.Notification.Builder setDefaults(int);
- method public android.app.Notification.Builder setDeleteIntent(android.app.PendingIntent);
- method public android.app.Notification.Builder setExtras(android.os.Bundle);
- method public android.app.Notification.Builder setFullScreenIntent(android.app.PendingIntent, boolean);
- method public android.app.Notification.Builder setGroup(String);
- method public android.app.Notification.Builder setGroupAlertBehavior(int);
- method public android.app.Notification.Builder setGroupSummary(boolean);
- method public android.app.Notification.Builder setLargeIcon(android.graphics.Bitmap);
- method public android.app.Notification.Builder setLargeIcon(android.graphics.drawable.Icon);
+ method @NonNull public android.app.Notification.Builder setDeleteIntent(android.app.PendingIntent);
+ method @NonNull public android.app.Notification.Builder setExtras(android.os.Bundle);
+ method @NonNull public android.app.Notification.Builder setFullScreenIntent(android.app.PendingIntent, boolean);
+ method @NonNull public android.app.Notification.Builder setGroup(String);
+ method @NonNull public android.app.Notification.Builder setGroupAlertBehavior(int);
+ method @NonNull public android.app.Notification.Builder setGroupSummary(boolean);
+ method @NonNull public android.app.Notification.Builder setLargeIcon(android.graphics.Bitmap);
+ method @NonNull public android.app.Notification.Builder setLargeIcon(android.graphics.drawable.Icon);
method @Deprecated public android.app.Notification.Builder setLights(@ColorInt int, int, int);
- method public android.app.Notification.Builder setLocalOnly(boolean);
- method public android.app.Notification.Builder setNumber(int);
- method public android.app.Notification.Builder setOngoing(boolean);
- method public android.app.Notification.Builder setOnlyAlertOnce(boolean);
+ method @NonNull public android.app.Notification.Builder setLocalOnly(boolean);
+ method @NonNull public android.app.Notification.Builder setNumber(int);
+ method @NonNull public android.app.Notification.Builder setOngoing(boolean);
+ method @NonNull public android.app.Notification.Builder setOnlyAlertOnce(boolean);
method @Deprecated public android.app.Notification.Builder setPriority(int);
- method public android.app.Notification.Builder setProgress(int, int, boolean);
- method public android.app.Notification.Builder setPublicVersion(android.app.Notification);
- method public android.app.Notification.Builder setRemoteInputHistory(CharSequence[]);
- method public android.app.Notification.Builder setSettingsText(CharSequence);
- method public android.app.Notification.Builder setShortcutId(String);
- method public android.app.Notification.Builder setShowWhen(boolean);
- method public android.app.Notification.Builder setSmallIcon(@DrawableRes int);
- method public android.app.Notification.Builder setSmallIcon(@DrawableRes int, int);
- method public android.app.Notification.Builder setSmallIcon(android.graphics.drawable.Icon);
- method public android.app.Notification.Builder setSortKey(String);
+ method @NonNull public android.app.Notification.Builder setProgress(int, int, boolean);
+ method @NonNull public android.app.Notification.Builder setPublicVersion(android.app.Notification);
+ method @NonNull public android.app.Notification.Builder setRemoteInputHistory(CharSequence[]);
+ method @NonNull public android.app.Notification.Builder setSettingsText(CharSequence);
+ method @NonNull public android.app.Notification.Builder setShortcutId(String);
+ method @NonNull public android.app.Notification.Builder setShowWhen(boolean);
+ method @NonNull public android.app.Notification.Builder setSmallIcon(@DrawableRes int);
+ method @NonNull public android.app.Notification.Builder setSmallIcon(@DrawableRes int, int);
+ method @NonNull public android.app.Notification.Builder setSmallIcon(android.graphics.drawable.Icon);
+ method @NonNull public android.app.Notification.Builder setSortKey(String);
method @Deprecated public android.app.Notification.Builder setSound(android.net.Uri);
method @Deprecated public android.app.Notification.Builder setSound(android.net.Uri, int);
method @Deprecated public android.app.Notification.Builder setSound(android.net.Uri, android.media.AudioAttributes);
- method public android.app.Notification.Builder setStyle(android.app.Notification.Style);
- method public android.app.Notification.Builder setSubText(CharSequence);
- method public android.app.Notification.Builder setTicker(CharSequence);
+ method @NonNull public android.app.Notification.Builder setStyle(android.app.Notification.Style);
+ method @NonNull public android.app.Notification.Builder setSubText(CharSequence);
+ method @NonNull public android.app.Notification.Builder setTicker(CharSequence);
method @Deprecated public android.app.Notification.Builder setTicker(CharSequence, android.widget.RemoteViews);
- method public android.app.Notification.Builder setTimeoutAfter(long);
- method public android.app.Notification.Builder setUsesChronometer(boolean);
+ method @NonNull public android.app.Notification.Builder setTimeoutAfter(long);
+ method @NonNull public android.app.Notification.Builder setUsesChronometer(boolean);
method @Deprecated public android.app.Notification.Builder setVibrate(long[]);
- method public android.app.Notification.Builder setVisibility(int);
- method public android.app.Notification.Builder setWhen(long);
+ method @NonNull public android.app.Notification.Builder setVisibility(int);
+ method @NonNull public android.app.Notification.Builder setWhen(long);
}
public static final class Notification.CarExtender implements android.app.Notification.Extender {
@@ -6171,6 +6171,7 @@ package android.app {
ctor public Service();
method protected void dump(java.io.FileDescriptor, java.io.PrintWriter, String[]);
method public final android.app.Application getApplication();
+ method public final int getForegroundServiceType();
method @Nullable public abstract android.os.IBinder onBind(android.content.Intent);
method public void onConfigurationChanged(android.content.res.Configuration);
method public void onCreate();
@@ -12512,7 +12513,7 @@ package android.database {
method public int getInt(int);
method public long getLong(int);
method public android.net.Uri getNotificationUri();
- method public default java.util.List<android.net.Uri> getNotificationUris();
+ method @Nullable public default java.util.List<android.net.Uri> getNotificationUris();
method public int getPosition();
method public short getShort(int);
method public String getString(int);
@@ -13553,7 +13554,7 @@ package android.graphics {
method @CheckResult public android.graphics.Bitmap extractAlpha(android.graphics.Paint, int[]);
method public int getAllocationByteCount();
method public int getByteCount();
- method public android.graphics.Color getColor(int, int);
+ method @NonNull public android.graphics.Color getColor(int, int);
method @Nullable public android.graphics.ColorSpace getColorSpace();
method public android.graphics.Bitmap.Config getConfig();
method public int getDensity();
@@ -16557,13 +16558,13 @@ package android.hardware.biometrics {
public static class BiometricPrompt.Builder {
ctor public BiometricPrompt.Builder(android.content.Context);
- method public android.hardware.biometrics.BiometricPrompt build();
- method public android.hardware.biometrics.BiometricPrompt.Builder setAllowDeviceCredential(boolean);
- method public android.hardware.biometrics.BiometricPrompt.Builder setDescription(@NonNull CharSequence);
- method public android.hardware.biometrics.BiometricPrompt.Builder setNegativeButton(@NonNull CharSequence, @NonNull java.util.concurrent.Executor, @NonNull android.content.DialogInterface.OnClickListener);
- method public android.hardware.biometrics.BiometricPrompt.Builder setRequireConfirmation(boolean);
- method public android.hardware.biometrics.BiometricPrompt.Builder setSubtitle(@NonNull CharSequence);
- method public android.hardware.biometrics.BiometricPrompt.Builder setTitle(@NonNull CharSequence);
+ method @NonNull public android.hardware.biometrics.BiometricPrompt build();
+ method @NonNull public android.hardware.biometrics.BiometricPrompt.Builder setAllowDeviceCredential(boolean);
+ method @NonNull public android.hardware.biometrics.BiometricPrompt.Builder setDescription(@NonNull CharSequence);
+ method @NonNull public android.hardware.biometrics.BiometricPrompt.Builder setNegativeButton(@NonNull CharSequence, @NonNull java.util.concurrent.Executor, @NonNull android.content.DialogInterface.OnClickListener);
+ method @NonNull public android.hardware.biometrics.BiometricPrompt.Builder setRequireConfirmation(boolean);
+ method @NonNull public android.hardware.biometrics.BiometricPrompt.Builder setSubtitle(@NonNull CharSequence);
+ method @NonNull public android.hardware.biometrics.BiometricPrompt.Builder setTitle(@NonNull CharSequence);
}
public static final class BiometricPrompt.CryptoObject {
@@ -16645,93 +16646,93 @@ package android.hardware.camera2 {
method public java.util.List<android.hardware.camera2.CameraCharacteristics.Key<?>> getKeysNeedingPermission();
method @NonNull public java.util.Set<java.lang.String> getPhysicalCameraIds();
method @Nullable public android.hardware.camera2.params.RecommendedStreamConfigurationMap getRecommendedStreamConfigurationMap(int);
- field public static final android.hardware.camera2.CameraCharacteristics.Key<int[]> COLOR_CORRECTION_AVAILABLE_ABERRATION_MODES;
- field public static final android.hardware.camera2.CameraCharacteristics.Key<int[]> CONTROL_AE_AVAILABLE_ANTIBANDING_MODES;
- field public static final android.hardware.camera2.CameraCharacteristics.Key<int[]> CONTROL_AE_AVAILABLE_MODES;
- field public static final android.hardware.camera2.CameraCharacteristics.Key<android.util.Range<java.lang.Integer>[]> CONTROL_AE_AVAILABLE_TARGET_FPS_RANGES;
- field public static final android.hardware.camera2.CameraCharacteristics.Key<android.util.Range<java.lang.Integer>> CONTROL_AE_COMPENSATION_RANGE;
- field public static final android.hardware.camera2.CameraCharacteristics.Key<android.util.Rational> CONTROL_AE_COMPENSATION_STEP;
- field public static final android.hardware.camera2.CameraCharacteristics.Key<java.lang.Boolean> CONTROL_AE_LOCK_AVAILABLE;
- field public static final android.hardware.camera2.CameraCharacteristics.Key<int[]> CONTROL_AF_AVAILABLE_MODES;
- field public static final android.hardware.camera2.CameraCharacteristics.Key<int[]> CONTROL_AVAILABLE_EFFECTS;
- field public static final android.hardware.camera2.CameraCharacteristics.Key<int[]> CONTROL_AVAILABLE_MODES;
- field public static final android.hardware.camera2.CameraCharacteristics.Key<int[]> CONTROL_AVAILABLE_SCENE_MODES;
- field public static final android.hardware.camera2.CameraCharacteristics.Key<int[]> CONTROL_AVAILABLE_VIDEO_STABILIZATION_MODES;
- field public static final android.hardware.camera2.CameraCharacteristics.Key<int[]> CONTROL_AWB_AVAILABLE_MODES;
- field public static final android.hardware.camera2.CameraCharacteristics.Key<java.lang.Boolean> CONTROL_AWB_LOCK_AVAILABLE;
- field public static final android.hardware.camera2.CameraCharacteristics.Key<java.lang.Integer> CONTROL_MAX_REGIONS_AE;
- field public static final android.hardware.camera2.CameraCharacteristics.Key<java.lang.Integer> CONTROL_MAX_REGIONS_AF;
- field public static final android.hardware.camera2.CameraCharacteristics.Key<java.lang.Integer> CONTROL_MAX_REGIONS_AWB;
- field public static final android.hardware.camera2.CameraCharacteristics.Key<android.util.Range<java.lang.Integer>> CONTROL_POST_RAW_SENSITIVITY_BOOST_RANGE;
- field public static final android.hardware.camera2.CameraCharacteristics.Key<java.lang.Boolean> DEPTH_DEPTH_IS_EXCLUSIVE;
- field public static final android.hardware.camera2.CameraCharacteristics.Key<int[]> DISTORTION_CORRECTION_AVAILABLE_MODES;
- field public static final android.hardware.camera2.CameraCharacteristics.Key<int[]> EDGE_AVAILABLE_EDGE_MODES;
- field public static final android.hardware.camera2.CameraCharacteristics.Key<java.lang.Boolean> FLASH_INFO_AVAILABLE;
- field public static final android.hardware.camera2.CameraCharacteristics.Key<int[]> HOT_PIXEL_AVAILABLE_HOT_PIXEL_MODES;
- field public static final android.hardware.camera2.CameraCharacteristics.Key<java.lang.Integer> INFO_SUPPORTED_HARDWARE_LEVEL;
- field public static final android.hardware.camera2.CameraCharacteristics.Key<java.lang.String> INFO_VERSION;
- field public static final android.hardware.camera2.CameraCharacteristics.Key<android.util.Size[]> JPEG_AVAILABLE_THUMBNAIL_SIZES;
- field public static final android.hardware.camera2.CameraCharacteristics.Key<float[]> LENS_DISTORTION;
- field public static final android.hardware.camera2.CameraCharacteristics.Key<java.lang.Integer> LENS_FACING;
- field public static final android.hardware.camera2.CameraCharacteristics.Key<float[]> LENS_INFO_AVAILABLE_APERTURES;
- field public static final android.hardware.camera2.CameraCharacteristics.Key<float[]> LENS_INFO_AVAILABLE_FILTER_DENSITIES;
- field public static final android.hardware.camera2.CameraCharacteristics.Key<float[]> LENS_INFO_AVAILABLE_FOCAL_LENGTHS;
- field public static final android.hardware.camera2.CameraCharacteristics.Key<int[]> LENS_INFO_AVAILABLE_OPTICAL_STABILIZATION;
- field public static final android.hardware.camera2.CameraCharacteristics.Key<java.lang.Integer> LENS_INFO_FOCUS_DISTANCE_CALIBRATION;
- field public static final android.hardware.camera2.CameraCharacteristics.Key<java.lang.Float> LENS_INFO_HYPERFOCAL_DISTANCE;
- field public static final android.hardware.camera2.CameraCharacteristics.Key<java.lang.Float> LENS_INFO_MINIMUM_FOCUS_DISTANCE;
- field public static final android.hardware.camera2.CameraCharacteristics.Key<float[]> LENS_INTRINSIC_CALIBRATION;
- field public static final android.hardware.camera2.CameraCharacteristics.Key<java.lang.Integer> LENS_POSE_REFERENCE;
- field public static final android.hardware.camera2.CameraCharacteristics.Key<float[]> LENS_POSE_ROTATION;
- field public static final android.hardware.camera2.CameraCharacteristics.Key<float[]> LENS_POSE_TRANSLATION;
- field @Deprecated public static final android.hardware.camera2.CameraCharacteristics.Key<float[]> LENS_RADIAL_DISTORTION;
- field public static final android.hardware.camera2.CameraCharacteristics.Key<java.lang.Integer> LOGICAL_MULTI_CAMERA_SENSOR_SYNC_TYPE;
- field public static final android.hardware.camera2.CameraCharacteristics.Key<int[]> NOISE_REDUCTION_AVAILABLE_NOISE_REDUCTION_MODES;
- field public static final android.hardware.camera2.CameraCharacteristics.Key<java.lang.Integer> REPROCESS_MAX_CAPTURE_STALL;
- field public static final android.hardware.camera2.CameraCharacteristics.Key<int[]> REQUEST_AVAILABLE_CAPABILITIES;
- field public static final android.hardware.camera2.CameraCharacteristics.Key<java.lang.Integer> REQUEST_MAX_NUM_INPUT_STREAMS;
- field public static final android.hardware.camera2.CameraCharacteristics.Key<java.lang.Integer> REQUEST_MAX_NUM_OUTPUT_PROC;
- field public static final android.hardware.camera2.CameraCharacteristics.Key<java.lang.Integer> REQUEST_MAX_NUM_OUTPUT_PROC_STALLING;
- field public static final android.hardware.camera2.CameraCharacteristics.Key<java.lang.Integer> REQUEST_MAX_NUM_OUTPUT_RAW;
- field public static final android.hardware.camera2.CameraCharacteristics.Key<java.lang.Integer> REQUEST_PARTIAL_RESULT_COUNT;
- field public static final android.hardware.camera2.CameraCharacteristics.Key<java.lang.Byte> REQUEST_PIPELINE_MAX_DEPTH;
- field public static final android.hardware.camera2.CameraCharacteristics.Key<java.lang.Float> SCALER_AVAILABLE_MAX_DIGITAL_ZOOM;
- field public static final android.hardware.camera2.CameraCharacteristics.Key<java.lang.Integer> SCALER_CROPPING_TYPE;
- field public static final android.hardware.camera2.CameraCharacteristics.Key<android.hardware.camera2.params.MandatoryStreamCombination[]> SCALER_MANDATORY_STREAM_COMBINATIONS;
- field public static final android.hardware.camera2.CameraCharacteristics.Key<android.hardware.camera2.params.StreamConfigurationMap> SCALER_STREAM_CONFIGURATION_MAP;
- field public static final android.hardware.camera2.CameraCharacteristics.Key<int[]> SENSOR_AVAILABLE_TEST_PATTERN_MODES;
- field public static final android.hardware.camera2.CameraCharacteristics.Key<android.hardware.camera2.params.BlackLevelPattern> SENSOR_BLACK_LEVEL_PATTERN;
- field public static final android.hardware.camera2.CameraCharacteristics.Key<android.hardware.camera2.params.ColorSpaceTransform> SENSOR_CALIBRATION_TRANSFORM1;
- field public static final android.hardware.camera2.CameraCharacteristics.Key<android.hardware.camera2.params.ColorSpaceTransform> SENSOR_CALIBRATION_TRANSFORM2;
- field public static final android.hardware.camera2.CameraCharacteristics.Key<android.hardware.camera2.params.ColorSpaceTransform> SENSOR_COLOR_TRANSFORM1;
- field public static final android.hardware.camera2.CameraCharacteristics.Key<android.hardware.camera2.params.ColorSpaceTransform> SENSOR_COLOR_TRANSFORM2;
- field public static final android.hardware.camera2.CameraCharacteristics.Key<android.hardware.camera2.params.ColorSpaceTransform> SENSOR_FORWARD_MATRIX1;
- field public static final android.hardware.camera2.CameraCharacteristics.Key<android.hardware.camera2.params.ColorSpaceTransform> SENSOR_FORWARD_MATRIX2;
- field public static final android.hardware.camera2.CameraCharacteristics.Key<android.graphics.Rect> SENSOR_INFO_ACTIVE_ARRAY_SIZE;
- field public static final android.hardware.camera2.CameraCharacteristics.Key<java.lang.Integer> SENSOR_INFO_COLOR_FILTER_ARRANGEMENT;
- field public static final android.hardware.camera2.CameraCharacteristics.Key<android.util.Range<java.lang.Long>> SENSOR_INFO_EXPOSURE_TIME_RANGE;
- field public static final android.hardware.camera2.CameraCharacteristics.Key<java.lang.Boolean> SENSOR_INFO_LENS_SHADING_APPLIED;
- field public static final android.hardware.camera2.CameraCharacteristics.Key<java.lang.Long> SENSOR_INFO_MAX_FRAME_DURATION;
- field public static final android.hardware.camera2.CameraCharacteristics.Key<android.util.SizeF> SENSOR_INFO_PHYSICAL_SIZE;
- field public static final android.hardware.camera2.CameraCharacteristics.Key<android.util.Size> SENSOR_INFO_PIXEL_ARRAY_SIZE;
- field public static final android.hardware.camera2.CameraCharacteristics.Key<android.graphics.Rect> SENSOR_INFO_PRE_CORRECTION_ACTIVE_ARRAY_SIZE;
- field public static final android.hardware.camera2.CameraCharacteristics.Key<android.util.Range<java.lang.Integer>> SENSOR_INFO_SENSITIVITY_RANGE;
- field public static final android.hardware.camera2.CameraCharacteristics.Key<java.lang.Integer> SENSOR_INFO_TIMESTAMP_SOURCE;
- field public static final android.hardware.camera2.CameraCharacteristics.Key<java.lang.Integer> SENSOR_INFO_WHITE_LEVEL;
- field public static final android.hardware.camera2.CameraCharacteristics.Key<java.lang.Integer> SENSOR_MAX_ANALOG_SENSITIVITY;
- field public static final android.hardware.camera2.CameraCharacteristics.Key<android.graphics.Rect[]> SENSOR_OPTICAL_BLACK_REGIONS;
- field public static final android.hardware.camera2.CameraCharacteristics.Key<java.lang.Integer> SENSOR_ORIENTATION;
- field public static final android.hardware.camera2.CameraCharacteristics.Key<java.lang.Integer> SENSOR_REFERENCE_ILLUMINANT1;
- field public static final android.hardware.camera2.CameraCharacteristics.Key<java.lang.Byte> SENSOR_REFERENCE_ILLUMINANT2;
- field public static final android.hardware.camera2.CameraCharacteristics.Key<int[]> SHADING_AVAILABLE_MODES;
- field public static final android.hardware.camera2.CameraCharacteristics.Key<int[]> STATISTICS_INFO_AVAILABLE_FACE_DETECT_MODES;
- field public static final android.hardware.camera2.CameraCharacteristics.Key<boolean[]> STATISTICS_INFO_AVAILABLE_HOT_PIXEL_MAP_MODES;
- field public static final android.hardware.camera2.CameraCharacteristics.Key<int[]> STATISTICS_INFO_AVAILABLE_LENS_SHADING_MAP_MODES;
- field public static final android.hardware.camera2.CameraCharacteristics.Key<int[]> STATISTICS_INFO_AVAILABLE_OIS_DATA_MODES;
- field public static final android.hardware.camera2.CameraCharacteristics.Key<java.lang.Integer> STATISTICS_INFO_MAX_FACE_COUNT;
- field public static final android.hardware.camera2.CameraCharacteristics.Key<java.lang.Integer> SYNC_MAX_LATENCY;
- field public static final android.hardware.camera2.CameraCharacteristics.Key<int[]> TONEMAP_AVAILABLE_TONE_MAP_MODES;
- field public static final android.hardware.camera2.CameraCharacteristics.Key<java.lang.Integer> TONEMAP_MAX_CURVE_POINTS;
+ field @NonNull public static final android.hardware.camera2.CameraCharacteristics.Key<int[]> COLOR_CORRECTION_AVAILABLE_ABERRATION_MODES;
+ field @NonNull public static final android.hardware.camera2.CameraCharacteristics.Key<int[]> CONTROL_AE_AVAILABLE_ANTIBANDING_MODES;
+ field @NonNull public static final android.hardware.camera2.CameraCharacteristics.Key<int[]> CONTROL_AE_AVAILABLE_MODES;
+ field @NonNull public static final android.hardware.camera2.CameraCharacteristics.Key<android.util.Range<java.lang.Integer>[]> CONTROL_AE_AVAILABLE_TARGET_FPS_RANGES;
+ field @NonNull public static final android.hardware.camera2.CameraCharacteristics.Key<android.util.Range<java.lang.Integer>> CONTROL_AE_COMPENSATION_RANGE;
+ field @NonNull public static final android.hardware.camera2.CameraCharacteristics.Key<android.util.Rational> CONTROL_AE_COMPENSATION_STEP;
+ field @NonNull public static final android.hardware.camera2.CameraCharacteristics.Key<java.lang.Boolean> CONTROL_AE_LOCK_AVAILABLE;
+ field @NonNull public static final android.hardware.camera2.CameraCharacteristics.Key<int[]> CONTROL_AF_AVAILABLE_MODES;
+ field @NonNull public static final android.hardware.camera2.CameraCharacteristics.Key<int[]> CONTROL_AVAILABLE_EFFECTS;
+ field @NonNull public static final android.hardware.camera2.CameraCharacteristics.Key<int[]> CONTROL_AVAILABLE_MODES;
+ field @NonNull public static final android.hardware.camera2.CameraCharacteristics.Key<int[]> CONTROL_AVAILABLE_SCENE_MODES;
+ field @NonNull public static final android.hardware.camera2.CameraCharacteristics.Key<int[]> CONTROL_AVAILABLE_VIDEO_STABILIZATION_MODES;
+ field @NonNull public static final android.hardware.camera2.CameraCharacteristics.Key<int[]> CONTROL_AWB_AVAILABLE_MODES;
+ field @NonNull public static final android.hardware.camera2.CameraCharacteristics.Key<java.lang.Boolean> CONTROL_AWB_LOCK_AVAILABLE;
+ field @NonNull public static final android.hardware.camera2.CameraCharacteristics.Key<java.lang.Integer> CONTROL_MAX_REGIONS_AE;
+ field @NonNull public static final android.hardware.camera2.CameraCharacteristics.Key<java.lang.Integer> CONTROL_MAX_REGIONS_AF;
+ field @NonNull public static final android.hardware.camera2.CameraCharacteristics.Key<java.lang.Integer> CONTROL_MAX_REGIONS_AWB;
+ field @NonNull public static final android.hardware.camera2.CameraCharacteristics.Key<android.util.Range<java.lang.Integer>> CONTROL_POST_RAW_SENSITIVITY_BOOST_RANGE;
+ field @NonNull public static final android.hardware.camera2.CameraCharacteristics.Key<java.lang.Boolean> DEPTH_DEPTH_IS_EXCLUSIVE;
+ field @NonNull public static final android.hardware.camera2.CameraCharacteristics.Key<int[]> DISTORTION_CORRECTION_AVAILABLE_MODES;
+ field @NonNull public static final android.hardware.camera2.CameraCharacteristics.Key<int[]> EDGE_AVAILABLE_EDGE_MODES;
+ field @NonNull public static final android.hardware.camera2.CameraCharacteristics.Key<java.lang.Boolean> FLASH_INFO_AVAILABLE;
+ field @NonNull public static final android.hardware.camera2.CameraCharacteristics.Key<int[]> HOT_PIXEL_AVAILABLE_HOT_PIXEL_MODES;
+ field @NonNull public static final android.hardware.camera2.CameraCharacteristics.Key<java.lang.Integer> INFO_SUPPORTED_HARDWARE_LEVEL;
+ field @NonNull public static final android.hardware.camera2.CameraCharacteristics.Key<java.lang.String> INFO_VERSION;
+ field @NonNull public static final android.hardware.camera2.CameraCharacteristics.Key<android.util.Size[]> JPEG_AVAILABLE_THUMBNAIL_SIZES;
+ field @NonNull public static final android.hardware.camera2.CameraCharacteristics.Key<float[]> LENS_DISTORTION;
+ field @NonNull public static final android.hardware.camera2.CameraCharacteristics.Key<java.lang.Integer> LENS_FACING;
+ field @NonNull public static final android.hardware.camera2.CameraCharacteristics.Key<float[]> LENS_INFO_AVAILABLE_APERTURES;
+ field @NonNull public static final android.hardware.camera2.CameraCharacteristics.Key<float[]> LENS_INFO_AVAILABLE_FILTER_DENSITIES;
+ field @NonNull public static final android.hardware.camera2.CameraCharacteristics.Key<float[]> LENS_INFO_AVAILABLE_FOCAL_LENGTHS;
+ field @NonNull public static final android.hardware.camera2.CameraCharacteristics.Key<int[]> LENS_INFO_AVAILABLE_OPTICAL_STABILIZATION;
+ field @NonNull public static final android.hardware.camera2.CameraCharacteristics.Key<java.lang.Integer> LENS_INFO_FOCUS_DISTANCE_CALIBRATION;
+ field @NonNull public static final android.hardware.camera2.CameraCharacteristics.Key<java.lang.Float> LENS_INFO_HYPERFOCAL_DISTANCE;
+ field @NonNull public static final android.hardware.camera2.CameraCharacteristics.Key<java.lang.Float> LENS_INFO_MINIMUM_FOCUS_DISTANCE;
+ field @NonNull public static final android.hardware.camera2.CameraCharacteristics.Key<float[]> LENS_INTRINSIC_CALIBRATION;
+ field @NonNull public static final android.hardware.camera2.CameraCharacteristics.Key<java.lang.Integer> LENS_POSE_REFERENCE;
+ field @NonNull public static final android.hardware.camera2.CameraCharacteristics.Key<float[]> LENS_POSE_ROTATION;
+ field @NonNull public static final android.hardware.camera2.CameraCharacteristics.Key<float[]> LENS_POSE_TRANSLATION;
+ field @Deprecated @NonNull public static final android.hardware.camera2.CameraCharacteristics.Key<float[]> LENS_RADIAL_DISTORTION;
+ field @NonNull public static final android.hardware.camera2.CameraCharacteristics.Key<java.lang.Integer> LOGICAL_MULTI_CAMERA_SENSOR_SYNC_TYPE;
+ field @NonNull public static final android.hardware.camera2.CameraCharacteristics.Key<int[]> NOISE_REDUCTION_AVAILABLE_NOISE_REDUCTION_MODES;
+ field @NonNull public static final android.hardware.camera2.CameraCharacteristics.Key<java.lang.Integer> REPROCESS_MAX_CAPTURE_STALL;
+ field @NonNull public static final android.hardware.camera2.CameraCharacteristics.Key<int[]> REQUEST_AVAILABLE_CAPABILITIES;
+ field @NonNull public static final android.hardware.camera2.CameraCharacteristics.Key<java.lang.Integer> REQUEST_MAX_NUM_INPUT_STREAMS;
+ field @NonNull public static final android.hardware.camera2.CameraCharacteristics.Key<java.lang.Integer> REQUEST_MAX_NUM_OUTPUT_PROC;
+ field @NonNull public static final android.hardware.camera2.CameraCharacteristics.Key<java.lang.Integer> REQUEST_MAX_NUM_OUTPUT_PROC_STALLING;
+ field @NonNull public static final android.hardware.camera2.CameraCharacteristics.Key<java.lang.Integer> REQUEST_MAX_NUM_OUTPUT_RAW;
+ field @NonNull public static final android.hardware.camera2.CameraCharacteristics.Key<java.lang.Integer> REQUEST_PARTIAL_RESULT_COUNT;
+ field @NonNull public static final android.hardware.camera2.CameraCharacteristics.Key<java.lang.Byte> REQUEST_PIPELINE_MAX_DEPTH;
+ field @NonNull public static final android.hardware.camera2.CameraCharacteristics.Key<java.lang.Float> SCALER_AVAILABLE_MAX_DIGITAL_ZOOM;
+ field @NonNull public static final android.hardware.camera2.CameraCharacteristics.Key<java.lang.Integer> SCALER_CROPPING_TYPE;
+ field @NonNull public static final android.hardware.camera2.CameraCharacteristics.Key<android.hardware.camera2.params.MandatoryStreamCombination[]> SCALER_MANDATORY_STREAM_COMBINATIONS;
+ field @NonNull public static final android.hardware.camera2.CameraCharacteristics.Key<android.hardware.camera2.params.StreamConfigurationMap> SCALER_STREAM_CONFIGURATION_MAP;
+ field @NonNull public static final android.hardware.camera2.CameraCharacteristics.Key<int[]> SENSOR_AVAILABLE_TEST_PATTERN_MODES;
+ field @NonNull public static final android.hardware.camera2.CameraCharacteristics.Key<android.hardware.camera2.params.BlackLevelPattern> SENSOR_BLACK_LEVEL_PATTERN;
+ field @NonNull public static final android.hardware.camera2.CameraCharacteristics.Key<android.hardware.camera2.params.ColorSpaceTransform> SENSOR_CALIBRATION_TRANSFORM1;
+ field @NonNull public static final android.hardware.camera2.CameraCharacteristics.Key<android.hardware.camera2.params.ColorSpaceTransform> SENSOR_CALIBRATION_TRANSFORM2;
+ field @NonNull public static final android.hardware.camera2.CameraCharacteristics.Key<android.hardware.camera2.params.ColorSpaceTransform> SENSOR_COLOR_TRANSFORM1;
+ field @NonNull public static final android.hardware.camera2.CameraCharacteristics.Key<android.hardware.camera2.params.ColorSpaceTransform> SENSOR_COLOR_TRANSFORM2;
+ field @NonNull public static final android.hardware.camera2.CameraCharacteristics.Key<android.hardware.camera2.params.ColorSpaceTransform> SENSOR_FORWARD_MATRIX1;
+ field @NonNull public static final android.hardware.camera2.CameraCharacteristics.Key<android.hardware.camera2.params.ColorSpaceTransform> SENSOR_FORWARD_MATRIX2;
+ field @NonNull public static final android.hardware.camera2.CameraCharacteristics.Key<android.graphics.Rect> SENSOR_INFO_ACTIVE_ARRAY_SIZE;
+ field @NonNull public static final android.hardware.camera2.CameraCharacteristics.Key<java.lang.Integer> SENSOR_INFO_COLOR_FILTER_ARRANGEMENT;
+ field @NonNull public static final android.hardware.camera2.CameraCharacteristics.Key<android.util.Range<java.lang.Long>> SENSOR_INFO_EXPOSURE_TIME_RANGE;
+ field @NonNull public static final android.hardware.camera2.CameraCharacteristics.Key<java.lang.Boolean> SENSOR_INFO_LENS_SHADING_APPLIED;
+ field @NonNull public static final android.hardware.camera2.CameraCharacteristics.Key<java.lang.Long> SENSOR_INFO_MAX_FRAME_DURATION;
+ field @NonNull public static final android.hardware.camera2.CameraCharacteristics.Key<android.util.SizeF> SENSOR_INFO_PHYSICAL_SIZE;
+ field @NonNull public static final android.hardware.camera2.CameraCharacteristics.Key<android.util.Size> SENSOR_INFO_PIXEL_ARRAY_SIZE;
+ field @NonNull public static final android.hardware.camera2.CameraCharacteristics.Key<android.graphics.Rect> SENSOR_INFO_PRE_CORRECTION_ACTIVE_ARRAY_SIZE;
+ field @NonNull public static final android.hardware.camera2.CameraCharacteristics.Key<android.util.Range<java.lang.Integer>> SENSOR_INFO_SENSITIVITY_RANGE;
+ field @NonNull public static final android.hardware.camera2.CameraCharacteristics.Key<java.lang.Integer> SENSOR_INFO_TIMESTAMP_SOURCE;
+ field @NonNull public static final android.hardware.camera2.CameraCharacteristics.Key<java.lang.Integer> SENSOR_INFO_WHITE_LEVEL;
+ field @NonNull public static final android.hardware.camera2.CameraCharacteristics.Key<java.lang.Integer> SENSOR_MAX_ANALOG_SENSITIVITY;
+ field @NonNull public static final android.hardware.camera2.CameraCharacteristics.Key<android.graphics.Rect[]> SENSOR_OPTICAL_BLACK_REGIONS;
+ field @NonNull public static final android.hardware.camera2.CameraCharacteristics.Key<java.lang.Integer> SENSOR_ORIENTATION;
+ field @NonNull public static final android.hardware.camera2.CameraCharacteristics.Key<java.lang.Integer> SENSOR_REFERENCE_ILLUMINANT1;
+ field @NonNull public static final android.hardware.camera2.CameraCharacteristics.Key<java.lang.Byte> SENSOR_REFERENCE_ILLUMINANT2;
+ field @NonNull public static final android.hardware.camera2.CameraCharacteristics.Key<int[]> SHADING_AVAILABLE_MODES;
+ field @NonNull public static final android.hardware.camera2.CameraCharacteristics.Key<int[]> STATISTICS_INFO_AVAILABLE_FACE_DETECT_MODES;
+ field @NonNull public static final android.hardware.camera2.CameraCharacteristics.Key<boolean[]> STATISTICS_INFO_AVAILABLE_HOT_PIXEL_MAP_MODES;
+ field @NonNull public static final android.hardware.camera2.CameraCharacteristics.Key<int[]> STATISTICS_INFO_AVAILABLE_LENS_SHADING_MAP_MODES;
+ field @NonNull public static final android.hardware.camera2.CameraCharacteristics.Key<int[]> STATISTICS_INFO_AVAILABLE_OIS_DATA_MODES;
+ field @NonNull public static final android.hardware.camera2.CameraCharacteristics.Key<java.lang.Integer> STATISTICS_INFO_MAX_FACE_COUNT;
+ field @NonNull public static final android.hardware.camera2.CameraCharacteristics.Key<java.lang.Integer> SYNC_MAX_LATENCY;
+ field @NonNull public static final android.hardware.camera2.CameraCharacteristics.Key<int[]> TONEMAP_AVAILABLE_TONE_MAP_MODES;
+ field @NonNull public static final android.hardware.camera2.CameraCharacteristics.Key<java.lang.Integer> TONEMAP_MAX_CURVE_POINTS;
}
public static final class CameraCharacteristics.Key<T> {
@@ -17037,63 +17038,63 @@ package android.hardware.camera2 {
method @Nullable public Object getTag();
method public boolean isReprocess();
method public void writeToParcel(android.os.Parcel, int);
- field public static final android.hardware.camera2.CaptureRequest.Key<java.lang.Boolean> BLACK_LEVEL_LOCK;
- field public static final android.hardware.camera2.CaptureRequest.Key<java.lang.Integer> COLOR_CORRECTION_ABERRATION_MODE;
- field public static final android.hardware.camera2.CaptureRequest.Key<android.hardware.camera2.params.RggbChannelVector> COLOR_CORRECTION_GAINS;
- field public static final android.hardware.camera2.CaptureRequest.Key<java.lang.Integer> COLOR_CORRECTION_MODE;
- field public static final android.hardware.camera2.CaptureRequest.Key<android.hardware.camera2.params.ColorSpaceTransform> COLOR_CORRECTION_TRANSFORM;
- field public static final android.hardware.camera2.CaptureRequest.Key<java.lang.Integer> CONTROL_AE_ANTIBANDING_MODE;
- field public static final android.hardware.camera2.CaptureRequest.Key<java.lang.Integer> CONTROL_AE_EXPOSURE_COMPENSATION;
- field public static final android.hardware.camera2.CaptureRequest.Key<java.lang.Boolean> CONTROL_AE_LOCK;
- field public static final android.hardware.camera2.CaptureRequest.Key<java.lang.Integer> CONTROL_AE_MODE;
- field public static final android.hardware.camera2.CaptureRequest.Key<java.lang.Integer> CONTROL_AE_PRECAPTURE_TRIGGER;
- field public static final android.hardware.camera2.CaptureRequest.Key<android.hardware.camera2.params.MeteringRectangle[]> CONTROL_AE_REGIONS;
- field public static final android.hardware.camera2.CaptureRequest.Key<android.util.Range<java.lang.Integer>> CONTROL_AE_TARGET_FPS_RANGE;
- field public static final android.hardware.camera2.CaptureRequest.Key<java.lang.Integer> CONTROL_AF_MODE;
- field public static final android.hardware.camera2.CaptureRequest.Key<android.hardware.camera2.params.MeteringRectangle[]> CONTROL_AF_REGIONS;
- field public static final android.hardware.camera2.CaptureRequest.Key<java.lang.Integer> CONTROL_AF_TRIGGER;
- field public static final android.hardware.camera2.CaptureRequest.Key<java.lang.Boolean> CONTROL_AWB_LOCK;
- field public static final android.hardware.camera2.CaptureRequest.Key<java.lang.Integer> CONTROL_AWB_MODE;
- field public static final android.hardware.camera2.CaptureRequest.Key<android.hardware.camera2.params.MeteringRectangle[]> CONTROL_AWB_REGIONS;
- field public static final android.hardware.camera2.CaptureRequest.Key<java.lang.Integer> CONTROL_CAPTURE_INTENT;
- field public static final android.hardware.camera2.CaptureRequest.Key<java.lang.Integer> CONTROL_EFFECT_MODE;
- field public static final android.hardware.camera2.CaptureRequest.Key<java.lang.Boolean> CONTROL_ENABLE_ZSL;
- field public static final android.hardware.camera2.CaptureRequest.Key<java.lang.Integer> CONTROL_MODE;
- field public static final android.hardware.camera2.CaptureRequest.Key<java.lang.Integer> CONTROL_POST_RAW_SENSITIVITY_BOOST;
- field public static final android.hardware.camera2.CaptureRequest.Key<java.lang.Integer> CONTROL_SCENE_MODE;
- field public static final android.hardware.camera2.CaptureRequest.Key<java.lang.Integer> CONTROL_VIDEO_STABILIZATION_MODE;
+ field @NonNull public static final android.hardware.camera2.CaptureRequest.Key<java.lang.Boolean> BLACK_LEVEL_LOCK;
+ field @NonNull public static final android.hardware.camera2.CaptureRequest.Key<java.lang.Integer> COLOR_CORRECTION_ABERRATION_MODE;
+ field @NonNull public static final android.hardware.camera2.CaptureRequest.Key<android.hardware.camera2.params.RggbChannelVector> COLOR_CORRECTION_GAINS;
+ field @NonNull public static final android.hardware.camera2.CaptureRequest.Key<java.lang.Integer> COLOR_CORRECTION_MODE;
+ field @NonNull public static final android.hardware.camera2.CaptureRequest.Key<android.hardware.camera2.params.ColorSpaceTransform> COLOR_CORRECTION_TRANSFORM;
+ field @NonNull public static final android.hardware.camera2.CaptureRequest.Key<java.lang.Integer> CONTROL_AE_ANTIBANDING_MODE;
+ field @NonNull public static final android.hardware.camera2.CaptureRequest.Key<java.lang.Integer> CONTROL_AE_EXPOSURE_COMPENSATION;
+ field @NonNull public static final android.hardware.camera2.CaptureRequest.Key<java.lang.Boolean> CONTROL_AE_LOCK;
+ field @NonNull public static final android.hardware.camera2.CaptureRequest.Key<java.lang.Integer> CONTROL_AE_MODE;
+ field @NonNull public static final android.hardware.camera2.CaptureRequest.Key<java.lang.Integer> CONTROL_AE_PRECAPTURE_TRIGGER;
+ field @NonNull public static final android.hardware.camera2.CaptureRequest.Key<android.hardware.camera2.params.MeteringRectangle[]> CONTROL_AE_REGIONS;
+ field @NonNull public static final android.hardware.camera2.CaptureRequest.Key<android.util.Range<java.lang.Integer>> CONTROL_AE_TARGET_FPS_RANGE;
+ field @NonNull public static final android.hardware.camera2.CaptureRequest.Key<java.lang.Integer> CONTROL_AF_MODE;
+ field @NonNull public static final android.hardware.camera2.CaptureRequest.Key<android.hardware.camera2.params.MeteringRectangle[]> CONTROL_AF_REGIONS;
+ field @NonNull public static final android.hardware.camera2.CaptureRequest.Key<java.lang.Integer> CONTROL_AF_TRIGGER;
+ field @NonNull public static final android.hardware.camera2.CaptureRequest.Key<java.lang.Boolean> CONTROL_AWB_LOCK;
+ field @NonNull public static final android.hardware.camera2.CaptureRequest.Key<java.lang.Integer> CONTROL_AWB_MODE;
+ field @NonNull public static final android.hardware.camera2.CaptureRequest.Key<android.hardware.camera2.params.MeteringRectangle[]> CONTROL_AWB_REGIONS;
+ field @NonNull public static final android.hardware.camera2.CaptureRequest.Key<java.lang.Integer> CONTROL_CAPTURE_INTENT;
+ field @NonNull public static final android.hardware.camera2.CaptureRequest.Key<java.lang.Integer> CONTROL_EFFECT_MODE;
+ field @NonNull public static final android.hardware.camera2.CaptureRequest.Key<java.lang.Boolean> CONTROL_ENABLE_ZSL;
+ field @NonNull public static final android.hardware.camera2.CaptureRequest.Key<java.lang.Integer> CONTROL_MODE;
+ field @NonNull public static final android.hardware.camera2.CaptureRequest.Key<java.lang.Integer> CONTROL_POST_RAW_SENSITIVITY_BOOST;
+ field @NonNull public static final android.hardware.camera2.CaptureRequest.Key<java.lang.Integer> CONTROL_SCENE_MODE;
+ field @NonNull public static final android.hardware.camera2.CaptureRequest.Key<java.lang.Integer> CONTROL_VIDEO_STABILIZATION_MODE;
field public static final android.os.Parcelable.Creator<android.hardware.camera2.CaptureRequest> CREATOR;
- field public static final android.hardware.camera2.CaptureRequest.Key<java.lang.Integer> DISTORTION_CORRECTION_MODE;
- field public static final android.hardware.camera2.CaptureRequest.Key<java.lang.Integer> EDGE_MODE;
- field public static final android.hardware.camera2.CaptureRequest.Key<java.lang.Integer> FLASH_MODE;
- field public static final android.hardware.camera2.CaptureRequest.Key<java.lang.Integer> HOT_PIXEL_MODE;
- field public static final android.hardware.camera2.CaptureRequest.Key<android.location.Location> JPEG_GPS_LOCATION;
- field public static final android.hardware.camera2.CaptureRequest.Key<java.lang.Integer> JPEG_ORIENTATION;
- field public static final android.hardware.camera2.CaptureRequest.Key<java.lang.Byte> JPEG_QUALITY;
- field public static final android.hardware.camera2.CaptureRequest.Key<java.lang.Byte> JPEG_THUMBNAIL_QUALITY;
- field public static final android.hardware.camera2.CaptureRequest.Key<android.util.Size> JPEG_THUMBNAIL_SIZE;
- field public static final android.hardware.camera2.CaptureRequest.Key<java.lang.Float> LENS_APERTURE;
- field public static final android.hardware.camera2.CaptureRequest.Key<java.lang.Float> LENS_FILTER_DENSITY;
- field public static final android.hardware.camera2.CaptureRequest.Key<java.lang.Float> LENS_FOCAL_LENGTH;
- field public static final android.hardware.camera2.CaptureRequest.Key<java.lang.Float> LENS_FOCUS_DISTANCE;
- field public static final android.hardware.camera2.CaptureRequest.Key<java.lang.Integer> LENS_OPTICAL_STABILIZATION_MODE;
- field public static final android.hardware.camera2.CaptureRequest.Key<java.lang.Integer> NOISE_REDUCTION_MODE;
- field public static final android.hardware.camera2.CaptureRequest.Key<java.lang.Float> REPROCESS_EFFECTIVE_EXPOSURE_FACTOR;
- field public static final android.hardware.camera2.CaptureRequest.Key<android.graphics.Rect> SCALER_CROP_REGION;
- field public static final android.hardware.camera2.CaptureRequest.Key<java.lang.Long> SENSOR_EXPOSURE_TIME;
- field public static final android.hardware.camera2.CaptureRequest.Key<java.lang.Long> SENSOR_FRAME_DURATION;
- field public static final android.hardware.camera2.CaptureRequest.Key<java.lang.Integer> SENSOR_SENSITIVITY;
- field public static final android.hardware.camera2.CaptureRequest.Key<int[]> SENSOR_TEST_PATTERN_DATA;
- field public static final android.hardware.camera2.CaptureRequest.Key<java.lang.Integer> SENSOR_TEST_PATTERN_MODE;
- field public static final android.hardware.camera2.CaptureRequest.Key<java.lang.Integer> SHADING_MODE;
- field public static final android.hardware.camera2.CaptureRequest.Key<java.lang.Integer> STATISTICS_FACE_DETECT_MODE;
- field public static final android.hardware.camera2.CaptureRequest.Key<java.lang.Boolean> STATISTICS_HOT_PIXEL_MAP_MODE;
- field public static final android.hardware.camera2.CaptureRequest.Key<java.lang.Integer> STATISTICS_LENS_SHADING_MAP_MODE;
- field public static final android.hardware.camera2.CaptureRequest.Key<java.lang.Integer> STATISTICS_OIS_DATA_MODE;
- field public static final android.hardware.camera2.CaptureRequest.Key<android.hardware.camera2.params.TonemapCurve> TONEMAP_CURVE;
- field public static final android.hardware.camera2.CaptureRequest.Key<java.lang.Float> TONEMAP_GAMMA;
- field public static final android.hardware.camera2.CaptureRequest.Key<java.lang.Integer> TONEMAP_MODE;
- field public static final android.hardware.camera2.CaptureRequest.Key<java.lang.Integer> TONEMAP_PRESET_CURVE;
+ field @NonNull public static final android.hardware.camera2.CaptureRequest.Key<java.lang.Integer> DISTORTION_CORRECTION_MODE;
+ field @NonNull public static final android.hardware.camera2.CaptureRequest.Key<java.lang.Integer> EDGE_MODE;
+ field @NonNull public static final android.hardware.camera2.CaptureRequest.Key<java.lang.Integer> FLASH_MODE;
+ field @NonNull public static final android.hardware.camera2.CaptureRequest.Key<java.lang.Integer> HOT_PIXEL_MODE;
+ field @NonNull public static final android.hardware.camera2.CaptureRequest.Key<android.location.Location> JPEG_GPS_LOCATION;
+ field @NonNull public static final android.hardware.camera2.CaptureRequest.Key<java.lang.Integer> JPEG_ORIENTATION;
+ field @NonNull public static final android.hardware.camera2.CaptureRequest.Key<java.lang.Byte> JPEG_QUALITY;
+ field @NonNull public static final android.hardware.camera2.CaptureRequest.Key<java.lang.Byte> JPEG_THUMBNAIL_QUALITY;
+ field @NonNull public static final android.hardware.camera2.CaptureRequest.Key<android.util.Size> JPEG_THUMBNAIL_SIZE;
+ field @NonNull public static final android.hardware.camera2.CaptureRequest.Key<java.lang.Float> LENS_APERTURE;
+ field @NonNull public static final android.hardware.camera2.CaptureRequest.Key<java.lang.Float> LENS_FILTER_DENSITY;
+ field @NonNull public static final android.hardware.camera2.CaptureRequest.Key<java.lang.Float> LENS_FOCAL_LENGTH;
+ field @NonNull public static final android.hardware.camera2.CaptureRequest.Key<java.lang.Float> LENS_FOCUS_DISTANCE;
+ field @NonNull public static final android.hardware.camera2.CaptureRequest.Key<java.lang.Integer> LENS_OPTICAL_STABILIZATION_MODE;
+ field @NonNull public static final android.hardware.camera2.CaptureRequest.Key<java.lang.Integer> NOISE_REDUCTION_MODE;
+ field @NonNull public static final android.hardware.camera2.CaptureRequest.Key<java.lang.Float> REPROCESS_EFFECTIVE_EXPOSURE_FACTOR;
+ field @NonNull public static final android.hardware.camera2.CaptureRequest.Key<android.graphics.Rect> SCALER_CROP_REGION;
+ field @NonNull public static final android.hardware.camera2.CaptureRequest.Key<java.lang.Long> SENSOR_EXPOSURE_TIME;
+ field @NonNull public static final android.hardware.camera2.CaptureRequest.Key<java.lang.Long> SENSOR_FRAME_DURATION;
+ field @NonNull public static final android.hardware.camera2.CaptureRequest.Key<java.lang.Integer> SENSOR_SENSITIVITY;
+ field @NonNull public static final android.hardware.camera2.CaptureRequest.Key<int[]> SENSOR_TEST_PATTERN_DATA;
+ field @NonNull public static final android.hardware.camera2.CaptureRequest.Key<java.lang.Integer> SENSOR_TEST_PATTERN_MODE;
+ field @NonNull public static final android.hardware.camera2.CaptureRequest.Key<java.lang.Integer> SHADING_MODE;
+ field @NonNull public static final android.hardware.camera2.CaptureRequest.Key<java.lang.Integer> STATISTICS_FACE_DETECT_MODE;
+ field @NonNull public static final android.hardware.camera2.CaptureRequest.Key<java.lang.Boolean> STATISTICS_HOT_PIXEL_MAP_MODE;
+ field @NonNull public static final android.hardware.camera2.CaptureRequest.Key<java.lang.Integer> STATISTICS_LENS_SHADING_MAP_MODE;
+ field @NonNull public static final android.hardware.camera2.CaptureRequest.Key<java.lang.Integer> STATISTICS_OIS_DATA_MODE;
+ field @NonNull public static final android.hardware.camera2.CaptureRequest.Key<android.hardware.camera2.params.TonemapCurve> TONEMAP_CURVE;
+ field @NonNull public static final android.hardware.camera2.CaptureRequest.Key<java.lang.Float> TONEMAP_GAMMA;
+ field @NonNull public static final android.hardware.camera2.CaptureRequest.Key<java.lang.Integer> TONEMAP_MODE;
+ field @NonNull public static final android.hardware.camera2.CaptureRequest.Key<java.lang.Integer> TONEMAP_PRESET_CURVE;
}
public static final class CaptureRequest.Builder {
@@ -17118,88 +17119,88 @@ package android.hardware.camera2 {
method @NonNull public java.util.List<android.hardware.camera2.CaptureResult.Key<?>> getKeys();
method @NonNull public android.hardware.camera2.CaptureRequest getRequest();
method public int getSequenceId();
- field public static final android.hardware.camera2.CaptureResult.Key<java.lang.Boolean> BLACK_LEVEL_LOCK;
- field public static final android.hardware.camera2.CaptureResult.Key<java.lang.Integer> COLOR_CORRECTION_ABERRATION_MODE;
- field public static final android.hardware.camera2.CaptureResult.Key<android.hardware.camera2.params.RggbChannelVector> COLOR_CORRECTION_GAINS;
- field public static final android.hardware.camera2.CaptureResult.Key<java.lang.Integer> COLOR_CORRECTION_MODE;
- field public static final android.hardware.camera2.CaptureResult.Key<android.hardware.camera2.params.ColorSpaceTransform> COLOR_CORRECTION_TRANSFORM;
- field public static final android.hardware.camera2.CaptureResult.Key<java.lang.Integer> CONTROL_AE_ANTIBANDING_MODE;
- field public static final android.hardware.camera2.CaptureResult.Key<java.lang.Integer> CONTROL_AE_EXPOSURE_COMPENSATION;
- field public static final android.hardware.camera2.CaptureResult.Key<java.lang.Boolean> CONTROL_AE_LOCK;
- field public static final android.hardware.camera2.CaptureResult.Key<java.lang.Integer> CONTROL_AE_MODE;
- field public static final android.hardware.camera2.CaptureResult.Key<java.lang.Integer> CONTROL_AE_PRECAPTURE_TRIGGER;
- field public static final android.hardware.camera2.CaptureResult.Key<android.hardware.camera2.params.MeteringRectangle[]> CONTROL_AE_REGIONS;
- field public static final android.hardware.camera2.CaptureResult.Key<java.lang.Integer> CONTROL_AE_STATE;
- field public static final android.hardware.camera2.CaptureResult.Key<android.util.Range<java.lang.Integer>> CONTROL_AE_TARGET_FPS_RANGE;
- field public static final android.hardware.camera2.CaptureResult.Key<java.lang.Integer> CONTROL_AF_MODE;
- field public static final android.hardware.camera2.CaptureResult.Key<android.hardware.camera2.params.MeteringRectangle[]> CONTROL_AF_REGIONS;
- field public static final android.hardware.camera2.CaptureResult.Key<java.lang.Integer> CONTROL_AF_SCENE_CHANGE;
- field public static final android.hardware.camera2.CaptureResult.Key<java.lang.Integer> CONTROL_AF_STATE;
- field public static final android.hardware.camera2.CaptureResult.Key<java.lang.Integer> CONTROL_AF_TRIGGER;
- field public static final android.hardware.camera2.CaptureResult.Key<java.lang.Boolean> CONTROL_AWB_LOCK;
- field public static final android.hardware.camera2.CaptureResult.Key<java.lang.Integer> CONTROL_AWB_MODE;
- field public static final android.hardware.camera2.CaptureResult.Key<android.hardware.camera2.params.MeteringRectangle[]> CONTROL_AWB_REGIONS;
- field public static final android.hardware.camera2.CaptureResult.Key<java.lang.Integer> CONTROL_AWB_STATE;
- field public static final android.hardware.camera2.CaptureResult.Key<java.lang.Integer> CONTROL_CAPTURE_INTENT;
- field public static final android.hardware.camera2.CaptureResult.Key<java.lang.Integer> CONTROL_EFFECT_MODE;
- field public static final android.hardware.camera2.CaptureResult.Key<java.lang.Boolean> CONTROL_ENABLE_ZSL;
- field public static final android.hardware.camera2.CaptureResult.Key<java.lang.Integer> CONTROL_MODE;
- field public static final android.hardware.camera2.CaptureResult.Key<java.lang.Integer> CONTROL_POST_RAW_SENSITIVITY_BOOST;
- field public static final android.hardware.camera2.CaptureResult.Key<java.lang.Integer> CONTROL_SCENE_MODE;
- field public static final android.hardware.camera2.CaptureResult.Key<java.lang.Integer> CONTROL_VIDEO_STABILIZATION_MODE;
- field public static final android.hardware.camera2.CaptureResult.Key<java.lang.Integer> DISTORTION_CORRECTION_MODE;
- field public static final android.hardware.camera2.CaptureResult.Key<java.lang.Integer> EDGE_MODE;
- field public static final android.hardware.camera2.CaptureResult.Key<java.lang.Integer> FLASH_MODE;
- field public static final android.hardware.camera2.CaptureResult.Key<java.lang.Integer> FLASH_STATE;
- field public static final android.hardware.camera2.CaptureResult.Key<java.lang.Integer> HOT_PIXEL_MODE;
- field public static final android.hardware.camera2.CaptureResult.Key<android.location.Location> JPEG_GPS_LOCATION;
- field public static final android.hardware.camera2.CaptureResult.Key<java.lang.Integer> JPEG_ORIENTATION;
- field public static final android.hardware.camera2.CaptureResult.Key<java.lang.Byte> JPEG_QUALITY;
- field public static final android.hardware.camera2.CaptureResult.Key<java.lang.Byte> JPEG_THUMBNAIL_QUALITY;
- field public static final android.hardware.camera2.CaptureResult.Key<android.util.Size> JPEG_THUMBNAIL_SIZE;
- field public static final android.hardware.camera2.CaptureResult.Key<java.lang.Float> LENS_APERTURE;
- field public static final android.hardware.camera2.CaptureResult.Key<float[]> LENS_DISTORTION;
- field public static final android.hardware.camera2.CaptureResult.Key<java.lang.Float> LENS_FILTER_DENSITY;
- field public static final android.hardware.camera2.CaptureResult.Key<java.lang.Float> LENS_FOCAL_LENGTH;
- field public static final android.hardware.camera2.CaptureResult.Key<java.lang.Float> LENS_FOCUS_DISTANCE;
- field public static final android.hardware.camera2.CaptureResult.Key<android.util.Pair<java.lang.Float,java.lang.Float>> LENS_FOCUS_RANGE;
- field public static final android.hardware.camera2.CaptureResult.Key<float[]> LENS_INTRINSIC_CALIBRATION;
- field public static final android.hardware.camera2.CaptureResult.Key<java.lang.Integer> LENS_OPTICAL_STABILIZATION_MODE;
- field public static final android.hardware.camera2.CaptureResult.Key<float[]> LENS_POSE_ROTATION;
- field public static final android.hardware.camera2.CaptureResult.Key<float[]> LENS_POSE_TRANSLATION;
- field @Deprecated public static final android.hardware.camera2.CaptureResult.Key<float[]> LENS_RADIAL_DISTORTION;
- field public static final android.hardware.camera2.CaptureResult.Key<java.lang.Integer> LENS_STATE;
- field public static final android.hardware.camera2.CaptureResult.Key<java.lang.String> LOGICAL_MULTI_CAMERA_ACTIVE_PHYSICAL_ID;
- field public static final android.hardware.camera2.CaptureResult.Key<java.lang.Integer> NOISE_REDUCTION_MODE;
- field public static final android.hardware.camera2.CaptureResult.Key<java.lang.Float> REPROCESS_EFFECTIVE_EXPOSURE_FACTOR;
- field public static final android.hardware.camera2.CaptureResult.Key<java.lang.Byte> REQUEST_PIPELINE_DEPTH;
- field public static final android.hardware.camera2.CaptureResult.Key<android.graphics.Rect> SCALER_CROP_REGION;
- field public static final android.hardware.camera2.CaptureResult.Key<float[]> SENSOR_DYNAMIC_BLACK_LEVEL;
- field public static final android.hardware.camera2.CaptureResult.Key<java.lang.Integer> SENSOR_DYNAMIC_WHITE_LEVEL;
- field public static final android.hardware.camera2.CaptureResult.Key<java.lang.Long> SENSOR_EXPOSURE_TIME;
- field public static final android.hardware.camera2.CaptureResult.Key<java.lang.Long> SENSOR_FRAME_DURATION;
- field public static final android.hardware.camera2.CaptureResult.Key<java.lang.Float> SENSOR_GREEN_SPLIT;
- field public static final android.hardware.camera2.CaptureResult.Key<android.util.Rational[]> SENSOR_NEUTRAL_COLOR_POINT;
- field public static final android.hardware.camera2.CaptureResult.Key<android.util.Pair<java.lang.Double,java.lang.Double>[]> SENSOR_NOISE_PROFILE;
- field public static final android.hardware.camera2.CaptureResult.Key<java.lang.Long> SENSOR_ROLLING_SHUTTER_SKEW;
- field public static final android.hardware.camera2.CaptureResult.Key<java.lang.Integer> SENSOR_SENSITIVITY;
- field public static final android.hardware.camera2.CaptureResult.Key<int[]> SENSOR_TEST_PATTERN_DATA;
- field public static final android.hardware.camera2.CaptureResult.Key<java.lang.Integer> SENSOR_TEST_PATTERN_MODE;
- field public static final android.hardware.camera2.CaptureResult.Key<java.lang.Long> SENSOR_TIMESTAMP;
- field public static final android.hardware.camera2.CaptureResult.Key<java.lang.Integer> SHADING_MODE;
- field public static final android.hardware.camera2.CaptureResult.Key<android.hardware.camera2.params.Face[]> STATISTICS_FACES;
- field public static final android.hardware.camera2.CaptureResult.Key<java.lang.Integer> STATISTICS_FACE_DETECT_MODE;
- field public static final android.hardware.camera2.CaptureResult.Key<android.graphics.Point[]> STATISTICS_HOT_PIXEL_MAP;
- field public static final android.hardware.camera2.CaptureResult.Key<java.lang.Boolean> STATISTICS_HOT_PIXEL_MAP_MODE;
- field public static final android.hardware.camera2.CaptureResult.Key<android.hardware.camera2.params.LensShadingMap> STATISTICS_LENS_SHADING_CORRECTION_MAP;
- field public static final android.hardware.camera2.CaptureResult.Key<java.lang.Integer> STATISTICS_LENS_SHADING_MAP_MODE;
- field public static final android.hardware.camera2.CaptureResult.Key<java.lang.Integer> STATISTICS_OIS_DATA_MODE;
- field public static final android.hardware.camera2.CaptureResult.Key<android.hardware.camera2.params.OisSample[]> STATISTICS_OIS_SAMPLES;
- field public static final android.hardware.camera2.CaptureResult.Key<java.lang.Integer> STATISTICS_SCENE_FLICKER;
- field public static final android.hardware.camera2.CaptureResult.Key<android.hardware.camera2.params.TonemapCurve> TONEMAP_CURVE;
- field public static final android.hardware.camera2.CaptureResult.Key<java.lang.Float> TONEMAP_GAMMA;
- field public static final android.hardware.camera2.CaptureResult.Key<java.lang.Integer> TONEMAP_MODE;
- field public static final android.hardware.camera2.CaptureResult.Key<java.lang.Integer> TONEMAP_PRESET_CURVE;
+ field @NonNull public static final android.hardware.camera2.CaptureResult.Key<java.lang.Boolean> BLACK_LEVEL_LOCK;
+ field @NonNull public static final android.hardware.camera2.CaptureResult.Key<java.lang.Integer> COLOR_CORRECTION_ABERRATION_MODE;
+ field @NonNull public static final android.hardware.camera2.CaptureResult.Key<android.hardware.camera2.params.RggbChannelVector> COLOR_CORRECTION_GAINS;
+ field @NonNull public static final android.hardware.camera2.CaptureResult.Key<java.lang.Integer> COLOR_CORRECTION_MODE;
+ field @NonNull public static final android.hardware.camera2.CaptureResult.Key<android.hardware.camera2.params.ColorSpaceTransform> COLOR_CORRECTION_TRANSFORM;
+ field @NonNull public static final android.hardware.camera2.CaptureResult.Key<java.lang.Integer> CONTROL_AE_ANTIBANDING_MODE;
+ field @NonNull public static final android.hardware.camera2.CaptureResult.Key<java.lang.Integer> CONTROL_AE_EXPOSURE_COMPENSATION;
+ field @NonNull public static final android.hardware.camera2.CaptureResult.Key<java.lang.Boolean> CONTROL_AE_LOCK;
+ field @NonNull public static final android.hardware.camera2.CaptureResult.Key<java.lang.Integer> CONTROL_AE_MODE;
+ field @NonNull public static final android.hardware.camera2.CaptureResult.Key<java.lang.Integer> CONTROL_AE_PRECAPTURE_TRIGGER;
+ field @NonNull public static final android.hardware.camera2.CaptureResult.Key<android.hardware.camera2.params.MeteringRectangle[]> CONTROL_AE_REGIONS;
+ field @NonNull public static final android.hardware.camera2.CaptureResult.Key<java.lang.Integer> CONTROL_AE_STATE;
+ field @NonNull public static final android.hardware.camera2.CaptureResult.Key<android.util.Range<java.lang.Integer>> CONTROL_AE_TARGET_FPS_RANGE;
+ field @NonNull public static final android.hardware.camera2.CaptureResult.Key<java.lang.Integer> CONTROL_AF_MODE;
+ field @NonNull public static final android.hardware.camera2.CaptureResult.Key<android.hardware.camera2.params.MeteringRectangle[]> CONTROL_AF_REGIONS;
+ field @NonNull public static final android.hardware.camera2.CaptureResult.Key<java.lang.Integer> CONTROL_AF_SCENE_CHANGE;
+ field @NonNull public static final android.hardware.camera2.CaptureResult.Key<java.lang.Integer> CONTROL_AF_STATE;
+ field @NonNull public static final android.hardware.camera2.CaptureResult.Key<java.lang.Integer> CONTROL_AF_TRIGGER;
+ field @NonNull public static final android.hardware.camera2.CaptureResult.Key<java.lang.Boolean> CONTROL_AWB_LOCK;
+ field @NonNull public static final android.hardware.camera2.CaptureResult.Key<java.lang.Integer> CONTROL_AWB_MODE;
+ field @NonNull public static final android.hardware.camera2.CaptureResult.Key<android.hardware.camera2.params.MeteringRectangle[]> CONTROL_AWB_REGIONS;
+ field @NonNull public static final android.hardware.camera2.CaptureResult.Key<java.lang.Integer> CONTROL_AWB_STATE;
+ field @NonNull public static final android.hardware.camera2.CaptureResult.Key<java.lang.Integer> CONTROL_CAPTURE_INTENT;
+ field @NonNull public static final android.hardware.camera2.CaptureResult.Key<java.lang.Integer> CONTROL_EFFECT_MODE;
+ field @NonNull public static final android.hardware.camera2.CaptureResult.Key<java.lang.Boolean> CONTROL_ENABLE_ZSL;
+ field @NonNull public static final android.hardware.camera2.CaptureResult.Key<java.lang.Integer> CONTROL_MODE;
+ field @NonNull public static final android.hardware.camera2.CaptureResult.Key<java.lang.Integer> CONTROL_POST_RAW_SENSITIVITY_BOOST;
+ field @NonNull public static final android.hardware.camera2.CaptureResult.Key<java.lang.Integer> CONTROL_SCENE_MODE;
+ field @NonNull public static final android.hardware.camera2.CaptureResult.Key<java.lang.Integer> CONTROL_VIDEO_STABILIZATION_MODE;
+ field @NonNull public static final android.hardware.camera2.CaptureResult.Key<java.lang.Integer> DISTORTION_CORRECTION_MODE;
+ field @NonNull public static final android.hardware.camera2.CaptureResult.Key<java.lang.Integer> EDGE_MODE;
+ field @NonNull public static final android.hardware.camera2.CaptureResult.Key<java.lang.Integer> FLASH_MODE;
+ field @NonNull public static final android.hardware.camera2.CaptureResult.Key<java.lang.Integer> FLASH_STATE;
+ field @NonNull public static final android.hardware.camera2.CaptureResult.Key<java.lang.Integer> HOT_PIXEL_MODE;
+ field @NonNull public static final android.hardware.camera2.CaptureResult.Key<android.location.Location> JPEG_GPS_LOCATION;
+ field @NonNull public static final android.hardware.camera2.CaptureResult.Key<java.lang.Integer> JPEG_ORIENTATION;
+ field @NonNull public static final android.hardware.camera2.CaptureResult.Key<java.lang.Byte> JPEG_QUALITY;
+ field @NonNull public static final android.hardware.camera2.CaptureResult.Key<java.lang.Byte> JPEG_THUMBNAIL_QUALITY;
+ field @NonNull public static final android.hardware.camera2.CaptureResult.Key<android.util.Size> JPEG_THUMBNAIL_SIZE;
+ field @NonNull public static final android.hardware.camera2.CaptureResult.Key<java.lang.Float> LENS_APERTURE;
+ field @NonNull public static final android.hardware.camera2.CaptureResult.Key<float[]> LENS_DISTORTION;
+ field @NonNull public static final android.hardware.camera2.CaptureResult.Key<java.lang.Float> LENS_FILTER_DENSITY;
+ field @NonNull public static final android.hardware.camera2.CaptureResult.Key<java.lang.Float> LENS_FOCAL_LENGTH;
+ field @NonNull public static final android.hardware.camera2.CaptureResult.Key<java.lang.Float> LENS_FOCUS_DISTANCE;
+ field @NonNull public static final android.hardware.camera2.CaptureResult.Key<android.util.Pair<java.lang.Float,java.lang.Float>> LENS_FOCUS_RANGE;
+ field @NonNull public static final android.hardware.camera2.CaptureResult.Key<float[]> LENS_INTRINSIC_CALIBRATION;
+ field @NonNull public static final android.hardware.camera2.CaptureResult.Key<java.lang.Integer> LENS_OPTICAL_STABILIZATION_MODE;
+ field @NonNull public static final android.hardware.camera2.CaptureResult.Key<float[]> LENS_POSE_ROTATION;
+ field @NonNull public static final android.hardware.camera2.CaptureResult.Key<float[]> LENS_POSE_TRANSLATION;
+ field @Deprecated @NonNull public static final android.hardware.camera2.CaptureResult.Key<float[]> LENS_RADIAL_DISTORTION;
+ field @NonNull public static final android.hardware.camera2.CaptureResult.Key<java.lang.Integer> LENS_STATE;
+ field @NonNull public static final android.hardware.camera2.CaptureResult.Key<java.lang.String> LOGICAL_MULTI_CAMERA_ACTIVE_PHYSICAL_ID;
+ field @NonNull public static final android.hardware.camera2.CaptureResult.Key<java.lang.Integer> NOISE_REDUCTION_MODE;
+ field @NonNull public static final android.hardware.camera2.CaptureResult.Key<java.lang.Float> REPROCESS_EFFECTIVE_EXPOSURE_FACTOR;
+ field @NonNull public static final android.hardware.camera2.CaptureResult.Key<java.lang.Byte> REQUEST_PIPELINE_DEPTH;
+ field @NonNull public static final android.hardware.camera2.CaptureResult.Key<android.graphics.Rect> SCALER_CROP_REGION;
+ field @NonNull public static final android.hardware.camera2.CaptureResult.Key<float[]> SENSOR_DYNAMIC_BLACK_LEVEL;
+ field @NonNull public static final android.hardware.camera2.CaptureResult.Key<java.lang.Integer> SENSOR_DYNAMIC_WHITE_LEVEL;
+ field @NonNull public static final android.hardware.camera2.CaptureResult.Key<java.lang.Long> SENSOR_EXPOSURE_TIME;
+ field @NonNull public static final android.hardware.camera2.CaptureResult.Key<java.lang.Long> SENSOR_FRAME_DURATION;
+ field @NonNull public static final android.hardware.camera2.CaptureResult.Key<java.lang.Float> SENSOR_GREEN_SPLIT;
+ field @NonNull public static final android.hardware.camera2.CaptureResult.Key<android.util.Rational[]> SENSOR_NEUTRAL_COLOR_POINT;
+ field @NonNull public static final android.hardware.camera2.CaptureResult.Key<android.util.Pair<java.lang.Double,java.lang.Double>[]> SENSOR_NOISE_PROFILE;
+ field @NonNull public static final android.hardware.camera2.CaptureResult.Key<java.lang.Long> SENSOR_ROLLING_SHUTTER_SKEW;
+ field @NonNull public static final android.hardware.camera2.CaptureResult.Key<java.lang.Integer> SENSOR_SENSITIVITY;
+ field @NonNull public static final android.hardware.camera2.CaptureResult.Key<int[]> SENSOR_TEST_PATTERN_DATA;
+ field @NonNull public static final android.hardware.camera2.CaptureResult.Key<java.lang.Integer> SENSOR_TEST_PATTERN_MODE;
+ field @NonNull public static final android.hardware.camera2.CaptureResult.Key<java.lang.Long> SENSOR_TIMESTAMP;
+ field @NonNull public static final android.hardware.camera2.CaptureResult.Key<java.lang.Integer> SHADING_MODE;
+ field @NonNull public static final android.hardware.camera2.CaptureResult.Key<android.hardware.camera2.params.Face[]> STATISTICS_FACES;
+ field @NonNull public static final android.hardware.camera2.CaptureResult.Key<java.lang.Integer> STATISTICS_FACE_DETECT_MODE;
+ field @NonNull public static final android.hardware.camera2.CaptureResult.Key<android.graphics.Point[]> STATISTICS_HOT_PIXEL_MAP;
+ field @NonNull public static final android.hardware.camera2.CaptureResult.Key<java.lang.Boolean> STATISTICS_HOT_PIXEL_MAP_MODE;
+ field @NonNull public static final android.hardware.camera2.CaptureResult.Key<android.hardware.camera2.params.LensShadingMap> STATISTICS_LENS_SHADING_CORRECTION_MAP;
+ field @NonNull public static final android.hardware.camera2.CaptureResult.Key<java.lang.Integer> STATISTICS_LENS_SHADING_MAP_MODE;
+ field @NonNull public static final android.hardware.camera2.CaptureResult.Key<java.lang.Integer> STATISTICS_OIS_DATA_MODE;
+ field @NonNull public static final android.hardware.camera2.CaptureResult.Key<android.hardware.camera2.params.OisSample[]> STATISTICS_OIS_SAMPLES;
+ field @NonNull public static final android.hardware.camera2.CaptureResult.Key<java.lang.Integer> STATISTICS_SCENE_FLICKER;
+ field @NonNull public static final android.hardware.camera2.CaptureResult.Key<android.hardware.camera2.params.TonemapCurve> TONEMAP_CURVE;
+ field @NonNull public static final android.hardware.camera2.CaptureResult.Key<java.lang.Float> TONEMAP_GAMMA;
+ field @NonNull public static final android.hardware.camera2.CaptureResult.Key<java.lang.Integer> TONEMAP_MODE;
+ field @NonNull public static final android.hardware.camera2.CaptureResult.Key<java.lang.Integer> TONEMAP_PRESET_CURVE;
}
public static final class CaptureResult.Key<T> {
@@ -23417,14 +23418,14 @@ package android.media {
field public static final int MASTERING_NOT_INDICATED = 0; // 0x0
}
- public static class AudioPresentation.Builder {
+ public static final class AudioPresentation.Builder {
ctor public AudioPresentation.Builder(int);
method @NonNull public android.media.AudioPresentation build();
method @NonNull public android.media.AudioPresentation.Builder setHasAudioDescription(boolean);
method @NonNull public android.media.AudioPresentation.Builder setHasDialogueEnhancement(boolean);
method @NonNull public android.media.AudioPresentation.Builder setHasSpokenSubtitles(boolean);
- method @NonNull public android.media.AudioPresentation.Builder setLabels(@NonNull java.util.Map<android.icu.util.ULocale,java.lang.String>);
- method @NonNull public android.media.AudioPresentation.Builder setLocale(android.icu.util.ULocale);
+ method @NonNull public android.media.AudioPresentation.Builder setLabels(@NonNull java.util.Map<android.icu.util.ULocale,java.lang.CharSequence>);
+ method @NonNull public android.media.AudioPresentation.Builder setLocale(@NonNull android.icu.util.ULocale);
method @NonNull public android.media.AudioPresentation.Builder setMasteringIndication(int);
method @NonNull public android.media.AudioPresentation.Builder setProgramId(int);
}
@@ -35516,7 +35517,7 @@ package android.os {
public abstract class VibrationEffect implements android.os.Parcelable {
method public static android.os.VibrationEffect createOneShot(long, int);
- method public static android.os.VibrationEffect createPrebaked(int);
+ method public static android.os.VibrationEffect createPredefined(int);
method public static android.os.VibrationEffect createWaveform(long[], int);
method public static android.os.VibrationEffect createWaveform(long[], int[], int);
method public int describeContents();
@@ -38406,14 +38407,12 @@ package android.provider {
public final class MediaStore {
ctor public MediaStore();
- method @NonNull public static android.net.Uri createPending(@NonNull android.content.Context, @NonNull android.provider.MediaStore.PendingParams);
method @NonNull public static java.util.Set<java.lang.String> getAllVolumeNames(android.content.Context);
method public static android.net.Uri getDocumentUri(android.content.Context, android.net.Uri);
method public static android.net.Uri getMediaScannerUri();
method public static android.net.Uri getMediaUri(android.content.Context, android.net.Uri);
method public static String getVersion(android.content.Context);
method @NonNull public static String getVolumeName(@NonNull android.net.Uri);
- method @NonNull public static android.provider.MediaStore.PendingSession openPending(@NonNull android.content.Context, @NonNull android.net.Uri);
method @NonNull public static android.net.Uri setIncludePending(@NonNull android.net.Uri);
method @NonNull public static android.net.Uri setRequireOriginal(@NonNull android.net.Uri);
field public static final String ACTION_IMAGE_CAPTURE = "android.media.action.IMAGE_CAPTURE";
@@ -38602,10 +38601,10 @@ package android.provider {
}
public static final class MediaStore.Downloads implements android.provider.MediaStore.DownloadColumns {
- method public static android.net.Uri getContentUri(String);
+ method @NonNull public static android.net.Uri getContentUri(@NonNull String);
field public static final String CONTENT_TYPE = "vnd.android.cursor.dir/download";
- field public static final android.net.Uri EXTERNAL_CONTENT_URI;
- field public static final android.net.Uri INTERNAL_CONTENT_URI;
+ field @NonNull public static final android.net.Uri EXTERNAL_CONTENT_URI;
+ field @NonNull public static final android.net.Uri INTERNAL_CONTENT_URI;
}
public static final class MediaStore.Files {
@@ -38686,6 +38685,7 @@ package android.provider {
public static interface MediaStore.MediaColumns extends android.provider.BaseColumns {
field @Deprecated public static final String DATA = "_data";
field public static final String DATE_ADDED = "date_added";
+ field public static final String DATE_EXPIRES = "date_expires";
field public static final String DATE_MODIFIED = "date_modified";
field public static final String DISPLAY_NAME = "_display_name";
field public static final String DOCUMENT_ID = "document_id";
@@ -38702,23 +38702,6 @@ package android.provider {
field public static final String WIDTH = "width";
}
- public static class MediaStore.PendingParams {
- ctor public MediaStore.PendingParams(@NonNull android.net.Uri, @NonNull String, @NonNull String);
- method public void setDownloadUri(@Nullable android.net.Uri);
- method public void setPrimaryDirectory(@Nullable String);
- method public void setRefererUri(@Nullable android.net.Uri);
- method public void setSecondaryDirectory(@Nullable String);
- }
-
- public static class MediaStore.PendingSession implements java.lang.AutoCloseable {
- method public void abandon();
- method public void close();
- method public void notifyProgress(@IntRange(from=0, to=100) int);
- method @NonNull public android.os.ParcelFileDescriptor open() throws java.io.FileNotFoundException;
- method @NonNull public java.io.OutputStream openOutputStream() throws java.io.FileNotFoundException;
- method @NonNull public android.net.Uri publish();
- }
-
public static final class MediaStore.Video {
ctor public MediaStore.Video();
method @Deprecated public static android.database.Cursor query(android.content.ContentResolver, android.net.Uri, String[]);
@@ -39257,7 +39240,7 @@ package android.provider {
}
public static final class Telephony.CarrierId implements android.provider.BaseColumns {
- method public static android.net.Uri getPreciseCarrierIdUriForSubscriptionId(int);
+ method @NonNull public static android.net.Uri getPreciseCarrierIdUriForSubscriptionId(int);
method public static android.net.Uri getUriForSubscriptionId(int);
field public static final String CARRIER_ID = "carrier_id";
field public static final String CARRIER_NAME = "carrier_name";
@@ -41192,8 +41175,9 @@ package android.service.autofill {
public final class FillContext implements android.os.Parcelable {
method public int describeContents();
+ method @NonNull public android.view.autofill.AutofillId getFocusedId();
method public int getRequestId();
- method public android.app.assist.AssistStructure getStructure();
+ method @NonNull public android.app.assist.AssistStructure getStructure();
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.service.autofill.FillContext> CREATOR;
}
@@ -41385,10 +41369,10 @@ package android.service.autofill {
field public static final android.os.Parcelable.Creator<android.service.autofill.VisibilitySetterAction> CREATOR;
}
- public static class VisibilitySetterAction.Builder {
+ public static final class VisibilitySetterAction.Builder {
ctor public VisibilitySetterAction.Builder(@IdRes int, int);
- method public android.service.autofill.VisibilitySetterAction build();
- method public android.service.autofill.VisibilitySetterAction.Builder setVisibility(@IdRes int, int);
+ method @NonNull public android.service.autofill.VisibilitySetterAction build();
+ method @NonNull public android.service.autofill.VisibilitySetterAction.Builder setVisibility(@IdRes int, int);
}
}
@@ -41414,7 +41398,7 @@ package android.service.carrier {
public class CarrierMessagingClientService extends android.app.Service {
ctor public CarrierMessagingClientService();
- method public final android.os.IBinder onBind(android.content.Intent);
+ method @NonNull public final android.os.IBinder onBind(@Nullable android.content.Intent);
}
public abstract class CarrierMessagingService extends android.app.Service {
@@ -42518,6 +42502,7 @@ package android.system {
method public static void chown(String, int, int) throws android.system.ErrnoException;
method public static void close(java.io.FileDescriptor) throws android.system.ErrnoException;
method public static void connect(java.io.FileDescriptor, java.net.InetAddress, int) throws android.system.ErrnoException, java.net.SocketException;
+ method public static void connect(java.io.FileDescriptor, java.net.SocketAddress) throws android.system.ErrnoException, java.net.SocketException;
method public static java.io.FileDescriptor dup(java.io.FileDescriptor) throws android.system.ErrnoException;
method public static java.io.FileDescriptor dup2(java.io.FileDescriptor, int) throws android.system.ErrnoException;
method public static String[] environ();
@@ -44486,6 +44471,7 @@ package android.telephony {
field public static final int CONNECTION_UNKNOWN = 2147483647; // 0x7fffffff
field public static final android.os.Parcelable.Creator<android.telephony.CellInfo> CREATOR;
field public static final int UNAVAILABLE = 2147483647; // 0x7fffffff
+ field public static final long UNAVAILABLE_LONG = 9223372036854775807L; // 0x7fffffffffffffffL
}
public final class CellInfoCdma extends android.telephony.CellInfo implements android.os.Parcelable {
@@ -45064,7 +45050,7 @@ package android.telephony {
method public boolean isNetworkRoaming(int);
method public static boolean isUsableSubscriptionId(int);
method public static boolean isValidSubscriptionId(int);
- method public void removeOnOpportunisticSubscriptionsChangedListener(android.telephony.SubscriptionManager.OnOpportunisticSubscriptionsChangedListener);
+ method public void removeOnOpportunisticSubscriptionsChangedListener(@NonNull android.telephony.SubscriptionManager.OnOpportunisticSubscriptionsChangedListener);
method public void removeOnSubscriptionsChangedListener(android.telephony.SubscriptionManager.OnSubscriptionsChangedListener);
method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public boolean removeSubscriptionsFromGroup(@NonNull int[]);
method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public boolean setMetered(boolean, int);
@@ -45073,7 +45059,7 @@ package android.telephony {
method public void setSubscriptionOverrideCongested(int, boolean, long);
method public void setSubscriptionOverrideUnmetered(int, boolean, long);
method public void setSubscriptionPlans(int, @NonNull java.util.List<android.telephony.SubscriptionPlan>);
- method @RequiresPermission("android.permission.WRITE_EMBEDDED_SUBSCRIPTIONS") public void switchToSubscription(int, android.app.PendingIntent);
+ method @RequiresPermission("android.permission.WRITE_EMBEDDED_SUBSCRIPTIONS") public void switchToSubscription(int, @NonNull android.app.PendingIntent);
field public static final String ACTION_DEFAULT_SMS_SUBSCRIPTION_CHANGED = "android.telephony.action.DEFAULT_SMS_SUBSCRIPTION_CHANGED";
field public static final String ACTION_DEFAULT_SUBSCRIPTION_CHANGED = "android.telephony.action.DEFAULT_SUBSCRIPTION_CHANGED";
field public static final String ACTION_MANAGE_SUBSCRIPTION_PLANS = "android.telephony.action.MANAGE_SUBSCRIPTION_PLANS";
@@ -45182,7 +45168,7 @@ package android.telephony {
method @RequiresPermission("android.permission.READ_PRIVILEGED_PHONE_STATE") public String getSubscriberId();
method public String getTypeAllocationCode();
method public String getTypeAllocationCode(int);
- method @RequiresPermission("android.permission.READ_PRIVILEGED_PHONE_STATE") public java.util.List<android.telephony.UiccCardInfo> getUiccCardsInfo();
+ method @RequiresPermission("android.permission.READ_PRIVILEGED_PHONE_STATE") @NonNull public java.util.List<android.telephony.UiccCardInfo> getUiccCardsInfo();
method @Nullable @RequiresPermission(android.Manifest.permission.READ_PHONE_STATE) public String getVisualVoicemailPackageName();
method @RequiresPermission(android.Manifest.permission.READ_PHONE_STATE) public String getVoiceMailAlphaTag();
method @RequiresPermission(android.Manifest.permission.READ_PHONE_STATE) public String getVoiceMailNumber();
@@ -45355,8 +45341,8 @@ package android.telephony {
public final class UiccCardInfo implements android.os.Parcelable {
method public int describeContents();
method public int getCardId();
- method public String getEid();
- method public String getIccId();
+ method @Nullable public String getEid();
+ method @Nullable public String getIccId();
method public int getSlotIndex();
method public boolean isEuicc();
method public boolean isRemovable();
@@ -50518,6 +50504,7 @@ package android.view {
method public android.animation.StateListAnimator getStateListAnimator();
method protected int getSuggestedMinimumHeight();
method protected int getSuggestedMinimumWidth();
+ method @NonNull public java.util.List<android.graphics.Rect> getSystemGestureExclusionRects();
method public int getSystemUiVisibility();
method @android.view.ViewDebug.ExportedProperty public Object getTag();
method public Object getTag(int);
@@ -50856,6 +50843,7 @@ package android.view {
method public void setSelected(boolean);
method public void setSoundEffectsEnabled(boolean);
method public void setStateListAnimator(android.animation.StateListAnimator);
+ method public void setSystemGestureExclusionRects(@NonNull java.util.List<android.graphics.Rect>);
method public void setSystemUiVisibility(int);
method public void setTag(Object);
method public void setTag(int, Object);
@@ -51684,6 +51672,7 @@ package android.view {
method public void addOnGlobalLayoutListener(android.view.ViewTreeObserver.OnGlobalLayoutListener);
method public void addOnPreDrawListener(android.view.ViewTreeObserver.OnPreDrawListener);
method public void addOnScrollChangedListener(android.view.ViewTreeObserver.OnScrollChangedListener);
+ method public void addOnSystemGestureExclusionRectsChangedListener(java.util.function.Consumer<java.util.List<android.graphics.Rect>>);
method public void addOnTouchModeChangeListener(android.view.ViewTreeObserver.OnTouchModeChangeListener);
method public void addOnWindowAttachListener(android.view.ViewTreeObserver.OnWindowAttachListener);
method public void addOnWindowFocusChangeListener(android.view.ViewTreeObserver.OnWindowFocusChangeListener);
@@ -51698,6 +51687,7 @@ package android.view {
method public void removeOnGlobalLayoutListener(android.view.ViewTreeObserver.OnGlobalLayoutListener);
method public void removeOnPreDrawListener(android.view.ViewTreeObserver.OnPreDrawListener);
method public void removeOnScrollChangedListener(android.view.ViewTreeObserver.OnScrollChangedListener);
+ method public void removeOnSystemGestureExclusionRectsChangedListener(java.util.function.Consumer<java.util.List<android.graphics.Rect>>);
method public void removeOnTouchModeChangeListener(android.view.ViewTreeObserver.OnTouchModeChangeListener);
method public void removeOnWindowAttachListener(android.view.ViewTreeObserver.OnWindowAttachListener);
method public void removeOnWindowFocusChangeListener(android.view.ViewTreeObserver.OnWindowFocusChangeListener);
@@ -53039,7 +53029,7 @@ package android.view.contentcapture {
public final class ContentCaptureContext implements android.os.Parcelable {
method public int describeContents();
- method public static android.view.contentcapture.ContentCaptureContext forLocusId(@NonNull android.net.Uri);
+ method @NonNull public static android.view.contentcapture.ContentCaptureContext forLocusId(@NonNull android.net.Uri);
method @Nullable public android.os.Bundle getExtras();
method @NonNull public android.content.LocusId getLocusId();
method public void writeToParcel(android.os.Parcel, int);
@@ -53048,7 +53038,7 @@ package android.view.contentcapture {
public static final class ContentCaptureContext.Builder {
ctor public ContentCaptureContext.Builder(@NonNull android.content.LocusId);
- method public android.view.contentcapture.ContentCaptureContext build();
+ method @NonNull public android.view.contentcapture.ContentCaptureContext build();
method @NonNull public android.view.contentcapture.ContentCaptureContext.Builder setExtras(@NonNull android.os.Bundle);
}
@@ -53064,7 +53054,7 @@ package android.view.contentcapture {
method @NonNull public final android.view.contentcapture.ContentCaptureSession createContentCaptureSession(@NonNull android.view.contentcapture.ContentCaptureContext);
method public final void destroy();
method @Nullable public final android.view.contentcapture.ContentCaptureContext getContentCaptureContext();
- method public final android.view.contentcapture.ContentCaptureSessionId getContentCaptureSessionId();
+ method @NonNull public final android.view.contentcapture.ContentCaptureSessionId getContentCaptureSessionId();
method @NonNull public android.view.autofill.AutofillId newAutofillId(@NonNull android.view.autofill.AutofillId, long);
method @NonNull public final android.view.ViewStructure newVirtualViewStructure(@NonNull android.view.autofill.AutofillId, long);
method public final void notifyViewAppeared(@NonNull android.view.ViewStructure);
@@ -53091,7 +53081,7 @@ package android.view.contentcapture {
public static final class UserDataRemovalRequest.Builder {
ctor public UserDataRemovalRequest.Builder();
- method public android.view.contentcapture.UserDataRemovalRequest.Builder addLocusId(@NonNull android.content.LocusId, boolean);
+ method @NonNull public android.view.contentcapture.UserDataRemovalRequest.Builder addLocusId(@NonNull android.content.LocusId, boolean);
method @NonNull public android.view.contentcapture.UserDataRemovalRequest build();
method @NonNull public android.view.contentcapture.UserDataRemovalRequest.Builder forEverything();
}
@@ -57776,16 +57766,16 @@ package android.widget {
method @Deprecated public void onZoom(boolean);
}
- public class ZoomControls extends android.widget.LinearLayout {
- ctor public ZoomControls(android.content.Context);
- ctor public ZoomControls(android.content.Context, android.util.AttributeSet);
- method public void hide();
- method public void setIsZoomInEnabled(boolean);
- method public void setIsZoomOutEnabled(boolean);
- method public void setOnZoomInClickListener(android.view.View.OnClickListener);
- method public void setOnZoomOutClickListener(android.view.View.OnClickListener);
- method public void setZoomSpeed(long);
- method public void show();
+ @Deprecated public class ZoomControls extends android.widget.LinearLayout {
+ ctor @Deprecated public ZoomControls(android.content.Context);
+ ctor @Deprecated public ZoomControls(android.content.Context, android.util.AttributeSet);
+ method @Deprecated public void hide();
+ method @Deprecated public void setIsZoomInEnabled(boolean);
+ method @Deprecated public void setIsZoomOutEnabled(boolean);
+ method @Deprecated public void setOnZoomInClickListener(android.view.View.OnClickListener);
+ method @Deprecated public void setOnZoomOutClickListener(android.view.View.OnClickListener);
+ method @Deprecated public void setZoomSpeed(long);
+ method @Deprecated public void show();
}
}
diff --git a/api/removed.txt b/api/removed.txt
index c4ed871d0661..40b1316a2a5d 100644
--- a/api/removed.txt
+++ b/api/removed.txt
@@ -508,6 +508,8 @@ package android.provider {
}
public final class MediaStore {
+ method @Deprecated @NonNull public static android.net.Uri createPending(@NonNull android.content.Context, @NonNull android.provider.MediaStore.PendingParams);
+ method @Deprecated @NonNull public static android.provider.MediaStore.PendingSession openPending(@NonNull android.content.Context, @NonNull android.net.Uri);
method @Deprecated @NonNull public static android.net.Uri setIncludeTrashed(@NonNull android.net.Uri);
method @Deprecated public static void trash(@NonNull android.content.Context, @NonNull android.net.Uri);
method @Deprecated public static void trash(@NonNull android.content.Context, @NonNull android.net.Uri, long);
@@ -515,11 +517,27 @@ package android.provider {
}
public static interface MediaStore.MediaColumns extends android.provider.BaseColumns {
- field @Deprecated public static final String DATE_EXPIRES = "date_expires";
field @Deprecated public static final String HASH = "_hash";
field @Deprecated public static final String IS_TRASHED = "is_trashed";
}
+ @Deprecated public static class MediaStore.PendingParams {
+ ctor public MediaStore.PendingParams(@NonNull android.net.Uri, @NonNull String, @NonNull String);
+ method public void setDownloadUri(@Nullable android.net.Uri);
+ method public void setPrimaryDirectory(@Nullable String);
+ method public void setRefererUri(@Nullable android.net.Uri);
+ method public void setSecondaryDirectory(@Nullable String);
+ }
+
+ @Deprecated public static class MediaStore.PendingSession implements java.lang.AutoCloseable {
+ method public void abandon();
+ method public void close();
+ method public void notifyProgress(@IntRange(from=0, to=100) int);
+ method @NonNull public android.os.ParcelFileDescriptor open() throws java.io.FileNotFoundException;
+ method @NonNull public java.io.OutputStream openOutputStream() throws java.io.FileNotFoundException;
+ method @NonNull public android.net.Uri publish();
+ }
+
public static final class Settings.Global extends android.provider.Settings.NameValueTable {
field @Deprecated public static final String CONTACT_METADATA_SYNC = "contact_metadata_sync";
}
diff --git a/api/system-current.txt b/api/system-current.txt
index dc418989d3eb..8325cbca4032 100644
--- a/api/system-current.txt
+++ b/api/system-current.txt
@@ -565,12 +565,12 @@ package android.app {
}
public class StatusBarManager {
- method public android.app.StatusBarManager.DisableInfo getDisableInfo();
- method public void setDisabledForSetup(boolean);
+ method @NonNull @RequiresPermission(android.Manifest.permission.STATUS_BAR) public android.app.StatusBarManager.DisableInfo getDisableInfo();
+ method @RequiresPermission(android.Manifest.permission.STATUS_BAR) public void setDisabledForSetup(boolean);
}
public static final class StatusBarManager.DisableInfo {
- method public boolean areNoComponentsDisabled();
+ method public boolean areAllComponentsEnabled();
method public boolean isNavigateToHomeDisabled();
method public boolean isNotificationPeekingDisabled();
method public boolean isRecentsDisabled();
@@ -1906,12 +1906,12 @@ package android.hardware.display {
public static class BrightnessConfiguration.Builder {
ctor public BrightnessConfiguration.Builder(float[], float[]);
- method public android.hardware.display.BrightnessConfiguration.Builder addCorrectionByCategory(int, @NonNull android.hardware.display.BrightnessCorrection);
- method public android.hardware.display.BrightnessConfiguration.Builder addCorrectionByPackageName(@NonNull String, @NonNull android.hardware.display.BrightnessCorrection);
- method public android.hardware.display.BrightnessConfiguration build();
+ method @NonNull public android.hardware.display.BrightnessConfiguration.Builder addCorrectionByCategory(int, @NonNull android.hardware.display.BrightnessCorrection);
+ method @NonNull public android.hardware.display.BrightnessConfiguration.Builder addCorrectionByPackageName(@NonNull String, @NonNull android.hardware.display.BrightnessCorrection);
+ method @NonNull public android.hardware.display.BrightnessConfiguration build();
method public int getMaxCorrectionsByCategory();
method public int getMaxCorrectionsByPackageName();
- method public android.hardware.display.BrightnessConfiguration.Builder setDescription(@Nullable String);
+ method @NonNull public android.hardware.display.BrightnessConfiguration.Builder setDescription(@Nullable String);
}
public final class BrightnessCorrection implements android.os.Parcelable {
@@ -3456,15 +3456,22 @@ package android.media {
method public void clearAudioServerStateCallback();
method @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) public int dispatchAudioFocusChange(@NonNull android.media.AudioFocusInfo, int, @NonNull android.media.audiopolicy.AudioPolicy);
method @NonNull @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) public android.media.audiopolicy.AudioProductStrategies getAudioProductStrategies();
+ method @NonNull @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) public android.media.audiopolicy.AudioVolumeGroups getAudioVolumeGroups();
+ method @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) public int getMaxVolumeIndexForAttributes(@NonNull android.media.AudioAttributes);
+ method @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) public int getMinVolumeIndexForAttributes(@NonNull android.media.AudioAttributes);
+ method @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) public int getVolumeIndexForAttributes(@NonNull android.media.AudioAttributes);
method public boolean isAudioServerRunning();
method public boolean isHdmiSystemAudioSupported();
method @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) public int registerAudioPolicy(@NonNull android.media.audiopolicy.AudioPolicy);
+ method public void registerVolumeGroupCallback(@NonNull java.util.concurrent.Executor, @NonNull android.media.AudioManager.VolumeGroupCallback);
method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public int requestAudioFocus(android.media.AudioManager.OnAudioFocusChangeListener, @NonNull android.media.AudioAttributes, int, int) throws java.lang.IllegalArgumentException;
method @Deprecated @RequiresPermission(anyOf={android.Manifest.permission.MODIFY_PHONE_STATE, android.Manifest.permission.MODIFY_AUDIO_ROUTING}) public int requestAudioFocus(android.media.AudioManager.OnAudioFocusChangeListener, @NonNull android.media.AudioAttributes, int, int, android.media.audiopolicy.AudioPolicy) throws java.lang.IllegalArgumentException;
method @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) public int requestAudioFocus(@NonNull android.media.AudioFocusRequest, @Nullable android.media.audiopolicy.AudioPolicy);
method public void setAudioServerStateCallback(@NonNull java.util.concurrent.Executor, @NonNull android.media.AudioManager.AudioServerStateCallback);
method @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) public void setFocusRequestResult(@NonNull android.media.AudioFocusInfo, int, @NonNull android.media.audiopolicy.AudioPolicy);
+ method @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) public void setVolumeIndexForAttributes(@NonNull android.media.AudioAttributes, int, int);
method @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) public void unregisterAudioPolicyAsync(@NonNull android.media.audiopolicy.AudioPolicy);
+ method public void unregisterVolumeGroupCallback(@NonNull android.media.AudioManager.VolumeGroupCallback);
field public static final int AUDIOFOCUS_FLAG_DELAY_OK = 1; // 0x1
field public static final int AUDIOFOCUS_FLAG_LOCK = 4; // 0x4
field public static final int AUDIOFOCUS_FLAG_PAUSES_ON_DUCKABLE_LOSS = 2; // 0x2
@@ -3478,6 +3485,11 @@ package android.media {
method public void onAudioServerUp();
}
+ public abstract static class AudioManager.VolumeGroupCallback {
+ ctor public AudioManager.VolumeGroupCallback();
+ method public void onAudioVolumeGroupChanged(int, int);
+ }
+
public final class AudioPlaybackConfiguration implements android.os.Parcelable {
method public int getClientPid();
method public int getClientUid();
@@ -3649,6 +3661,8 @@ package android.media.audiopolicy {
method @Nullable public android.media.audiopolicy.AudioProductStrategy getById(int);
method public int getLegacyStreamTypeForAudioAttributes(@NonNull android.media.AudioAttributes);
method @Nullable public android.media.audiopolicy.AudioProductStrategy getProductStrategyForAudioAttributes(@NonNull android.media.AudioAttributes);
+ method public int getVolumeGroupIdForAttributes(@NonNull android.media.AudioAttributes);
+ method public int getVolumeGroupIdForLegacyStreamType(int);
method public java.util.Iterator<android.media.audiopolicy.AudioProductStrategy> iterator();
method public int size();
method public void writeToParcel(@NonNull android.os.Parcel, int);
@@ -3664,6 +3678,27 @@ package android.media.audiopolicy {
field public static final android.os.Parcelable.Creator<android.media.audiopolicy.AudioProductStrategy> CREATOR;
}
+ public final class AudioVolumeGroup implements android.os.Parcelable {
+ method public int describeContents();
+ method public java.util.List<android.media.AudioAttributes> getAudioAttributes();
+ method public int getId();
+ method @NonNull public int[] getLegacyStreamTypes();
+ method @NonNull public String name();
+ method public void writeToParcel(@NonNull android.os.Parcel, int);
+ field public static final android.os.Parcelable.Creator<android.media.audiopolicy.AudioVolumeGroup> CREATOR;
+ }
+
+ public final class AudioVolumeGroups implements java.lang.Iterable<android.media.audiopolicy.AudioVolumeGroup> android.os.Parcelable {
+ ctor public AudioVolumeGroups();
+ method public int describeContents();
+ method @Nullable public android.media.audiopolicy.AudioVolumeGroup getById(int);
+ method public java.util.Iterator<android.media.audiopolicy.AudioVolumeGroup> iterator();
+ method public int size();
+ method public void writeToParcel(@NonNull android.os.Parcel, int);
+ field public static final android.os.Parcelable.Creator<android.media.audiopolicy.AudioVolumeGroups> CREATOR;
+ field public static final int DEFAULT_VOLUME_GROUP = -1; // 0xffffffff
+ }
+
}
package android.media.session {
@@ -5791,10 +5826,16 @@ package android.provider {
public final class DeviceConfig {
method @RequiresPermission(android.Manifest.permission.READ_DEVICE_CONFIG) public static void addOnPropertyChangedListener(@NonNull String, @NonNull java.util.concurrent.Executor, @NonNull android.provider.DeviceConfig.OnPropertyChangedListener);
+ method @RequiresPermission(android.Manifest.permission.READ_DEVICE_CONFIG) public static boolean getBoolean(String, String, boolean);
+ method @RequiresPermission(android.Manifest.permission.READ_DEVICE_CONFIG) public static float getFloat(String, String, float);
+ method @RequiresPermission(android.Manifest.permission.READ_DEVICE_CONFIG) public static int getInt(String, String, int);
+ method @RequiresPermission(android.Manifest.permission.READ_DEVICE_CONFIG) public static long getLong(String, String, long);
method @RequiresPermission(android.Manifest.permission.READ_DEVICE_CONFIG) public static String getProperty(String, String);
+ method @RequiresPermission(android.Manifest.permission.READ_DEVICE_CONFIG) public static String getString(String, String, String);
method public static void removeOnPropertyChangedListener(android.provider.DeviceConfig.OnPropertyChangedListener);
method @RequiresPermission(android.Manifest.permission.WRITE_DEVICE_CONFIG) public static void resetToDefaults(int, @Nullable String);
method @RequiresPermission(android.Manifest.permission.WRITE_DEVICE_CONFIG) public static boolean setProperty(String, String, String, boolean);
+ field public static final String NAMESPACE_ACTIVITY_MANAGER = "activity_manager";
field public static final String NAMESPACE_AUTOFILL = "autofill";
field public static final String NAMESPACE_CONTENT_CAPTURE = "content_capture";
field public static final String NAMESPACE_GAME_DRIVER = "game_driver";
@@ -5803,19 +5844,6 @@ package android.provider {
field public static final String NAMESPACE_SYSTEMUI = "systemui";
}
- public static interface DeviceConfig.ActivityManager {
- field public static final String KEY_COMPACT_ACTION_1 = "compact_action_1";
- field public static final String KEY_COMPACT_ACTION_2 = "compact_action_2";
- field public static final String KEY_COMPACT_STATSD_SAMPLE_RATE = "compact_statsd_sample_rate";
- field public static final String KEY_COMPACT_THROTTLE_1 = "compact_throttle_1";
- field public static final String KEY_COMPACT_THROTTLE_2 = "compact_throttle_2";
- field public static final String KEY_COMPACT_THROTTLE_3 = "compact_throttle_3";
- field public static final String KEY_COMPACT_THROTTLE_4 = "compact_throttle_4";
- field public static final String KEY_MAX_CACHED_PROCESSES = "max_cached_processes";
- field public static final String KEY_USE_COMPACTION = "use_compaction";
- field public static final String NAMESPACE = "activity_manager";
- }
-
public static interface DeviceConfig.ActivityManagerNativeBoot {
field public static final String NAMESPACE = "activity_manager_native_boot";
field public static final String OFFLOAD_QUEUE_ENABLED = "offload_queue_enabled";
@@ -6365,9 +6393,8 @@ package android.service.autofill.augmented {
public static final class FillResponse.Builder {
ctor public FillResponse.Builder();
- method public android.service.autofill.augmented.FillResponse build();
- method public android.service.autofill.augmented.FillResponse.Builder setFillWindow(@NonNull android.service.autofill.augmented.FillWindow);
- method public android.service.autofill.augmented.FillResponse.Builder setIgnoredIds(@NonNull java.util.List<android.view.autofill.AutofillId>);
+ method @NonNull public android.service.autofill.augmented.FillResponse build();
+ method @NonNull public android.service.autofill.augmented.FillResponse.Builder setFillWindow(@NonNull android.service.autofill.augmented.FillWindow);
}
public final class FillWindow implements java.lang.AutoCloseable {
@@ -6415,9 +6442,9 @@ package android.service.contentcapture {
public final class SnapshotData implements android.os.Parcelable {
method public int describeContents();
- method public android.app.assist.AssistContent getAssistContent();
- method public android.os.Bundle getAssistData();
- method public android.app.assist.AssistStructure getAssistStructure();
+ method @Nullable public android.app.assist.AssistContent getAssistContent();
+ method @NonNull public android.os.Bundle getAssistData();
+ method @NonNull public android.app.assist.AssistStructure getAssistStructure();
method public void writeToParcel(@NonNull android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.service.contentcapture.SnapshotData> CREATOR;
}
@@ -7661,7 +7688,7 @@ package android.telephony {
method @RequiresPermission("android.permission.READ_PRECISE_PHONE_STATE") public void onCallDisconnectCauseChanged(int, int);
method @RequiresPermission("android.permission.READ_PRECISE_PHONE_STATE") public void onImsCallDisconnectCauseChanged(@NonNull android.telephony.ims.ImsReasonInfo);
method @RequiresPermission("android.permission.READ_PRECISE_PHONE_STATE") public void onPreciseCallStateChanged(@NonNull android.telephony.PreciseCallState);
- method @RequiresPermission("android.permission.READ_PRECISE_PHONE_STATE") public void onPreciseDataConnectionStateChanged(android.telephony.PreciseDataConnectionState);
+ method @RequiresPermission("android.permission.READ_PRECISE_PHONE_STATE") public void onPreciseDataConnectionStateChanged(@NonNull android.telephony.PreciseDataConnectionState);
method public void onRadioPowerStateChanged(int);
method public void onSrvccStateChanged(int);
method public void onVoiceActivationStateChanged(int);
@@ -7696,7 +7723,7 @@ package android.telephony {
public final class PreciseDataConnectionState implements android.os.Parcelable {
method public int describeContents();
- method public String getDataConnectionApn();
+ method @Nullable public String getDataConnectionApn();
method public int getDataConnectionApnTypeBitMask();
method public int getDataConnectionFailCause();
method public int getDataConnectionState();
@@ -7851,17 +7878,17 @@ package android.telephony {
method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void setDefaultSmsSubId(int);
method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void setPreferredDataSubscriptionId(int, boolean, @NonNull java.util.concurrent.Executor, java.util.function.Consumer<java.lang.Integer>);
method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public boolean setSubscriptionEnabled(int, boolean);
- field public static final android.net.Uri ADVANCED_CALLING_ENABLED_CONTENT_URI;
+ field @NonNull public static final android.net.Uri ADVANCED_CALLING_ENABLED_CONTENT_URI;
field public static final int PROFILE_CLASS_DEFAULT = -1; // 0xffffffff
field public static final int PROFILE_CLASS_OPERATIONAL = 2; // 0x2
field public static final int PROFILE_CLASS_PROVISIONING = 1; // 0x1
field public static final int PROFILE_CLASS_TESTING = 0; // 0x0
field public static final int PROFILE_CLASS_UNSET = -1; // 0xffffffff
- field public static final android.net.Uri VT_ENABLED_CONTENT_URI;
- field public static final android.net.Uri WFC_ENABLED_CONTENT_URI;
- field public static final android.net.Uri WFC_MODE_CONTENT_URI;
- field public static final android.net.Uri WFC_ROAMING_ENABLED_CONTENT_URI;
- field public static final android.net.Uri WFC_ROAMING_MODE_CONTENT_URI;
+ field @NonNull public static final android.net.Uri VT_ENABLED_CONTENT_URI;
+ field @NonNull public static final android.net.Uri WFC_ENABLED_CONTENT_URI;
+ field @NonNull public static final android.net.Uri WFC_MODE_CONTENT_URI;
+ field @NonNull public static final android.net.Uri WFC_ROAMING_ENABLED_CONTENT_URI;
+ field @NonNull public static final android.net.Uri WFC_ROAMING_MODE_CONTENT_URI;
}
public static class SubscriptionPlan.Builder {
@@ -8493,14 +8520,14 @@ package android.telephony.ims {
method @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public boolean isVtSettingEnabled();
method @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public void registerImsRegistrationCallback(java.util.concurrent.Executor, @NonNull android.telephony.ims.ImsMmTelManager.RegistrationCallback) throws android.telephony.ims.ImsException;
method @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public void registerMmTelCapabilityCallback(@NonNull java.util.concurrent.Executor, @NonNull android.telephony.ims.ImsMmTelManager.CapabilityCallback) throws android.telephony.ims.ImsException;
- method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void setAdvancedCallingSetting(boolean);
+ method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void setAdvancedCallingSettingEnabled(boolean);
method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void setRttCapabilitySetting(boolean);
method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void setVoWiFiModeSetting(int);
method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void setVoWiFiNonPersistent(boolean, int);
method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void setVoWiFiRoamingModeSetting(int);
- method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void setVoWiFiRoamingSetting(boolean);
- method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void setVoWiFiSetting(boolean);
- method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void setVtSetting(boolean);
+ method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void setVoWiFiRoamingSettingEnabled(boolean);
+ method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void setVoWiFiSettingEnabled(boolean);
+ method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void setVtSettingEnabled(boolean);
method @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public void unregisterImsRegistrationCallback(@NonNull android.telephony.ims.ImsMmTelManager.RegistrationCallback);
method @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public void unregisterMmTelCapabilityCallback(@NonNull android.telephony.ims.ImsMmTelManager.CapabilityCallback);
field public static final int WIFI_MODE_CELLULAR_PREFERRED = 1; // 0x1
@@ -8515,10 +8542,10 @@ package android.telephony.ims {
public static class ImsMmTelManager.RegistrationCallback {
ctor public ImsMmTelManager.RegistrationCallback();
- method public void onDeregistered(android.telephony.ims.ImsReasonInfo);
method public void onRegistered(int);
method public void onRegistering(int);
method public void onTechnologyChangeFailed(int, android.telephony.ims.ImsReasonInfo);
+ method public void onUnregistered(android.telephony.ims.ImsReasonInfo);
}
public final class ImsReasonInfo implements android.os.Parcelable {
@@ -9808,7 +9835,7 @@ package android.webkit {
method public default void onMovedToDisplay(int, android.content.res.Configuration);
method public void onOverScrolled(int, int, boolean, boolean);
method public default void onProvideAutofillVirtualStructure(android.view.ViewStructure, int);
- method public default void onProvideContentCaptureStructure(android.view.ViewStructure, int);
+ method public default void onProvideContentCaptureStructure(@NonNull android.view.ViewStructure, int);
method public void onProvideVirtualStructure(android.view.ViewStructure);
method public void onScrollChanged(int, int, int, int);
method public void onSizeChanged(int, int, int, int);
diff --git a/api/test-current.txt b/api/test-current.txt
index 1089761a3ab1..c5e535e65f9e 100644
--- a/api/test-current.txt
+++ b/api/test-current.txt
@@ -271,6 +271,10 @@ package android.app {
method public void onOpActiveChanged(int, int, String, boolean);
}
+ public class DownloadManager {
+ field public static final String COLUMN_MEDIASTORE_URI = "mediastore_uri";
+ }
+
public final class NotificationChannel implements android.os.Parcelable {
method public boolean isImportanceLockedByOEM();
method public void setImportanceLockedByOEM(boolean);
@@ -778,12 +782,12 @@ package android.hardware.display {
public static class BrightnessConfiguration.Builder {
ctor public BrightnessConfiguration.Builder(float[], float[]);
- method public android.hardware.display.BrightnessConfiguration.Builder addCorrectionByCategory(int, @NonNull android.hardware.display.BrightnessCorrection);
- method public android.hardware.display.BrightnessConfiguration.Builder addCorrectionByPackageName(@NonNull String, @NonNull android.hardware.display.BrightnessCorrection);
- method public android.hardware.display.BrightnessConfiguration build();
+ method @NonNull public android.hardware.display.BrightnessConfiguration.Builder addCorrectionByCategory(int, @NonNull android.hardware.display.BrightnessCorrection);
+ method @NonNull public android.hardware.display.BrightnessConfiguration.Builder addCorrectionByPackageName(@NonNull String, @NonNull android.hardware.display.BrightnessCorrection);
+ method @NonNull public android.hardware.display.BrightnessConfiguration build();
method public int getMaxCorrectionsByCategory();
method public int getMaxCorrectionsByPackageName();
- method public android.hardware.display.BrightnessConfiguration.Builder setDescription(@Nullable String);
+ method @NonNull public android.hardware.display.BrightnessConfiguration.Builder setDescription(@Nullable String);
}
public final class BrightnessCorrection implements android.os.Parcelable {
@@ -1921,7 +1925,12 @@ package android.provider {
public final class DeviceConfig {
method @RequiresPermission("android.permission.READ_DEVICE_CONFIG") public static void addOnPropertyChangedListener(@NonNull String, @NonNull java.util.concurrent.Executor, @NonNull android.provider.DeviceConfig.OnPropertyChangedListener);
+ method @RequiresPermission("android.permission.READ_DEVICE_CONFIG") public static boolean getBoolean(String, String, boolean);
+ method @RequiresPermission("android.permission.READ_DEVICE_CONFIG") public static float getFloat(String, String, float);
+ method @RequiresPermission("android.permission.READ_DEVICE_CONFIG") public static int getInt(String, String, int);
+ method @RequiresPermission("android.permission.READ_DEVICE_CONFIG") public static long getLong(String, String, long);
method @RequiresPermission("android.permission.READ_DEVICE_CONFIG") public static String getProperty(String, String);
+ method @RequiresPermission("android.permission.READ_DEVICE_CONFIG") public static String getString(String, String, String);
method public static void removeOnPropertyChangedListener(android.provider.DeviceConfig.OnPropertyChangedListener);
method @RequiresPermission("android.permission.WRITE_DEVICE_CONFIG") public static void resetToDefaults(int, @Nullable String);
method @RequiresPermission("android.permission.WRITE_DEVICE_CONFIG") public static boolean setProperty(String, String, String, boolean);
@@ -2203,9 +2212,8 @@ package android.service.autofill.augmented {
public static final class FillResponse.Builder {
ctor public FillResponse.Builder();
- method public android.service.autofill.augmented.FillResponse build();
- method public android.service.autofill.augmented.FillResponse.Builder setFillWindow(@NonNull android.service.autofill.augmented.FillWindow);
- method public android.service.autofill.augmented.FillResponse.Builder setIgnoredIds(@NonNull java.util.List<android.view.autofill.AutofillId>);
+ method @NonNull public android.service.autofill.augmented.FillResponse build();
+ method @NonNull public android.service.autofill.augmented.FillResponse.Builder setFillWindow(@NonNull android.service.autofill.augmented.FillWindow);
}
public final class FillWindow implements java.lang.AutoCloseable {
@@ -2243,9 +2251,9 @@ package android.service.contentcapture {
public final class SnapshotData implements android.os.Parcelable {
method public int describeContents();
- method public android.app.assist.AssistContent getAssistContent();
- method public android.os.Bundle getAssistData();
- method public android.app.assist.AssistStructure getAssistStructure();
+ method @Nullable public android.app.assist.AssistContent getAssistContent();
+ method @NonNull public android.os.Bundle getAssistData();
+ method @NonNull public android.app.assist.AssistStructure getAssistStructure();
method public void writeToParcel(@NonNull android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.service.contentcapture.SnapshotData> CREATOR;
}
diff --git a/cmds/idmap2/idmap2/Create.cpp b/cmds/idmap2/idmap2/Create.cpp
index 6703909d887e..c416fa123b73 100644
--- a/cmds/idmap2/idmap2/Create.cpp
+++ b/cmds/idmap2/idmap2/Create.cpp
@@ -28,7 +28,6 @@
#include "idmap2/FileUtils.h"
#include "idmap2/Idmap.h"
#include "idmap2/Policies.h"
-#include "idmap2/Result.h"
#include "idmap2/SysTrace.h"
using android::ApkAssets;
@@ -38,7 +37,6 @@ using android::idmap2::Idmap;
using android::idmap2::PoliciesToBitmask;
using android::idmap2::PolicyBitmask;
using android::idmap2::PolicyFlags;
-using android::idmap2::Result;
using android::idmap2::utils::kIdmapFilePermissionMask;
using android::idmap2::utils::UidHasWriteAccessToPath;
@@ -77,9 +75,11 @@ bool Create(const std::vector<std::string>& args, std::ostream& out_error) {
}
PolicyBitmask fulfilled_policies = 0;
- if (auto result = PoliciesToBitmask(policies, out_error)) {
- fulfilled_policies |= *result;
+ auto conv_result = PoliciesToBitmask(policies);
+ if (conv_result) {
+ fulfilled_policies |= *conv_result;
} else {
+ out_error << "error: " << conv_result.GetErrorMessage() << std::endl;
return false;
}
diff --git a/cmds/idmap2/idmap2/Lookup.cpp b/cmds/idmap2/idmap2/Lookup.cpp
index 553d8cac99e4..83a40efee3f3 100644
--- a/cmds/idmap2/idmap2/Lookup.cpp
+++ b/cmds/idmap2/idmap2/Lookup.cpp
@@ -53,6 +53,7 @@ using android::ResTable_config;
using android::StringPiece16;
using android::base::StringPrintf;
using android::idmap2::CommandLineOptions;
+using android::idmap2::Error;
using android::idmap2::IdmapHeader;
using android::idmap2::ResourceId;
using android::idmap2::Result;
@@ -71,17 +72,17 @@ Result<ResourceId> WARN_UNUSED ParseResReference(const AssetManager2& am, const
ResourceId resid;
resid = strtol(res.c_str(), &endptr, kBaseHex);
if (*endptr == '\0') {
- return {resid};
+ return resid;
}
// next, try to parse as a package:type/name string
resid = am.GetResourceId(res, "", fallback_package);
if (is_valid_resid(resid)) {
- return {resid};
+ return resid;
}
// end of the road: res could not be parsed
- return {};
+ return Error("failed to obtain resource id for %s", res.c_str());
}
Result<std::string> WARN_UNUSED GetValue(const AssetManager2& am, ResourceId resid) {
@@ -90,7 +91,7 @@ Result<std::string> WARN_UNUSED GetValue(const AssetManager2& am, ResourceId res
uint32_t flags;
ApkAssetsCookie cookie = am.GetResource(resid, false, 0, &value, &config, &flags);
if (cookie == kInvalidCookie) {
- return {};
+ return Error("no resource 0x%08x in asset manager", resid);
}
std::string out;
@@ -128,31 +129,31 @@ Result<std::string> WARN_UNUSED GetValue(const AssetManager2& am, ResourceId res
out.append(StringPrintf("dataType=0x%02x data=0x%08x", value.dataType, value.data));
break;
}
- return {out};
+ return out;
}
Result<std::string> GetTargetPackageNameFromManifest(const std::string& apk_path) {
const auto zip = ZipFile::Open(apk_path);
if (!zip) {
- return {};
+ return Error("failed to open %s as zip", apk_path.c_str());
}
const auto entry = zip->Uncompress("AndroidManifest.xml");
if (!entry) {
- return {};
+ return Error("failed to uncompress AndroidManifest.xml in %s", apk_path.c_str());
}
const auto xml = Xml::Create(entry->buf, entry->size);
if (!xml) {
- return {};
+ return Error("failed to create XML buffer");
}
const auto tag = xml->FindTag("overlay");
if (!tag) {
- return {};
+ return Error("failed to find <overlay> tag");
}
const auto iter = tag->find("targetPackage");
if (iter == tag->end()) {
- return {};
+ return Error("failed to find targetPackage attribute");
}
- return {iter->second};
+ return iter->second;
}
} // namespace
diff --git a/cmds/idmap2/idmap2/Scan.cpp b/cmds/idmap2/idmap2/Scan.cpp
index 873779f386f5..e5f6223ef2b4 100644
--- a/cmds/idmap2/idmap2/Scan.cpp
+++ b/cmds/idmap2/idmap2/Scan.cpp
@@ -142,9 +142,9 @@ bool Scan(const std::vector<std::string>& args, std::ostream& out_error) {
std::vector<InputOverlay> interesting_apks;
for (const std::string& path : *apk_paths) {
Result<OverlayManifestInfo> overlay_info =
- ExtractOverlayManifestInfo(path, out_error,
- /* assert_overlay */ false);
+ ExtractOverlayManifestInfo(path, /* assert_overlay */ false);
if (!overlay_info) {
+ out_error << "error: " << overlay_info.GetErrorMessage() << std::endl;
return false;
}
@@ -163,9 +163,11 @@ bool Scan(const std::vector<std::string>& args, std::ostream& out_error) {
PolicyBitmask fulfilled_policies;
if (!override_policies.empty()) {
- if (Result<PolicyBitmask> result = PoliciesToBitmask(override_policies, out_error)) {
- fulfilled_policies = *result;
+ auto conv_result = PoliciesToBitmask(override_policies);
+ if (conv_result) {
+ fulfilled_policies = *conv_result;
} else {
+ out_error << "error: " << conv_result.GetErrorMessage() << std::endl;
return false;
}
} else {
diff --git a/cmds/idmap2/idmap2d/Idmap2Service.cpp b/cmds/idmap2/idmap2d/Idmap2Service.cpp
index 0e4bd89e355c..fa944143e408 100644
--- a/cmds/idmap2/idmap2d/Idmap2Service.cpp
+++ b/cmds/idmap2/idmap2d/Idmap2Service.cpp
@@ -34,7 +34,6 @@
#include "idmap2/FileUtils.h"
#include "idmap2/Idmap.h"
#include "idmap2/Policies.h"
-#include "idmap2/Result.h"
#include "idmap2/SysTrace.h"
#include "idmap2d/Idmap2Service.h"
@@ -45,7 +44,6 @@ using android::idmap2::BinaryStreamVisitor;
using android::idmap2::Idmap;
using android::idmap2::IdmapHeader;
using android::idmap2::PolicyBitmask;
-using android::idmap2::Result;
using android::idmap2::utils::kIdmapCacheDir;
using android::idmap2::utils::kIdmapFilePermissionMask;
using android::idmap2::utils::UidHasWriteAccessToPath;
diff --git a/cmds/idmap2/include/idmap2/Policies.h b/cmds/idmap2/include/idmap2/Policies.h
index eecee25445e2..911d3f2cd109 100644
--- a/cmds/idmap2/include/idmap2/Policies.h
+++ b/cmds/idmap2/include/idmap2/Policies.h
@@ -14,7 +14,6 @@
* limitations under the License.
*/
-#include <ostream>
#include <string>
#include <vector>
@@ -33,8 +32,7 @@ using PolicyBitmask = uint32_t;
// Parses a the string representation of a set of policies into a bitmask. The format of the string
// is the same as for the <policy> element.
-Result<PolicyBitmask> PoliciesToBitmask(const std::vector<std::string>& policies,
- std::ostream& err);
+Result<PolicyBitmask> PoliciesToBitmask(const std::vector<std::string>& policies);
} // namespace android::idmap2
diff --git a/cmds/idmap2/include/idmap2/ResourceUtils.h b/cmds/idmap2/include/idmap2/ResourceUtils.h
index 22827ac45f9b..1d81c486d504 100644
--- a/cmds/idmap2/include/idmap2/ResourceUtils.h
+++ b/cmds/idmap2/include/idmap2/ResourceUtils.h
@@ -18,10 +18,8 @@
#define IDMAP2_INCLUDE_IDMAP2_RESOURCEUTILS_H_
#include <optional>
-#include <ostream>
#include <string>
-#include "android-base/macros.h"
#include "androidfw/AssetManager2.h"
#include "idmap2/Idmap.h"
@@ -38,10 +36,9 @@ struct OverlayManifestInfo {
};
Result<OverlayManifestInfo> ExtractOverlayManifestInfo(const std::string& path,
- std::ostream& out_error,
bool assert_overlay = true);
-Result<std::string> WARN_UNUSED ResToTypeEntryName(const AssetManager2& am, ResourceId resid);
+Result<std::string> ResToTypeEntryName(const AssetManager2& am, ResourceId resid);
} // namespace android::idmap2::utils
diff --git a/cmds/idmap2/include/idmap2/Result.h b/cmds/idmap2/include/idmap2/Result.h
index d88dd5179610..41b15ebf4afc 100644
--- a/cmds/idmap2/include/idmap2/Result.h
+++ b/cmds/idmap2/include/idmap2/Result.h
@@ -17,7 +17,6 @@
#ifndef IDMAP2_INCLUDE_IDMAP2_RESULT_H_
#define IDMAP2_INCLUDE_IDMAP2_RESULT_H_
-#include <optional>
#include <string>
#include <utility>
#include <variant>
@@ -26,13 +25,6 @@
namespace android::idmap2 {
-template <typename T>
-using Result = std::optional<T>;
-
-static constexpr std::nullopt_t kResultError = std::nullopt;
-
-namespace v2 {
-
using Unit = std::monostate;
class Error {
@@ -148,8 +140,6 @@ inline bool Result<T>::is_ok() const {
return std::holds_alternative<T>(data_);
}
-} // namespace v2
-
} // namespace android::idmap2
#endif // IDMAP2_INCLUDE_IDMAP2_RESULT_H_
diff --git a/cmds/idmap2/libidmap2/Idmap.cpp b/cmds/idmap2/libidmap2/Idmap.cpp
index ec498ffb393c..a1341fb001f6 100644
--- a/cmds/idmap2/libidmap2/Idmap.cpp
+++ b/cmds/idmap2/libidmap2/Idmap.cpp
@@ -121,7 +121,9 @@ const LoadedPackage* GetPackageAtIndex0(const LoadedArsc& loaded_arsc) {
Result<uint32_t> GetCrc(const ZipFile& zip) {
const Result<uint32_t> a = zip.Crc("resources.arsc");
const Result<uint32_t> b = zip.Crc("AndroidManifest.xml");
- return a && b ? Result<uint32_t>(*a ^ *b) : kResultError;
+ return a && b
+ ? Result<uint32_t>(*a ^ *b)
+ : Error("Couldn't get CRC for \"%s\"", a ? "AndroidManifest.xml" : "resources.arsc");
}
} // namespace
@@ -355,9 +357,9 @@ std::unique_ptr<const Idmap> Idmap::FromApkAssets(
return nullptr;
}
- Result<utils::OverlayManifestInfo> overlay_info =
- utils::ExtractOverlayManifestInfo(overlay_apk_path, out_error);
+ auto overlay_info = utils::ExtractOverlayManifestInfo(overlay_apk_path);
if (!overlay_info) {
+ out_error << "error: " << overlay_info.GetErrorMessage() << std::endl;
return nullptr;
}
diff --git a/cmds/idmap2/libidmap2/Policies.cpp b/cmds/idmap2/libidmap2/Policies.cpp
index 6649288dfa41..c6ba87dfc2fb 100644
--- a/cmds/idmap2/libidmap2/Policies.cpp
+++ b/cmds/idmap2/libidmap2/Policies.cpp
@@ -16,7 +16,6 @@
#include <iterator>
#include <map>
-#include <sstream>
#include <string>
#include <vector>
@@ -39,16 +38,14 @@ const std::map<android::StringPiece, PolicyFlags> kStringToFlag = {
};
} // namespace
-Result<PolicyBitmask> PoliciesToBitmask(const std::vector<std::string>& policies,
- std::ostream& err) {
+Result<PolicyBitmask> PoliciesToBitmask(const std::vector<std::string>& policies) {
PolicyBitmask bitmask = 0;
for (const std::string& policy : policies) {
const auto iter = kStringToFlag.find(policy);
if (iter != kStringToFlag.end()) {
bitmask |= iter->second;
} else {
- err << "error: unknown policy \"" << policy << "\"";
- return kResultError;
+ return Error("unknown policy \"%s\"", policy.c_str());
}
}
diff --git a/cmds/idmap2/libidmap2/RawPrintVisitor.cpp b/cmds/idmap2/libidmap2/RawPrintVisitor.cpp
index b78e942d4049..1149c905a178 100644
--- a/cmds/idmap2/libidmap2/RawPrintVisitor.cpp
+++ b/cmds/idmap2/libidmap2/RawPrintVisitor.cpp
@@ -75,7 +75,7 @@ void RawPrintVisitor::visit(const IdmapData::TypeEntry& type_entry) {
type_entry.GetEntryOffset() + i);
const ResourceId overlay_resid =
RESID(last_seen_package_id_, type_entry.GetOverlayTypeId(), entry);
- Result<std::string> name;
+ Result<std::string> name(Error(""));
if (target_package_loaded) {
name = utils::ResToTypeEntryName(target_am_, target_resid);
}
diff --git a/cmds/idmap2/libidmap2/ResourceUtils.cpp b/cmds/idmap2/libidmap2/ResourceUtils.cpp
index 7a984f3f98ad..a24836da7f3a 100644
--- a/cmds/idmap2/libidmap2/ResourceUtils.cpp
+++ b/cmds/idmap2/libidmap2/ResourceUtils.cpp
@@ -33,10 +33,10 @@ using android::util::Utf16ToUtf8;
namespace android::idmap2::utils {
-Result<std::string> WARN_UNUSED ResToTypeEntryName(const AssetManager2& am, ResourceId resid) {
+Result<std::string> ResToTypeEntryName(const AssetManager2& am, ResourceId resid) {
AssetManager2::ResourceName name;
if (!am.GetResourceName(resid, &name)) {
- return {};
+ return Error("no resource 0x%08x in asset manager", resid);
}
std::string out;
if (name.type != nullptr) {
@@ -50,36 +50,31 @@ Result<std::string> WARN_UNUSED ResToTypeEntryName(const AssetManager2& am, Reso
} else {
out += Utf16ToUtf8(StringPiece16(name.entry16, name.entry_len));
}
- return {out};
+ return out;
}
Result<OverlayManifestInfo> ExtractOverlayManifestInfo(const std::string& path,
- std::ostream& out_error,
bool assert_overlay) {
std::unique_ptr<const ZipFile> zip = ZipFile::Open(path);
if (!zip) {
- out_error << "error: failed to open " << path << " as a zip file" << std::endl;
- return kResultError;
+ return Error("failed to open %s as a zip file", path.c_str());
}
std::unique_ptr<const MemoryChunk> entry = zip->Uncompress("AndroidManifest.xml");
if (!entry) {
- out_error << "error: failed to uncompress AndroidManifest.xml from " << path << std::endl;
- return kResultError;
+ return Error("failed to uncompress AndroidManifest.xml from %s", path.c_str());
}
std::unique_ptr<const Xml> xml = Xml::Create(entry->buf, entry->size);
if (!xml) {
- out_error << "error: failed to parse AndroidManifest.xml from " << path << std::endl;
- return kResultError;
+ return Error("failed to parse AndroidManifest.xml from %s", path.c_str());
}
OverlayManifestInfo info{};
const auto tag = xml->FindTag("overlay");
if (!tag) {
if (assert_overlay) {
- out_error << "error: <overlay> missing from AndroidManifest.xml of " << path << std::endl;
- return kResultError;
+ return Error("<overlay> missing from AndroidManifest.xml of %s", path.c_str());
}
return info;
}
@@ -87,8 +82,7 @@ Result<OverlayManifestInfo> ExtractOverlayManifestInfo(const std::string& path,
auto iter = tag->find("targetPackage");
if (iter == tag->end()) {
if (assert_overlay) {
- out_error << "error: android:targetPackage missing from <overlay> of " << path << std::endl;
- return kResultError;
+ return Error("android:targetPackage missing from <overlay> of %s", path.c_str());
}
} else {
info.target_package = iter->second;
diff --git a/cmds/idmap2/libidmap2/Result.cpp b/cmds/idmap2/libidmap2/Result.cpp
index bd4fabd3bdac..471dab2e0411 100644
--- a/cmds/idmap2/libidmap2/Result.cpp
+++ b/cmds/idmap2/libidmap2/Result.cpp
@@ -23,7 +23,7 @@
namespace android::idmap2 {
// NOLINTNEXTLINE(cert-dcl50-cpp)
-v2::Error::Error(const char* fmt, ...) {
+Error::Error(const char* fmt, ...) {
va_list ap;
va_start(ap, fmt);
base::StringAppendV(&msg_, fmt, ap);
@@ -31,7 +31,7 @@ v2::Error::Error(const char* fmt, ...) {
}
// NOLINTNEXTLINE(cert-dcl50-cpp)
-v2::Error::Error(const Error& parent, const char* fmt, ...) : msg_(parent.msg_) {
+Error::Error(const Error& parent, const char* fmt, ...) : msg_(parent.msg_) {
msg_.append(" -> ");
va_list ap;
diff --git a/cmds/idmap2/libidmap2/ZipFile.cpp b/cmds/idmap2/libidmap2/ZipFile.cpp
index 15ec3f9d3afe..0f0732466256 100644
--- a/cmds/idmap2/libidmap2/ZipFile.cpp
+++ b/cmds/idmap2/libidmap2/ZipFile.cpp
@@ -59,7 +59,10 @@ std::unique_ptr<const MemoryChunk> ZipFile::Uncompress(const std::string& entryP
Result<uint32_t> ZipFile::Crc(const std::string& entryPath) const {
::ZipEntry entry;
int32_t status = ::FindEntry(handle_, ::ZipString(entryPath.c_str()), &entry);
- return status == 0 ? Result<uint32_t>(entry.crc32) : kResultError;
+ if (status != 0) {
+ return Error("failed to find zip entry %s", entryPath.c_str());
+ }
+ return entry.crc32;
}
} // namespace android::idmap2
diff --git a/cmds/idmap2/tests/FileUtilsTests.cpp b/cmds/idmap2/tests/FileUtilsTests.cpp
index 2e85eb6215d1..34a0097b0316 100644
--- a/cmds/idmap2/tests/FileUtilsTests.cpp
+++ b/cmds/idmap2/tests/FileUtilsTests.cpp
@@ -58,21 +58,15 @@ TEST(FileUtilsTests, FindFilesFindApkFilesRecursive) {
});
ASSERT_THAT(v, NotNull());
ASSERT_EQ(v->size(), 10U);
- ASSERT_EQ(
- std::set<std::string>(v->begin(), v->end()),
- std::set<std::string>(
- {
- root + "/target/target.apk",
- root + "/target/target-no-overlayable.apk",
- root + "/overlay/overlay.apk",
- root + "/overlay/overlay-no-name.apk",
- root + "/overlay/overlay-no-name-static.apk",
- root + "/overlay/overlay-static-1.apk",
- root + "/overlay/overlay-static-2.apk",
- root + "/signature-overlay/signature-overlay.apk",
- root + "/system-overlay/system-overlay.apk",
- root + "/system-overlay-invalid/system-overlay-invalid.apk"
- }));
+ ASSERT_EQ(std::set<std::string>(v->begin(), v->end()),
+ std::set<std::string>(
+ {root + "/target/target.apk", root + "/target/target-no-overlayable.apk",
+ root + "/overlay/overlay.apk", root + "/overlay/overlay-no-name.apk",
+ root + "/overlay/overlay-no-name-static.apk",
+ root + "/overlay/overlay-static-1.apk", root + "/overlay/overlay-static-2.apk",
+ root + "/signature-overlay/signature-overlay.apk",
+ root + "/system-overlay/system-overlay.apk",
+ root + "/system-overlay-invalid/system-overlay-invalid.apk"}));
}
TEST(FileUtilsTests, ReadFile) {
diff --git a/cmds/idmap2/tests/IdmapTests.cpp b/cmds/idmap2/tests/IdmapTests.cpp
index 53ec03ba3d5e..bbfbad9aa8ca 100644
--- a/cmds/idmap2/tests/IdmapTests.cpp
+++ b/cmds/idmap2/tests/IdmapTests.cpp
@@ -256,10 +256,10 @@ TEST(IdmapOverlayableTests, CreateIdmapFromApkAssetsPolicySystemPublic) {
ASSERT_EQ(types[0]->GetOverlayTypeId(), 0x01U);
ASSERT_EQ(types[0]->GetEntryCount(), 4U);
ASSERT_EQ(types[0]->GetEntryOffset(), 6U);
- ASSERT_EQ(types[0]->GetEntry(0), 0x0000U); // string/policy_public
- ASSERT_EQ(types[0]->GetEntry(1), kNoEntry); // string/policy_signature
- ASSERT_EQ(types[0]->GetEntry(2), 0x0001U); // string/policy_system
- ASSERT_EQ(types[0]->GetEntry(3), 0x0002U); // string/policy_system_vendor
+ ASSERT_EQ(types[0]->GetEntry(0), 0x0000U); // string/policy_public
+ ASSERT_EQ(types[0]->GetEntry(1), kNoEntry); // string/policy_signature
+ ASSERT_EQ(types[0]->GetEntry(2), 0x0001U); // string/policy_system
+ ASSERT_EQ(types[0]->GetEntry(3), 0x0002U); // string/policy_system_vendor
}
TEST(IdmapOverlayableTests, CreateIdmapFromApkAssetsPolicySignature) {
@@ -267,7 +267,8 @@ TEST(IdmapOverlayableTests, CreateIdmapFromApkAssetsPolicySignature) {
std::unique_ptr<const ApkAssets> target_apk = ApkAssets::Load(target_apk_path);
ASSERT_THAT(target_apk, NotNull());
- const std::string overlay_apk_path(GetTestDataPath() + "/signature-overlay/signature-overlay.apk");
+ const std::string overlay_apk_path(GetTestDataPath() +
+ "/signature-overlay/signature-overlay.apk");
std::unique_ptr<const ApkAssets> overlay_apk = ApkAssets::Load(overlay_apk_path);
ASSERT_THAT(overlay_apk, NotNull());
@@ -294,7 +295,7 @@ TEST(IdmapOverlayableTests, CreateIdmapFromApkAssetsPolicySignature) {
ASSERT_EQ(types[0]->GetOverlayTypeId(), 0x01U);
ASSERT_EQ(types[0]->GetEntryCount(), 1U);
ASSERT_EQ(types[0]->GetEntryOffset(), 7U);
- ASSERT_EQ(types[0]->GetEntry(0), 0x0000U); // string/policy_signature
+ ASSERT_EQ(types[0]->GetEntry(0), 0x0000U); // string/policy_signature
}
TEST(IdmapOverlayableTests, CreateIdmapFromApkAssetsPolicySignatureNotFulfilled) {
@@ -302,7 +303,8 @@ TEST(IdmapOverlayableTests, CreateIdmapFromApkAssetsPolicySignatureNotFulfilled)
std::unique_ptr<const ApkAssets> target_apk = ApkAssets::Load(target_apk_path);
ASSERT_THAT(target_apk, NotNull());
- const std::string overlay_apk_path(GetTestDataPath() + "/signature-overlay/signature-overlay.apk");
+ const std::string overlay_apk_path(GetTestDataPath() +
+ "/signature-overlay/signature-overlay.apk");
std::unique_ptr<const ApkAssets> overlay_apk = ApkAssets::Load(overlay_apk_path);
ASSERT_THAT(overlay_apk, NotNull());
@@ -323,7 +325,7 @@ TEST(IdmapOverlayableTests, CreateIdmapFromApkAssetsPolicySignatureNotFulfilled)
ASSERT_EQ(data->GetHeader()->GetTypeCount(), 0U);
const std::vector<std::unique_ptr<const IdmapData::TypeEntry>>& types = data->GetTypeEntries();
- ASSERT_EQ(types.size(), 0U); // can't overlay, so contains nothing
+ ASSERT_EQ(types.size(), 0U); // can't overlay, so contains nothing
}
// Overlays should abide by all overlayable restrictions if enforcement of overlayable is enabled.
@@ -359,10 +361,10 @@ TEST(IdmapOverlayableTests, CreateIdmapFromApkAssetsPolicySystemPublicInvalid) {
ASSERT_EQ(types[0]->GetOverlayTypeId(), 0x01U);
ASSERT_EQ(types[0]->GetEntryCount(), 4U);
ASSERT_EQ(types[0]->GetEntryOffset(), 6U);
- ASSERT_EQ(types[0]->GetEntry(0), 0x0003U); // string/policy_public
- ASSERT_EQ(types[0]->GetEntry(1), kNoEntry); // string/policy_signature
- ASSERT_EQ(types[0]->GetEntry(2), 0x0005U); // string/policy_system
- ASSERT_EQ(types[0]->GetEntry(3), 0x0006U); // string/policy_system_vendor
+ ASSERT_EQ(types[0]->GetEntry(0), 0x0003U); // string/policy_public
+ ASSERT_EQ(types[0]->GetEntry(1), kNoEntry); // string/policy_signature
+ ASSERT_EQ(types[0]->GetEntry(2), 0x0005U); // string/policy_system
+ ASSERT_EQ(types[0]->GetEntry(3), 0x0006U); // string/policy_system_vendor
}
// Overlays should ignore all overlayable restrictions if enforcement of overlayable is disabled.
diff --git a/cmds/idmap2/tests/PoliciesTests.cpp b/cmds/idmap2/tests/PoliciesTests.cpp
index ab567adc6f19..a76da533cdcb 100644
--- a/cmds/idmap2/tests/PoliciesTests.cpp
+++ b/cmds/idmap2/tests/PoliciesTests.cpp
@@ -27,44 +27,42 @@ using android::idmap2::PolicyFlags;
namespace android::idmap2 {
TEST(PoliciesTests, PoliciesToBitmasks) {
- const Result<PolicyBitmask> bitmask1 = PoliciesToBitmask({"system"}, std::cerr);
- ASSERT_NE(bitmask1, kResultError);
- ASSERT_EQ(bitmask1, PolicyFlags::POLICY_SYSTEM_PARTITION);
+ const auto bitmask1 = PoliciesToBitmask({"system"});
+ ASSERT_TRUE(bitmask1);
+ ASSERT_EQ(*bitmask1, PolicyFlags::POLICY_SYSTEM_PARTITION);
- const Result<PolicyBitmask> bitmask2 = PoliciesToBitmask({"system", "vendor"}, std::cerr);
- ASSERT_NE(bitmask2, kResultError);
- ASSERT_EQ(bitmask2, PolicyFlags::POLICY_SYSTEM_PARTITION | PolicyFlags::POLICY_VENDOR_PARTITION);
+ const auto bitmask2 = PoliciesToBitmask({"system", "vendor"});
+ ASSERT_TRUE(bitmask2);
+ ASSERT_EQ(*bitmask2, PolicyFlags::POLICY_SYSTEM_PARTITION | PolicyFlags::POLICY_VENDOR_PARTITION);
- const Result<PolicyBitmask> bitmask3 = PoliciesToBitmask({"vendor", "system"}, std::cerr);
- ASSERT_NE(bitmask3, kResultError);
- ASSERT_EQ(bitmask3, PolicyFlags::POLICY_SYSTEM_PARTITION | PolicyFlags::POLICY_VENDOR_PARTITION);
+ const auto bitmask3 = PoliciesToBitmask({"vendor", "system"});
+ ASSERT_TRUE(bitmask3);
+ ASSERT_EQ(*bitmask3, PolicyFlags::POLICY_SYSTEM_PARTITION | PolicyFlags::POLICY_VENDOR_PARTITION);
- const Result<PolicyBitmask> bitmask4 =
- PoliciesToBitmask({"public", "product", "system", "vendor"}, std::cerr);
- ASSERT_NE(bitmask4, kResultError);
- ASSERT_EQ(bitmask4, PolicyFlags::POLICY_PUBLIC | PolicyFlags::POLICY_PRODUCT_PARTITION |
- PolicyFlags::POLICY_SYSTEM_PARTITION |
- PolicyFlags::POLICY_VENDOR_PARTITION);
+ const auto bitmask4 = PoliciesToBitmask({"public", "product", "system", "vendor"});
+ ASSERT_TRUE(bitmask4);
+ ASSERT_EQ(*bitmask4, PolicyFlags::POLICY_PUBLIC | PolicyFlags::POLICY_PRODUCT_PARTITION |
+ PolicyFlags::POLICY_SYSTEM_PARTITION |
+ PolicyFlags::POLICY_VENDOR_PARTITION);
- const Result<PolicyBitmask> bitmask5 =
- PoliciesToBitmask({"system", "system", "system"}, std::cerr);
- ASSERT_NE(bitmask5, kResultError);
- ASSERT_EQ(bitmask5, PolicyFlags::POLICY_SYSTEM_PARTITION);
+ const auto bitmask5 = PoliciesToBitmask({"system", "system", "system"});
+ ASSERT_TRUE(bitmask5);
+ ASSERT_EQ(*bitmask5, PolicyFlags::POLICY_SYSTEM_PARTITION);
- const Result<PolicyBitmask> bitmask6 = PoliciesToBitmask({""}, std::cerr);
- ASSERT_EQ(bitmask6, kResultError);
+ const auto bitmask6 = PoliciesToBitmask({""});
+ ASSERT_FALSE(bitmask6);
- const Result<PolicyBitmask> bitmask7 = PoliciesToBitmask({"foo"}, std::cerr);
- ASSERT_EQ(bitmask7, kResultError);
+ const auto bitmask7 = PoliciesToBitmask({"foo"});
+ ASSERT_FALSE(bitmask7);
- const Result<PolicyBitmask> bitmask8 = PoliciesToBitmask({"system", "foo"}, std::cerr);
- ASSERT_EQ(bitmask8, kResultError);
+ const auto bitmask8 = PoliciesToBitmask({"system", "foo"});
+ ASSERT_FALSE(bitmask8);
- const Result<PolicyBitmask> bitmask9 = PoliciesToBitmask({"system", ""}, std::cerr);
- ASSERT_EQ(bitmask9, kResultError);
+ const auto bitmask9 = PoliciesToBitmask({"system", ""});
+ ASSERT_FALSE(bitmask9);
- const Result<PolicyBitmask> bitmask10 = PoliciesToBitmask({"system "}, std::cerr);
- ASSERT_EQ(bitmask10, kResultError);
+ const auto bitmask10 = PoliciesToBitmask({"system "});
+ ASSERT_FALSE(bitmask10);
}
} // namespace android::idmap2
diff --git a/cmds/idmap2/tests/ResultTests.cpp b/cmds/idmap2/tests/ResultTests.cpp
index d82f0c475ea9..5f4daed521c0 100644
--- a/cmds/idmap2/tests/ResultTests.cpp
+++ b/cmds/idmap2/tests/ResultTests.cpp
@@ -32,28 +32,28 @@ struct Container {
// Tests: Error
TEST(ResultTests, ErrorTraits) {
- ASSERT_TRUE(std::is_move_constructible<v2::Error>::value);
- ASSERT_TRUE(std::is_move_assignable<v2::Error>::value);
- ASSERT_TRUE(std::is_copy_constructible<v2::Error>::value);
- ASSERT_TRUE(std::is_copy_assignable<v2::Error>::value);
+ ASSERT_TRUE(std::is_move_constructible<Error>::value);
+ ASSERT_TRUE(std::is_move_assignable<Error>::value);
+ ASSERT_TRUE(std::is_copy_constructible<Error>::value);
+ ASSERT_TRUE(std::is_copy_assignable<Error>::value);
}
TEST(ResultTests, ErrorCtorFormat) {
- v2::Error e("%s=0x%08x", "resid", 0x7f010002);
+ Error e("%s=0x%08x", "resid", 0x7f010002);
ASSERT_EQ(e.GetMessage(), "resid=0x7f010002");
}
TEST(ResultTests, ErrorPropagateParent) {
- v2::Error e1("foo");
+ Error e1("foo");
ASSERT_EQ(e1.GetMessage(), "foo");
- v2::Error e2(e1, "bar");
+ Error e2(e1, "bar");
ASSERT_EQ(e2.GetMessage(), "foo -> bar");
- v2::Error e3(e2); // NOLINT(performance-unnecessary-copy-initialization)
+ Error e3(e2); // NOLINT(performance-unnecessary-copy-initialization)
ASSERT_EQ(e3.GetMessage(), "foo -> bar");
- v2::Error e4(e3, "%02d", 1);
+ Error e4(e3, "%02d", 1);
ASSERT_EQ(e4.GetMessage(), "foo -> bar -> 01");
}
@@ -61,13 +61,13 @@ TEST(ResultTests, ErrorPropagateParent) {
// Result(const Result&)
TEST(ResultTests, CopyConstructor) {
- v2::Result<uint32_t> r1(42U);
+ Result<uint32_t> r1(42U);
- v2::Result<uint32_t> r2(r1);
+ Result<uint32_t> r2(r1);
ASSERT_TRUE(r2);
ASSERT_EQ(*r2, 42U);
- v2::Result<uint32_t> r3 = r2;
+ Result<uint32_t> r3 = r2;
ASSERT_TRUE(r3);
ASSERT_EQ(*r3, 42U);
}
@@ -75,23 +75,23 @@ TEST(ResultTests, CopyConstructor) {
// Result(const T&)
TEST(ResultTests, Constructor) {
uint32_t v = 42U;
- v2::Result<uint32_t> r1(v);
+ Result<uint32_t> r1(v);
ASSERT_TRUE(r1);
ASSERT_EQ(*r1, 42U);
- v2::Error e("foo");
- v2::Result<uint32_t> r2(e);
+ Error e("foo");
+ Result<uint32_t> r2(e);
ASSERT_FALSE(r2);
ASSERT_EQ(r2.GetErrorMessage(), "foo");
}
// Result(const T&&)
TEST(ResultTests, MoveConstructor) {
- v2::Result<uint32_t> r1(42U);
+ Result<uint32_t> r1(42U);
ASSERT_TRUE(r1);
ASSERT_EQ(*r1, 42U);
- v2::Result<uint32_t> r2(v2::Error("foo"));
+ Result<uint32_t> r2(Error("foo"));
ASSERT_FALSE(r2);
ASSERT_EQ(r2.GetErrorMessage(), "foo");
}
@@ -99,52 +99,52 @@ TEST(ResultTests, MoveConstructor) {
// operator=
TEST(ResultTests, CopyAssignmentOperator) {
// note: 'Result<...> r2 = r1;' calls the copy ctor
- v2::Result<uint32_t> r1(42U);
- v2::Result<uint32_t> r2(0U);
+ Result<uint32_t> r1(42U);
+ Result<uint32_t> r2(0U);
r2 = r1;
ASSERT_TRUE(r2);
ASSERT_EQ(*r2, 42U);
- v2::Result<uint32_t> r3(v2::Error("foo"));
+ Result<uint32_t> r3(Error("foo"));
r2 = r3;
ASSERT_FALSE(r2);
ASSERT_EQ(r2.GetErrorMessage(), "foo");
}
TEST(ResultTests, MoveAssignmentOperator) {
- v2::Result<uint32_t> r(0U);
- r = v2::Result<uint32_t>(42U);
+ Result<uint32_t> r(0U);
+ r = Result<uint32_t>(42U);
ASSERT_TRUE(r);
ASSERT_EQ(*r, 42U);
- r = v2::Result<uint32_t>(v2::Error("foo"));
+ r = Result<uint32_t>(Error("foo"));
ASSERT_FALSE(r);
ASSERT_EQ(r.GetErrorMessage(), "foo");
}
// operator bool()
TEST(ResultTests, BoolOperator) {
- v2::Result<uint32_t> r1(42U);
+ Result<uint32_t> r1(42U);
ASSERT_TRUE(r1);
ASSERT_EQ(*r1, 42U);
- v2::Result<uint32_t> r2(v2::Error("foo"));
+ Result<uint32_t> r2(Error("foo"));
ASSERT_FALSE(r2);
ASSERT_EQ(r2.GetErrorMessage(), "foo");
}
// operator*
TEST(ResultTests, IndirectionOperator) {
- const v2::Result<uint32_t> r1(42U);
+ const Result<uint32_t> r1(42U);
ASSERT_TRUE(r1);
ASSERT_EQ(*r1, 42U);
- const v2::Result<Container> r2(Container{42U});
+ const Result<Container> r2(Container{42U});
ASSERT_TRUE(r2);
const Container& c = *r2;
ASSERT_EQ(c.value, 42U);
- v2::Result<Container> r3(Container{42U});
+ Result<Container> r3(Container{42U});
ASSERT_TRUE(r3);
ASSERT_EQ((*r3).value, 42U);
(*r3).value = 0U;
@@ -153,11 +153,11 @@ TEST(ResultTests, IndirectionOperator) {
// operator->
TEST(ResultTests, DereferenceOperator) {
- const v2::Result<Container> r1(Container{42U});
+ const Result<Container> r1(Container{42U});
ASSERT_TRUE(r1);
ASSERT_EQ(r1->value, 42U);
- v2::Result<Container> r2(Container{42U});
+ Result<Container> r2(Container{42U});
ASSERT_TRUE(r2);
ASSERT_EQ(r2->value, 42U);
r2->value = 0U;
@@ -167,14 +167,14 @@ TEST(ResultTests, DereferenceOperator) {
// Tests: intended use of Result<T>
TEST(ResultTests, ResultTraits) {
- ASSERT_TRUE(std::is_move_constructible<v2::Result<uint32_t>>::value);
- ASSERT_TRUE(std::is_move_assignable<v2::Result<uint32_t>>::value);
- ASSERT_TRUE(std::is_copy_constructible<v2::Result<uint32_t>>::value);
- ASSERT_TRUE(std::is_copy_assignable<v2::Result<uint32_t>>::value);
+ ASSERT_TRUE(std::is_move_constructible<Result<uint32_t>>::value);
+ ASSERT_TRUE(std::is_move_assignable<Result<uint32_t>>::value);
+ ASSERT_TRUE(std::is_copy_constructible<Result<uint32_t>>::value);
+ ASSERT_TRUE(std::is_copy_assignable<Result<uint32_t>>::value);
}
TEST(ResultTests, UnitTypeResult) {
- v2::Result<v2::Unit> r(v2::Unit{});
+ Result<Unit> r(Unit{});
ASSERT_TRUE(r);
}
@@ -220,16 +220,16 @@ TEST(ResultTests, ReferenceCount) {
ASSERT_FALSE(std::is_copy_assignable<RefCountContainer>::value);
RefCountData rc{0, 0, 0, 0};
- { v2::Result<RefCountContainer> r(RefCountContainer{rc}); }
+ { Result<RefCountContainer> r(RefCountContainer{rc}); }
ASSERT_EQ(rc.ctor, 1);
ASSERT_EQ(rc.copy_ctor, 1);
ASSERT_EQ(rc.move, 0);
ASSERT_EQ(rc.dtor, 2);
}
-v2::Result<Container> CreateContainer(bool succeed) {
+Result<Container> CreateContainer(bool succeed) {
if (!succeed) {
- return v2::Error("foo");
+ return Error("foo");
}
return Container{42U};
}
@@ -245,10 +245,10 @@ TEST(ResultTests, FunctionReturn) {
ASSERT_EQ(r2.GetError().GetMessage(), "foo");
}
-v2::Result<Container> FailToCreateContainer() {
+Result<Container> FailToCreateContainer() {
auto container = CreateContainer(false);
if (!container) {
- return v2::Error(container.GetError(), "bar");
+ return Error(container.GetError(), "bar");
}
return container;
}
@@ -264,9 +264,9 @@ struct NoCopyContainer {
DISALLOW_COPY_AND_ASSIGN(NoCopyContainer);
};
-v2::Result<std::unique_ptr<NoCopyContainer>> CreateNoCopyContainer(bool succeed) {
+Result<std::unique_ptr<NoCopyContainer>> CreateNoCopyContainer(bool succeed) {
if (!succeed) {
- return v2::Error("foo");
+ return Error("foo");
}
std::unique_ptr<NoCopyContainer> p(new NoCopyContainer{0U});
p->value = 42U;
diff --git a/cmds/sm/src/com/android/commands/sm/Sm.java b/cmds/sm/src/com/android/commands/sm/Sm.java
index be5a5bf6c35a..4a6f87f09d29 100644
--- a/cmds/sm/src/com/android/commands/sm/Sm.java
+++ b/cmds/sm/src/com/android/commands/sm/Sm.java
@@ -103,6 +103,8 @@ public final class Sm {
runSetVirtualDisk();
} else if ("set-isolated-storage".equals(op)) {
runIsolatedStorage();
+ } else if ("set-legacy-greylist".equals(op)) {
+ runLegacyGreylist();
} else {
throw new IllegalArgumentException();
}
@@ -282,7 +284,7 @@ public final class Sm {
StorageManager.DEBUG_VIRTUAL_DISK);
}
- public void runIsolatedStorage() {
+ public void runIsolatedStorage() throws RemoteException {
final int value;
final int mask = StorageManager.DEBUG_ISOLATED_STORAGE_FORCE_ON
| StorageManager.DEBUG_ISOLATED_STORAGE_FORCE_OFF;
@@ -301,16 +303,13 @@ public final class Sm {
default:
return;
}
+ mSm.setDebugFlags(value, mask);
+ }
- // Toggling isolated-storage state will result in a device reboot. So to avoid this command
- // from erroring out (DeadSystemException), call setDebugFlags() in a separate thread.
- new Thread(() -> {
- try {
- mSm.setDebugFlags(value, mask);
- } catch (RemoteException e) {
- Log.e(TAG, "Encountered an error!", e);
- }
- }).start();
+ public void runLegacyGreylist() throws RemoteException {
+ final boolean legacyGreylist = Boolean.parseBoolean(nextArg());
+ mSm.setDebugFlags(legacyGreylist ? StorageManager.DEBUG_LEGACY_GREYLIST : 0,
+ StorageManager.DEBUG_LEGACY_GREYLIST);
}
public void runIdleMaint() throws RemoteException {
diff --git a/cmds/statsd/src/atoms.proto b/cmds/statsd/src/atoms.proto
index 1dd68df36ba8..b6474001deba 100644
--- a/cmds/statsd/src/atoms.proto
+++ b/cmds/statsd/src/atoms.proto
@@ -5528,8 +5528,9 @@ message ScheduledJobConstraintChanged {
optional com.android.server.job.ConstraintEnum constraint = 3;
enum State {
- UNSATISFIED = 0;
- SATISFIED = 1;
+ UNKNOWN = 0;
+ UNSATISFIED = 1;
+ SATISFIED = 2;
}
optional State state = 4;
}
diff --git a/cmds/statsd/src/metrics/MetricProducer.h b/cmds/statsd/src/metrics/MetricProducer.h
index 99cb5d4389c7..046f9963b351 100644
--- a/cmds/statsd/src/metrics/MetricProducer.h
+++ b/cmds/statsd/src/metrics/MetricProducer.h
@@ -69,7 +69,7 @@ public:
mTimeBaseNs(timeBaseNs),
mCurrentBucketStartTimeNs(timeBaseNs),
mCurrentBucketNum(0),
- mCondition(conditionIndex >= 0 ? ConditionState::kUnknown : ConditionState::kTrue),
+ mCondition(initialCondition(conditionIndex)),
mConditionSliced(false),
mWizard(wizard),
mConditionTrackerIndex(conditionIndex),
@@ -82,6 +82,10 @@ public:
virtual ~MetricProducer(){};
+ ConditionState initialCondition(const int conditionIndex) const {
+ return conditionIndex >= 0 ? ConditionState::kUnknown : ConditionState::kTrue;
+ }
+
/**
* Forces this metric to split into a partial bucket right now. If we're past a full bucket, we
* first call the standard flushing code to flush up to the latest full bucket. Then we call
diff --git a/cmds/statsd/src/metrics/ValueMetricProducer.cpp b/cmds/statsd/src/metrics/ValueMetricProducer.cpp
index 9de62a2cce03..27ee57013fda 100644
--- a/cmds/statsd/src/metrics/ValueMetricProducer.cpp
+++ b/cmds/statsd/src/metrics/ValueMetricProducer.cpp
@@ -394,7 +394,7 @@ void ValueMetricProducer::onConditionChangedLocked(const bool condition,
invalidateCurrentBucket();
// Something weird happened. If we received another event if the future, the condition might
// be wrong.
- mCondition = ConditionState::kUnknown;
+ mCondition = initialCondition(mConditionTrackerIndex);
}
// This part should alway be called.
diff --git a/config/hiddenapi-greylist.txt b/config/hiddenapi-greylist.txt
index e25f463a9442..07fba3ba9ce4 100644
--- a/config/hiddenapi-greylist.txt
+++ b/config/hiddenapi-greylist.txt
@@ -437,7 +437,6 @@ Landroid/content/pm/IShortcutService$Stub;->asInterface(Landroid/os/IBinder;)Lan
Landroid/content/res/ConfigurationBoundResourceCache;-><init>()V
Landroid/content/res/DrawableCache;-><init>()V
Landroid/content/UndoManager;-><init>()V
-Landroid/database/BulkCursorProxy;->mRemote:Landroid/os/IBinder;
Landroid/database/IContentObserver$Stub;-><init>()V
Landroid/database/IContentObserver$Stub;->asInterface(Landroid/os/IBinder;)Landroid/database/IContentObserver;
Landroid/database/IContentObserver;->onChange(ZLandroid/net/Uri;I)V
@@ -446,16 +445,13 @@ Landroid/database/sqlite/SQLiteDatabase;->$assertionsDisabled:Z
Landroid/filterfw/GraphEnvironment;->addReferences([Ljava/lang/Object;)V
Landroid/hardware/camera2/utils/HashCodeHelpers;->hashCode([I)I
Landroid/hardware/display/IDisplayManager$Stub;->asInterface(Landroid/os/IBinder;)Landroid/hardware/display/IDisplayManager;
-Landroid/hardware/display/IDisplayManager;->getDisplayInfo(I)Landroid/view/DisplayInfo;
Landroid/hardware/fingerprint/IFingerprintService$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
Landroid/hardware/fingerprint/IFingerprintService$Stub;->asInterface(Landroid/os/IBinder;)Landroid/hardware/fingerprint/IFingerprintService;
Landroid/hardware/ICameraService$Stub;->asInterface(Landroid/os/IBinder;)Landroid/hardware/ICameraService;
Landroid/hardware/input/IInputManager$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
Landroid/hardware/input/IInputManager$Stub;->asInterface(Landroid/os/IBinder;)Landroid/hardware/input/IInputManager;
Landroid/hardware/input/IInputManager$Stub;->TRANSACTION_injectInputEvent:I
-Landroid/hardware/input/IInputManager;->injectInputEvent(Landroid/view/InputEvent;I)Z
Landroid/hardware/location/IActivityRecognitionHardwareClient$Stub;-><init>()V
-Landroid/hardware/location/IActivityRecognitionHardwareClient;->onAvailabilityChanged(ZLandroid/hardware/location/IActivityRecognitionHardware;)V
Landroid/hardware/location/IContextHubService$Stub;->asInterface(Landroid/os/IBinder;)Landroid/hardware/location/IContextHubService;
Landroid/hardware/usb/IUsbManager$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
Landroid/hardware/usb/IUsbManager$Stub;->asInterface(Landroid/os/IBinder;)Landroid/hardware/usb/IUsbManager;
@@ -465,60 +461,33 @@ Landroid/location/ICountryDetector$Stub;->asInterface(Landroid/os/IBinder;)Landr
Landroid/location/ICountryListener$Stub;-><init>()V
Landroid/location/IGeocodeProvider$Stub;-><init>()V
Landroid/location/IGeocodeProvider$Stub;->asInterface(Landroid/os/IBinder;)Landroid/location/IGeocodeProvider;
-Landroid/location/IGeocodeProvider;->getFromLocation(DDILandroid/location/GeocoderParams;Ljava/util/List;)Ljava/lang/String;
-Landroid/location/IGeocodeProvider;->getFromLocationName(Ljava/lang/String;DDDDILandroid/location/GeocoderParams;Ljava/util/List;)Ljava/lang/String;
Landroid/location/IGeofenceProvider$Stub;-><init>()V
-Landroid/location/IGeofenceProvider;->setGeofenceHardware(Landroid/hardware/location/IGeofenceHardware;)V
Landroid/location/ILocationListener$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
Landroid/location/ILocationListener$Stub$Proxy;->mRemote:Landroid/os/IBinder;
Landroid/location/ILocationListener$Stub;-><init>()V
Landroid/location/ILocationListener$Stub;->asInterface(Landroid/os/IBinder;)Landroid/location/ILocationListener;
-Landroid/location/ILocationListener;->onLocationChanged(Landroid/location/Location;)V
-Landroid/location/ILocationListener;->onProviderDisabled(Ljava/lang/String;)V
-Landroid/location/ILocationListener;->onProviderEnabled(Ljava/lang/String;)V
-Landroid/location/ILocationListener;->onStatusChanged(Ljava/lang/String;ILandroid/os/Bundle;)V
Landroid/location/ILocationManager$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
Landroid/location/ILocationManager$Stub;->asInterface(Landroid/os/IBinder;)Landroid/location/ILocationManager;
Landroid/location/ILocationManager$Stub;->TRANSACTION_getAllProviders:I
-Landroid/location/ILocationManager;->getAllProviders()Ljava/util/List;
Landroid/location/INetInitiatedListener$Stub;-><init>()V
-Landroid/location/INetInitiatedListener;->sendNiResponse(II)Z
Landroid/location/LocationManager$ListenerTransport;-><init>(Landroid/location/LocationManager;Landroid/location/LocationListener;Landroid/os/Looper;)V
Landroid/Manifest$permission;->CAPTURE_SECURE_VIDEO_OUTPUT:Ljava/lang/String;
Landroid/Manifest$permission;->CAPTURE_VIDEO_OUTPUT:Ljava/lang/String;
Landroid/Manifest$permission;->READ_FRAME_BUFFER:Ljava/lang/String;
Landroid/media/effect/SingleFilterEffect;-><init>(Landroid/media/effect/EffectContext;Ljava/lang/String;Ljava/lang/Class;Ljava/lang/String;Ljava/lang/String;[Ljava/lang/Object;)V
-Landroid/media/IAudioFocusDispatcher;->dispatchAudioFocusChange(ILjava/lang/String;)V
Landroid/media/IAudioRoutesObserver$Stub;-><init>()V
Landroid/media/IAudioService$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
Landroid/media/IAudioService$Stub;-><init>()V
Landroid/media/IAudioService$Stub;->asInterface(Landroid/os/IBinder;)Landroid/media/IAudioService;
-Landroid/media/IAudioService;->getStreamMaxVolume(I)I
-Landroid/media/IAudioService;->getStreamVolume(I)I
-Landroid/media/IAudioService;->setStreamVolume(IIILjava/lang/String;)V
-Landroid/media/IAudioService;->startWatchingRoutes(Landroid/media/IAudioRoutesObserver;)Landroid/media/AudioRoutesInfo;
Landroid/media/IMediaRouterService$Stub;->asInterface(Landroid/os/IBinder;)Landroid/media/IMediaRouterService;
Landroid/media/IMediaScannerListener$Stub;-><init>()V
Landroid/media/IMediaScannerService$Stub;->asInterface(Landroid/os/IBinder;)Landroid/media/IMediaScannerService;
-Landroid/media/IMediaScannerService;->requestScanFile(Ljava/lang/String;Ljava/lang/String;Landroid/media/IMediaScannerListener;)V
-Landroid/media/IMediaScannerService;->scanFile(Ljava/lang/String;Ljava/lang/String;)V
-Landroid/media/IRemoteDisplayCallback;->onStateChanged(Landroid/media/RemoteDisplayState;)V
Landroid/media/IRingtonePlayer;->play(Landroid/os/IBinder;Landroid/net/Uri;Landroid/media/AudioAttributes;FZ)V
Landroid/media/IVolumeController$Stub;->asInterface(Landroid/os/IBinder;)Landroid/media/IVolumeController;
Landroid/media/MediaFile;-><init>()V
Landroid/media/MediaScanner$MyMediaScannerClient;-><init>(Landroid/media/MediaScanner;)V
-Landroid/media/projection/IMediaProjectionManager;->hasProjectionPermission(ILjava/lang/String;)Z
Landroid/media/session/ISessionManager$Stub;->asInterface(Landroid/os/IBinder;)Landroid/media/session/ISessionManager;
Landroid/media/tv/ITvRemoteProvider$Stub;-><init>()V
-Landroid/media/tv/ITvRemoteServiceInput;->clearInputBridge(Landroid/os/IBinder;)V
-Landroid/media/tv/ITvRemoteServiceInput;->closeInputBridge(Landroid/os/IBinder;)V
-Landroid/media/tv/ITvRemoteServiceInput;->openInputBridge(Landroid/os/IBinder;Ljava/lang/String;III)V
-Landroid/media/tv/ITvRemoteServiceInput;->sendKeyDown(Landroid/os/IBinder;I)V
-Landroid/media/tv/ITvRemoteServiceInput;->sendKeyUp(Landroid/os/IBinder;I)V
-Landroid/media/tv/ITvRemoteServiceInput;->sendPointerDown(Landroid/os/IBinder;III)V
-Landroid/media/tv/ITvRemoteServiceInput;->sendPointerSync(Landroid/os/IBinder;)V
-Landroid/media/tv/ITvRemoteServiceInput;->sendPointerUp(Landroid/os/IBinder;I)V
-Landroid/media/tv/ITvRemoteServiceInput;->sendTimestamp(Landroid/os/IBinder;J)V
Landroid/net/ConnectivityManager$PacketKeepaliveCallback;-><init>()V
Landroid/net/IConnectivityManager$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
Landroid/net/IConnectivityManager$Stub$Proxy;->getActiveLinkProperties()Landroid/net/LinkProperties;
@@ -530,41 +499,13 @@ Landroid/net/IConnectivityManager$Stub$Proxy;->getTetherableUsbRegexs()[Ljava/la
Landroid/net/IConnectivityManager$Stub$Proxy;->getTetheredIfaces()[Ljava/lang/String;
Landroid/net/IConnectivityManager$Stub$Proxy;->mRemote:Landroid/os/IBinder;
Landroid/net/IConnectivityManager$Stub;->asInterface(Landroid/os/IBinder;)Landroid/net/IConnectivityManager;
-Landroid/net/IConnectivityManager;->getActiveLinkProperties()Landroid/net/LinkProperties;
-Landroid/net/IConnectivityManager;->getActiveNetworkInfo()Landroid/net/NetworkInfo;
-Landroid/net/IConnectivityManager;->getAllNetworkInfo()[Landroid/net/NetworkInfo;
-Landroid/net/IConnectivityManager;->getAllNetworkState()[Landroid/net/NetworkState;
-Landroid/net/IConnectivityManager;->getLastTetherError(Ljava/lang/String;)I
-Landroid/net/IConnectivityManager;->getTetherableIfaces()[Ljava/lang/String;
-Landroid/net/IConnectivityManager;->getTetherableUsbRegexs()[Ljava/lang/String;
-Landroid/net/IConnectivityManager;->getTetherableWifiRegexs()[Ljava/lang/String;
-Landroid/net/IConnectivityManager;->getTetheredIfaces()[Ljava/lang/String;
-Landroid/net/IConnectivityManager;->getTetheringErroredIfaces()[Ljava/lang/String;
-Landroid/net/IConnectivityManager;->startLegacyVpn(Lcom/android/internal/net/VpnProfile;)V
Landroid/net/INetworkManagementEventObserver$Stub;-><init>()V
Landroid/net/INetworkPolicyListener$Stub;-><init>()V
Landroid/net/INetworkPolicyManager$Stub;->asInterface(Landroid/os/IBinder;)Landroid/net/INetworkPolicyManager;
-Landroid/net/INetworkPolicyManager;->getNetworkQuotaInfo(Landroid/net/NetworkState;)Landroid/net/NetworkQuotaInfo;
-Landroid/net/INetworkPolicyManager;->getRestrictBackground()Z
-Landroid/net/INetworkPolicyManager;->getUidPolicy(I)I
-Landroid/net/INetworkPolicyManager;->setNetworkPolicies([Landroid/net/NetworkPolicy;)V
-Landroid/net/INetworkPolicyManager;->setRestrictBackground(Z)V
-Landroid/net/INetworkPolicyManager;->setUidPolicy(II)V
-Landroid/net/INetworkPolicyManager;->snoozeLimit(Landroid/net/NetworkTemplate;)V
Landroid/net/INetworkScoreService$Stub;->asInterface(Landroid/os/IBinder;)Landroid/net/INetworkScoreService;
Landroid/net/INetworkStatsService$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
Landroid/net/INetworkStatsService$Stub$Proxy;->getMobileIfaces()[Ljava/lang/String;
Landroid/net/INetworkStatsService$Stub;->asInterface(Landroid/os/IBinder;)Landroid/net/INetworkStatsService;
-Landroid/net/INetworkStatsService;->forceUpdate()V
-Landroid/net/INetworkStatsService;->getDataLayerSnapshotForUid(I)Landroid/net/NetworkStats;
-Landroid/net/INetworkStatsService;->getMobileIfaces()[Ljava/lang/String;
-Landroid/net/INetworkStatsService;->openSession()Landroid/net/INetworkStatsSession;
-Landroid/net/INetworkStatsService;->openSessionForUsageStats(ILjava/lang/String;)Landroid/net/INetworkStatsSession;
-Landroid/net/INetworkStatsSession;->close()V
-Landroid/net/INetworkStatsSession;->getHistoryForNetwork(Landroid/net/NetworkTemplate;I)Landroid/net/NetworkStatsHistory;
-Landroid/net/INetworkStatsSession;->getHistoryForUid(Landroid/net/NetworkTemplate;IIII)Landroid/net/NetworkStatsHistory;
-Landroid/net/INetworkStatsSession;->getSummaryForAllUid(Landroid/net/NetworkTemplate;JJZ)Landroid/net/NetworkStats;
-Landroid/net/INetworkStatsSession;->getSummaryForNetwork(Landroid/net/NetworkTemplate;JJ)Landroid/net/NetworkStats;
Landroid/net/InterfaceConfiguration;-><init>()V
Landroid/net/LinkProperties$ProvisioningChange;->values()[Landroid/net/LinkProperties$ProvisioningChange;
Landroid/net/MobileLinkQualityInfo;-><init>()V
@@ -575,22 +516,12 @@ Landroid/net/SntpClient;-><init>()V
Landroid/net/wifi/IWifiManager$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
Landroid/net/wifi/IWifiManager$Stub;->asInterface(Landroid/os/IBinder;)Landroid/net/wifi/IWifiManager;
Landroid/net/wifi/IWifiManager$Stub;->TRANSACTION_getScanResults:I
-Landroid/net/wifi/IWifiManager;->getCurrentNetwork()Landroid/net/Network;
-Landroid/net/wifi/IWifiManager;->getWifiApConfiguration()Landroid/net/wifi/WifiConfiguration;
-Landroid/net/wifi/IWifiManager;->getWifiApEnabledState()I
Landroid/net/wifi/IWifiScanner$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
Landroid/net/wifi/IWifiScanner$Stub$Proxy;->mRemote:Landroid/os/IBinder;
Landroid/net/wifi/IWifiScanner$Stub;-><init>()V
Landroid/net/wifi/IWifiScanner$Stub;->asInterface(Landroid/os/IBinder;)Landroid/net/wifi/IWifiScanner;
Landroid/net/wifi/p2p/IWifiP2pManager$Stub;->asInterface(Landroid/os/IBinder;)Landroid/net/wifi/p2p/IWifiP2pManager;
Landroid/nfc/INfcAdapter$Stub;->TRANSACTION_enable:I
-Landroid/nfc/INfcAdapterExtras;->authenticate(Ljava/lang/String;[B)V
-Landroid/nfc/INfcAdapterExtras;->close(Ljava/lang/String;Landroid/os/IBinder;)Landroid/os/Bundle;
-Landroid/nfc/INfcAdapterExtras;->getCardEmulationRoute(Ljava/lang/String;)I
-Landroid/nfc/INfcAdapterExtras;->getDriverName(Ljava/lang/String;)Ljava/lang/String;
-Landroid/nfc/INfcAdapterExtras;->open(Ljava/lang/String;Landroid/os/IBinder;)Landroid/os/Bundle;
-Landroid/nfc/INfcAdapterExtras;->setCardEmulationRoute(Ljava/lang/String;I)V
-Landroid/nfc/INfcAdapterExtras;->transceive(Ljava/lang/String;[B)Landroid/os/Bundle;
Landroid/os/AsyncResult;-><init>(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Throwable;)V
Landroid/os/AsyncResult;->exception:Ljava/lang/Throwable;
Landroid/os/AsyncResult;->forMessage(Landroid/os/Message;)Landroid/os/AsyncResult;
@@ -1360,9 +1291,7 @@ Landroid/R$styleable;->View_visibility:I
Landroid/R$styleable;->Window:[I
Landroid/R$styleable;->Window_windowBackground:I
Landroid/R$styleable;->Window_windowFrame:I
-Landroid/security/Credentials;->convertToPem([Ljava/security/cert/Certificate;)[B
Landroid/security/IKeyChainService$Stub;->asInterface(Landroid/os/IBinder;)Landroid/security/IKeyChainService;
-Landroid/security/IKeyChainService;->requestPrivateKey(Ljava/lang/String;)Ljava/lang/String;
Landroid/security/keymaster/KeymasterBlobArgument;-><init>(ILandroid/os/Parcel;)V
Landroid/security/keymaster/KeymasterBlobArgument;-><init>(I[B)V
Landroid/security/keymaster/KeymasterBlobArgument;->blob:[B
@@ -1391,29 +1320,12 @@ Landroid/service/dreams/IDreamManager;->dream()V
Landroid/service/dreams/IDreamManager;->getDreamComponents()[Landroid/content/ComponentName;
Landroid/service/dreams/IDreamManager;->isDreaming()Z
Landroid/service/dreams/IDreamManager;->setDreamComponents([Landroid/content/ComponentName;)V
-Landroid/service/euicc/IDeleteSubscriptionCallback;->onComplete(I)V
-Landroid/service/euicc/IEraseSubscriptionsCallback;->onComplete(I)V
Landroid/service/euicc/IEuiccService$Stub;-><init>()V
-Landroid/service/euicc/IGetDefaultDownloadableSubscriptionListCallback;->onComplete(Landroid/service/euicc/GetDefaultDownloadableSubscriptionListResult;)V
-Landroid/service/euicc/IGetDownloadableSubscriptionMetadataCallback;->onComplete(Landroid/service/euicc/GetDownloadableSubscriptionMetadataResult;)V
-Landroid/service/euicc/IGetEidCallback;->onSuccess(Ljava/lang/String;)V
-Landroid/service/euicc/IGetEuiccInfoCallback;->onSuccess(Landroid/telephony/euicc/EuiccInfo;)V
-Landroid/service/euicc/IGetEuiccProfileInfoListCallback;->onComplete(Landroid/service/euicc/GetEuiccProfileInfoListResult;)V
-Landroid/service/euicc/IRetainSubscriptionsForFactoryResetCallback;->onComplete(I)V
-Landroid/service/euicc/ISwitchToSubscriptionCallback;->onComplete(I)V
-Landroid/service/euicc/IUpdateSubscriptionNicknameCallback;->onComplete(I)V
Landroid/service/notification/INotificationListener$Stub;-><init>()V
Landroid/service/persistentdata/IPersistentDataBlockService$Stub;->asInterface(Landroid/os/IBinder;)Landroid/service/persistentdata/IPersistentDataBlockService;
Landroid/service/vr/IVrManager$Stub;->asInterface(Landroid/os/IBinder;)Landroid/service/vr/IVrManager;
-Landroid/service/vr/IVrManager;->getVr2dDisplayId()I
-Landroid/service/vr/IVrManager;->getVrModeState()Z
Landroid/service/wallpaper/IWallpaperConnection$Stub;-><init>()V
-Landroid/service/wallpaper/IWallpaperEngine;->destroy()V
-Landroid/service/wallpaper/IWallpaperEngine;->dispatchPointer(Landroid/view/MotionEvent;)V
-Landroid/service/wallpaper/IWallpaperEngine;->dispatchWallpaperCommand(Ljava/lang/String;IIILandroid/os/Bundle;)V
-Landroid/service/wallpaper/IWallpaperEngine;->setVisibility(Z)V
Landroid/service/wallpaper/IWallpaperService$Stub;->asInterface(Landroid/os/IBinder;)Landroid/service/wallpaper/IWallpaperService;
-Landroid/speech/IRecognitionListener;->onEvent(ILandroid/os/Bundle;)V
Landroid/telecom/Log;->i(Ljava/lang/String;Ljava/lang/String;[Ljava/lang/Object;)V
Landroid/telecom/Log;->w(Ljava/lang/String;Ljava/lang/String;[Ljava/lang/Object;)V
Landroid/telephony/ims/compat/feature/MMTelFeature;-><init>()V
@@ -1424,10 +1336,6 @@ Landroid/telephony/JapanesePhoneNumberFormatter;->format(Landroid/text/Editable;
Landroid/telephony/mbms/IMbmsStreamingSessionCallback$Stub;-><init>()V
Landroid/telephony/mbms/IStreamingServiceCallback$Stub;-><init>()V
Landroid/telephony/mbms/vendor/IMbmsStreamingService$Stub;->asInterface(Landroid/os/IBinder;)Landroid/telephony/mbms/vendor/IMbmsStreamingService;
-Landroid/telephony/mbms/vendor/IMbmsStreamingService;->getPlaybackUri(ILjava/lang/String;)Landroid/net/Uri;
-Landroid/telephony/mbms/vendor/IMbmsStreamingService;->initialize(Landroid/telephony/mbms/IMbmsStreamingSessionCallback;I)I
-Landroid/telephony/mbms/vendor/IMbmsStreamingService;->requestUpdateStreamingServices(ILjava/util/List;)I
-Landroid/telephony/mbms/vendor/IMbmsStreamingService;->startStreaming(ILjava/lang/String;Landroid/telephony/mbms/IStreamingServiceCallback;)I
Landroid/telephony/SmsCbCmasInfo;->getCategory()I
Landroid/telephony/SmsCbCmasInfo;->getCertainty()I
Landroid/telephony/SmsCbCmasInfo;->getMessageClass()I
@@ -1470,17 +1378,8 @@ Landroid/view/autofill/IAutoFillManager$Stub$Proxy;-><init>(Landroid/os/IBinder;
Landroid/view/autofill/IAutoFillManager$Stub;->asInterface(Landroid/os/IBinder;)Landroid/view/autofill/IAutoFillManager;
Landroid/view/IAppTransitionAnimationSpecsFuture$Stub;-><init>()V
Landroid/view/IDockedStackListener$Stub;-><init>()V
-Landroid/view/IRecentsAnimationController;->finish(Z)V
-Landroid/view/IRecentsAnimationController;->screenshotTask(I)Landroid/app/ActivityManager$TaskSnapshot;
-Landroid/view/IRecentsAnimationController;->setAnimationTargetsBehindSystemBars(Z)V
-Landroid/view/IRecentsAnimationController;->setInputConsumerEnabled(Z)V
Landroid/view/IRecentsAnimationRunner$Stub;-><init>()V
-Landroid/view/IRecentsAnimationRunner;->onAnimationCanceled()V
-Landroid/view/IRecentsAnimationRunner;->onAnimationStart(Landroid/view/IRecentsAnimationController;[Landroid/view/RemoteAnimationTarget;Landroid/graphics/Rect;Landroid/graphics/Rect;)V
-Landroid/view/IRemoteAnimationFinishedCallback;->onAnimationFinished()V
Landroid/view/IRemoteAnimationRunner$Stub;-><init>()V
-Landroid/view/IRemoteAnimationRunner;->onAnimationCancelled()V
-Landroid/view/IRemoteAnimationRunner;->onAnimationStart([Landroid/view/RemoteAnimationTarget;Landroid/view/IRemoteAnimationFinishedCallback;)V
Landroid/view/IRotationWatcher$Stub;-><init>()V
Landroid/view/IWindow$Stub;-><init>()V
Landroid/view/IWindow$Stub;->asInterface(Landroid/os/IBinder;)Landroid/view/IWindow;
@@ -1492,44 +1391,7 @@ Landroid/view/IWindowManager$Stub$Proxy;->hasNavigationBar(I)Z
Landroid/view/IWindowManager$Stub$Proxy;->watchRotation(Landroid/view/IRotationWatcher;I)I
Landroid/view/IWindowManager$Stub;-><init>()V
Landroid/view/IWindowManager$Stub;->asInterface(Landroid/os/IBinder;)Landroid/view/IWindowManager;
-Landroid/view/IWindowManager;->createInputConsumer(Landroid/os/IBinder;Ljava/lang/String;ILandroid/view/InputChannel;)V
-Landroid/view/IWindowManager;->destroyInputConsumer(Ljava/lang/String;I)Z
-Landroid/view/IWindowManager;->endProlongedAnimations()V
-Landroid/view/IWindowManager;->executeAppTransition()V
-Landroid/view/IWindowManager;->freezeRotation(I)V
-Landroid/view/IWindowManager;->getAnimationScale(I)F
-Landroid/view/IWindowManager;->getAnimationScales()[F
-Landroid/view/IWindowManager;->getBaseDisplaySize(ILandroid/graphics/Point;)V
-Landroid/view/IWindowManager;->getDockedStackSide()I
-Landroid/view/IWindowManager;->getInitialDisplayDensity(I)I
-Landroid/view/IWindowManager;->getInitialDisplaySize(ILandroid/graphics/Point;)V
-Landroid/view/IWindowManager;->getStableInsets(ILandroid/graphics/Rect;)V
-Landroid/view/IWindowManager;->hasNavigationBar(I)Z
-Landroid/view/IWindowManager;->isKeyguardLocked()Z
-Landroid/view/IWindowManager;->isKeyguardSecure()Z
-Landroid/view/IWindowManager;->isSafeModeEnabled()Z
-Landroid/view/IWindowManager;->lockNow(Landroid/os/Bundle;)V
-Landroid/view/IWindowManager;->overridePendingAppTransitionMultiThumbFuture(Landroid/view/IAppTransitionAnimationSpecsFuture;Landroid/os/IRemoteCallback;ZI)V
-Landroid/view/IWindowManager;->overridePendingAppTransitionRemote(Landroid/view/RemoteAnimationAdapter;I)V
-Landroid/view/IWindowManager;->registerDockedStackListener(Landroid/view/IDockedStackListener;)V
-Landroid/view/IWindowManager;->removeRotationWatcher(Landroid/view/IRotationWatcher;)V
-Landroid/view/IWindowManager;->setAnimationScale(IF)V
-Landroid/view/IWindowManager;->setAnimationScales([F)V
-Landroid/view/IWindowManager;->setNavBarVirtualKeyHapticFeedbackEnabled(Z)V
-Landroid/view/IWindowManager;->setShelfHeight(ZI)V
-Landroid/view/IWindowManager;->setStrictModeVisualIndicatorPreference(Ljava/lang/String;)V
-Landroid/view/IWindowManager;->thawRotation()V
Landroid/view/IWindowSession$Stub;->asInterface(Landroid/os/IBinder;)Landroid/view/IWindowSession;
-Landroid/view/IWindowSession;->finishDrawing(Landroid/view/IWindow;)V
-Landroid/view/IWindowSession;->getInTouchMode()Z
-Landroid/view/IWindowSession;->performDrag(Landroid/view/IWindow;ILandroid/view/SurfaceControl;IFFFFLandroid/content/ClipData;)Landroid/os/IBinder;
-Landroid/view/IWindowSession;->performHapticFeedback(IZ)Z
-Landroid/view/IWindowSession;->remove(Landroid/view/IWindow;)V
-Landroid/view/IWindowSession;->setInTouchMode(Z)V
-Landroid/view/IWindowSession;->setTransparentRegion(Landroid/view/IWindow;Landroid/graphics/Region;)V
-Landroid/view/IWindowSession;->wallpaperCommandComplete(Landroid/os/IBinder;Landroid/os/Bundle;)V
-Landroid/view/IWindowSession;->wallpaperOffsetsComplete(Landroid/os/IBinder;)V
-Landroid/view/RenderNodeAnimator;->setDuration(J)Landroid/view/RenderNodeAnimator;
Landroid/view/View$AttachInfo$InvalidateInfo;-><init>()V
Landroid/view/View$CheckForLongPress;-><init>(Landroid/view/View;)V
Landroid/view/View$ListenerInfo;-><init>()V
@@ -1538,9 +1400,6 @@ Landroid/webkit/CacheManager$CacheResult;-><init>()V
Landroid/webkit/IWebViewUpdateService$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
Landroid/webkit/IWebViewUpdateService$Stub$Proxy;->waitForAndGetProvider()Landroid/webkit/WebViewProviderResponse;
Landroid/webkit/IWebViewUpdateService$Stub;->asInterface(Landroid/os/IBinder;)Landroid/webkit/IWebViewUpdateService;
-Landroid/webkit/IWebViewUpdateService;->getCurrentWebViewPackageName()Ljava/lang/String;
-Landroid/webkit/IWebViewUpdateService;->getValidWebViewPackages()[Landroid/webkit/WebViewProviderInfo;
-Landroid/webkit/IWebViewUpdateService;->isFallbackPackage(Ljava/lang/String;)Z
Landroid/widget/DigitalClock$FormatChangeObserver;-><init>(Landroid/widget/DigitalClock;)V
Landroid/widget/QuickContactBadge$QueryHandler;-><init>(Landroid/widget/QuickContactBadge;Landroid/content/ContentResolver;)V
Landroid/widget/RelativeLayout$DependencyGraph$Node;-><init>()V
@@ -1550,7 +1409,6 @@ Lcom/android/ims/ImsCall;->isMultiparty()Z
Lcom/android/ims/ImsCall;->reject(I)V
Lcom/android/ims/ImsCall;->terminate(I)V
Lcom/android/ims/ImsConfigListener$Stub;-><init>()V
-Lcom/android/ims/ImsConfigListener;->onSetFeatureResponse(IIII)V
Lcom/android/ims/ImsEcbm;->exitEmergencyCallbackMode()V
Lcom/android/ims/ImsManager;->getConfigInterface()Lcom/android/ims/ImsConfig;
Lcom/android/ims/ImsManager;->getInstance(Landroid/content/Context;I)Lcom/android/ims/ImsManager;
@@ -1560,104 +1418,17 @@ Lcom/android/ims/ImsManager;->isVolteEnabledByPlatform(Landroid/content/Context;
Lcom/android/ims/ImsUtInterface;->queryCallForward(ILjava/lang/String;Landroid/os/Message;)V
Lcom/android/ims/internal/IImsCallSession$Stub;-><init>()V
Lcom/android/ims/internal/IImsCallSession$Stub;->asInterface(Landroid/os/IBinder;)Lcom/android/ims/internal/IImsCallSession;
-Lcom/android/ims/internal/IImsCallSessionListener;->callSessionConferenceStateUpdated(Lcom/android/ims/internal/IImsCallSession;Landroid/telephony/ims/ImsConferenceState;)V
-Lcom/android/ims/internal/IImsCallSessionListener;->callSessionHandover(Lcom/android/ims/internal/IImsCallSession;IILandroid/telephony/ims/ImsReasonInfo;)V
-Lcom/android/ims/internal/IImsCallSessionListener;->callSessionHandoverFailed(Lcom/android/ims/internal/IImsCallSession;IILandroid/telephony/ims/ImsReasonInfo;)V
-Lcom/android/ims/internal/IImsCallSessionListener;->callSessionHeld(Lcom/android/ims/internal/IImsCallSession;Landroid/telephony/ims/ImsCallProfile;)V
-Lcom/android/ims/internal/IImsCallSessionListener;->callSessionHoldFailed(Lcom/android/ims/internal/IImsCallSession;Landroid/telephony/ims/ImsReasonInfo;)V
-Lcom/android/ims/internal/IImsCallSessionListener;->callSessionHoldReceived(Lcom/android/ims/internal/IImsCallSession;Landroid/telephony/ims/ImsCallProfile;)V
-Lcom/android/ims/internal/IImsCallSessionListener;->callSessionInviteParticipantsRequestDelivered(Lcom/android/ims/internal/IImsCallSession;)V
-Lcom/android/ims/internal/IImsCallSessionListener;->callSessionInviteParticipantsRequestFailed(Lcom/android/ims/internal/IImsCallSession;Landroid/telephony/ims/ImsReasonInfo;)V
-Lcom/android/ims/internal/IImsCallSessionListener;->callSessionMergeComplete(Lcom/android/ims/internal/IImsCallSession;)V
-Lcom/android/ims/internal/IImsCallSessionListener;->callSessionMergeFailed(Lcom/android/ims/internal/IImsCallSession;Landroid/telephony/ims/ImsReasonInfo;)V
-Lcom/android/ims/internal/IImsCallSessionListener;->callSessionMergeStarted(Lcom/android/ims/internal/IImsCallSession;Lcom/android/ims/internal/IImsCallSession;Landroid/telephony/ims/ImsCallProfile;)V
-Lcom/android/ims/internal/IImsCallSessionListener;->callSessionMultipartyStateChanged(Lcom/android/ims/internal/IImsCallSession;Z)V
-Lcom/android/ims/internal/IImsCallSessionListener;->callSessionProgressing(Lcom/android/ims/internal/IImsCallSession;Landroid/telephony/ims/ImsStreamMediaProfile;)V
-Lcom/android/ims/internal/IImsCallSessionListener;->callSessionResumed(Lcom/android/ims/internal/IImsCallSession;Landroid/telephony/ims/ImsCallProfile;)V
-Lcom/android/ims/internal/IImsCallSessionListener;->callSessionResumeFailed(Lcom/android/ims/internal/IImsCallSession;Landroid/telephony/ims/ImsReasonInfo;)V
-Lcom/android/ims/internal/IImsCallSessionListener;->callSessionResumeReceived(Lcom/android/ims/internal/IImsCallSession;Landroid/telephony/ims/ImsCallProfile;)V
-Lcom/android/ims/internal/IImsCallSessionListener;->callSessionStarted(Lcom/android/ims/internal/IImsCallSession;Landroid/telephony/ims/ImsCallProfile;)V
-Lcom/android/ims/internal/IImsCallSessionListener;->callSessionStartFailed(Lcom/android/ims/internal/IImsCallSession;Landroid/telephony/ims/ImsReasonInfo;)V
-Lcom/android/ims/internal/IImsCallSessionListener;->callSessionSuppServiceReceived(Lcom/android/ims/internal/IImsCallSession;Landroid/telephony/ims/ImsSuppServiceNotification;)V
-Lcom/android/ims/internal/IImsCallSessionListener;->callSessionTerminated(Lcom/android/ims/internal/IImsCallSession;Landroid/telephony/ims/ImsReasonInfo;)V
-Lcom/android/ims/internal/IImsCallSessionListener;->callSessionTtyModeReceived(Lcom/android/ims/internal/IImsCallSession;I)V
-Lcom/android/ims/internal/IImsCallSessionListener;->callSessionUpdated(Lcom/android/ims/internal/IImsCallSession;Landroid/telephony/ims/ImsCallProfile;)V
Lcom/android/ims/internal/IImsConfig$Stub;-><init>()V
Lcom/android/ims/internal/IImsEcbm$Stub;-><init>()V
-Lcom/android/ims/internal/IImsRegistrationListener;->registrationAssociatedUriChanged([Landroid/net/Uri;)V
-Lcom/android/ims/internal/IImsRegistrationListener;->registrationChangeFailed(ILandroid/telephony/ims/ImsReasonInfo;)V
-Lcom/android/ims/internal/IImsRegistrationListener;->registrationConnected()V
-Lcom/android/ims/internal/IImsRegistrationListener;->registrationConnectedWithRadioTech(I)V
-Lcom/android/ims/internal/IImsRegistrationListener;->registrationDisconnected(Landroid/telephony/ims/ImsReasonInfo;)V
-Lcom/android/ims/internal/IImsRegistrationListener;->registrationFeatureCapabilityChanged(I[I[I)V
-Lcom/android/ims/internal/IImsRegistrationListener;->registrationProgressingWithRadioTech(I)V
-Lcom/android/ims/internal/IImsRegistrationListener;->voiceMessageCountUpdate(I)V
Lcom/android/ims/internal/IImsService$Stub;-><init>()V
Lcom/android/ims/internal/IImsService$Stub;->asInterface(Landroid/os/IBinder;)Lcom/android/ims/internal/IImsService;
Lcom/android/ims/internal/IImsUt$Stub;-><init>()V
-Lcom/android/ims/internal/IImsUtListener;->utConfigurationCallBarringQueried(Lcom/android/ims/internal/IImsUt;I[Landroid/telephony/ims/ImsSsInfo;)V
-Lcom/android/ims/internal/IImsUtListener;->utConfigurationCallForwardQueried(Lcom/android/ims/internal/IImsUt;I[Landroid/telephony/ims/ImsCallForwardInfo;)V
-Lcom/android/ims/internal/IImsUtListener;->utConfigurationCallWaitingQueried(Lcom/android/ims/internal/IImsUt;I[Landroid/telephony/ims/ImsSsInfo;)V
-Lcom/android/ims/internal/IImsUtListener;->utConfigurationQueried(Lcom/android/ims/internal/IImsUt;ILandroid/os/Bundle;)V
-Lcom/android/ims/internal/IImsUtListener;->utConfigurationQueryFailed(Lcom/android/ims/internal/IImsUt;ILandroid/telephony/ims/ImsReasonInfo;)V
-Lcom/android/ims/internal/IImsUtListener;->utConfigurationUpdated(Lcom/android/ims/internal/IImsUt;I)V
-Lcom/android/ims/internal/IImsUtListener;->utConfigurationUpdateFailed(Lcom/android/ims/internal/IImsUt;ILandroid/telephony/ims/ImsReasonInfo;)V
-Lcom/android/ims/internal/IImsVideoCallCallback;->changeCallDataUsage(J)V
-Lcom/android/ims/internal/IImsVideoCallCallback;->changeCameraCapabilities(Landroid/telecom/VideoProfile$CameraCapabilities;)V
-Lcom/android/ims/internal/IImsVideoCallCallback;->changePeerDimensions(II)V
-Lcom/android/ims/internal/IImsVideoCallCallback;->changeVideoQuality(I)V
-Lcom/android/ims/internal/IImsVideoCallCallback;->handleCallSessionEvent(I)V
-Lcom/android/ims/internal/IImsVideoCallCallback;->receiveSessionModifyRequest(Landroid/telecom/VideoProfile;)V
-Lcom/android/ims/internal/IImsVideoCallCallback;->receiveSessionModifyResponse(ILandroid/telecom/VideoProfile;Landroid/telecom/VideoProfile;)V
Lcom/android/ims/internal/IImsVideoCallProvider$Stub;-><init>()V
-Lcom/android/ims/internal/IImsVideoCallProvider;->setCallback(Lcom/android/ims/internal/IImsVideoCallCallback;)V
Lcom/android/ims/internal/ImsVideoCallProviderWrapper;-><init>(Lcom/android/ims/internal/IImsVideoCallProvider;)V
-Lcom/android/ims/internal/uce/options/IOptionsListener;->cmdStatus(Lcom/android/ims/internal/uce/options/OptionsCmdStatus;)V
-Lcom/android/ims/internal/uce/options/IOptionsListener;->getVersionCb(Ljava/lang/String;)V
-Lcom/android/ims/internal/uce/options/IOptionsListener;->incomingOptions(Ljava/lang/String;Lcom/android/ims/internal/uce/options/OptionsCapInfo;I)V
-Lcom/android/ims/internal/uce/options/IOptionsListener;->serviceAvailable(Lcom/android/ims/internal/uce/common/StatusCode;)V
-Lcom/android/ims/internal/uce/options/IOptionsListener;->serviceUnavailable(Lcom/android/ims/internal/uce/common/StatusCode;)V
-Lcom/android/ims/internal/uce/options/IOptionsListener;->sipResponseReceived(Ljava/lang/String;Lcom/android/ims/internal/uce/options/OptionsSipResponse;Lcom/android/ims/internal/uce/options/OptionsCapInfo;)V
Lcom/android/ims/internal/uce/options/IOptionsService$Stub;-><init>()V
-Lcom/android/ims/internal/uce/options/IOptionsService;->addListener(ILcom/android/ims/internal/uce/options/IOptionsListener;Lcom/android/ims/internal/uce/common/UceLong;)Lcom/android/ims/internal/uce/common/StatusCode;
-Lcom/android/ims/internal/uce/options/IOptionsService;->getContactCap(ILjava/lang/String;I)Lcom/android/ims/internal/uce/common/StatusCode;
-Lcom/android/ims/internal/uce/options/IOptionsService;->getContactListCap(I[Ljava/lang/String;I)Lcom/android/ims/internal/uce/common/StatusCode;
-Lcom/android/ims/internal/uce/options/IOptionsService;->getMyInfo(II)Lcom/android/ims/internal/uce/common/StatusCode;
-Lcom/android/ims/internal/uce/options/IOptionsService;->getVersion(I)Lcom/android/ims/internal/uce/common/StatusCode;
-Lcom/android/ims/internal/uce/options/IOptionsService;->removeListener(ILcom/android/ims/internal/uce/common/UceLong;)Lcom/android/ims/internal/uce/common/StatusCode;
-Lcom/android/ims/internal/uce/options/IOptionsService;->responseIncomingOptions(IIILjava/lang/String;Lcom/android/ims/internal/uce/options/OptionsCapInfo;Z)Lcom/android/ims/internal/uce/common/StatusCode;
-Lcom/android/ims/internal/uce/options/IOptionsService;->setMyInfo(ILcom/android/ims/internal/uce/common/CapInfo;I)Lcom/android/ims/internal/uce/common/StatusCode;
-Lcom/android/ims/internal/uce/presence/IPresenceListener;->capInfoReceived(Ljava/lang/String;[Lcom/android/ims/internal/uce/presence/PresTupleInfo;)V
-Lcom/android/ims/internal/uce/presence/IPresenceListener;->cmdStatus(Lcom/android/ims/internal/uce/presence/PresCmdStatus;)V
-Lcom/android/ims/internal/uce/presence/IPresenceListener;->getVersionCb(Ljava/lang/String;)V
-Lcom/android/ims/internal/uce/presence/IPresenceListener;->listCapInfoReceived(Lcom/android/ims/internal/uce/presence/PresRlmiInfo;[Lcom/android/ims/internal/uce/presence/PresResInfo;)V
-Lcom/android/ims/internal/uce/presence/IPresenceListener;->publishTriggering(Lcom/android/ims/internal/uce/presence/PresPublishTriggerType;)V
-Lcom/android/ims/internal/uce/presence/IPresenceListener;->serviceAvailable(Lcom/android/ims/internal/uce/common/StatusCode;)V
-Lcom/android/ims/internal/uce/presence/IPresenceListener;->serviceUnAvailable(Lcom/android/ims/internal/uce/common/StatusCode;)V
-Lcom/android/ims/internal/uce/presence/IPresenceListener;->sipResponseReceived(Lcom/android/ims/internal/uce/presence/PresSipResponse;)V
-Lcom/android/ims/internal/uce/presence/IPresenceListener;->unpublishMessageSent()V
Lcom/android/ims/internal/uce/presence/IPresenceService$Stub;-><init>()V
-Lcom/android/ims/internal/uce/presence/IPresenceService;->addListener(ILcom/android/ims/internal/uce/presence/IPresenceListener;Lcom/android/ims/internal/uce/common/UceLong;)Lcom/android/ims/internal/uce/common/StatusCode;
-Lcom/android/ims/internal/uce/presence/IPresenceService;->getContactCap(ILjava/lang/String;I)Lcom/android/ims/internal/uce/common/StatusCode;
-Lcom/android/ims/internal/uce/presence/IPresenceService;->getContactListCap(I[Ljava/lang/String;I)Lcom/android/ims/internal/uce/common/StatusCode;
-Lcom/android/ims/internal/uce/presence/IPresenceService;->getVersion(I)Lcom/android/ims/internal/uce/common/StatusCode;
-Lcom/android/ims/internal/uce/presence/IPresenceService;->publishMyCap(ILcom/android/ims/internal/uce/presence/PresCapInfo;I)Lcom/android/ims/internal/uce/common/StatusCode;
-Lcom/android/ims/internal/uce/presence/IPresenceService;->reenableService(II)Lcom/android/ims/internal/uce/common/StatusCode;
-Lcom/android/ims/internal/uce/presence/IPresenceService;->removeListener(ILcom/android/ims/internal/uce/common/UceLong;)Lcom/android/ims/internal/uce/common/StatusCode;
-Lcom/android/ims/internal/uce/presence/IPresenceService;->setNewFeatureTag(ILjava/lang/String;Lcom/android/ims/internal/uce/presence/PresServiceInfo;I)Lcom/android/ims/internal/uce/common/StatusCode;
Lcom/android/ims/internal/uce/uceservice/IUceListener$Stub;-><init>()V
-Lcom/android/ims/internal/uce/uceservice/IUceListener;->setStatus(I)V
Lcom/android/ims/internal/uce/uceservice/IUceService$Stub;-><init>()V
-Lcom/android/ims/internal/uce/uceservice/IUceService;->createOptionsService(Lcom/android/ims/internal/uce/options/IOptionsListener;Lcom/android/ims/internal/uce/common/UceLong;)I
-Lcom/android/ims/internal/uce/uceservice/IUceService;->createPresenceService(Lcom/android/ims/internal/uce/presence/IPresenceListener;Lcom/android/ims/internal/uce/common/UceLong;)I
-Lcom/android/ims/internal/uce/uceservice/IUceService;->destroyOptionsService(I)V
-Lcom/android/ims/internal/uce/uceservice/IUceService;->destroyPresenceService(I)V
-Lcom/android/ims/internal/uce/uceservice/IUceService;->getOptionsService()Lcom/android/ims/internal/uce/options/IOptionsService;
-Lcom/android/ims/internal/uce/uceservice/IUceService;->getPresenceService()Lcom/android/ims/internal/uce/presence/IPresenceService;
-Lcom/android/ims/internal/uce/uceservice/IUceService;->getServiceStatus()Z
-Lcom/android/ims/internal/uce/uceservice/IUceService;->isServiceStarted()Z
-Lcom/android/ims/internal/uce/uceservice/IUceService;->startService(Lcom/android/ims/internal/uce/uceservice/IUceListener;)Z
-Lcom/android/ims/internal/uce/uceservice/IUceService;->stopService()Z
Lcom/android/internal/app/AlertActivity;-><init>()V
Lcom/android/internal/app/AlertActivity;->mAlert:Lcom/android/internal/app/AlertController;
Lcom/android/internal/app/AlertActivity;->mAlertParams:Lcom/android/internal/app/AlertController$AlertParams;
@@ -1688,22 +1459,12 @@ Lcom/android/internal/app/IAppOpsService$Stub;->TRANSACTION_setUserRestrictions:
Lcom/android/internal/app/IAppOpsService$Stub;->TRANSACTION_startOperation:I
Lcom/android/internal/app/IAppOpsService$Stub;->TRANSACTION_startWatchingMode:I
Lcom/android/internal/app/IAppOpsService$Stub;->TRANSACTION_stopWatchingMode:I
-Lcom/android/internal/app/IAppOpsService;->finishOperation(Landroid/os/IBinder;IILjava/lang/String;)V
-Lcom/android/internal/app/IAppOpsService;->getOpsForPackage(ILjava/lang/String;[I)Ljava/util/List;
-Lcom/android/internal/app/IAppOpsService;->getPackagesForOps([I)Ljava/util/List;
-Lcom/android/internal/app/IAppOpsService;->resetAllModes(ILjava/lang/String;)V
-Lcom/android/internal/app/IAppOpsService;->setMode(IILjava/lang/String;I)V
Lcom/android/internal/app/IBatteryStats$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
Lcom/android/internal/app/IBatteryStats$Stub;->asInterface(Landroid/os/IBinder;)Lcom/android/internal/app/IBatteryStats;
-Lcom/android/internal/app/IBatteryStats;->computeChargeTimeRemaining()J
-Lcom/android/internal/app/IBatteryStats;->getAwakeTimeBattery()J
-Lcom/android/internal/app/IBatteryStats;->getStatistics()[B
-Lcom/android/internal/app/IBatteryStats;->isCharging()Z
Lcom/android/internal/app/IMediaContainerService$Stub;->asInterface(Landroid/os/IBinder;)Lcom/android/internal/app/IMediaContainerService;
Lcom/android/internal/app/IntentForwarderActivity;->TAG:Ljava/lang/String;
Lcom/android/internal/app/IVoiceInteractionManagerService$Stub$Proxy;->showSessionFromSession(Landroid/os/IBinder;Landroid/os/Bundle;I)Z
Lcom/android/internal/app/IVoiceInteractionManagerService$Stub;->asInterface(Landroid/os/IBinder;)Lcom/android/internal/app/IVoiceInteractionManagerService;
-Lcom/android/internal/app/IVoiceInteractionManagerService;->getKeyphraseSoundModel(ILjava/lang/String;)Landroid/hardware/soundtrigger/SoundTrigger$KeyphraseSoundModel;
Lcom/android/internal/app/LocaleHelper$LocaleInfoComparator;-><init>(Ljava/util/Locale;Z)V
Lcom/android/internal/app/LocaleHelper$LocaleInfoComparator;->compare(Lcom/android/internal/app/LocaleStore$LocaleInfo;Lcom/android/internal/app/LocaleStore$LocaleInfo;)I
Lcom/android/internal/app/LocaleHelper;->getDisplayCountry(Ljava/util/Locale;Ljava/util/Locale;)Ljava/lang/String;
@@ -1731,10 +1492,6 @@ Lcom/android/internal/app/WindowDecorActionBar;->mTabScrollView:Lcom/android/int
Lcom/android/internal/app/WindowDecorActionBar;->setShowHideAnimationEnabled(Z)V
Lcom/android/internal/appwidget/IAppWidgetService$Stub;->asInterface(Landroid/os/IBinder;)Lcom/android/internal/appwidget/IAppWidgetService;
Lcom/android/internal/appwidget/IAppWidgetService$Stub;->TRANSACTION_bindAppWidgetId:I
-Lcom/android/internal/appwidget/IAppWidgetService;->bindAppWidgetId(Ljava/lang/String;IILandroid/content/ComponentName;Landroid/os/Bundle;)Z
-Lcom/android/internal/appwidget/IAppWidgetService;->bindRemoteViewsService(Ljava/lang/String;ILandroid/content/Intent;Landroid/app/IApplicationThread;Landroid/os/IBinder;Landroid/app/IServiceConnection;I)Z
-Lcom/android/internal/appwidget/IAppWidgetService;->getAppWidgetIds(Landroid/content/ComponentName;)[I
-Lcom/android/internal/appwidget/IAppWidgetService;->getAppWidgetViews(Ljava/lang/String;I)Landroid/widget/RemoteViews;
Lcom/android/internal/backup/IBackupTransport$Stub;-><init>()V
Lcom/android/internal/content/PackageMonitor;-><init>()V
Lcom/android/internal/database/SortCursor;-><init>([Landroid/database/Cursor;Ljava/lang/String;)V
@@ -1751,16 +1508,11 @@ Lcom/android/internal/location/GpsNetInitiatedHandler;->handleNiNotification(Lco
Lcom/android/internal/location/GpsNetInitiatedHandler;->mIsHexInput:Z
Lcom/android/internal/location/ILocationProvider$Stub;-><init>()V
Lcom/android/internal/location/ILocationProvider$Stub;->asInterface(Landroid/os/IBinder;)Lcom/android/internal/location/ILocationProvider;
-Lcom/android/internal/location/ILocationProvider;->getStatus(Landroid/os/Bundle;)I
-Lcom/android/internal/location/ILocationProvider;->getStatusUpdateTime()J
Lcom/android/internal/location/ILocationProvider;->sendExtraCommand(Ljava/lang/String;Landroid/os/Bundle;)V
Lcom/android/internal/location/ILocationProvider;->setLocationProviderManager(Lcom/android/internal/location/ILocationProviderManager;)V
Lcom/android/internal/location/ILocationProvider;->setRequest(Lcom/android/internal/location/ProviderRequest;Landroid/os/WorkSource;)V
Lcom/android/internal/location/ILocationProviderManager$Stub;-><init>()V
Lcom/android/internal/location/ILocationProviderManager$Stub;->asInterface(Landroid/os/IBinder;)Lcom/android/internal/location/ILocationProviderManager;
-Lcom/android/internal/location/ILocationProviderManager;->onReportLocation(Landroid/location/Location;)V
-Lcom/android/internal/location/ILocationProviderManager;->onSetEnabled(Z)V
-Lcom/android/internal/location/ILocationProviderManager;->onSetProperties(Lcom/android/internal/location/ProviderProperties;)V
Lcom/android/internal/logging/MetricsLogger;-><init>()V
Lcom/android/internal/net/LegacyVpnInfo;-><init>()V
Lcom/android/internal/net/VpnConfig;-><init>()V
@@ -1772,7 +1524,6 @@ Lcom/android/internal/os/BinderInternal;->getContextObject()Landroid/os/IBinder;
Lcom/android/internal/os/BinderInternal;->handleGc()V
Lcom/android/internal/os/ClassLoaderFactory;->createClassloaderNamespace(Ljava/lang/ClassLoader;ILjava/lang/String;Ljava/lang/String;ZZ)Ljava/lang/String;
Lcom/android/internal/os/IDropBoxManagerService$Stub;->asInterface(Landroid/os/IBinder;)Lcom/android/internal/os/IDropBoxManagerService;
-Lcom/android/internal/os/IDropBoxManagerService;->getNextEntry(Ljava/lang/String;JLjava/lang/String;)Landroid/os/DropBoxManager$Entry;
Lcom/android/internal/os/ProcessCpuTracker$Stats;->name:Ljava/lang/String;
Lcom/android/internal/os/ProcessCpuTracker$Stats;->rel_stime:I
Lcom/android/internal/os/ProcessCpuTracker$Stats;->rel_uptime:J
@@ -1798,8 +1549,6 @@ Lcom/android/internal/policy/DecorView;->mLastLeftInset:I
Lcom/android/internal/policy/DecorView;->mLastRightInset:I
Lcom/android/internal/policy/DecorView;->mWindow:Lcom/android/internal/policy/PhoneWindow;
Lcom/android/internal/policy/IKeyguardService$Stub;->asInterface(Landroid/os/IBinder;)Lcom/android/internal/policy/IKeyguardService;
-Lcom/android/internal/policy/IKeyguardService;->doKeyguardTimeout(Landroid/os/Bundle;)V
-Lcom/android/internal/policy/IKeyguardService;->setKeyguardEnabled(Z)V
Lcom/android/internal/policy/IKeyguardStateCallback$Stub;->asInterface(Landroid/os/IBinder;)Lcom/android/internal/policy/IKeyguardStateCallback;
Lcom/android/internal/policy/PhoneFallbackEventHandler;-><init>(Landroid/content/Context;)V
Lcom/android/internal/policy/PhoneFallbackEventHandler;->mContext:Landroid/content/Context;
@@ -2253,14 +2002,7 @@ Lcom/android/internal/R$xml;->power_profile:I
Lcom/android/internal/statusbar/IStatusBar$Stub;->asInterface(Landroid/os/IBinder;)Lcom/android/internal/statusbar/IStatusBar;
Lcom/android/internal/statusbar/IStatusBarService$Stub;-><init>()V
Lcom/android/internal/statusbar/IStatusBarService$Stub;->asInterface(Landroid/os/IBinder;)Lcom/android/internal/statusbar/IStatusBarService;
-Lcom/android/internal/statusbar/IStatusBarService;->collapsePanels()V
-Lcom/android/internal/statusbar/IStatusBarService;->disable(ILandroid/os/IBinder;Ljava/lang/String;)V
-Lcom/android/internal/statusbar/IStatusBarService;->expandNotificationsPanel()V
-Lcom/android/internal/statusbar/IStatusBarService;->handleSystemKey(I)V
-Lcom/android/internal/statusbar/IStatusBarService;->removeIcon(Ljava/lang/String;)V
-Lcom/android/internal/statusbar/IStatusBarService;->setIconVisibility(Ljava/lang/String;Z)V
Lcom/android/internal/telecom/ITelecomService$Stub;->asInterface(Landroid/os/IBinder;)Lcom/android/internal/telecom/ITelecomService;
-Lcom/android/internal/telecom/ITelecomService;->getCallState()I
Lcom/android/internal/telephony/BaseCommands;->mCallStateRegistrants:Landroid/os/RegistrantList;
Lcom/android/internal/telephony/BaseCommands;->mCallWaitingInfoRegistrants:Landroid/os/RegistrantList;
Lcom/android/internal/telephony/BaseCommands;->mCatCallSetUpRegistrant:Landroid/os/Registrant;
@@ -2887,7 +2629,6 @@ Lcom/android/internal/telephony/GsmCdmaPhone;->notifyPreciseCallStateChanged()V
Lcom/android/internal/telephony/GsmCdmaPhone;->notifyServiceStateChanged(Landroid/telephony/ServiceState;)V
Lcom/android/internal/telephony/GsmCdmaPhone;->setOnEcbModeExitResponse(Landroid/os/Handler;ILjava/lang/Object;)V
Lcom/android/internal/telephony/GsmCdmaPhone;->syncClirSetting()V
-Lcom/android/internal/telephony/ICarrierConfigLoader;->getConfigForSubId(ILjava/lang/String;)Landroid/os/PersistableBundle;
Lcom/android/internal/telephony/IccCard;->getState()Lcom/android/internal/telephony/IccCardConstants$State;
Lcom/android/internal/telephony/IccCard;->registerForNetworkLocked(Landroid/os/Handler;ILjava/lang/Object;)V
Lcom/android/internal/telephony/IccCard;->supplyNetworkDepersonalization(Ljava/lang/String;Landroid/os/Message;)V
@@ -3093,8 +2834,6 @@ Lcom/android/internal/telephony/IPhoneSubInfo$Stub$Proxy;-><init>(Landroid/os/IB
Lcom/android/internal/telephony/IPhoneSubInfo$Stub$Proxy;->getDeviceId(Ljava/lang/String;)Ljava/lang/String;
Lcom/android/internal/telephony/IPhoneSubInfo$Stub;->asInterface(Landroid/os/IBinder;)Lcom/android/internal/telephony/IPhoneSubInfo;
Lcom/android/internal/telephony/IPhoneSubInfo$Stub;->TRANSACTION_getDeviceId:I
-Lcom/android/internal/telephony/IPhoneSubInfo;->getIccSerialNumber(Ljava/lang/String;)Ljava/lang/String;
-Lcom/android/internal/telephony/IPhoneSubInfo;->getSubscriberId(Ljava/lang/String;)Ljava/lang/String;
Lcom/android/internal/telephony/ISms$Stub;-><init>()V
Lcom/android/internal/telephony/ISms$Stub;->asInterface(Landroid/os/IBinder;)Lcom/android/internal/telephony/ISms;
Lcom/android/internal/telephony/ISub$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
@@ -3108,38 +2847,9 @@ Lcom/android/internal/telephony/ITelephony$Stub;->DESCRIPTOR:Ljava/lang/String;
Lcom/android/internal/telephony/ITelephony$Stub;->TRANSACTION_call:I
Lcom/android/internal/telephony/ITelephony$Stub;->TRANSACTION_dial:I
Lcom/android/internal/telephony/ITelephony$Stub;->TRANSACTION_getDeviceId:I
-Lcom/android/internal/telephony/ITelephony;->call(Ljava/lang/String;Ljava/lang/String;)V
-Lcom/android/internal/telephony/ITelephony;->dial(Ljava/lang/String;)V
-Lcom/android/internal/telephony/ITelephony;->disableDataConnectivity()Z
-Lcom/android/internal/telephony/ITelephony;->disableLocationUpdates()V
-Lcom/android/internal/telephony/ITelephony;->enableDataConnectivity()Z
-Lcom/android/internal/telephony/ITelephony;->enableLocationUpdates()V
-Lcom/android/internal/telephony/ITelephony;->getActivePhoneType()I
-Lcom/android/internal/telephony/ITelephony;->getCallState()I
-Lcom/android/internal/telephony/ITelephony;->getDataActivity()I
-Lcom/android/internal/telephony/ITelephony;->getDataEnabled(I)Z
-Lcom/android/internal/telephony/ITelephony;->getDataState()I
-Lcom/android/internal/telephony/ITelephony;->getNetworkType()I
-Lcom/android/internal/telephony/ITelephony;->handlePinMmi(Ljava/lang/String;)Z
-Lcom/android/internal/telephony/ITelephony;->handlePinMmiForSubscriber(ILjava/lang/String;)Z
-Lcom/android/internal/telephony/ITelephony;->hasIccCard()Z
-Lcom/android/internal/telephony/ITelephony;->iccCloseLogicalChannel(II)Z
-Lcom/android/internal/telephony/ITelephony;->iccTransmitApduLogicalChannel(IIIIIIILjava/lang/String;)Ljava/lang/String;
-Lcom/android/internal/telephony/ITelephony;->isRadioOnForSubscriber(ILjava/lang/String;)Z
-Lcom/android/internal/telephony/ITelephony;->setRadio(Z)Z
-Lcom/android/internal/telephony/ITelephony;->supplyPin(Ljava/lang/String;)Z
-Lcom/android/internal/telephony/ITelephony;->toggleRadioOnOff()V
-Lcom/android/internal/telephony/ITelephony;->updateServiceLocation()V
Lcom/android/internal/telephony/ITelephonyRegistry$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
Lcom/android/internal/telephony/ITelephonyRegistry$Stub;->asInterface(Landroid/os/IBinder;)Lcom/android/internal/telephony/ITelephonyRegistry;
-Lcom/android/internal/telephony/ITelephonyRegistry;->listen(Ljava/lang/String;Lcom/android/internal/telephony/IPhoneStateListener;IZ)V
-Lcom/android/internal/telephony/ITelephonyRegistry;->notifyCallState(ILjava/lang/String;)V
-Lcom/android/internal/telephony/ITelephonyRegistry;->notifyCellInfo(Ljava/util/List;)V
-Lcom/android/internal/telephony/ITelephonyRegistry;->notifyDataConnectionFailed(Ljava/lang/String;)V
Lcom/android/internal/telephony/IWapPushManager$Stub;->asInterface(Landroid/os/IBinder;)Lcom/android/internal/telephony/IWapPushManager;
-Lcom/android/internal/telephony/IWapPushManager;->addPackage(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;IZZ)Z
-Lcom/android/internal/telephony/IWapPushManager;->deletePackage(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Z
-Lcom/android/internal/telephony/IWapPushManager;->updatePackage(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;IZZ)Z
Lcom/android/internal/telephony/MccTable$MccEntry;->mIso:Ljava/lang/String;
Lcom/android/internal/telephony/MccTable;->countryCodeForMcc(I)Ljava/lang/String;
Lcom/android/internal/telephony/MccTable;->defaultLanguageForMcc(I)Ljava/lang/String;
@@ -3934,23 +3644,7 @@ Lcom/android/internal/widget/ActionBarOverlayLayout;-><init>(Landroid/content/Co
Lcom/android/internal/widget/ActionBarOverlayLayout;->setWindowCallback(Landroid/view/Window$Callback;)V
Lcom/android/internal/widget/EditableInputConnection;-><init>(Landroid/widget/TextView;)V
Lcom/android/internal/widget/ILockSettings$Stub;->asInterface(Landroid/os/IBinder;)Lcom/android/internal/widget/ILockSettings;
-Lcom/android/internal/widget/ILockSettings;->getBoolean(Ljava/lang/String;ZI)Z
-Lcom/android/internal/widget/ILockSettings;->getLong(Ljava/lang/String;JI)J
-Lcom/android/internal/widget/ILockSettings;->getString(Ljava/lang/String;Ljava/lang/String;I)Ljava/lang/String;
-Lcom/android/internal/widget/ILockSettings;->havePassword(I)Z
-Lcom/android/internal/widget/ILockSettings;->havePattern(I)Z
-Lcom/android/internal/widget/ILockSettings;->setBoolean(Ljava/lang/String;ZI)V
-Lcom/android/internal/widget/ILockSettings;->setLong(Ljava/lang/String;JI)V
-Lcom/android/internal/widget/ILockSettings;->setString(Ljava/lang/String;Ljava/lang/String;I)V
Lcom/android/internal/widget/IRemoteViewsFactory$Stub;->asInterface(Landroid/os/IBinder;)Lcom/android/internal/widget/IRemoteViewsFactory;
-Lcom/android/internal/widget/IRemoteViewsFactory;->getCount()I
-Lcom/android/internal/widget/IRemoteViewsFactory;->getItemId(I)J
-Lcom/android/internal/widget/IRemoteViewsFactory;->getLoadingView()Landroid/widget/RemoteViews;
-Lcom/android/internal/widget/IRemoteViewsFactory;->getViewAt(I)Landroid/widget/RemoteViews;
-Lcom/android/internal/widget/IRemoteViewsFactory;->getViewTypeCount()I
-Lcom/android/internal/widget/IRemoteViewsFactory;->hasStableIds()Z
-Lcom/android/internal/widget/IRemoteViewsFactory;->isCreated()Z
-Lcom/android/internal/widget/IRemoteViewsFactory;->onDataSetChanged()V
Lcom/android/internal/widget/LinearLayoutWithDefaultTouchRecepient;-><init>(Landroid/content/Context;)V
Lcom/android/internal/widget/LinearLayoutWithDefaultTouchRecepient;->setDefaultTouchRecepient(Landroid/view/View;)V
Lcom/android/internal/widget/LockPatternChecker;->checkPassword(Lcom/android/internal/widget/LockPatternUtils;Ljava/lang/String;ILcom/android/internal/widget/LockPatternChecker$OnCheckCallback;)Landroid/os/AsyncTask;
diff --git a/core/java/android/app/ActivityThread.java b/core/java/android/app/ActivityThread.java
index 92302c501caf..b18c4de93b40 100644
--- a/core/java/android/app/ActivityThread.java
+++ b/core/java/android/app/ActivityThread.java
@@ -6954,6 +6954,8 @@ public final class ActivityThread extends ClientTransactionHandler {
fd.setInt$(cr.openFileDescriptor(uri,
FileUtils.translateModePosixToString(mode)).detachFd());
return fd;
+ } catch (SecurityException e) {
+ throw new ErrnoException(e.getMessage(), OsConstants.EACCES);
} catch (FileNotFoundException e) {
throw new ErrnoException(e.getMessage(), OsConstants.ENOENT);
}
diff --git a/core/java/android/app/AppComponentFactory.java b/core/java/android/app/AppComponentFactory.java
index ae632915dd2d..2cec7f0fc323 100644
--- a/core/java/android/app/AppComponentFactory.java
+++ b/core/java/android/app/AppComponentFactory.java
@@ -27,6 +27,7 @@ import android.content.pm.ApplicationInfo;
*
* @see #instantiateApplication
* @see #instantiateActivity
+ * @see #instantiateClassLoader
* @see #instantiateService
* @see #instantiateReceiver
* @see #instantiateProvider
@@ -39,8 +40,10 @@ public class AppComponentFactory {
* a custom class loader hierarchy.
*
* @param cl The default classloader instantiated by platform.
+ * @param aInfo Information about the application being loaded.
*/
- public @NonNull ClassLoader instantiateClassLoader(@NonNull ClassLoader cl) {
+ public @NonNull ClassLoader instantiateClassLoader(@NonNull ClassLoader cl,
+ @NonNull ApplicationInfo aInfo) {
return cl;
}
@@ -133,19 +136,6 @@ public class AppComponentFactory {
return (ContentProvider) cl.loadClass(className).newInstance();
}
- private ApplicationInfo mApplicationInfo = null;
-
- void setApplicationInfo(ApplicationInfo info) {
- mApplicationInfo = info;
- }
-
- /**
- * Returns the ApplicationInfo associated with this package.
- */
- public ApplicationInfo getApplicationInfo() {
- return mApplicationInfo;
- }
-
/**
* @hide
*/
diff --git a/core/java/android/app/DownloadManager.java b/core/java/android/app/DownloadManager.java
index fde1d29eb709..e20c4901ea0d 100644
--- a/core/java/android/app/DownloadManager.java
+++ b/core/java/android/app/DownloadManager.java
@@ -21,6 +21,7 @@ import android.annotation.SdkConstant;
import android.annotation.SdkConstant.SdkConstantType;
import android.annotation.SystemApi;
import android.annotation.SystemService;
+import android.annotation.TestApi;
import android.annotation.UnsupportedAppUsage;
import android.content.ContentResolver;
import android.content.ContentUris;
@@ -163,6 +164,10 @@ public class DownloadManager {
*/
public static final String COLUMN_MEDIAPROVIDER_URI = Downloads.Impl.COLUMN_MEDIAPROVIDER_URI;
+ /** @hide */
+ @TestApi
+ public static final String COLUMN_MEDIASTORE_URI = Downloads.Impl.COLUMN_MEDIASTORE_URI;
+
/**
* @hide
*/
diff --git a/core/java/android/app/IActivityManager.aidl b/core/java/android/app/IActivityManager.aidl
index 780dd630d834..5cbb59976c5a 100644
--- a/core/java/android/app/IActivityManager.aidl
+++ b/core/java/android/app/IActivityManager.aidl
@@ -204,6 +204,7 @@ interface IActivityManager {
void setProcessImportant(in IBinder token, int pid, boolean isForeground, String reason);
void setServiceForeground(in ComponentName className, in IBinder token,
int id, in Notification notification, int flags, int foregroundServiceType);
+ int getForegroundServiceType(in ComponentName className, in IBinder token);
boolean moveActivityTaskToBack(in IBinder token, boolean nonRoot);
void getMemoryInfo(out ActivityManager.MemoryInfo outInfo);
List<ActivityManager.ProcessErrorStateInfo> getProcessesInErrorState();
diff --git a/core/java/android/app/IActivityTaskManager.aidl b/core/java/android/app/IActivityTaskManager.aidl
index b01cd0e411c7..b16188f1a0e3 100644
--- a/core/java/android/app/IActivityTaskManager.aidl
+++ b/core/java/android/app/IActivityTaskManager.aidl
@@ -129,6 +129,7 @@ interface IActivityTaskManager {
oneway void activityIdle(in IBinder token, in Configuration config,
in boolean stopProfiling);
void activityResumed(in IBinder token);
+ void activityTopResumedStateLost();
void activityPaused(in IBinder token);
void activityStopped(in IBinder token, in Bundle state,
in PersistableBundle persistentState, in CharSequence description);
diff --git a/core/java/android/app/ITaskStackListener.aidl b/core/java/android/app/ITaskStackListener.aidl
index 8615f00facd9..8c85ad134e53 100644
--- a/core/java/android/app/ITaskStackListener.aidl
+++ b/core/java/android/app/ITaskStackListener.aidl
@@ -81,6 +81,16 @@ oneway interface ITaskStackListener {
int requestedDisplayId);
/**
+ * Called when an activity was requested to be launched on a secondary display but was rerouted
+ * to default display.
+ *
+ * @param taskInfo info about the Activity's task
+ * @param requestedDisplayId the id of the requested launch display
+ */
+ void onActivityLaunchOnSecondaryDisplayRerouted(in ActivityManager.RunningTaskInfo taskInfo,
+ int requestedDisplayId);
+
+ /**
* Called when a task is added.
*
* @param taskId id of the task.
diff --git a/core/java/android/app/Instrumentation.java b/core/java/android/app/Instrumentation.java
index dda5569a26b3..4f9420946680 100644
--- a/core/java/android/app/Instrumentation.java
+++ b/core/java/android/app/Instrumentation.java
@@ -52,6 +52,7 @@ import android.view.KeyEvent;
import android.view.MotionEvent;
import android.view.ViewConfiguration;
import android.view.Window;
+import android.view.WindowManagerGlobal;
import com.android.internal.content.ReferrerIntent;
@@ -1102,8 +1103,11 @@ public class Instrumentation {
if ((event.getSource() & InputDevice.SOURCE_CLASS_POINTER) == 0) {
event.setSource(InputDevice.SOURCE_TOUCHSCREEN);
}
- InputManager.getInstance().injectInputEvent(event,
- InputManager.INJECT_INPUT_EVENT_MODE_WAIT_FOR_FINISH);
+ try {
+ WindowManagerGlobal.getWindowManagerService().injectInputAfterTransactionsApplied(event,
+ InputManager.INJECT_INPUT_EVENT_MODE_WAIT_FOR_FINISH);
+ } catch (RemoteException e) {
+ }
}
/**
diff --git a/core/java/android/app/LoadedApk.java b/core/java/android/app/LoadedApk.java
index 5c4c0052cfbb..5d186a25596f 100644
--- a/core/java/android/app/LoadedApk.java
+++ b/core/java/android/app/LoadedApk.java
@@ -232,7 +232,8 @@ public final class LoadedApk {
mResources = Resources.getSystem();
mDefaultClassLoader = ClassLoader.getSystemClassLoader();
mAppComponentFactory = createAppFactory(mApplicationInfo, mDefaultClassLoader);
- mClassLoader = mAppComponentFactory.instantiateClassLoader(mDefaultClassLoader);
+ mClassLoader = mAppComponentFactory.instantiateClassLoader(mDefaultClassLoader,
+ new ApplicationInfo(mApplicationInfo));
}
/**
@@ -243,19 +244,15 @@ public final class LoadedApk {
mApplicationInfo = info;
mDefaultClassLoader = classLoader;
mAppComponentFactory = createAppFactory(info, mDefaultClassLoader);
- mClassLoader = mAppComponentFactory.instantiateClassLoader(mDefaultClassLoader);
+ mClassLoader = mAppComponentFactory.instantiateClassLoader(mDefaultClassLoader,
+ new ApplicationInfo(mApplicationInfo));
}
private AppComponentFactory createAppFactory(ApplicationInfo appInfo, ClassLoader cl) {
if (appInfo.appComponentFactory != null && cl != null) {
try {
- AppComponentFactory factory = (AppComponentFactory) cl.loadClass(
- appInfo.appComponentFactory).newInstance();
- // Pass a copy of ApplicationInfo to the factory. Copying protects the framework
- // from apps which would override the factory and change ApplicationInfo contents.
- // ApplicationInfo is used to set up the default class loader.
- factory.setApplicationInfo(new ApplicationInfo(appInfo));
- return factory;
+ return (AppComponentFactory)
+ cl.loadClass(appInfo.appComponentFactory).newInstance();
} catch (InstantiationException | IllegalAccessException | ClassNotFoundException e) {
Slog.e(TAG, "Unable to instantiate appComponentFactory", e);
}
@@ -729,8 +726,8 @@ public final class LoadedApk {
mDefaultClassLoader = ClassLoader.getSystemClassLoader();
}
mAppComponentFactory = createAppFactory(mApplicationInfo, mDefaultClassLoader);
- mClassLoader = mAppComponentFactory.instantiateClassLoader(mDefaultClassLoader);
-
+ mClassLoader = mAppComponentFactory.instantiateClassLoader(mDefaultClassLoader,
+ new ApplicationInfo(mApplicationInfo));
return;
}
@@ -821,7 +818,8 @@ public final class LoadedApk {
}
if (mClassLoader == null) {
- mClassLoader = mAppComponentFactory.instantiateClassLoader(mDefaultClassLoader);
+ mClassLoader = mAppComponentFactory.instantiateClassLoader(mDefaultClassLoader,
+ new ApplicationInfo(mApplicationInfo));
}
return;
@@ -935,8 +933,10 @@ public final class LoadedApk {
// Call AppComponentFactory to select/create the main class loader of this app.
// Since this may call code in the app, mDefaultClassLoader must be fully set up
// before invoking the factory.
+ // Invoke with a copy of ApplicationInfo to protect against the app changing it.
if (mClassLoader == null) {
- mClassLoader = mAppComponentFactory.instantiateClassLoader(mDefaultClassLoader);
+ mClassLoader = mAppComponentFactory.instantiateClassLoader(mDefaultClassLoader,
+ new ApplicationInfo(mApplicationInfo));
}
}
diff --git a/core/java/android/app/Notification.java b/core/java/android/app/Notification.java
index 2e7093db92f0..dd7b629905f4 100644
--- a/core/java/android/app/Notification.java
+++ b/core/java/android/app/Notification.java
@@ -3471,6 +3471,7 @@ public class Notification implements Parcelable
* @param shortcutId the {@link ShortcutInfo#getId() id} of the shortcut this notification
* supersedes
*/
+ @NonNull
public Builder setShortcutId(String shortcutId) {
mN.mShortcutId = shortcutId;
return this;
@@ -3484,6 +3485,7 @@ public class Notification implements Parcelable
*
* Note: This value might be ignored, for launchers that don't support badge icons.
*/
+ @NonNull
public Builder setBadgeIconType(int icon) {
mN.mBadgeIcon = icon;
return this;
@@ -3499,6 +3501,7 @@ public class Notification implements Parcelable
*
* <p> The default value is {@link #GROUP_ALERT_ALL}.</p>
*/
+ @NonNull
public Builder setGroupAlertBehavior(@GroupAlertBehavior int groupAlertBehavior) {
mN.mGroupAlertBehavior = groupAlertBehavior;
return this;
@@ -3515,6 +3518,7 @@ public class Notification implements Parcelable
* outside of the notification shade on unlocked devices. When a user interacts with the
* collapsed state, the bubble intent will be invoked and displayed.</b>
*/
+ @NonNull
public Builder setBubbleMetadata(BubbleMetadata data) {
mN.mBubbleMetadata = data;
return this;
@@ -3530,6 +3534,7 @@ public class Notification implements Parcelable
/**
* Specifies the channel the notification should be delivered on.
*/
+ @NonNull
public Builder setChannelId(String channelId) {
mN.mChannelId = channelId;
return this;
@@ -3546,6 +3551,7 @@ public class Notification implements Parcelable
* Specifies a duration in milliseconds after which this notification should be canceled,
* if it is not already canceled.
*/
+ @NonNull
public Builder setTimeoutAfter(long durationMs) {
mN.mTimeout = durationMs;
return this;
@@ -3560,6 +3566,7 @@ public class Notification implements Parcelable
*
* @see Notification#when
*/
+ @NonNull
public Builder setWhen(long when) {
mN.when = when;
return this;
@@ -3571,6 +3578,7 @@ public class Notification implements Parcelable
* For apps targeting {@link android.os.Build.VERSION_CODES#N} and above, this defaults to
* {@code false}. For earlier apps, the default is {@code true}.
*/
+ @NonNull
public Builder setShowWhen(boolean show) {
mN.extras.putBoolean(EXTRA_SHOW_WHEN, show);
return this;
@@ -3591,6 +3599,7 @@ public class Notification implements Parcelable
* @see Notification#when
* @see #setChronometerCountDown(boolean)
*/
+ @NonNull
public Builder setUsesChronometer(boolean b) {
mN.extras.putBoolean(EXTRA_SHOW_CHRONOMETER, b);
return this;
@@ -3604,6 +3613,7 @@ public class Notification implements Parcelable
*
* @see #setUsesChronometer(boolean)
*/
+ @NonNull
public Builder setChronometerCountDown(boolean countDown) {
mN.extras.putBoolean(EXTRA_CHRONOMETER_COUNT_DOWN, countDown);
return this;
@@ -3623,6 +3633,7 @@ public class Notification implements Parcelable
* A resource ID in the application's package of the drawable to use.
* @see Notification#icon
*/
+ @NonNull
public Builder setSmallIcon(@DrawableRes int icon) {
return setSmallIcon(icon != 0
? Icon.createWithResource(mContext, icon)
@@ -3640,6 +3651,7 @@ public class Notification implements Parcelable
* @see Notification#icon
* @see Notification#iconLevel
*/
+ @NonNull
public Builder setSmallIcon(@DrawableRes int icon, int level) {
mN.iconLevel = level;
return setSmallIcon(icon);
@@ -3653,6 +3665,7 @@ public class Notification implements Parcelable
* @param icon An Icon object to use.
* @see Notification#icon
*/
+ @NonNull
public Builder setSmallIcon(Icon icon) {
mN.setSmallIcon(icon);
if (icon != null && icon.getType() == Icon.TYPE_RESOURCE) {
@@ -3664,6 +3677,7 @@ public class Notification implements Parcelable
/**
* Set the first line of text in the platform notification template.
*/
+ @NonNull
public Builder setContentTitle(CharSequence title) {
mN.extras.putCharSequence(EXTRA_TITLE, safeCharSequence(title));
return this;
@@ -3672,6 +3686,7 @@ public class Notification implements Parcelable
/**
* Set the second line of text in the platform notification template.
*/
+ @NonNull
public Builder setContentText(CharSequence text) {
mN.extras.putCharSequence(EXTRA_TEXT, safeCharSequence(text));
return this;
@@ -3695,6 +3710,7 @@ public class Notification implements Parcelable
* same time on those versions; they occupy the same place.
* </p>
*/
+ @NonNull
public Builder setSubText(CharSequence text) {
mN.extras.putCharSequence(EXTRA_SUB_TEXT, safeCharSequence(text));
return this;
@@ -3713,6 +3729,7 @@ public class Notification implements Parcelable
* @param text
* @return
*/
+ @NonNull
public Builder setSettingsText(CharSequence text) {
mN.mSettingsText = safeCharSequence(text);
return this;
@@ -3732,6 +3749,7 @@ public class Notification implements Parcelable
* <p>Note: The reply text will only be shown on notifications that have least one action
* with a {@code RemoteInput}.</p>
*/
+ @NonNull
public Builder setRemoteInputHistory(CharSequence[] text) {
if (text == null) {
mN.extras.putCharSequenceArray(EXTRA_REMOTE_INPUT_HISTORY, null);
@@ -3750,6 +3768,7 @@ public class Notification implements Parcelable
* Sets whether remote history entries view should have a spinner.
* @hide
*/
+ @NonNull
public Builder setShowRemoteInputSpinner(boolean showSpinner) {
mN.extras.putBoolean(EXTRA_SHOW_REMOTE_INPUT_SPINNER, showSpinner);
return this;
@@ -3759,6 +3778,7 @@ public class Notification implements Parcelable
* Sets whether smart reply buttons should be hidden.
* @hide
*/
+ @NonNull
public Builder setHideSmartReplies(boolean hideSmartReplies) {
mN.extras.putBoolean(EXTRA_HIDE_SMART_REPLIES, hideSmartReplies);
return this;
@@ -3768,6 +3788,7 @@ public class Notification implements Parcelable
* Sets the number of items this notification represents. May be displayed as a badge count
* for Launchers that support badging.
*/
+ @NonNull
public Builder setNumber(int number) {
mN.number = number;
return this;
@@ -3794,6 +3815,7 @@ public class Notification implements Parcelable
*
* The platform template will represent this using a {@link ProgressBar}.
*/
+ @NonNull
public Builder setProgress(int max, int progress, boolean indeterminate) {
mN.extras.putInt(EXTRA_PROGRESS, progress);
mN.extras.putInt(EXTRA_PROGRESS_MAX, max);
@@ -3817,6 +3839,7 @@ public class Notification implements Parcelable
* This will override the layout that would otherwise be constructed by this Builder
* object.
*/
+ @NonNull
public Builder setCustomContentView(RemoteViews contentView) {
mN.contentView = contentView;
return this;
@@ -3828,6 +3851,7 @@ public class Notification implements Parcelable
* This will override the expanded layout that would otherwise be constructed by this
* Builder object.
*/
+ @NonNull
public Builder setCustomBigContentView(RemoteViews contentView) {
mN.bigContentView = contentView;
return this;
@@ -3839,6 +3863,7 @@ public class Notification implements Parcelable
* This will override the heads-up layout that would otherwise be constructed by this
* Builder object.
*/
+ @NonNull
public Builder setCustomHeadsUpContentView(RemoteViews contentView) {
mN.headsUpContentView = contentView;
return this;
@@ -3855,6 +3880,7 @@ public class Notification implements Parcelable
*
* @see Notification#contentIntent Notification.contentIntent
*/
+ @NonNull
public Builder setContentIntent(PendingIntent intent) {
mN.contentIntent = intent;
return this;
@@ -3865,6 +3891,7 @@ public class Notification implements Parcelable
*
* @see Notification#deleteIntent
*/
+ @NonNull
public Builder setDeleteIntent(PendingIntent intent) {
mN.deleteIntent = intent;
return this;
@@ -3893,6 +3920,7 @@ public class Notification implements Parcelable
*
* @see Notification#fullScreenIntent
*/
+ @NonNull
public Builder setFullScreenIntent(PendingIntent intent, boolean highPriority) {
mN.fullScreenIntent = intent;
setFlag(FLAG_HIGH_PRIORITY, highPriority);
@@ -3904,6 +3932,7 @@ public class Notification implements Parcelable
*
* @see Notification#tickerText
*/
+ @NonNull
public Builder setTicker(CharSequence tickerText) {
mN.tickerText = safeCharSequence(tickerText);
return this;
@@ -3927,6 +3956,7 @@ public class Notification implements Parcelable
* in place of the {@link #setSmallIcon(Icon) small icon} (which will be placed in a small
* badge atop the large icon).
*/
+ @NonNull
public Builder setLargeIcon(Bitmap b) {
return setLargeIcon(b != null ? Icon.createWithBitmap(b) : null);
}
@@ -3938,6 +3968,7 @@ public class Notification implements Parcelable
* in place of the {@link #setSmallIcon(Icon) small icon} (which will be placed in a small
* badge atop the large icon).
*/
+ @NonNull
public Builder setLargeIcon(Icon icon) {
mN.mLargeIcon = icon;
mN.extras.putParcelable(EXTRA_LARGE_ICON, icon);
@@ -4045,6 +4076,7 @@ public class Notification implements Parcelable
* @see Notification#FLAG_ONGOING_EVENT
*/
+ @NonNull
public Builder setOngoing(boolean ongoing) {
setFlag(FLAG_ONGOING_EVENT, ongoing);
return this;
@@ -4065,6 +4097,7 @@ public class Notification implements Parcelable
* @see #setColor(int)
* @see MediaStyle#setMediaSession(MediaSession.Token)
*/
+ @NonNull
public Builder setColorized(boolean colorize) {
mN.extras.putBoolean(EXTRA_COLORIZED, colorize);
return this;
@@ -4076,6 +4109,7 @@ public class Notification implements Parcelable
*
* @see Notification#FLAG_ONLY_ALERT_ONCE
*/
+ @NonNull
public Builder setOnlyAlertOnce(boolean onlyAlertOnce) {
setFlag(FLAG_ONLY_ALERT_ONCE, onlyAlertOnce);
return this;
@@ -4086,6 +4120,7 @@ public class Notification implements Parcelable
*
* @see Notification#FLAG_AUTO_CANCEL
*/
+ @NonNull
public Builder setAutoCancel(boolean autoCancel) {
setFlag(FLAG_AUTO_CANCEL, autoCancel);
return this;
@@ -4097,6 +4132,7 @@ public class Notification implements Parcelable
* <p>Some notifications can be bridged to other devices for remote display.
* This hint can be set to recommend this notification not be bridged.
*/
+ @NonNull
public Builder setLocalOnly(boolean localOnly) {
setFlag(FLAG_LOCAL_ONLY, localOnly);
return this;
@@ -4138,6 +4174,7 @@ public class Notification implements Parcelable
*
* @see Notification#category
*/
+ @NonNull
public Builder setCategory(String category) {
mN.category = category;
return this;
@@ -4195,6 +4232,7 @@ public class Notification implements Parcelable
* @param person the person to add.
* @see Notification#EXTRA_PEOPLE_LIST
*/
+ @NonNull
public Builder addPerson(Person person) {
mPersonList.add(person);
return this;
@@ -4211,6 +4249,7 @@ public class Notification implements Parcelable
* @param groupKey The group key of the group.
* @return this object for method chaining
*/
+ @NonNull
public Builder setGroup(String groupKey) {
mN.mGroupKey = groupKey;
return this;
@@ -4224,6 +4263,7 @@ public class Notification implements Parcelable
* @param isGroupSummary Whether this notification should be a group summary.
* @return this object for method chaining
*/
+ @NonNull
public Builder setGroupSummary(boolean isGroupSummary) {
setFlag(FLAG_GROUP_SUMMARY, isGroupSummary);
return this;
@@ -4241,6 +4281,7 @@ public class Notification implements Parcelable
*
* @see String#compareTo(String)
*/
+ @NonNull
public Builder setSortKey(String sortKey) {
mN.mSortKey = sortKey;
return this;
@@ -4253,6 +4294,7 @@ public class Notification implements Parcelable
*
* @see Notification#extras
*/
+ @NonNull
public Builder addExtras(Bundle extras) {
if (extras != null) {
mUserExtras.putAll(extras);
@@ -4272,6 +4314,7 @@ public class Notification implements Parcelable
*
* @see Notification#extras
*/
+ @NonNull
public Builder setExtras(Bundle extras) {
if (extras != null) {
mUserExtras = extras;
@@ -4339,6 +4382,7 @@ public class Notification implements Parcelable
*
* @param action The action to add.
*/
+ @NonNull
public Builder addAction(Action action) {
if (action != null) {
mActions.add(action);
@@ -4353,6 +4397,7 @@ public class Notification implements Parcelable
* @param actions
* @return
*/
+ @NonNull
public Builder setActions(Action... actions) {
mActions.clear();
for (int i = 0; i < actions.length; i++) {
@@ -4368,6 +4413,7 @@ public class Notification implements Parcelable
*
* @param style Object responsible for modifying the notification style.
*/
+ @NonNull
public Builder setStyle(Style style) {
if (mStyle != style) {
mStyle = style;
@@ -4393,6 +4439,7 @@ public class Notification implements Parcelable
*
* @return The same Builder.
*/
+ @NonNull
public Builder setVisibility(@Visibility int visibility) {
mN.visibility = visibility;
return this;
@@ -4404,6 +4451,7 @@ public class Notification implements Parcelable
* @param n A replacement notification, presumably with some or all info redacted.
* @return The same Builder.
*/
+ @NonNull
public Builder setPublicVersion(Notification n) {
if (n != null) {
mN.publicVersion = new Notification();
@@ -4418,6 +4466,7 @@ public class Notification implements Parcelable
* Apply an extender to this notification builder. Extenders may be used to add
* metadata or change options on this builder.
*/
+ @NonNull
public Builder extend(Extender extender) {
extender.extend(this);
return this;
@@ -4426,6 +4475,7 @@ public class Notification implements Parcelable
/**
* @hide
*/
+ @NonNull
public Builder setFlag(int mask, boolean value) {
if (value) {
mN.flags |= mask;
@@ -4442,6 +4492,7 @@ public class Notification implements Parcelable
*
* @return The same Builder.
*/
+ @NonNull
public Builder setColor(@ColorInt int argb) {
mN.color = argb;
sanitizeColor();
@@ -5674,6 +5725,7 @@ public class Notification implements Parcelable
* Apply the unstyled operations and return a new {@link Notification} object.
* @hide
*/
+ @NonNull
public Notification buildUnstyled() {
if (mActions.size() > 0) {
mN.actions = new Action[mActions.size()];
@@ -5694,6 +5746,7 @@ public class Notification implements Parcelable
* @param context The context for your application / activity.
* @param n The notification to create a Builder from.
*/
+ @NonNull
public static Notification.Builder recoverBuilder(Context context, Notification n) {
// Re-create notification context so we can access app resources.
ApplicationInfo applicationInfo = n.extras.getParcelable(
@@ -5718,6 +5771,7 @@ public class Notification implements Parcelable
* Determines whether the platform can generate contextual actions for a notification.
* By default this is true.
*/
+ @NonNull
public Builder setAllowSystemGeneratedContextualActions(boolean allowed) {
mN.mAllowSystemGeneratedContextualActions = allowed;
return this;
@@ -5735,6 +5789,7 @@ public class Notification implements Parcelable
* Combine all of the options that have been set and return a new {@link Notification}
* object.
*/
+ @NonNull
public Notification build() {
// first, add any extras from the calling code
if (mUserExtras != null) {
@@ -5793,7 +5848,8 @@ public class Notification implements Parcelable
*
* @hide
*/
- public Notification buildInto(Notification n) {
+ @NonNull
+ public Notification buildInto(@NonNull Notification n) {
build().cloneInto(n, true);
return n;
}
diff --git a/core/java/android/app/SearchDialog.java b/core/java/android/app/SearchDialog.java
index 4a451509f538..8493fb25b8a5 100644
--- a/core/java/android/app/SearchDialog.java
+++ b/core/java/android/app/SearchDialog.java
@@ -47,8 +47,10 @@ import android.view.Window;
import android.view.WindowManager;
import android.view.inputmethod.InputMethodManager;
import android.widget.AutoCompleteTextView;
+import android.widget.Filterable;
import android.widget.ImageView;
import android.widget.LinearLayout;
+import android.widget.ListPopupWindow;
import android.widget.SearchView;
import android.widget.TextView;
@@ -370,7 +372,10 @@ public class SearchDialog extends Dialog {
updateSearchAppIcon();
updateSearchBadge();
if (isLandscapeMode(getContext())) {
- mSearchAutoComplete.ensureImeVisible(true);
+ mSearchAutoComplete.setInputMethodMode(ListPopupWindow.INPUT_METHOD_NEEDED);
+ if (mSearchAutoComplete.isDropDownAlwaysVisible() || enoughToFilter()) {
+ mSearchAutoComplete.showDropDown();
+ }
}
}
}
@@ -381,6 +386,15 @@ public class SearchDialog extends Dialog {
== Configuration.ORIENTATION_LANDSCAPE;
}
+ private boolean enoughToFilter() {
+ Filterable filterableAdapter = (Filterable) mSearchAutoComplete.getAdapter();
+ if (filterableAdapter == null || filterableAdapter.getFilter() == null) {
+ return false;
+ }
+
+ return mSearchAutoComplete.enoughToFilter();
+ }
+
/**
* Update the UI according to the info in the current value of {@link #mSearchable}.
*/
diff --git a/core/java/android/app/Service.java b/core/java/android/app/Service.java
index f116e133e338..1f91b3f431a1 100644
--- a/core/java/android/app/Service.java
+++ b/core/java/android/app/Service.java
@@ -27,6 +27,7 @@ import android.content.ComponentName;
import android.content.Context;
import android.content.ContextWrapper;
import android.content.Intent;
+import android.content.pm.ServiceInfo;
import android.content.pm.ServiceInfo.ForegroundServiceType;
import android.content.res.Configuration;
import android.os.Build;
@@ -733,7 +734,7 @@ public abstract class Service extends ContextWrapper implements ComponentCallbac
* {@link android.R.attr#foregroundServiceType} flags.
* @throws IllegalArgumentException if param foregroundServiceType is not subset of manifest
* attribute {@link android.R.attr#foregroundServiceType}.
- * @see {@link android.content.pm.ServiceInfo} for the set of FOREGROUND_SERVICE_TYPE flags.
+ * @see android.content.pm.ServiceInfo#FOREGROUND_SERVICE_TYPE_MANIFEST
*/
public final void startForeground(int id, @NonNull Notification notification,
@ForegroundServiceType int foregroundServiceType) {
@@ -775,6 +776,30 @@ public abstract class Service extends ContextWrapper implements ComponentCallbac
}
/**
+ * If the service has become a foreground service by calling
+ * {@link #startForeground(int, Notification)}
+ * or {@link #startForeground(int, Notification, int)}, {@link #getForegroundServiceType()}
+ * returns the current foreground service type.
+ *
+ * <p>If there is no foregroundServiceType specified
+ * in manifest, {@link ServiceInfo#FOREGROUND_SERVICE_TYPE_NONE} is returned. </p>
+ *
+ * <p>If the service is not a foreground service,
+ * {@link ServiceInfo#FOREGROUND_SERVICE_TYPE_NONE} is returned.</p>
+ *
+ * @return current foreground service type flags.
+ */
+ public final @ForegroundServiceType int getForegroundServiceType() {
+ int ret = ServiceInfo.FOREGROUND_SERVICE_TYPE_NONE;
+ try {
+ ret = mActivityManager.getForegroundServiceType(
+ new ComponentName(this, mClassName), mToken);
+ } catch (RemoteException ex) {
+ }
+ return ret;
+ }
+
+ /**
* Print the Service's state into the given stream. This gets invoked if
* you run "adb shell dumpsys activity service &lt;yourservicename&gt;"
* (note that for this command to work, the service must be running, and
diff --git a/core/java/android/app/StatusBarManager.java b/core/java/android/app/StatusBarManager.java
index 077652cacc2d..9ff363dddc3c 100644
--- a/core/java/android/app/StatusBarManager.java
+++ b/core/java/android/app/StatusBarManager.java
@@ -17,7 +17,9 @@
package android.app;
import android.annotation.IntDef;
+import android.annotation.NonNull;
import android.annotation.Nullable;
+import android.annotation.RequiresPermission;
import android.annotation.SystemApi;
import android.annotation.SystemService;
import android.annotation.UnsupportedAppUsage;
@@ -364,6 +366,7 @@ public class StatusBarManager {
* @hide
*/
@SystemApi
+ @RequiresPermission(android.Manifest.permission.STATUS_BAR)
public void setDisabledForSetup(boolean disabled) {
try {
final int userId = Binder.getCallingUserHandle().getIdentifier();
@@ -387,6 +390,8 @@ public class StatusBarManager {
* @hide
*/
@SystemApi
+ @RequiresPermission(android.Manifest.permission.STATUS_BAR)
+ @NonNull
public DisableInfo getDisableInfo() {
try {
final int userId = Binder.getCallingUserHandle().getIdentifier();
@@ -518,7 +523,7 @@ public class StatusBarManager {
* @hide
*/
@SystemApi
- public boolean areNoComponentsDisabled() {
+ public boolean areAllComponentsEnabled() {
return !mStatusBarExpansion && !mNavigateHome && !mNotificationPeeking && !mRecents
&& !mSearch;
}
diff --git a/core/java/android/app/TaskStackListener.java b/core/java/android/app/TaskStackListener.java
index fcc76ac8bc40..47ad6d737430 100644
--- a/core/java/android/app/TaskStackListener.java
+++ b/core/java/android/app/TaskStackListener.java
@@ -85,6 +85,12 @@ public abstract class TaskStackListener extends ITaskStackListener.Stub {
}
@Override
+ @UnsupportedAppUsage
+ public void onActivityLaunchOnSecondaryDisplayRerouted(ActivityManager.RunningTaskInfo taskInfo,
+ int requestedDisplayId) throws RemoteException {
+ }
+
+ @Override
public void onTaskCreated(int taskId, ComponentName componentName) throws RemoteException {
}
diff --git a/core/java/android/app/admin/DevicePolicyManager.java b/core/java/android/app/admin/DevicePolicyManager.java
index a32e01fb68e5..d593ad1fd0cd 100644
--- a/core/java/android/app/admin/DevicePolicyManager.java
+++ b/core/java/android/app/admin/DevicePolicyManager.java
@@ -59,7 +59,6 @@ import android.os.Build;
import android.os.Bundle;
import android.os.ParcelFileDescriptor;
import android.os.Parcelable;
-import android.os.ParcelableException;
import android.os.PersistableBundle;
import android.os.Process;
import android.os.RemoteCallback;
@@ -1453,7 +1452,7 @@ public class DevicePolicyManager {
* Constant for {@link #getPasswordComplexity()}: password satisfies one of the following:
* <ul>
* <li>PIN with <b>no</b> repeating (4444) or ordered (1234, 4321, 2468) sequences, length at
- * least 4
+ * least 8
* <li>alphabetic, length at least 6
* <li>alphanumeric, length at least 6
* </ul>
diff --git a/core/java/android/app/servertransaction/TopResumedActivityChangeItem.java b/core/java/android/app/servertransaction/TopResumedActivityChangeItem.java
index 4064a02e54a8..ad2006c07f6a 100644
--- a/core/java/android/app/servertransaction/TopResumedActivityChangeItem.java
+++ b/core/java/android/app/servertransaction/TopResumedActivityChangeItem.java
@@ -17,9 +17,11 @@ package android.app.servertransaction;
import static android.os.Trace.TRACE_TAG_ACTIVITY_MANAGER;
+import android.app.ActivityTaskManager;
import android.app.ClientTransactionHandler;
import android.os.IBinder;
import android.os.Parcel;
+import android.os.RemoteException;
import android.os.Trace;
/**
@@ -38,6 +40,26 @@ public class TopResumedActivityChangeItem extends ClientTransactionItem {
Trace.traceEnd(TRACE_TAG_ACTIVITY_MANAGER);
}
+ @Override
+ public void postExecute(ClientTransactionHandler client, IBinder token,
+ PendingTransactionActions pendingActions) {
+ if (mOnTop) {
+ return;
+ }
+
+ // The loss of top resumed state can always be reported immediately in postExecute
+ // because only three cases are possible:
+ // 1. Activity is in RESUMED state now and it just handled the callback in #execute().
+ // 2. Activity wasn't RESUMED yet, which means that it didn't receive the top state yet.
+ // 3. Activity is PAUSED or in other lifecycle state after PAUSED. In this case top resumed
+ // state loss was already called right before pausing.
+ try {
+ ActivityTaskManager.getService().activityTopResumedStateLost();
+ } catch (RemoteException ex) {
+ throw ex.rethrowFromSystemServer();
+ }
+ }
+
// ObjectPoolItem implementation
diff --git a/core/java/android/app/servertransaction/WindowVisibilityItem.java b/core/java/android/app/servertransaction/WindowVisibilityItem.java
index d9956b1348b1..6bdd313d819a 100644
--- a/core/java/android/app/servertransaction/WindowVisibilityItem.java
+++ b/core/java/android/app/servertransaction/WindowVisibilityItem.java
@@ -34,7 +34,8 @@ public class WindowVisibilityItem extends ClientTransactionItem {
@Override
public void execute(ClientTransactionHandler client, IBinder token,
PendingTransactionActions pendingActions) {
- Trace.traceBegin(TRACE_TAG_ACTIVITY_MANAGER, "activityShowWindow");
+ Trace.traceBegin(TRACE_TAG_ACTIVITY_MANAGER,
+ mShowWindow ? "activityShowWindow" : "activityHideWindow");
client.handleWindowVisibility(token, mShowWindow);
Trace.traceEnd(TRACE_TAG_ACTIVITY_MANAGER);
}
diff --git a/core/java/android/app/usage/UsageStatsManager.java b/core/java/android/app/usage/UsageStatsManager.java
index 9c6bd927dd56..d34e6d3836b8 100644
--- a/core/java/android/app/usage/UsageStatsManager.java
+++ b/core/java/android/app/usage/UsageStatsManager.java
@@ -195,6 +195,8 @@ public final class UsageStatsManager {
/** @hide */
public static final int REASON_SUB_USAGE_EXEMPTED_SYNC_START = 0x000D;
/** @hide */
+ public static final int REASON_SUB_USAGE_UNEXEMPTED_SYNC_SCHEDULED = 0x000E;
+ /** @hide */
public static final int REASON_SUB_PREDICTED_RESTORED = 0x0001;
@@ -972,6 +974,9 @@ public final class UsageStatsManager {
case REASON_SUB_USAGE_EXEMPTED_SYNC_START:
sb.append("-es");
break;
+ case REASON_SUB_USAGE_UNEXEMPTED_SYNC_SCHEDULED:
+ sb.append("-uss");
+ break;
}
break;
}
diff --git a/core/java/android/app/usage/UsageStatsManagerInternal.java b/core/java/android/app/usage/UsageStatsManagerInternal.java
index 43ce521fa9f3..bbec6b386d60 100644
--- a/core/java/android/app/usage/UsageStatsManagerInternal.java
+++ b/core/java/android/app/usage/UsageStatsManagerInternal.java
@@ -257,12 +257,14 @@ public abstract class UsageStatsManagerInternal {
int numDeferredJobs, long timeSinceLastJobRun);
/**
- * Report a sync is scheduled by a foreground app.
+ * Report a sync that was scheduled.
*
* @param packageName name of the package that owns the sync adapter.
* @param userId which user the app is associated with
+ * @param exempted is sync app standby exempted
*/
- public abstract void reportExemptedSyncScheduled(String packageName, @UserIdInt int userId);
+ public abstract void reportSyncScheduled(String packageName, @UserIdInt int userId,
+ boolean exempted);
/**
* Report a sync that was scheduled by a foreground app is about to be executed.
diff --git a/core/java/android/content/LocusId.java b/core/java/android/content/LocusId.java
index 9548f9c32d90..d6697286cfa1 100644
--- a/core/java/android/content/LocusId.java
+++ b/core/java/android/content/LocusId.java
@@ -101,12 +101,14 @@ public final class LocusId implements Parcelable {
public static final Parcelable.Creator<LocusId> CREATOR =
new Parcelable.Creator<LocusId>() {
+ @NonNull
@Override
public LocusId createFromParcel(Parcel source) {
final Uri uri = source.readParcelable(null);
return new LocusId(uri);
}
+ @NonNull
@Override
public LocusId[] newArray(int size) {
return new LocusId[size];
diff --git a/core/java/android/content/pm/ApplicationInfo.java b/core/java/android/content/pm/ApplicationInfo.java
index 6c6fcb2ea558..dad1a1a22fb6 100644
--- a/core/java/android/content/pm/ApplicationInfo.java
+++ b/core/java/android/content/pm/ApplicationInfo.java
@@ -662,6 +662,14 @@ public class ApplicationInfo extends PackageItemInfo implements Parcelable {
*/
public static final int PRIVATE_FLAG_ALLOW_CLEAR_USER_DATA_ON_FAILED_RESTORE = 1 << 26;
+ /**
+ * Value for {@link #privateFlags}: true if the application allows its audio playback
+ * to be captured by other apps.
+ *
+ * @hide
+ */
+ public static final int PRIVATE_FLAG_ALLOW_AUDIO_PLAYBACK_CAPTURE = 1 << 27;
+
/** @hide */
@IntDef(flag = true, prefix = { "PRIVATE_FLAG_" }, value = {
PRIVATE_FLAG_ACTIVITIES_RESIZE_MODE_RESIZEABLE,
@@ -688,7 +696,8 @@ public class ApplicationInfo extends PackageItemInfo implements Parcelable {
PRIVATE_FLAG_VENDOR,
PRIVATE_FLAG_VIRTUAL_PRELOAD,
PRIVATE_FLAG_HAS_FRAGILE_USER_DATA,
- PRIVATE_FLAG_ALLOW_CLEAR_USER_DATA_ON_FAILED_RESTORE
+ PRIVATE_FLAG_ALLOW_CLEAR_USER_DATA_ON_FAILED_RESTORE,
+ PRIVATE_FLAG_ALLOW_AUDIO_PLAYBACK_CAPTURE
})
@Retention(RetentionPolicy.SOURCE)
public @interface ApplicationInfoPrivateFlags {}
@@ -1342,6 +1351,8 @@ public class ApplicationInfo extends PackageItemInfo implements Parcelable {
}
pw.println(prefix + "HiddenApiEnforcementPolicy=" + getHiddenApiEnforcementPolicy());
pw.println(prefix + "usesNonSdkApi=" + usesNonSdkApi());
+ pw.println(prefix + "allowsPlaybackCapture="
+ + (isAudioPlaybackCaptureAllowed() ? "true" : "false"));
}
super.dumpBack(pw, prefix);
}
@@ -1790,6 +1801,17 @@ public class ApplicationInfo extends PackageItemInfo implements Parcelable {
return (privateFlags & PRIVATE_FLAG_HAS_FRAGILE_USER_DATA) != 0;
}
+ /**
+ * Whether an app allows its playback audio to be captured by other apps.
+ *
+ * @return {@code true} if the app indicates that its audio can be captured by other apps.
+ *
+ * @hide
+ */
+ public boolean isAudioPlaybackCaptureAllowed() {
+ return (privateFlags & PRIVATE_FLAG_ALLOW_AUDIO_PLAYBACK_CAPTURE) != 0;
+ }
+
private boolean isAllowedToUseHiddenApis() {
if (isSignedWithPlatformKey()) {
return true;
diff --git a/core/java/android/content/pm/PackageManagerInternal.java b/core/java/android/content/pm/PackageManagerInternal.java
index 270e3879a71f..2c1842c70db9 100644
--- a/core/java/android/content/pm/PackageManagerInternal.java
+++ b/core/java/android/content/pm/PackageManagerInternal.java
@@ -160,6 +160,14 @@ public abstract class PackageManagerInternal {
* @return whether the default browser was successfully set.
*/
boolean setDefaultBrowser(@Nullable String packageName, @UserIdInt int userId);
+
+ /**
+ * Set the package name of the default browser asynchronously.
+ *
+ * @param packageName package name of the default browser, or {@code null} to remove
+ * @param userId the user id
+ */
+ void setDefaultBrowserAsync(@Nullable String packageName, @UserIdInt int userId);
}
/**
diff --git a/core/java/android/content/pm/PackageParser.java b/core/java/android/content/pm/PackageParser.java
index 4db7d0a91c6a..f899800f4e93 100644
--- a/core/java/android/content/pm/PackageParser.java
+++ b/core/java/android/content/pm/PackageParser.java
@@ -3756,6 +3756,12 @@ public class PackageParser {
ai.privateFlags |= ApplicationInfo.PRIVATE_FLAG_ALLOW_CLEAR_USER_DATA_ON_FAILED_RESTORE;
}
+ if (sa.getBoolean(
+ R.styleable.AndroidManifestApplication_allowAudioPlaybackCapture,
+ owner.applicationInfo.targetSdkVersion >= Build.VERSION_CODES.Q)) {
+ ai.privateFlags |= ApplicationInfo.PRIVATE_FLAG_ALLOW_AUDIO_PLAYBACK_CAPTURE;
+ }
+
ai.maxAspectRatio = sa.getFloat(R.styleable.AndroidManifestApplication_maxAspectRatio, 0);
ai.minAspectRatio = sa.getFloat(R.styleable.AndroidManifestApplication_minAspectRatio, 0);
diff --git a/core/java/android/content/rollback/RollbackInfo.java b/core/java/android/content/rollback/RollbackInfo.java
index 0cde6ba38099..9459ad366f76 100644
--- a/core/java/android/content/rollback/RollbackInfo.java
+++ b/core/java/android/content/rollback/RollbackInfo.java
@@ -17,12 +17,10 @@
package android.content.rollback;
import android.annotation.SystemApi;
-import android.content.pm.PackageInstaller;
import android.content.pm.VersionedPackage;
import android.os.Parcel;
import android.os.Parcelable;
-import java.util.Collections;
import java.util.List;
/**
@@ -44,13 +42,7 @@ public final class RollbackInfo implements Parcelable {
private final List<VersionedPackage> mCausePackages;
private final boolean mIsStaged;
- private final int mCommittedSessionId;
-
- /** @hide */
- public RollbackInfo(int rollbackId, List<PackageRollbackInfo> packages, boolean isStaged) {
- this(rollbackId, packages, isStaged, Collections.emptyList(),
- PackageInstaller.SessionInfo.INVALID_ID);
- }
+ private int mCommittedSessionId;
/** @hide */
public RollbackInfo(int rollbackId, List<PackageRollbackInfo> packages, boolean isStaged,
@@ -101,6 +93,14 @@ public final class RollbackInfo implements Parcelable {
}
/**
+ * Sets the session ID for the committed rollback for staged rollbacks.
+ * @hide
+ */
+ public void setCommittedSessionId(int sessionId) {
+ mCommittedSessionId = sessionId;
+ }
+
+ /**
* Gets the list of package versions that motivated this rollback.
* As provided to {@link #commitRollback} when the rollback was committed.
* This is only applicable for rollbacks that have been committed.
diff --git a/core/java/android/database/BulkCursorNative.java b/core/java/android/database/BulkCursorNative.java
index d3c11e785d7f..77a13cf80073 100644
--- a/core/java/android/database/BulkCursorNative.java
+++ b/core/java/android/database/BulkCursorNative.java
@@ -16,6 +16,7 @@
package android.database;
+import android.annotation.UnsupportedAppUsage;
import android.os.Binder;
import android.os.Bundle;
import android.os.IBinder;
@@ -138,6 +139,7 @@ public abstract class BulkCursorNative extends Binder implements IBulkCursor
final class BulkCursorProxy implements IBulkCursor {
+ @UnsupportedAppUsage
private IBinder mRemote;
private Bundle mExtras;
diff --git a/core/java/android/database/Cursor.java b/core/java/android/database/Cursor.java
index 1379138b37c0..2afb755031b9 100644
--- a/core/java/android/database/Cursor.java
+++ b/core/java/android/database/Cursor.java
@@ -17,6 +17,7 @@
package android.database;
import android.annotation.NonNull;
+import android.annotation.Nullable;
import android.content.ContentResolver;
import android.net.Uri;
import android.os.Bundle;
@@ -473,7 +474,7 @@ public interface Cursor extends Closeable {
* ContentResolver.registerContentObserver} to find out about changes to this Cursor's
* data. May be null if no notification URI has been set.
*/
- default List<Uri> getNotificationUris() {
+ default @Nullable List<Uri> getNotificationUris() {
final Uri notifyUri = getNotificationUri();
return notifyUri == null ? null : Arrays.asList(notifyUri);
}
diff --git a/core/java/android/hardware/biometrics/BiometricPrompt.java b/core/java/android/hardware/biometrics/BiometricPrompt.java
index baf972b26573..c64e48f44fd9 100644
--- a/core/java/android/hardware/biometrics/BiometricPrompt.java
+++ b/core/java/android/hardware/biometrics/BiometricPrompt.java
@@ -139,7 +139,7 @@ public class BiometricPrompt implements BiometricAuthenticator, BiometricConstan
* @param title
* @return
*/
- public Builder setTitle(@NonNull CharSequence title) {
+ @NonNull public Builder setTitle(@NonNull CharSequence title) {
mBundle.putCharSequence(KEY_TITLE, title);
return this;
}
@@ -150,7 +150,7 @@ public class BiometricPrompt implements BiometricAuthenticator, BiometricConstan
* @hide
*/
@RequiresPermission(USE_BIOMETRIC_INTERNAL)
- public Builder setUseDefaultTitle() {
+ @NonNull public Builder setUseDefaultTitle() {
mBundle.putBoolean(KEY_USE_DEFAULT_TITLE, true);
return this;
}
@@ -160,7 +160,7 @@ public class BiometricPrompt implements BiometricAuthenticator, BiometricConstan
* @param subtitle
* @return
*/
- public Builder setSubtitle(@NonNull CharSequence subtitle) {
+ @NonNull public Builder setSubtitle(@NonNull CharSequence subtitle) {
mBundle.putCharSequence(KEY_SUBTITLE, subtitle);
return this;
}
@@ -170,7 +170,7 @@ public class BiometricPrompt implements BiometricAuthenticator, BiometricConstan
* @param description
* @return
*/
- public Builder setDescription(@NonNull CharSequence description) {
+ @NonNull public Builder setDescription(@NonNull CharSequence description) {
mBundle.putCharSequence(KEY_DESCRIPTION, description);
return this;
}
@@ -182,7 +182,7 @@ public class BiometricPrompt implements BiometricAuthenticator, BiometricConstan
* @return
* @hide
*/
- public Builder setPositiveButton(@NonNull CharSequence text,
+ @NonNull public Builder setPositiveButton(@NonNull CharSequence text,
@NonNull @CallbackExecutor Executor executor,
@NonNull DialogInterface.OnClickListener listener) {
if (TextUtils.isEmpty(text)) {
@@ -210,7 +210,7 @@ public class BiometricPrompt implements BiometricAuthenticator, BiometricConstan
* @param text
* @return
*/
- public Builder setNegativeButton(@NonNull CharSequence text,
+ @NonNull public Builder setNegativeButton(@NonNull CharSequence text,
@NonNull @CallbackExecutor Executor executor,
@NonNull DialogInterface.OnClickListener listener) {
if (TextUtils.isEmpty(text)) {
@@ -245,7 +245,7 @@ public class BiometricPrompt implements BiometricAuthenticator, BiometricConstan
*
* @param requireConfirmation
*/
- public Builder setRequireConfirmation(boolean requireConfirmation) {
+ @NonNull public Builder setRequireConfirmation(boolean requireConfirmation) {
mBundle.putBoolean(KEY_REQUIRE_CONFIRMATION, requireConfirmation);
return this;
}
@@ -255,7 +255,8 @@ public class BiometricPrompt implements BiometricAuthenticator, BiometricConstan
* option to authenticate with their device PIN, pattern, or password. Developers should
* first check {@link KeyguardManager#isDeviceSecure()} before enabling this. If the device
* is not secure, {@link BiometricPrompt#BIOMETRIC_ERROR_NO_DEVICE_CREDENTIAL} will be
- * returned in {@link AuthenticationCallback#onAuthenticationError(int, CharSequence)}}
+ * returned in {@link AuthenticationCallback#onAuthenticationError(int, CharSequence)}}.
+ * Defaults to false.
*
* Note that {@link #setNegativeButton(CharSequence, Executor,
* DialogInterface.OnClickListener)} should not be set if this is set to true.
@@ -264,7 +265,7 @@ public class BiometricPrompt implements BiometricAuthenticator, BiometricConstan
* credentials (PIN, pattern, or password).
* @return
*/
- public Builder setAllowDeviceCredential(boolean enable) {
+ @NonNull public Builder setAllowDeviceCredential(boolean enable) {
mBundle.putBoolean(KEY_ALLOW_DEVICE_CREDENTIAL, enable);
return this;
}
@@ -274,7 +275,7 @@ public class BiometricPrompt implements BiometricAuthenticator, BiometricConstan
* @return a {@link BiometricPrompt}
* @throws IllegalArgumentException if any of the required fields are not set.
*/
- public BiometricPrompt build() {
+ @NonNull public BiometricPrompt build() {
final CharSequence title = mBundle.getCharSequence(KEY_TITLE);
final CharSequence negative = mBundle.getCharSequence(KEY_NEGATIVE_TEXT);
final boolean useDefaultTitle = mBundle.getBoolean(KEY_USE_DEFAULT_TITLE);
@@ -616,8 +617,15 @@ public class BiometricPrompt implements BiometricAuthenticator, BiometricConstan
mExecutor = executor;
mAuthenticationCallback = callback;
final long sessionId = crypto != null ? crypto.getOpId() : 0;
- mService.authenticate(mToken, sessionId, userId, mBiometricServiceReceiver,
- mContext.getOpPackageName(), mBundle);
+ if (BiometricManager.hasBiometrics(mContext)) {
+ mService.authenticate(mToken, sessionId, userId, mBiometricServiceReceiver,
+ mContext.getOpPackageName(), mBundle);
+ } else {
+ mExecutor.execute(() -> {
+ callback.onAuthenticationError(BiometricPrompt.BIOMETRIC_ERROR_HW_NOT_PRESENT,
+ mContext.getString(R.string.biometric_error_hw_unavailable));
+ });
+ }
} catch (RemoteException e) {
Log.e(TAG, "Remote exception while authenticating", e);
mExecutor.execute(() -> {
diff --git a/core/java/android/hardware/camera2/CameraCharacteristics.java b/core/java/android/hardware/camera2/CameraCharacteristics.java
index 0e4ff78af1e0..f7b7ef2f0d58 100644
--- a/core/java/android/hardware/camera2/CameraCharacteristics.java
+++ b/core/java/android/hardware/camera2/CameraCharacteristics.java
@@ -682,6 +682,7 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri
* @see CaptureRequest#COLOR_CORRECTION_ABERRATION_MODE
*/
@PublicKey
+ @NonNull
public static final Key<int[]> COLOR_CORRECTION_AVAILABLE_ABERRATION_MODES =
new Key<int[]>("android.colorCorrection.availableAberrationModes", int[].class);
@@ -700,6 +701,7 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri
* @see CaptureRequest#CONTROL_AE_ANTIBANDING_MODE
*/
@PublicKey
+ @NonNull
public static final Key<int[]> CONTROL_AE_AVAILABLE_ANTIBANDING_MODES =
new Key<int[]>("android.control.aeAvailableAntibandingModes", int[].class);
@@ -725,6 +727,7 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri
* @see CaptureRequest#CONTROL_AE_MODE
*/
@PublicKey
+ @NonNull
public static final Key<int[]> CONTROL_AE_AVAILABLE_MODES =
new Key<int[]>("android.control.aeAvailableModes", int[].class);
@@ -764,6 +767,7 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri
* @see CaptureRequest#CONTROL_AE_TARGET_FPS_RANGE
*/
@PublicKey
+ @NonNull
public static final Key<android.util.Range<Integer>[]> CONTROL_AE_AVAILABLE_TARGET_FPS_RANGES =
new Key<android.util.Range<Integer>[]>("android.control.aeAvailableTargetFpsRanges", new TypeReference<android.util.Range<Integer>[]>() {{ }});
@@ -784,6 +788,7 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri
* @see CaptureRequest#CONTROL_AE_EXPOSURE_COMPENSATION
*/
@PublicKey
+ @NonNull
public static final Key<android.util.Range<Integer>> CONTROL_AE_COMPENSATION_RANGE =
new Key<android.util.Range<Integer>>("android.control.aeCompensationRange", new TypeReference<android.util.Range<Integer>>() {{ }});
@@ -801,6 +806,7 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri
* @see CaptureRequest#CONTROL_AE_EXPOSURE_COMPENSATION
*/
@PublicKey
+ @NonNull
public static final Key<Rational> CONTROL_AE_COMPENSATION_STEP =
new Key<Rational>("android.control.aeCompensationStep", Rational.class);
@@ -825,6 +831,7 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri
* @see CameraCharacteristics#LENS_INFO_MINIMUM_FOCUS_DISTANCE
*/
@PublicKey
+ @NonNull
public static final Key<int[]> CONTROL_AF_AVAILABLE_MODES =
new Key<int[]>("android.control.afAvailableModes", int[].class);
@@ -848,6 +855,7 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri
* @see CaptureRequest#CONTROL_MODE
*/
@PublicKey
+ @NonNull
public static final Key<int[]> CONTROL_AVAILABLE_EFFECTS =
new Key<int[]>("android.control.availableEffects", int[].class);
@@ -871,6 +879,7 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri
* @see CameraCharacteristics#STATISTICS_INFO_MAX_FACE_COUNT
*/
@PublicKey
+ @NonNull
public static final Key<int[]> CONTROL_AVAILABLE_SCENE_MODES =
new Key<int[]>("android.control.availableSceneModes", int[].class);
@@ -885,6 +894,7 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri
* @see CaptureRequest#CONTROL_VIDEO_STABILIZATION_MODE
*/
@PublicKey
+ @NonNull
public static final Key<int[]> CONTROL_AVAILABLE_VIDEO_STABILIZATION_MODES =
new Key<int[]>("android.control.availableVideoStabilizationModes", int[].class);
@@ -909,6 +919,7 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri
* @see CaptureRequest#CONTROL_AWB_MODE
*/
@PublicKey
+ @NonNull
public static final Key<int[]> CONTROL_AWB_AVAILABLE_MODES =
new Key<int[]>("android.control.awbAvailableModes", int[].class);
@@ -945,6 +956,7 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri
* @see CaptureRequest#CONTROL_AE_REGIONS
*/
@PublicKey
+ @NonNull
@SyntheticKey
public static final Key<Integer> CONTROL_MAX_REGIONS_AE =
new Key<Integer>("android.control.maxRegionsAe", int.class);
@@ -961,6 +973,7 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri
* @see CaptureRequest#CONTROL_AWB_REGIONS
*/
@PublicKey
+ @NonNull
@SyntheticKey
public static final Key<Integer> CONTROL_MAX_REGIONS_AWB =
new Key<Integer>("android.control.maxRegionsAwb", int.class);
@@ -977,6 +990,7 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri
* @see CaptureRequest#CONTROL_AF_REGIONS
*/
@PublicKey
+ @NonNull
@SyntheticKey
public static final Key<Integer> CONTROL_MAX_REGIONS_AF =
new Key<Integer>("android.control.maxRegionsAf", int.class);
@@ -1025,7 +1039,7 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri
* normal capture session, or it will cause request error.</p>
* <p><b>Range of valid values:</b><br></p>
* <p>For each configuration, the fps_max &gt;= 120fps.</p>
- * <p><b>Optional</b> - This value may be {@code null} on some devices.</p>
+ * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p>
* <p><b>Limited capability</b> -
* Present on all camera devices that report being at least {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL_LIMITED HARDWARE_LEVEL_LIMITED} devices in the
* {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL android.info.supportedHardwareLevel} key</p>
@@ -1046,6 +1060,7 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri
* @see CaptureRequest#CONTROL_AE_LOCK
*/
@PublicKey
+ @NonNull
public static final Key<Boolean> CONTROL_AE_LOCK_AVAILABLE =
new Key<Boolean>("android.control.aeLockAvailable", boolean.class);
@@ -1058,6 +1073,7 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri
* @see CaptureRequest#CONTROL_AWB_LOCK
*/
@PublicKey
+ @NonNull
public static final Key<Boolean> CONTROL_AWB_LOCK_AVAILABLE =
new Key<Boolean>("android.control.awbLockAvailable", boolean.class);
@@ -1074,6 +1090,7 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri
* @see CaptureRequest#CONTROL_MODE
*/
@PublicKey
+ @NonNull
public static final Key<int[]> CONTROL_AVAILABLE_MODES =
new Key<int[]>("android.control.availableModes", int[].class);
@@ -1088,12 +1105,13 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri
* present, and if a device does not support post RAW sensitivity boost, it will
* list <code>(100, 100)</code> in this key.</p>
* <p><b>Units</b>: ISO arithmetic units, the same as {@link CaptureRequest#SENSOR_SENSITIVITY android.sensor.sensitivity}</p>
- * <p><b>Optional</b> - This value may be {@code null} on some devices.</p>
+ * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p>
*
* @see CaptureRequest#CONTROL_POST_RAW_SENSITIVITY_BOOST
* @see CaptureRequest#SENSOR_SENSITIVITY
*/
@PublicKey
+ @NonNull
public static final Key<android.util.Range<Integer>> CONTROL_POST_RAW_SENSITIVITY_BOOST_RANGE =
new Key<android.util.Range<Integer>>("android.control.postRawSensitivityBoostRange", new TypeReference<android.util.Range<Integer>>() {{ }});
@@ -1105,7 +1123,7 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri
* list FAST.</p>
* <p><b>Range of valid values:</b><br>
* Any value listed in {@link CaptureRequest#EDGE_MODE android.edge.mode}</p>
- * <p><b>Optional</b> - This value may be {@code null} on some devices.</p>
+ * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p>
* <p><b>Full capability</b> -
* Present on all camera devices that report being {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL_FULL HARDWARE_LEVEL_FULL} devices in the
* {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL android.info.supportedHardwareLevel} key</p>
@@ -1114,6 +1132,7 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri
* @see CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL
*/
@PublicKey
+ @NonNull
public static final Key<int[]> EDGE_AVAILABLE_EDGE_MODES =
new Key<int[]>("android.edge.availableEdgeModes", int[].class);
@@ -1126,6 +1145,7 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri
* This key is available on all devices.</p>
*/
@PublicKey
+ @NonNull
public static final Key<Boolean> FLASH_INFO_AVAILABLE =
new Key<Boolean>("android.flash.info.available", boolean.class);
@@ -1135,11 +1155,12 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri
* <p>FULL mode camera devices will always support FAST.</p>
* <p><b>Range of valid values:</b><br>
* Any value listed in {@link CaptureRequest#HOT_PIXEL_MODE android.hotPixel.mode}</p>
- * <p><b>Optional</b> - This value may be {@code null} on some devices.</p>
+ * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p>
*
* @see CaptureRequest#HOT_PIXEL_MODE
*/
@PublicKey
+ @NonNull
public static final Key<int[]> HOT_PIXEL_AVAILABLE_HOT_PIXEL_MODES =
new Key<int[]>("android.hotPixel.availableHotPixelModes", int[].class);
@@ -1167,6 +1188,7 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri
* @see CaptureRequest#JPEG_THUMBNAIL_SIZE
*/
@PublicKey
+ @NonNull
public static final Key<android.util.Size[]> JPEG_AVAILABLE_THUMBNAIL_SIZES =
new Key<android.util.Size[]>("android.jpeg.availableThumbnailSizes", android.util.Size[].class);
@@ -1178,7 +1200,7 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri
* <p>If the camera device supports a variable aperture, the aperture values
* in this list will be sorted in ascending order.</p>
* <p><b>Units</b>: The aperture f-number</p>
- * <p><b>Optional</b> - This value may be {@code null} on some devices.</p>
+ * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p>
* <p><b>Full capability</b> -
* Present on all camera devices that report being {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL_FULL HARDWARE_LEVEL_FULL} devices in the
* {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL android.info.supportedHardwareLevel} key</p>
@@ -1187,6 +1209,7 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri
* @see CaptureRequest#LENS_APERTURE
*/
@PublicKey
+ @NonNull
public static final Key<float[]> LENS_INFO_AVAILABLE_APERTURES =
new Key<float[]>("android.lens.info.availableApertures", float[].class);
@@ -1199,7 +1222,7 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri
* <p><b>Units</b>: Exposure value (EV)</p>
* <p><b>Range of valid values:</b><br></p>
* <p>Values are &gt;= 0</p>
- * <p><b>Optional</b> - This value may be {@code null} on some devices.</p>
+ * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p>
* <p><b>Full capability</b> -
* Present on all camera devices that report being {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL_FULL HARDWARE_LEVEL_FULL} devices in the
* {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL android.info.supportedHardwareLevel} key</p>
@@ -1208,6 +1231,7 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri
* @see CaptureRequest#LENS_FILTER_DENSITY
*/
@PublicKey
+ @NonNull
public static final Key<float[]> LENS_INFO_AVAILABLE_FILTER_DENSITIES =
new Key<float[]>("android.lens.info.availableFilterDensities", float[].class);
@@ -1226,6 +1250,7 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri
* @see CaptureRequest#LENS_FOCAL_LENGTH
*/
@PublicKey
+ @NonNull
public static final Key<float[]> LENS_INFO_AVAILABLE_FOCAL_LENGTHS =
new Key<float[]>("android.lens.info.availableFocalLengths", float[].class);
@@ -1236,7 +1261,7 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri
* contain only OFF.</p>
* <p><b>Range of valid values:</b><br>
* Any value listed in {@link CaptureRequest#LENS_OPTICAL_STABILIZATION_MODE android.lens.opticalStabilizationMode}</p>
- * <p><b>Optional</b> - This value may be {@code null} on some devices.</p>
+ * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p>
* <p><b>Limited capability</b> -
* Present on all camera devices that report being at least {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL_LIMITED HARDWARE_LEVEL_LIMITED} devices in the
* {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL android.info.supportedHardwareLevel} key</p>
@@ -1245,6 +1270,7 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri
* @see CaptureRequest#LENS_OPTICAL_STABILIZATION_MODE
*/
@PublicKey
+ @NonNull
public static final Key<int[]> LENS_INFO_AVAILABLE_OPTICAL_STABILIZATION =
new Key<int[]>("android.lens.info.availableOpticalStabilization", int[].class);
@@ -1256,7 +1282,7 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri
* <p><b>Range of valid values:</b><br>
* If lens is fixed focus, &gt;= 0. If lens has focuser unit, the value is
* within <code>(0.0f, {@link CameraCharacteristics#LENS_INFO_MINIMUM_FOCUS_DISTANCE android.lens.info.minimumFocusDistance}]</code></p>
- * <p><b>Optional</b> - This value may be {@code null} on some devices.</p>
+ * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p>
* <p><b>Limited capability</b> -
* Present on all camera devices that report being at least {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL_LIMITED HARDWARE_LEVEL_LIMITED} devices in the
* {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL android.info.supportedHardwareLevel} key</p>
@@ -1267,6 +1293,7 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri
* @see CameraCharacteristics#LENS_INFO_MINIMUM_FOCUS_DISTANCE
*/
@PublicKey
+ @NonNull
public static final Key<Float> LENS_INFO_HYPERFOCAL_DISTANCE =
new Key<Float>("android.lens.info.hyperfocalDistance", float.class);
@@ -1278,7 +1305,7 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri
* <p><b>Units</b>: See {@link CameraCharacteristics#LENS_INFO_FOCUS_DISTANCE_CALIBRATION android.lens.info.focusDistanceCalibration} for details</p>
* <p><b>Range of valid values:</b><br>
* &gt;= 0</p>
- * <p><b>Optional</b> - This value may be {@code null} on some devices.</p>
+ * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p>
* <p><b>Limited capability</b> -
* Present on all camera devices that report being at least {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL_LIMITED HARDWARE_LEVEL_LIMITED} devices in the
* {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL android.info.supportedHardwareLevel} key</p>
@@ -1288,6 +1315,7 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri
* @see CameraCharacteristics#LENS_INFO_FOCUS_DISTANCE_CALIBRATION
*/
@PublicKey
+ @NonNull
public static final Key<Float> LENS_INFO_MINIMUM_FOCUS_DISTANCE =
new Key<Float>("android.lens.info.minimumFocusDistance", float.class);
@@ -1297,7 +1325,7 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri
* must be smaller than 64x64.</p>
* <p><b>Range of valid values:</b><br>
* Both values &gt;= 1</p>
- * <p><b>Optional</b> - This value may be {@code null} on some devices.</p>
+ * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p>
* <p><b>Full capability</b> -
* Present on all camera devices that report being {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL_FULL HARDWARE_LEVEL_FULL} devices in the
* {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL android.info.supportedHardwareLevel} key</p>
@@ -1329,7 +1357,7 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri
* <li>{@link #LENS_INFO_FOCUS_DISTANCE_CALIBRATION_APPROXIMATE APPROXIMATE}</li>
* <li>{@link #LENS_INFO_FOCUS_DISTANCE_CALIBRATION_CALIBRATED CALIBRATED}</li>
* </ul></p>
- * <p><b>Optional</b> - This value may be {@code null} on some devices.</p>
+ * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p>
* <p><b>Limited capability</b> -
* Present on all camera devices that report being at least {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL_LIMITED HARDWARE_LEVEL_LIMITED} devices in the
* {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL android.info.supportedHardwareLevel} key</p>
@@ -1344,6 +1372,7 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri
* @see #LENS_INFO_FOCUS_DISTANCE_CALIBRATION_CALIBRATED
*/
@PublicKey
+ @NonNull
public static final Key<Integer> LENS_INFO_FOCUS_DISTANCE_CALIBRATION =
new Key<Integer>("android.lens.info.focusDistanceCalibration", int.class);
@@ -1362,6 +1391,7 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri
* @see #LENS_FACING_EXTERNAL
*/
@PublicKey
+ @NonNull
public static final Key<Integer> LENS_FACING =
new Key<Integer>("android.lens.facing", int.class);
@@ -1396,10 +1426,11 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri
* <code>p'</code> is in the camera-oriented coordinate system.</p>
* <p><b>Units</b>:
* Quaternion coefficients</p>
- * <p><b>Optional</b> - This value may be {@code null} on some devices.</p>
+ * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p>
* <p><b>Permission {@link android.Manifest.permission#CAMERA } is needed to access this property</b></p>
*/
@PublicKey
+ @NonNull
public static final Key<float[]> LENS_POSE_ROTATION =
new Key<float[]>("android.lens.poseRotation", float[].class);
@@ -1432,7 +1463,7 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri
* the center of the primary gyroscope on the device. The axis definitions are the same as
* with PRIMARY_CAMERA.</p>
* <p><b>Units</b>: Meters</p>
- * <p><b>Optional</b> - This value may be {@code null} on some devices.</p>
+ * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p>
* <p><b>Permission {@link android.Manifest.permission#CAMERA } is needed to access this property</b></p>
*
* @see CameraCharacteristics#LENS_DISTORTION
@@ -1441,6 +1472,7 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri
* @see CameraCharacteristics#LENS_POSE_ROTATION
*/
@PublicKey
+ @NonNull
public static final Key<float[]> LENS_POSE_TRANSLATION =
new Key<float[]>("android.lens.poseTranslation", float[].class);
@@ -1504,7 +1536,7 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri
* Pixels in the
* {@link CameraCharacteristics#SENSOR_INFO_PRE_CORRECTION_ACTIVE_ARRAY_SIZE android.sensor.info.preCorrectionActiveArraySize}
* coordinate system.</p>
- * <p><b>Optional</b> - This value may be {@code null} on some devices.</p>
+ * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p>
* <p><b>Permission {@link android.Manifest.permission#CAMERA } is needed to access this property</b></p>
*
* @see CameraCharacteristics#LENS_DISTORTION
@@ -1514,6 +1546,7 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri
* @see CameraCharacteristics#SENSOR_INFO_PRE_CORRECTION_ACTIVE_ARRAY_SIZE
*/
@PublicKey
+ @NonNull
public static final Key<float[]> LENS_INTRINSIC_CALIBRATION =
new Key<float[]>("android.lens.intrinsicCalibration", float[].class);
@@ -1548,7 +1581,7 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri
* <p>The distortion model used is the Brown-Conrady model.</p>
* <p><b>Units</b>:
* Unitless coefficients.</p>
- * <p><b>Optional</b> - This value may be {@code null} on some devices.</p>
+ * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p>
* <p><b>Permission {@link android.Manifest.permission#CAMERA } is needed to access this property</b></p>
*
* @see CameraCharacteristics#LENS_INTRINSIC_CALIBRATION
@@ -1561,6 +1594,7 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri
*/
@Deprecated
@PublicKey
+ @NonNull
public static final Key<float[]> LENS_RADIAL_DISTORTION =
new Key<float[]>("android.lens.radialDistortion", float[].class);
@@ -1573,7 +1607,7 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri
* <li>{@link #LENS_POSE_REFERENCE_PRIMARY_CAMERA PRIMARY_CAMERA}</li>
* <li>{@link #LENS_POSE_REFERENCE_GYROSCOPE GYROSCOPE}</li>
* </ul></p>
- * <p><b>Optional</b> - This value may be {@code null} on some devices.</p>
+ * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p>
* <p><b>Permission {@link android.Manifest.permission#CAMERA } is needed to access this property</b></p>
*
* @see CameraCharacteristics#LENS_POSE_TRANSLATION
@@ -1581,6 +1615,7 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri
* @see #LENS_POSE_REFERENCE_GYROSCOPE
*/
@PublicKey
+ @NonNull
public static final Key<Integer> LENS_POSE_REFERENCE =
new Key<Integer>("android.lens.poseReference", int.class);
@@ -1615,13 +1650,14 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri
* <p>The distortion model used is the Brown-Conrady model.</p>
* <p><b>Units</b>:
* Unitless coefficients.</p>
- * <p><b>Optional</b> - This value may be {@code null} on some devices.</p>
+ * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p>
* <p><b>Permission {@link android.Manifest.permission#CAMERA } is needed to access this property</b></p>
*
* @see CameraCharacteristics#LENS_INTRINSIC_CALIBRATION
* @see CameraCharacteristics#LENS_RADIAL_DISTORTION
*/
@PublicKey
+ @NonNull
public static final Key<float[]> LENS_DISTORTION =
new Key<float[]>("android.lens.distortion", float[].class);
@@ -1634,7 +1670,7 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri
* <p>Legacy-capability camera devices will only support FAST mode.</p>
* <p><b>Range of valid values:</b><br>
* Any value listed in {@link CaptureRequest#NOISE_REDUCTION_MODE android.noiseReduction.mode}</p>
- * <p><b>Optional</b> - This value may be {@code null} on some devices.</p>
+ * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p>
* <p><b>Limited capability</b> -
* Present on all camera devices that report being at least {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL_LIMITED HARDWARE_LEVEL_LIMITED} devices in the
* {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL android.info.supportedHardwareLevel} key</p>
@@ -1643,6 +1679,7 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri
* @see CaptureRequest#NOISE_REDUCTION_MODE
*/
@PublicKey
+ @NonNull
public static final Key<int[]> NOISE_REDUCTION_AVAILABLE_NOISE_REDUCTION_MODES =
new Key<int[]>("android.noiseReduction.availableNoiseReductionModes", int[].class);
@@ -1655,7 +1692,7 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri
* future versions of camera service. This quirk will stop
* working at that point; DO NOT USE without careful
* consideration of future support.</p>
- * <p><b>Optional</b> - This value may be {@code null} on some devices.</p>
+ * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p>
* @deprecated
* <p>Not used in HALv3 or newer; replaced by better partials mechanism</p>
@@ -1728,6 +1765,7 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri
* @see CameraCharacteristics#SCALER_STREAM_CONFIGURATION_MAP
*/
@PublicKey
+ @NonNull
@SyntheticKey
public static final Key<Integer> REQUEST_MAX_NUM_OUTPUT_RAW =
new Key<Integer>("android.request.maxNumOutputRaw", int.class);
@@ -1764,6 +1802,7 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri
* @see CameraCharacteristics#SCALER_STREAM_CONFIGURATION_MAP
*/
@PublicKey
+ @NonNull
@SyntheticKey
public static final Key<Integer> REQUEST_MAX_NUM_OUTPUT_PROC =
new Key<Integer>("android.request.maxNumOutputProc", int.class);
@@ -1790,6 +1829,7 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri
* @see CameraCharacteristics#SCALER_STREAM_CONFIGURATION_MAP
*/
@PublicKey
+ @NonNull
@SyntheticKey
public static final Key<Integer> REQUEST_MAX_NUM_OUTPUT_PROC_STALLING =
new Key<Integer>("android.request.maxNumOutputProcStalling", int.class);
@@ -1809,7 +1849,7 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri
* should be JPEG.</p>
* <p><b>Range of valid values:</b><br></p>
* <p>0 or 1.</p>
- * <p><b>Optional</b> - This value may be {@code null} on some devices.</p>
+ * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p>
* <p><b>Full capability</b> -
* Present on all camera devices that report being {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL_FULL HARDWARE_LEVEL_FULL} devices in the
* {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL android.info.supportedHardwareLevel} key</p>
@@ -1817,6 +1857,7 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri
* @see CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL
*/
@PublicKey
+ @NonNull
public static final Key<Integer> REQUEST_MAX_NUM_INPUT_STREAMS =
new Key<Integer>("android.request.maxNumInputStreams", int.class);
@@ -1841,6 +1882,7 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri
* @see CaptureResult#REQUEST_PIPELINE_DEPTH
*/
@PublicKey
+ @NonNull
public static final Key<Byte> REQUEST_PIPELINE_MAX_DEPTH =
new Key<Byte>("android.request.pipelineMaxDepth", byte.class);
@@ -1861,9 +1903,10 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri
* partial results.</p>
* <p><b>Range of valid values:</b><br>
* &gt;= 1</p>
- * <p><b>Optional</b> - This value may be {@code null} on some devices.</p>
+ * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p>
*/
@PublicKey
+ @NonNull
public static final Key<Integer> REQUEST_PARTIAL_RESULT_COUNT =
new Key<Integer>("android.request.partialResultCount", int.class);
@@ -1923,6 +1966,7 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri
* @see #REQUEST_AVAILABLE_CAPABILITIES_SECURE_IMAGE_DATA
*/
@PublicKey
+ @NonNull
public static final Key<int[]> REQUEST_AVAILABLE_CAPABILITIES =
new Key<int[]>("android.request.availableCapabilities", int[].class);
@@ -2036,7 +2080,7 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri
* {@link CaptureRequest.Builder#getPhysicalCameraKey }. Capture requests that contain
* individual physical device requests must be built via
* {@link android.hardware.camera2.CameraDevice#createCaptureRequest(int, Set)}.</p>
- * <p><b>Optional</b> - This value may be {@code null} on some devices.</p>
+ * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p>
* <p><b>Limited capability</b> -
* Present on all camera devices that report being at least {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL_LIMITED HARDWARE_LEVEL_LIMITED} devices in the
* {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL android.info.supportedHardwareLevel} key</p>
@@ -2067,7 +2111,7 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri
* camera device for output streams.</p>
* <p>All camera devices will support JPEG and YUV_420_888 formats.</p>
* <p>When set to YUV_420_888, application can access the YUV420 data directly.</p>
- * <p><b>Optional</b> - This value may be {@code null} on some devices.</p>
+ * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p>
* @deprecated
* <p>Not used in HALv3 or newer</p>
@@ -2089,7 +2133,7 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri
* <p><b>Units</b>: Nanoseconds</p>
* <p><b>Range of valid values:</b><br>
* TODO: Remove property.</p>
- * <p><b>Optional</b> - This value may be {@code null} on some devices.</p>
+ * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p>
* @deprecated
* <p>Not used in HALv3 or newer</p>
@@ -2105,7 +2149,7 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri
* sensor maximum resolution (defined by {@link CameraCharacteristics#SENSOR_INFO_ACTIVE_ARRAY_SIZE android.sensor.info.activeArraySize}).</p>
* <p><b>Range of valid values:</b><br>
* TODO: Remove property.</p>
- * <p><b>Optional</b> - This value may be {@code null} on some devices.</p>
+ * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p>
*
* @see CameraCharacteristics#SENSOR_INFO_ACTIVE_ARRAY_SIZE
* @deprecated
@@ -2135,6 +2179,7 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri
* @see CaptureRequest#SCALER_CROP_REGION
*/
@PublicKey
+ @NonNull
public static final Key<Float> SCALER_AVAILABLE_MAX_DIGITAL_ZOOM =
new Key<Float>("android.scaler.availableMaxDigitalZoom", float.class);
@@ -2148,7 +2193,7 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri
* <p>When multiple streams are configured, the minimum frame duration will
* be &gt;= max(individual stream min durations).</p>
* <p><b>Units</b>: Nanoseconds</p>
- * <p><b>Optional</b> - This value may be {@code null} on some devices.</p>
+ * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p>
* @deprecated
* <p>Not used in HALv3 or newer</p>
@@ -2172,7 +2217,7 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri
* can provide.</p>
* <p>Please reference the documentation for the image data destination to
* check if it limits the maximum size for image data.</p>
- * <p><b>Optional</b> - This value may be {@code null} on some devices.</p>
+ * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p>
* @deprecated
* <p>Not used in HALv3 or newer</p>
@@ -2257,7 +2302,7 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri
* </tr>
* </tbody>
* </table>
- * <p><b>Optional</b> - This value may be {@code null} on some devices.</p>
+ * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p>
*
* @see CameraCharacteristics#REQUEST_AVAILABLE_CAPABILITIES
* @see CameraCharacteristics#REQUEST_MAX_NUM_INPUT_STREAMS
@@ -2551,6 +2596,7 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri
* @see CameraCharacteristics#SENSOR_INFO_ACTIVE_ARRAY_SIZE
*/
@PublicKey
+ @NonNull
@SyntheticKey
public static final Key<android.hardware.camera2.params.StreamConfigurationMap> SCALER_STREAM_CONFIGURATION_MAP =
new Key<android.hardware.camera2.params.StreamConfigurationMap>("android.scaler.streamConfigurationMap", android.hardware.camera2.params.StreamConfigurationMap.class);
@@ -2579,6 +2625,7 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri
* @see #SCALER_CROPPING_TYPE_FREEFORM
*/
@PublicKey
+ @NonNull
public static final Key<Integer> SCALER_CROPPING_TYPE =
new Key<Integer>("android.scaler.croppingType", int.class);
@@ -2591,7 +2638,7 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri
* power and performance efficient for specific use cases. For more information about
* retrieving the suggestions see
* {@link android.hardware.camera2.CameraCharacteristics#getRecommendedStreamConfigurationMap }.</p>
- * <p><b>Optional</b> - This value may be {@code null} on some devices.</p>
+ * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p>
* @hide
*/
public static final Key<android.hardware.camera2.params.RecommendedStreamConfiguration[]> SCALER_AVAILABLE_RECOMMENDED_STREAM_CONFIGURATIONS =
@@ -2607,7 +2654,7 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri
* If set, the information will be available in the ZERO_SHUTTER_LAG recommended stream
* configuration see
* {@link android.hardware.camera2.CameraCharacteristics#getRecommendedStreamConfigurationMap }.</p>
- * <p><b>Optional</b> - This value may be {@code null} on some devices.</p>
+ * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p>
* @hide
*/
public static final Key<android.hardware.camera2.params.ReprocessFormatsMap> SCALER_AVAILABLE_RECOMMENDED_INPUT_OUTPUT_FORMATS_MAP =
@@ -2634,7 +2681,7 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri
* physical camera not independently exposed in
* {@link android.hardware.camera2.CameraManager#getCameraIdList } or is not backward
* compatible.</p>
- * <p><b>Optional</b> - This value may be {@code null} on some devices.</p>
+ * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p>
* <p><b>Limited capability</b> -
* Present on all camera devices that report being at least {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL_LIMITED HARDWARE_LEVEL_LIMITED} devices in the
* {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL android.info.supportedHardwareLevel} key</p>
@@ -2642,6 +2689,7 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri
* @see CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL
*/
@PublicKey
+ @NonNull
@SyntheticKey
public static final Key<android.hardware.camera2.params.MandatoryStreamCombination[]> SCALER_MANDATORY_STREAM_COMBINATIONS =
new Key<android.hardware.camera2.params.MandatoryStreamCombination[]>("android.scaler.mandatoryStreamCombinations", android.hardware.camera2.params.MandatoryStreamCombination[].class);
@@ -2681,6 +2729,7 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri
* @see CameraCharacteristics#SENSOR_INFO_PRE_CORRECTION_ACTIVE_ARRAY_SIZE
*/
@PublicKey
+ @NonNull
public static final Key<android.graphics.Rect> SENSOR_INFO_ACTIVE_ARRAY_SIZE =
new Key<android.graphics.Rect>("android.sensor.info.activeArraySize", android.graphics.Rect.class);
@@ -2691,7 +2740,7 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri
* as defined in ISO 12232:2006.</p>
* <p><b>Range of valid values:</b><br>
* Min &lt;= 100, Max &gt;= 800</p>
- * <p><b>Optional</b> - This value may be {@code null} on some devices.</p>
+ * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p>
* <p><b>Full capability</b> -
* Present on all camera devices that report being {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL_FULL HARDWARE_LEVEL_FULL} devices in the
* {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL android.info.supportedHardwareLevel} key</p>
@@ -2700,6 +2749,7 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri
* @see CaptureRequest#SENSOR_SENSITIVITY
*/
@PublicKey
+ @NonNull
public static final Key<android.util.Range<Integer>> SENSOR_INFO_SENSITIVITY_RANGE =
new Key<android.util.Range<Integer>>("android.sensor.info.sensitivityRange", new TypeReference<android.util.Range<Integer>>() {{ }});
@@ -2718,7 +2768,7 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri
* <li>{@link #SENSOR_INFO_COLOR_FILTER_ARRANGEMENT_MONO MONO}</li>
* <li>{@link #SENSOR_INFO_COLOR_FILTER_ARRANGEMENT_NIR NIR}</li>
* </ul></p>
- * <p><b>Optional</b> - This value may be {@code null} on some devices.</p>
+ * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p>
* <p><b>Full capability</b> -
* Present on all camera devices that report being {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL_FULL HARDWARE_LEVEL_FULL} devices in the
* {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL android.info.supportedHardwareLevel} key</p>
@@ -2733,6 +2783,7 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri
* @see #SENSOR_INFO_COLOR_FILTER_ARRANGEMENT_NIR
*/
@PublicKey
+ @NonNull
public static final Key<Integer> SENSOR_INFO_COLOR_FILTER_ARRANGEMENT =
new Key<Integer>("android.sensor.info.colorFilterArrangement", int.class);
@@ -2744,7 +2795,7 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri
* The minimum exposure time will be less than 100 us. For FULL
* capability devices ({@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL android.info.supportedHardwareLevel} == FULL),
* the maximum exposure time will be greater than 100ms.</p>
- * <p><b>Optional</b> - This value may be {@code null} on some devices.</p>
+ * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p>
* <p><b>Full capability</b> -
* Present on all camera devices that report being {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL_FULL HARDWARE_LEVEL_FULL} devices in the
* {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL android.info.supportedHardwareLevel} key</p>
@@ -2753,6 +2804,7 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri
* @see CaptureRequest#SENSOR_EXPOSURE_TIME
*/
@PublicKey
+ @NonNull
public static final Key<android.util.Range<Long>> SENSOR_INFO_EXPOSURE_TIME_RANGE =
new Key<android.util.Range<Long>>("android.sensor.info.exposureTimeRange", new TypeReference<android.util.Range<Long>>() {{ }});
@@ -2768,7 +2820,7 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri
* <p><b>Range of valid values:</b><br>
* For FULL capability devices
* ({@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL android.info.supportedHardwareLevel} == FULL), at least 100ms.</p>
- * <p><b>Optional</b> - This value may be {@code null} on some devices.</p>
+ * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p>
* <p><b>Full capability</b> -
* Present on all camera devices that report being {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL_FULL HARDWARE_LEVEL_FULL} devices in the
* {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL android.info.supportedHardwareLevel} key</p>
@@ -2777,6 +2829,7 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri
* @see CaptureRequest#SENSOR_FRAME_DURATION
*/
@PublicKey
+ @NonNull
public static final Key<Long> SENSOR_INFO_MAX_FRAME_DURATION =
new Key<Long>("android.sensor.info.maxFrameDuration", long.class);
@@ -2791,6 +2844,7 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri
* @see CameraCharacteristics#SENSOR_INFO_PIXEL_ARRAY_SIZE
*/
@PublicKey
+ @NonNull
public static final Key<android.util.SizeF> SENSOR_INFO_PHYSICAL_SIZE =
new Key<android.util.SizeF>("android.sensor.info.physicalSize", android.util.SizeF.class);
@@ -2816,6 +2870,7 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri
* @see CameraCharacteristics#SENSOR_INFO_PRE_CORRECTION_ACTIVE_ARRAY_SIZE
*/
@PublicKey
+ @NonNull
public static final Key<android.util.Size> SENSOR_INFO_PIXEL_ARRAY_SIZE =
new Key<android.util.Size>("android.sensor.info.pixelArraySize", android.util.Size.class);
@@ -2837,13 +2892,14 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri
* by the camera device, which provides more accurate white level values.</p>
* <p><b>Range of valid values:</b><br>
* &gt; 255 (8-bit output)</p>
- * <p><b>Optional</b> - This value may be {@code null} on some devices.</p>
+ * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p>
*
* @see CameraCharacteristics#SENSOR_BLACK_LEVEL_PATTERN
* @see CaptureResult#SENSOR_DYNAMIC_WHITE_LEVEL
* @see CaptureRequest#SENSOR_SENSITIVITY
*/
@PublicKey
+ @NonNull
public static final Key<Integer> SENSOR_INFO_WHITE_LEVEL =
new Key<Integer>("android.sensor.info.whiteLevel", int.class);
@@ -2863,6 +2919,7 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri
* @see #SENSOR_INFO_TIMESTAMP_SOURCE_REALTIME
*/
@PublicKey
+ @NonNull
public static final Key<Integer> SENSOR_INFO_TIMESTAMP_SOURCE =
new Key<Integer>("android.sensor.info.timestampSource", int.class);
@@ -2875,11 +2932,12 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri
* See {@link CameraCharacteristics#REQUEST_MAX_NUM_OUTPUT_RAW android.request.maxNumOutputRaw} for a list of RAW image formats.</p>
* <p>This key will be <code>null</code> for all devices do not report this information.
* Devices with RAW capability will always report this information in this key.</p>
- * <p><b>Optional</b> - This value may be {@code null} on some devices.</p>
+ * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p>
*
* @see CameraCharacteristics#REQUEST_MAX_NUM_OUTPUT_RAW
*/
@PublicKey
+ @NonNull
public static final Key<Boolean> SENSOR_INFO_LENS_SHADING_APPLIED =
new Key<Boolean>("android.sensor.info.lensShadingApplied", boolean.class);
@@ -2945,6 +3003,7 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri
* @see CameraCharacteristics#SENSOR_INFO_PRE_CORRECTION_ACTIVE_ARRAY_SIZE
*/
@PublicKey
+ @NonNull
public static final Key<android.graphics.Rect> SENSOR_INFO_PRE_CORRECTION_ACTIVE_ARRAY_SIZE =
new Key<android.graphics.Rect>("android.sensor.info.preCorrectionActiveArraySize", android.graphics.Rect.class);
@@ -2986,7 +3045,7 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri
* <li>{@link #SENSOR_REFERENCE_ILLUMINANT1_D50 D50}</li>
* <li>{@link #SENSOR_REFERENCE_ILLUMINANT1_ISO_STUDIO_TUNGSTEN ISO_STUDIO_TUNGSTEN}</li>
* </ul></p>
- * <p><b>Optional</b> - This value may be {@code null} on some devices.</p>
+ * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p>
* <p><b>Permission {@link android.Manifest.permission#CAMERA } is needed to access this property</b></p>
*
* @see CameraCharacteristics#SENSOR_CALIBRATION_TRANSFORM1
@@ -3014,6 +3073,7 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri
* @see #SENSOR_REFERENCE_ILLUMINANT1_ISO_STUDIO_TUNGSTEN
*/
@PublicKey
+ @NonNull
public static final Key<Integer> SENSOR_REFERENCE_ILLUMINANT1 =
new Key<Integer>("android.sensor.referenceIlluminant1", int.class);
@@ -3030,7 +3090,7 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri
* the camera device has RAW capability.</p>
* <p><b>Range of valid values:</b><br>
* Any value listed in {@link CameraCharacteristics#SENSOR_REFERENCE_ILLUMINANT1 android.sensor.referenceIlluminant1}</p>
- * <p><b>Optional</b> - This value may be {@code null} on some devices.</p>
+ * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p>
* <p><b>Permission {@link android.Manifest.permission#CAMERA } is needed to access this property</b></p>
*
* @see CameraCharacteristics#SENSOR_CALIBRATION_TRANSFORM2
@@ -3039,6 +3099,7 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri
* @see CameraCharacteristics#SENSOR_REFERENCE_ILLUMINANT1
*/
@PublicKey
+ @NonNull
public static final Key<Byte> SENSOR_REFERENCE_ILLUMINANT2 =
new Key<Byte>("android.sensor.referenceIlluminant2", byte.class);
@@ -3055,12 +3116,13 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri
* ({@link CameraCharacteristics#SENSOR_REFERENCE_ILLUMINANT1 android.sensor.referenceIlluminant1}).</p>
* <p>Starting from Android Q, this key will not be present for a MONOCHROME camera, even if
* the camera device has RAW capability.</p>
- * <p><b>Optional</b> - This value may be {@code null} on some devices.</p>
+ * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p>
* <p><b>Permission {@link android.Manifest.permission#CAMERA } is needed to access this property</b></p>
*
* @see CameraCharacteristics#SENSOR_REFERENCE_ILLUMINANT1
*/
@PublicKey
+ @NonNull
public static final Key<android.hardware.camera2.params.ColorSpaceTransform> SENSOR_CALIBRATION_TRANSFORM1 =
new Key<android.hardware.camera2.params.ColorSpaceTransform>("android.sensor.calibrationTransform1", android.hardware.camera2.params.ColorSpaceTransform.class);
@@ -3080,12 +3142,13 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri
* illuminant is present.</p>
* <p>Starting from Android Q, this key will not be present for a MONOCHROME camera, even if
* the camera device has RAW capability.</p>
- * <p><b>Optional</b> - This value may be {@code null} on some devices.</p>
+ * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p>
* <p><b>Permission {@link android.Manifest.permission#CAMERA } is needed to access this property</b></p>
*
* @see CameraCharacteristics#SENSOR_REFERENCE_ILLUMINANT2
*/
@PublicKey
+ @NonNull
public static final Key<android.hardware.camera2.params.ColorSpaceTransform> SENSOR_CALIBRATION_TRANSFORM2 =
new Key<android.hardware.camera2.params.ColorSpaceTransform>("android.sensor.calibrationTransform2", android.hardware.camera2.params.ColorSpaceTransform.class);
@@ -3106,12 +3169,13 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri
* (i.e. no chromatic adaptation will be applied by this transform).</p>
* <p>Starting from Android Q, this key will not be present for a MONOCHROME camera, even if
* the camera device has RAW capability.</p>
- * <p><b>Optional</b> - This value may be {@code null} on some devices.</p>
+ * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p>
* <p><b>Permission {@link android.Manifest.permission#CAMERA } is needed to access this property</b></p>
*
* @see CameraCharacteristics#SENSOR_REFERENCE_ILLUMINANT1
*/
@PublicKey
+ @NonNull
public static final Key<android.hardware.camera2.params.ColorSpaceTransform> SENSOR_COLOR_TRANSFORM1 =
new Key<android.hardware.camera2.params.ColorSpaceTransform>("android.sensor.colorTransform1", android.hardware.camera2.params.ColorSpaceTransform.class);
@@ -3134,12 +3198,13 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri
* illuminant is present.</p>
* <p>Starting from Android Q, this key will not be present for a MONOCHROME camera, even if
* the camera device has RAW capability.</p>
- * <p><b>Optional</b> - This value may be {@code null} on some devices.</p>
+ * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p>
* <p><b>Permission {@link android.Manifest.permission#CAMERA } is needed to access this property</b></p>
*
* @see CameraCharacteristics#SENSOR_REFERENCE_ILLUMINANT2
*/
@PublicKey
+ @NonNull
public static final Key<android.hardware.camera2.params.ColorSpaceTransform> SENSOR_COLOR_TRANSFORM2 =
new Key<android.hardware.camera2.params.ColorSpaceTransform>("android.sensor.colorTransform2", android.hardware.camera2.params.ColorSpaceTransform.class);
@@ -3158,12 +3223,13 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri
* CIE XYZ colorspace.</p>
* <p>Starting from Android Q, this key will not be present for a MONOCHROME camera, even if
* the camera device has RAW capability.</p>
- * <p><b>Optional</b> - This value may be {@code null} on some devices.</p>
+ * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p>
* <p><b>Permission {@link android.Manifest.permission#CAMERA } is needed to access this property</b></p>
*
* @see CameraCharacteristics#SENSOR_REFERENCE_ILLUMINANT1
*/
@PublicKey
+ @NonNull
public static final Key<android.hardware.camera2.params.ColorSpaceTransform> SENSOR_FORWARD_MATRIX1 =
new Key<android.hardware.camera2.params.ColorSpaceTransform>("android.sensor.forwardMatrix1", android.hardware.camera2.params.ColorSpaceTransform.class);
@@ -3184,12 +3250,13 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri
* illuminant is present.</p>
* <p>Starting from Android Q, this key will not be present for a MONOCHROME camera, even if
* the camera device has RAW capability.</p>
- * <p><b>Optional</b> - This value may be {@code null} on some devices.</p>
+ * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p>
* <p><b>Permission {@link android.Manifest.permission#CAMERA } is needed to access this property</b></p>
*
* @see CameraCharacteristics#SENSOR_REFERENCE_ILLUMINANT2
*/
@PublicKey
+ @NonNull
public static final Key<android.hardware.camera2.params.ColorSpaceTransform> SENSOR_FORWARD_MATRIX2 =
new Key<android.hardware.camera2.params.ColorSpaceTransform>("android.sensor.forwardMatrix2", android.hardware.camera2.params.ColorSpaceTransform.class);
@@ -3215,7 +3282,7 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri
* <p>For a MONOCHROME camera device, all of the 2x2 channels must have the same values.</p>
* <p><b>Range of valid values:</b><br>
* &gt;= 0 for each.</p>
- * <p><b>Optional</b> - This value may be {@code null} on some devices.</p>
+ * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p>
*
* @see CaptureResult#SENSOR_DYNAMIC_BLACK_LEVEL
* @see CameraCharacteristics#SENSOR_INFO_COLOR_FILTER_ARRANGEMENT
@@ -3224,6 +3291,7 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri
* @see CaptureRequest#SENSOR_SENSITIVITY
*/
@PublicKey
+ @NonNull
public static final Key<android.hardware.camera2.params.BlackLevelPattern> SENSOR_BLACK_LEVEL_PATTERN =
new Key<android.hardware.camera2.params.BlackLevelPattern>("android.sensor.blackLevelPattern", android.hardware.camera2.params.BlackLevelPattern.class);
@@ -3234,7 +3302,7 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri
* equal to this, all applied gain must be analog. For
* values above this, the gain applied can be a mix of analog and
* digital.</p>
- * <p><b>Optional</b> - This value may be {@code null} on some devices.</p>
+ * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p>
* <p><b>Full capability</b> -
* Present on all camera devices that report being {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL_FULL HARDWARE_LEVEL_FULL} devices in the
* {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL android.info.supportedHardwareLevel} key</p>
@@ -3243,6 +3311,7 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri
* @see CaptureRequest#SENSOR_SENSITIVITY
*/
@PublicKey
+ @NonNull
public static final Key<Integer> SENSOR_MAX_ANALOG_SENSITIVITY =
new Key<Integer>("android.sensor.maxAnalogSensitivity", int.class);
@@ -3258,6 +3327,7 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri
* <p>This key is available on all devices.</p>
*/
@PublicKey
+ @NonNull
public static final Key<Integer> SENSOR_ORIENTATION =
new Key<Integer>("android.sensor.orientation", int.class);
@@ -3267,11 +3337,12 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri
* <p>Defaults to OFF, and always includes OFF if defined.</p>
* <p><b>Range of valid values:</b><br>
* Any value listed in {@link CaptureRequest#SENSOR_TEST_PATTERN_MODE android.sensor.testPatternMode}</p>
- * <p><b>Optional</b> - This value may be {@code null} on some devices.</p>
+ * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p>
*
* @see CaptureRequest#SENSOR_TEST_PATTERN_MODE
*/
@PublicKey
+ @NonNull
public static final Key<int[]> SENSOR_AVAILABLE_TEST_PATTERN_MODES =
new Key<int[]>("android.sensor.availableTestPatternModes", int[].class);
@@ -3291,13 +3362,14 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri
* black level of each captured raw images.</p>
* <p>When this key is reported, the {@link CaptureResult#SENSOR_DYNAMIC_BLACK_LEVEL android.sensor.dynamicBlackLevel} and
* {@link CaptureResult#SENSOR_DYNAMIC_WHITE_LEVEL android.sensor.dynamicWhiteLevel} will also be reported.</p>
- * <p><b>Optional</b> - This value may be {@code null} on some devices.</p>
+ * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p>
*
* @see CameraCharacteristics#SENSOR_BLACK_LEVEL_PATTERN
* @see CaptureResult#SENSOR_DYNAMIC_BLACK_LEVEL
* @see CaptureResult#SENSOR_DYNAMIC_WHITE_LEVEL
*/
@PublicKey
+ @NonNull
public static final Key<android.graphics.Rect[]> SENSOR_OPTICAL_BLACK_REGIONS =
new Key<android.graphics.Rect[]>("android.sensor.opticalBlackRegions", android.graphics.Rect[].class);
@@ -3314,6 +3386,7 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri
* @see CaptureRequest#SHADING_MODE
*/
@PublicKey
+ @NonNull
public static final Key<int[]> SHADING_AVAILABLE_MODES =
new Key<int[]>("android.shading.availableModes", int[].class);
@@ -3328,6 +3401,7 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri
* @see CaptureRequest#STATISTICS_FACE_DETECT_MODE
*/
@PublicKey
+ @NonNull
public static final Key<int[]> STATISTICS_INFO_AVAILABLE_FACE_DETECT_MODES =
new Key<int[]>("android.statistics.info.availableFaceDetectModes", int[].class);
@@ -3341,6 +3415,7 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri
* <p>This key is available on all devices.</p>
*/
@PublicKey
+ @NonNull
public static final Key<Integer> STATISTICS_INFO_MAX_FACE_COUNT =
new Key<Integer>("android.statistics.info.maxFaceCount", int.class);
@@ -3352,11 +3427,12 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri
* <p>ON is always supported on devices with the RAW capability.</p>
* <p><b>Range of valid values:</b><br>
* Any value listed in {@link CaptureRequest#STATISTICS_HOT_PIXEL_MAP_MODE android.statistics.hotPixelMapMode}</p>
- * <p><b>Optional</b> - This value may be {@code null} on some devices.</p>
+ * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p>
*
* @see CaptureRequest#STATISTICS_HOT_PIXEL_MAP_MODE
*/
@PublicKey
+ @NonNull
public static final Key<boolean[]> STATISTICS_INFO_AVAILABLE_HOT_PIXEL_MAP_MODES =
new Key<boolean[]>("android.statistics.info.availableHotPixelMapModes", boolean[].class);
@@ -3369,11 +3445,12 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri
* LEGACY mode devices will always only support OFF.</p>
* <p><b>Range of valid values:</b><br>
* Any value listed in {@link CaptureRequest#STATISTICS_LENS_SHADING_MAP_MODE android.statistics.lensShadingMapMode}</p>
- * <p><b>Optional</b> - This value may be {@code null} on some devices.</p>
+ * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p>
*
* @see CaptureRequest#STATISTICS_LENS_SHADING_MAP_MODE
*/
@PublicKey
+ @NonNull
public static final Key<int[]> STATISTICS_INFO_AVAILABLE_LENS_SHADING_MAP_MODES =
new Key<int[]>("android.statistics.info.availableLensShadingMapModes", int[].class);
@@ -3384,11 +3461,12 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri
* contain only OFF.</p>
* <p><b>Range of valid values:</b><br>
* Any value listed in {@link CaptureRequest#STATISTICS_OIS_DATA_MODE android.statistics.oisDataMode}</p>
- * <p><b>Optional</b> - This value may be {@code null} on some devices.</p>
+ * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p>
*
* @see CaptureRequest#STATISTICS_OIS_DATA_MODE
*/
@PublicKey
+ @NonNull
public static final Key<int[]> STATISTICS_INFO_AVAILABLE_OIS_DATA_MODES =
new Key<int[]>("android.statistics.info.availableOisDataModes", int[].class);
@@ -3401,7 +3479,7 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri
* <p>The output curves in the result metadata may have a different number
* of points than the input curves, and will represent the actual
* hardware curves used as closely as possible when linearly interpolated.</p>
- * <p><b>Optional</b> - This value may be {@code null} on some devices.</p>
+ * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p>
* <p><b>Full capability</b> -
* Present on all camera devices that report being {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL_FULL HARDWARE_LEVEL_FULL} devices in the
* {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL android.info.supportedHardwareLevel} key</p>
@@ -3410,6 +3488,7 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri
* @see CaptureRequest#TONEMAP_CURVE
*/
@PublicKey
+ @NonNull
public static final Key<Integer> TONEMAP_MAX_CURVE_POINTS =
new Key<Integer>("android.tonemap.maxCurvePoints", int.class);
@@ -3425,7 +3504,7 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri
* <p>This includes all FULL level devices.</p>
* <p><b>Range of valid values:</b><br>
* Any value listed in {@link CaptureRequest#TONEMAP_MODE android.tonemap.mode}</p>
- * <p><b>Optional</b> - This value may be {@code null} on some devices.</p>
+ * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p>
* <p><b>Full capability</b> -
* Present on all camera devices that report being {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL_FULL HARDWARE_LEVEL_FULL} devices in the
* {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL android.info.supportedHardwareLevel} key</p>
@@ -3434,6 +3513,7 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri
* @see CaptureRequest#TONEMAP_MODE
*/
@PublicKey
+ @NonNull
public static final Key<int[]> TONEMAP_AVAILABLE_TONE_MAP_MODES =
new Key<int[]>("android.tonemap.availableToneMapModes", int[].class);
@@ -3443,7 +3523,7 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri
* <ul>
* <li>{@link #LED_AVAILABLE_LEDS_TRANSMIT TRANSMIT}</li>
* </ul></p>
- * <p><b>Optional</b> - This value may be {@code null} on some devices.</p>
+ * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p>
* @see #LED_AVAILABLE_LEDS_TRANSMIT
* @hide
*/
@@ -3534,6 +3614,7 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri
* @see #INFO_SUPPORTED_HARDWARE_LEVEL_EXTERNAL
*/
@PublicKey
+ @NonNull
public static final Key<Integer> INFO_SUPPORTED_HARDWARE_LEVEL =
new Key<Integer>("android.info.supportedHardwareLevel", int.class);
@@ -3543,9 +3624,10 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri
* <p>This can be used in {@link android.media.ExifInterface#TAG_IMAGE_DESCRIPTION TAG_IMAGE_DESCRIPTION}
* in jpeg EXIF. This key may be absent if no version information is available on the
* device.</p>
- * <p><b>Optional</b> - This value may be {@code null} on some devices.</p>
+ * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p>
*/
@PublicKey
+ @NonNull
public static final Key<String> INFO_VERSION =
new Key<String>("android.info.version", String.class);
@@ -3572,6 +3654,7 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri
* @see #SYNC_MAX_LATENCY_UNKNOWN
*/
@PublicKey
+ @NonNull
public static final Key<Integer> SYNC_MAX_LATENCY =
new Key<Integer>("android.sync.maxLatency", int.class);
@@ -3598,7 +3681,7 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri
* <p><b>Units</b>: Number of frames.</p>
* <p><b>Range of valid values:</b><br>
* &lt;= 4</p>
- * <p><b>Optional</b> - This value may be {@code null} on some devices.</p>
+ * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p>
* <p><b>Limited capability</b> -
* Present on all camera devices that report being at least {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL_LIMITED HARDWARE_LEVEL_LIMITED} devices in the
* {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL android.info.supportedHardwareLevel} key</p>
@@ -3607,6 +3690,7 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri
* @see CameraCharacteristics#REQUEST_AVAILABLE_CAPABILITIES
*/
@PublicKey
+ @NonNull
public static final Key<Integer> REPROCESS_MAX_CAPTURE_STALL =
new Key<Integer>("android.reprocess.maxCaptureStall", int.class);
@@ -3625,7 +3709,7 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri
* the format in this list as <code>(HAL_PIXEL_FORMAT_BLOB,
* android.depth.maxDepthSamples, 1, OUTPUT)</code> in addition to
* the entries for HAL_PIXEL_FORMAT_Y16.</p>
- * <p><b>Optional</b> - This value may be {@code null} on some devices.</p>
+ * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p>
* <p><b>Limited capability</b> -
* Present on all camera devices that report being at least {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL_LIMITED HARDWARE_LEVEL_LIMITED} devices in the
* {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL android.info.supportedHardwareLevel} key</p>
@@ -3650,7 +3734,7 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri
* android.scaler.availableStallDurations for more details about
* calculating the max frame rate.</p>
* <p><b>Units</b>: (format, width, height, ns) x n</p>
- * <p><b>Optional</b> - This value may be {@code null} on some devices.</p>
+ * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p>
* <p><b>Limited capability</b> -
* Present on all camera devices that report being at least {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL_LIMITED HARDWARE_LEVEL_LIMITED} devices in the
* {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL android.info.supportedHardwareLevel} key</p>
@@ -3674,7 +3758,7 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri
* <p>All depth output stream formats may have a nonzero stall
* duration.</p>
* <p><b>Units</b>: (format, width, height, ns) x n</p>
- * <p><b>Optional</b> - This value may be {@code null} on some devices.</p>
+ * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p>
* <p><b>Limited capability</b> -
* Present on all camera devices that report being at least {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL_LIMITED HARDWARE_LEVEL_LIMITED} devices in the
* {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL android.info.supportedHardwareLevel} key</p>
@@ -3697,7 +3781,7 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri
* need to emit a specific pattern or wavelength of light to
* measure depth values, which causes the color image to be
* corrupted during depth measurement.</p>
- * <p><b>Optional</b> - This value may be {@code null} on some devices.</p>
+ * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p>
* <p><b>Limited capability</b> -
* Present on all camera devices that report being at least {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL_LIMITED HARDWARE_LEVEL_LIMITED} devices in the
* {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL android.info.supportedHardwareLevel} key</p>
@@ -3705,6 +3789,7 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri
* @see CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL
*/
@PublicKey
+ @NonNull
public static final Key<Boolean> DEPTH_DEPTH_IS_EXCLUSIVE =
new Key<Boolean>("android.depth.depthIsExclusive", boolean.class);
@@ -3717,7 +3802,7 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri
* power and performance efficient for specific use cases. For more information about
* retrieving the suggestions see
* {@link android.hardware.camera2.CameraCharacteristics#getRecommendedStreamConfigurationMap }.</p>
- * <p><b>Optional</b> - This value may be {@code null} on some devices.</p>
+ * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p>
* @hide
*/
public static final Key<android.hardware.camera2.params.RecommendedStreamConfiguration[]> DEPTH_AVAILABLE_RECOMMENDED_DEPTH_STREAM_CONFIGURATIONS =
@@ -3736,7 +3821,7 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri
* the same aspect ratio can have dynamic depth dataspace
* stream configuration. {@link CameraCharacteristics#DEPTH_DEPTH_IS_EXCLUSIVE android.depth.depthIsExclusive} also
* needs to be set to FALSE.</p>
- * <p><b>Optional</b> - This value may be {@code null} on some devices.</p>
+ * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p>
*
* @see CameraCharacteristics#DEPTH_DEPTH_IS_EXCLUSIVE
* @hide
@@ -3755,7 +3840,7 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri
* <p>The minimum frame duration of a stream (of a particular format, size)
* is the same regardless of whether the stream is input or output.</p>
* <p><b>Units</b>: (format, width, height, ns) x n</p>
- * <p><b>Optional</b> - This value may be {@code null} on some devices.</p>
+ * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p>
* @hide
*/
public static final Key<android.hardware.camera2.params.StreamConfigurationDuration[]> DEPTH_AVAILABLE_DYNAMIC_DEPTH_MIN_FRAME_DURATIONS =
@@ -3770,7 +3855,7 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri
* <p>All dynamic depth output streams may have a nonzero stall
* duration.</p>
* <p><b>Units</b>: (format, width, height, ns) x n</p>
- * <p><b>Optional</b> - This value may be {@code null} on some devices.</p>
+ * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p>
* @hide
*/
public static final Key<android.hardware.camera2.params.StreamConfigurationDuration[]> DEPTH_AVAILABLE_DYNAMIC_DEPTH_STALL_DURATIONS =
@@ -3785,7 +3870,7 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri
* value of this tag will be ['2', '\0', '3', '\0'].</p>
* <p>The number of physical camera IDs must be no less than 2.</p>
* <p><b>Units</b>: UTF-8 null-terminated string</p>
- * <p><b>Optional</b> - This value may be {@code null} on some devices.</p>
+ * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p>
* <p><b>Limited capability</b> -
* Present on all camera devices that report being at least {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL_LIMITED HARDWARE_LEVEL_LIMITED} devices in the
* {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL android.info.supportedHardwareLevel} key</p>
@@ -3811,7 +3896,7 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri
* <li>{@link #LOGICAL_MULTI_CAMERA_SENSOR_SYNC_TYPE_APPROXIMATE APPROXIMATE}</li>
* <li>{@link #LOGICAL_MULTI_CAMERA_SENSOR_SYNC_TYPE_CALIBRATED CALIBRATED}</li>
* </ul></p>
- * <p><b>Optional</b> - This value may be {@code null} on some devices.</p>
+ * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p>
* <p><b>Limited capability</b> -
* Present on all camera devices that report being at least {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL_LIMITED HARDWARE_LEVEL_LIMITED} devices in the
* {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL android.info.supportedHardwareLevel} key</p>
@@ -3821,6 +3906,7 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri
* @see #LOGICAL_MULTI_CAMERA_SENSOR_SYNC_TYPE_CALIBRATED
*/
@PublicKey
+ @NonNull
public static final Key<Integer> LOGICAL_MULTI_CAMERA_SENSOR_SYNC_TYPE =
new Key<Integer>("android.logicalMultiCamera.sensorSyncType", int.class);
@@ -3831,11 +3917,12 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri
* All devices that support this API will list both FAST and HIGH_QUALITY.</p>
* <p><b>Range of valid values:</b><br>
* Any value listed in {@link CaptureRequest#DISTORTION_CORRECTION_MODE android.distortionCorrection.mode}</p>
- * <p><b>Optional</b> - This value may be {@code null} on some devices.</p>
+ * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p>
*
* @see CaptureRequest#DISTORTION_CORRECTION_MODE
*/
@PublicKey
+ @NonNull
public static final Key<int[]> DISTORTION_CORRECTION_AVAILABLE_MODES =
new Key<int[]>("android.distortionCorrection.availableModes", int[].class);
@@ -3849,7 +3936,7 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri
* image format as required by the device's hardware level and capabilities.</p>
* <p>All the static, control, and dynamic metadata tags related to JPEG apply to HEIC formats.
* Configuring JPEG and HEIC streams at the same time is not supported.</p>
- * <p><b>Optional</b> - This value may be {@code null} on some devices.</p>
+ * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p>
* <p><b>Limited capability</b> -
* Present on all camera devices that report being at least {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL_LIMITED HARDWARE_LEVEL_LIMITED} devices in the
* {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL android.info.supportedHardwareLevel} key</p>
@@ -3872,7 +3959,7 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri
* android.scaler.availableStallDurations for more details about
* calculating the max frame rate.</p>
* <p><b>Units</b>: (format, width, height, ns) x n</p>
- * <p><b>Optional</b> - This value may be {@code null} on some devices.</p>
+ * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p>
* <p><b>Limited capability</b> -
* Present on all camera devices that report being at least {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL_LIMITED HARDWARE_LEVEL_LIMITED} devices in the
* {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL android.info.supportedHardwareLevel} key</p>
@@ -3896,7 +3983,7 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri
* <p>All HEIC output stream formats may have a nonzero stall
* duration.</p>
* <p><b>Units</b>: (format, width, height, ns) x n</p>
- * <p><b>Optional</b> - This value may be {@code null} on some devices.</p>
+ * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p>
* <p><b>Limited capability</b> -
* Present on all camera devices that report being at least {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL_LIMITED HARDWARE_LEVEL_LIMITED} devices in the
* {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL android.info.supportedHardwareLevel} key</p>
@@ -3913,4 +4000,7 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri
+
+
+
}
diff --git a/core/java/android/hardware/camera2/CaptureRequest.java b/core/java/android/hardware/camera2/CaptureRequest.java
index 525070103c2c..792ec256b7a3 100644
--- a/core/java/android/hardware/camera2/CaptureRequest.java
+++ b/core/java/android/hardware/camera2/CaptureRequest.java
@@ -978,7 +978,7 @@ public final class CaptureRequest extends CameraMetadata<CaptureRequest.Key<?>>
* <li>{@link #COLOR_CORRECTION_MODE_FAST FAST}</li>
* <li>{@link #COLOR_CORRECTION_MODE_HIGH_QUALITY HIGH_QUALITY}</li>
* </ul></p>
- * <p><b>Optional</b> - This value may be {@code null} on some devices.</p>
+ * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p>
* <p><b>Full capability</b> -
* Present on all camera devices that report being {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL_FULL HARDWARE_LEVEL_FULL} devices in the
* {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL android.info.supportedHardwareLevel} key</p>
@@ -992,6 +992,7 @@ public final class CaptureRequest extends CameraMetadata<CaptureRequest.Key<?>>
* @see #COLOR_CORRECTION_MODE_HIGH_QUALITY
*/
@PublicKey
+ @NonNull
public static final Key<Integer> COLOR_CORRECTION_MODE =
new Key<Integer>("android.colorCorrection.mode", int.class);
@@ -1010,7 +1011,7 @@ public final class CaptureRequest extends CameraMetadata<CaptureRequest.Key<?>>
* <p>The valid range of each matrix element varies on different devices, but
* values within [-1.5, 3.0] are guaranteed not to be clipped.</p>
* <p><b>Units</b>: Unitless scale factors</p>
- * <p><b>Optional</b> - This value may be {@code null} on some devices.</p>
+ * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p>
* <p><b>Full capability</b> -
* Present on all camera devices that report being {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL_FULL HARDWARE_LEVEL_FULL} devices in the
* {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL android.info.supportedHardwareLevel} key</p>
@@ -1019,6 +1020,7 @@ public final class CaptureRequest extends CameraMetadata<CaptureRequest.Key<?>>
* @see CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL
*/
@PublicKey
+ @NonNull
public static final Key<android.hardware.camera2.params.ColorSpaceTransform> COLOR_CORRECTION_TRANSFORM =
new Key<android.hardware.camera2.params.ColorSpaceTransform>("android.colorCorrection.transform", android.hardware.camera2.params.ColorSpaceTransform.class);
@@ -1037,7 +1039,7 @@ public final class CaptureRequest extends CameraMetadata<CaptureRequest.Key<?>>
* device allows gains below 1.0, this is usually not recommended because
* this can create color artifacts.</p>
* <p><b>Units</b>: Unitless gain factors</p>
- * <p><b>Optional</b> - This value may be {@code null} on some devices.</p>
+ * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p>
* <p><b>Full capability</b> -
* Present on all camera devices that report being {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL_FULL HARDWARE_LEVEL_FULL} devices in the
* {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL android.info.supportedHardwareLevel} key</p>
@@ -1046,6 +1048,7 @@ public final class CaptureRequest extends CameraMetadata<CaptureRequest.Key<?>>
* @see CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL
*/
@PublicKey
+ @NonNull
public static final Key<android.hardware.camera2.params.RggbChannelVector> COLOR_CORRECTION_GAINS =
new Key<android.hardware.camera2.params.RggbChannelVector>("android.colorCorrection.gains", android.hardware.camera2.params.RggbChannelVector.class);
@@ -1078,6 +1081,7 @@ public final class CaptureRequest extends CameraMetadata<CaptureRequest.Key<?>>
* @see #COLOR_CORRECTION_ABERRATION_MODE_HIGH_QUALITY
*/
@PublicKey
+ @NonNull
public static final Key<Integer> COLOR_CORRECTION_ABERRATION_MODE =
new Key<Integer>("android.colorCorrection.aberrationMode", int.class);
@@ -1134,6 +1138,7 @@ public final class CaptureRequest extends CameraMetadata<CaptureRequest.Key<?>>
* @see #CONTROL_AE_ANTIBANDING_MODE_AUTO
*/
@PublicKey
+ @NonNull
public static final Key<Integer> CONTROL_AE_ANTIBANDING_MODE =
new Key<Integer>("android.control.aeAntibandingMode", int.class);
@@ -1167,6 +1172,7 @@ public final class CaptureRequest extends CameraMetadata<CaptureRequest.Key<?>>
* @see CaptureResult#CONTROL_AE_STATE
*/
@PublicKey
+ @NonNull
public static final Key<Integer> CONTROL_AE_EXPOSURE_COMPENSATION =
new Key<Integer>("android.control.aeExposureCompensation", int.class);
@@ -1217,6 +1223,7 @@ public final class CaptureRequest extends CameraMetadata<CaptureRequest.Key<?>>
* @see CaptureRequest#SENSOR_SENSITIVITY
*/
@PublicKey
+ @NonNull
public static final Key<Boolean> CONTROL_AE_LOCK =
new Key<Boolean>("android.control.aeLock", boolean.class);
@@ -1269,6 +1276,7 @@ public final class CaptureRequest extends CameraMetadata<CaptureRequest.Key<?>>
* @see #CONTROL_AE_MODE_ON_EXTERNAL_FLASH
*/
@PublicKey
+ @NonNull
public static final Key<Integer> CONTROL_AE_MODE =
new Key<Integer>("android.control.aeMode", int.class);
@@ -1320,7 +1328,7 @@ public final class CaptureRequest extends CameraMetadata<CaptureRequest.Key<?>>
* Coordinates must be between <code>[(0,0), (width, height))</code> of
* {@link CameraCharacteristics#SENSOR_INFO_ACTIVE_ARRAY_SIZE android.sensor.info.activeArraySize} or {@link CameraCharacteristics#SENSOR_INFO_PRE_CORRECTION_ACTIVE_ARRAY_SIZE android.sensor.info.preCorrectionActiveArraySize}
* depending on distortion correction capability and mode</p>
- * <p><b>Optional</b> - This value may be {@code null} on some devices.</p>
+ * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p>
*
* @see CameraCharacteristics#CONTROL_MAX_REGIONS_AE
* @see CaptureRequest#DISTORTION_CORRECTION_MODE
@@ -1329,6 +1337,7 @@ public final class CaptureRequest extends CameraMetadata<CaptureRequest.Key<?>>
* @see CameraCharacteristics#SENSOR_INFO_PRE_CORRECTION_ACTIVE_ARRAY_SIZE
*/
@PublicKey
+ @NonNull
public static final Key<android.hardware.camera2.params.MeteringRectangle[]> CONTROL_AE_REGIONS =
new Key<android.hardware.camera2.params.MeteringRectangle[]>("android.control.aeRegions", android.hardware.camera2.params.MeteringRectangle[].class);
@@ -1349,6 +1358,7 @@ public final class CaptureRequest extends CameraMetadata<CaptureRequest.Key<?>>
* @see CaptureRequest#SENSOR_FRAME_DURATION
*/
@PublicKey
+ @NonNull
public static final Key<android.util.Range<Integer>> CONTROL_AE_TARGET_FPS_RANGE =
new Key<android.util.Range<Integer>>("android.control.aeTargetFpsRange", new TypeReference<android.util.Range<Integer>>() {{ }});
@@ -1407,7 +1417,7 @@ public final class CaptureRequest extends CameraMetadata<CaptureRequest.Key<?>>
* <li>{@link #CONTROL_AE_PRECAPTURE_TRIGGER_START START}</li>
* <li>{@link #CONTROL_AE_PRECAPTURE_TRIGGER_CANCEL CANCEL}</li>
* </ul></p>
- * <p><b>Optional</b> - This value may be {@code null} on some devices.</p>
+ * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p>
* <p><b>Limited capability</b> -
* Present on all camera devices that report being at least {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL_LIMITED HARDWARE_LEVEL_LIMITED} devices in the
* {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL android.info.supportedHardwareLevel} key</p>
@@ -1422,6 +1432,7 @@ public final class CaptureRequest extends CameraMetadata<CaptureRequest.Key<?>>
* @see #CONTROL_AE_PRECAPTURE_TRIGGER_CANCEL
*/
@PublicKey
+ @NonNull
public static final Key<Integer> CONTROL_AE_PRECAPTURE_TRIGGER =
new Key<Integer>("android.control.aePrecaptureTrigger", int.class);
@@ -1463,6 +1474,7 @@ public final class CaptureRequest extends CameraMetadata<CaptureRequest.Key<?>>
* @see #CONTROL_AF_MODE_EDOF
*/
@PublicKey
+ @NonNull
public static final Key<Integer> CONTROL_AF_MODE =
new Key<Integer>("android.control.afMode", int.class);
@@ -1515,7 +1527,7 @@ public final class CaptureRequest extends CameraMetadata<CaptureRequest.Key<?>>
* Coordinates must be between <code>[(0,0), (width, height))</code> of
* {@link CameraCharacteristics#SENSOR_INFO_ACTIVE_ARRAY_SIZE android.sensor.info.activeArraySize} or {@link CameraCharacteristics#SENSOR_INFO_PRE_CORRECTION_ACTIVE_ARRAY_SIZE android.sensor.info.preCorrectionActiveArraySize}
* depending on distortion correction capability and mode</p>
- * <p><b>Optional</b> - This value may be {@code null} on some devices.</p>
+ * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p>
*
* @see CameraCharacteristics#CONTROL_MAX_REGIONS_AF
* @see CaptureRequest#DISTORTION_CORRECTION_MODE
@@ -1524,6 +1536,7 @@ public final class CaptureRequest extends CameraMetadata<CaptureRequest.Key<?>>
* @see CameraCharacteristics#SENSOR_INFO_PRE_CORRECTION_ACTIVE_ARRAY_SIZE
*/
@PublicKey
+ @NonNull
public static final Key<android.hardware.camera2.params.MeteringRectangle[]> CONTROL_AF_REGIONS =
new Key<android.hardware.camera2.params.MeteringRectangle[]>("android.control.afRegions", android.hardware.camera2.params.MeteringRectangle[].class);
@@ -1561,6 +1574,7 @@ public final class CaptureRequest extends CameraMetadata<CaptureRequest.Key<?>>
* @see #CONTROL_AF_TRIGGER_CANCEL
*/
@PublicKey
+ @NonNull
public static final Key<Integer> CONTROL_AF_TRIGGER =
new Key<Integer>("android.control.afTrigger", int.class);
@@ -1591,6 +1605,7 @@ public final class CaptureRequest extends CameraMetadata<CaptureRequest.Key<?>>
* @see CaptureRequest#CONTROL_AWB_MODE
*/
@PublicKey
+ @NonNull
public static final Key<Boolean> CONTROL_AWB_LOCK =
new Key<Boolean>("android.control.awbLock", boolean.class);
@@ -1651,6 +1666,7 @@ public final class CaptureRequest extends CameraMetadata<CaptureRequest.Key<?>>
* @see #CONTROL_AWB_MODE_SHADE
*/
@PublicKey
+ @NonNull
public static final Key<Integer> CONTROL_AWB_MODE =
new Key<Integer>("android.control.awbMode", int.class);
@@ -1703,7 +1719,7 @@ public final class CaptureRequest extends CameraMetadata<CaptureRequest.Key<?>>
* Coordinates must be between <code>[(0,0), (width, height))</code> of
* {@link CameraCharacteristics#SENSOR_INFO_ACTIVE_ARRAY_SIZE android.sensor.info.activeArraySize} or {@link CameraCharacteristics#SENSOR_INFO_PRE_CORRECTION_ACTIVE_ARRAY_SIZE android.sensor.info.preCorrectionActiveArraySize}
* depending on distortion correction capability and mode</p>
- * <p><b>Optional</b> - This value may be {@code null} on some devices.</p>
+ * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p>
*
* @see CameraCharacteristics#CONTROL_MAX_REGIONS_AWB
* @see CaptureRequest#DISTORTION_CORRECTION_MODE
@@ -1712,6 +1728,7 @@ public final class CaptureRequest extends CameraMetadata<CaptureRequest.Key<?>>
* @see CameraCharacteristics#SENSOR_INFO_PRE_CORRECTION_ACTIVE_ARRAY_SIZE
*/
@PublicKey
+ @NonNull
public static final Key<android.hardware.camera2.params.MeteringRectangle[]> CONTROL_AWB_REGIONS =
new Key<android.hardware.camera2.params.MeteringRectangle[]>("android.control.awbRegions", android.hardware.camera2.params.MeteringRectangle[].class);
@@ -1754,6 +1771,7 @@ public final class CaptureRequest extends CameraMetadata<CaptureRequest.Key<?>>
* @see #CONTROL_CAPTURE_INTENT_MOTION_TRACKING
*/
@PublicKey
+ @NonNull
public static final Key<Integer> CONTROL_CAPTURE_INTENT =
new Key<Integer>("android.control.captureIntent", int.class);
@@ -1793,6 +1811,7 @@ public final class CaptureRequest extends CameraMetadata<CaptureRequest.Key<?>>
* @see #CONTROL_EFFECT_MODE_AQUA
*/
@PublicKey
+ @NonNull
public static final Key<Integer> CONTROL_EFFECT_MODE =
new Key<Integer>("android.control.effectMode", int.class);
@@ -1833,6 +1852,7 @@ public final class CaptureRequest extends CameraMetadata<CaptureRequest.Key<?>>
* @see #CONTROL_MODE_OFF_KEEP_STATE
*/
@PublicKey
+ @NonNull
public static final Key<Integer> CONTROL_MODE =
new Key<Integer>("android.control.mode", int.class);
@@ -1900,6 +1920,7 @@ public final class CaptureRequest extends CameraMetadata<CaptureRequest.Key<?>>
* @see #CONTROL_SCENE_MODE_HDR
*/
@PublicKey
+ @NonNull
public static final Key<Integer> CONTROL_SCENE_MODE =
new Key<Integer>("android.control.sceneMode", int.class);
@@ -1943,6 +1964,7 @@ public final class CaptureRequest extends CameraMetadata<CaptureRequest.Key<?>>
* @see #CONTROL_VIDEO_STABILIZATION_MODE_ON
*/
@PublicKey
+ @NonNull
public static final Key<Integer> CONTROL_VIDEO_STABILIZATION_MODE =
new Key<Integer>("android.control.videoStabilizationMode", int.class);
@@ -1969,7 +1991,7 @@ public final class CaptureRequest extends CameraMetadata<CaptureRequest.Key<?>>
* <p><b>Units</b>: ISO arithmetic units, the same as {@link CaptureRequest#SENSOR_SENSITIVITY android.sensor.sensitivity}</p>
* <p><b>Range of valid values:</b><br>
* {@link CameraCharacteristics#CONTROL_POST_RAW_SENSITIVITY_BOOST_RANGE android.control.postRawSensitivityBoostRange}</p>
- * <p><b>Optional</b> - This value may be {@code null} on some devices.</p>
+ * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p>
*
* @see CaptureRequest#CONTROL_AE_MODE
* @see CaptureRequest#CONTROL_MODE
@@ -1978,6 +2000,7 @@ public final class CaptureRequest extends CameraMetadata<CaptureRequest.Key<?>>
* @see CaptureRequest#SENSOR_SENSITIVITY
*/
@PublicKey
+ @NonNull
public static final Key<Integer> CONTROL_POST_RAW_SENSITIVITY_BOOST =
new Key<Integer>("android.control.postRawSensitivityBoost", int.class);
@@ -2005,12 +2028,13 @@ public final class CaptureRequest extends CameraMetadata<CaptureRequest.Key<?>>
* <p>For applications targeting SDK versions older than O, the value of enableZsl in all
* capture templates is always <code>false</code> if present.</p>
* <p>For application-operated ZSL, use CAMERA3_TEMPLATE_ZERO_SHUTTER_LAG template.</p>
- * <p><b>Optional</b> - This value may be {@code null} on some devices.</p>
+ * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p>
*
* @see CaptureRequest#CONTROL_CAPTURE_INTENT
* @see CaptureResult#SENSOR_TIMESTAMP
*/
@PublicKey
+ @NonNull
public static final Key<Boolean> CONTROL_ENABLE_ZSL =
new Key<Boolean>("android.control.enableZsl", boolean.class);
@@ -2045,7 +2069,7 @@ public final class CaptureRequest extends CameraMetadata<CaptureRequest.Key<?>>
* </ul></p>
* <p><b>Available values for this device:</b><br>
* {@link CameraCharacteristics#EDGE_AVAILABLE_EDGE_MODES android.edge.availableEdgeModes}</p>
- * <p><b>Optional</b> - This value may be {@code null} on some devices.</p>
+ * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p>
* <p><b>Full capability</b> -
* Present on all camera devices that report being {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL_FULL HARDWARE_LEVEL_FULL} devices in the
* {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL android.info.supportedHardwareLevel} key</p>
@@ -2059,6 +2083,7 @@ public final class CaptureRequest extends CameraMetadata<CaptureRequest.Key<?>>
* @see #EDGE_MODE_ZERO_SHUTTER_LAG
*/
@PublicKey
+ @NonNull
public static final Key<Integer> EDGE_MODE =
new Key<Integer>("android.edge.mode", int.class);
@@ -2094,6 +2119,7 @@ public final class CaptureRequest extends CameraMetadata<CaptureRequest.Key<?>>
* @see #FLASH_MODE_TORCH
*/
@PublicKey
+ @NonNull
public static final Key<Integer> FLASH_MODE =
new Key<Integer>("android.flash.mode", int.class);
@@ -2110,7 +2136,7 @@ public final class CaptureRequest extends CameraMetadata<CaptureRequest.Key<?>>
* </ul></p>
* <p><b>Available values for this device:</b><br>
* {@link CameraCharacteristics#HOT_PIXEL_AVAILABLE_HOT_PIXEL_MODES android.hotPixel.availableHotPixelModes}</p>
- * <p><b>Optional</b> - This value may be {@code null} on some devices.</p>
+ * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p>
*
* @see CameraCharacteristics#HOT_PIXEL_AVAILABLE_HOT_PIXEL_MODES
* @see #HOT_PIXEL_MODE_OFF
@@ -2118,6 +2144,7 @@ public final class CaptureRequest extends CameraMetadata<CaptureRequest.Key<?>>
* @see #HOT_PIXEL_MODE_HIGH_QUALITY
*/
@PublicKey
+ @NonNull
public static final Key<Integer> HOT_PIXEL_MODE =
new Key<Integer>("android.hotPixel.mode", int.class);
@@ -2130,6 +2157,7 @@ public final class CaptureRequest extends CameraMetadata<CaptureRequest.Key<?>>
* <p>This key is available on all devices.</p>
*/
@PublicKey
+ @NonNull
@SyntheticKey
public static final Key<android.location.Location> JPEG_GPS_LOCATION =
new Key<android.location.Location>("android.jpeg.gpsLocation", android.location.Location.class);
@@ -2211,6 +2239,7 @@ public final class CaptureRequest extends CameraMetadata<CaptureRequest.Key<?>>
* @see CameraCharacteristics#SENSOR_ORIENTATION
*/
@PublicKey
+ @NonNull
public static final Key<Integer> JPEG_ORIENTATION =
new Key<Integer>("android.jpeg.orientation", int.class);
@@ -2224,6 +2253,7 @@ public final class CaptureRequest extends CameraMetadata<CaptureRequest.Key<?>>
* <p>This key is available on all devices.</p>
*/
@PublicKey
+ @NonNull
public static final Key<Byte> JPEG_QUALITY =
new Key<Byte>("android.jpeg.quality", byte.class);
@@ -2236,6 +2266,7 @@ public final class CaptureRequest extends CameraMetadata<CaptureRequest.Key<?>>
* <p>This key is available on all devices.</p>
*/
@PublicKey
+ @NonNull
public static final Key<Byte> JPEG_THUMBNAIL_QUALITY =
new Key<Byte>("android.jpeg.thumbnailQuality", byte.class);
@@ -2275,6 +2306,7 @@ public final class CaptureRequest extends CameraMetadata<CaptureRequest.Key<?>>
* @see CaptureRequest#JPEG_ORIENTATION
*/
@PublicKey
+ @NonNull
public static final Key<android.util.Size> JPEG_THUMBNAIL_SIZE =
new Key<android.util.Size>("android.jpeg.thumbnailSize", android.util.Size.class);
@@ -2298,7 +2330,7 @@ public final class CaptureRequest extends CameraMetadata<CaptureRequest.Key<?>>
* <p><b>Units</b>: The f-number (f/N)</p>
* <p><b>Range of valid values:</b><br>
* {@link CameraCharacteristics#LENS_INFO_AVAILABLE_APERTURES android.lens.info.availableApertures}</p>
- * <p><b>Optional</b> - This value may be {@code null} on some devices.</p>
+ * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p>
* <p><b>Full capability</b> -
* Present on all camera devices that report being {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL_FULL HARDWARE_LEVEL_FULL} devices in the
* {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL android.info.supportedHardwareLevel} key</p>
@@ -2312,6 +2344,7 @@ public final class CaptureRequest extends CameraMetadata<CaptureRequest.Key<?>>
* @see CaptureRequest#SENSOR_SENSITIVITY
*/
@PublicKey
+ @NonNull
public static final Key<Float> LENS_APERTURE =
new Key<Float>("android.lens.aperture", float.class);
@@ -2332,7 +2365,7 @@ public final class CaptureRequest extends CameraMetadata<CaptureRequest.Key<?>>
* <p><b>Units</b>: Exposure Value (EV)</p>
* <p><b>Range of valid values:</b><br>
* {@link CameraCharacteristics#LENS_INFO_AVAILABLE_FILTER_DENSITIES android.lens.info.availableFilterDensities}</p>
- * <p><b>Optional</b> - This value may be {@code null} on some devices.</p>
+ * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p>
* <p><b>Full capability</b> -
* Present on all camera devices that report being {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL_FULL HARDWARE_LEVEL_FULL} devices in the
* {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL android.info.supportedHardwareLevel} key</p>
@@ -2342,6 +2375,7 @@ public final class CaptureRequest extends CameraMetadata<CaptureRequest.Key<?>>
* @see CaptureResult#LENS_STATE
*/
@PublicKey
+ @NonNull
public static final Key<Float> LENS_FILTER_DENSITY =
new Key<Float>("android.lens.filterDensity", float.class);
@@ -2367,6 +2401,7 @@ public final class CaptureRequest extends CameraMetadata<CaptureRequest.Key<?>>
* @see CaptureResult#LENS_STATE
*/
@PublicKey
+ @NonNull
public static final Key<Float> LENS_FOCAL_LENGTH =
new Key<Float>("android.lens.focalLength", float.class);
@@ -2387,7 +2422,7 @@ public final class CaptureRequest extends CameraMetadata<CaptureRequest.Key<?>>
* <p><b>Units</b>: See {@link CameraCharacteristics#LENS_INFO_FOCUS_DISTANCE_CALIBRATION android.lens.info.focusDistanceCalibration} for details</p>
* <p><b>Range of valid values:</b><br>
* &gt;= 0</p>
- * <p><b>Optional</b> - This value may be {@code null} on some devices.</p>
+ * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p>
* <p><b>Full capability</b> -
* Present on all camera devices that report being {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL_FULL HARDWARE_LEVEL_FULL} devices in the
* {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL android.info.supportedHardwareLevel} key</p>
@@ -2399,6 +2434,7 @@ public final class CaptureRequest extends CameraMetadata<CaptureRequest.Key<?>>
* @see CaptureResult#LENS_STATE
*/
@PublicKey
+ @NonNull
public static final Key<Float> LENS_FOCUS_DISTANCE =
new Key<Float>("android.lens.focusDistance", float.class);
@@ -2429,7 +2465,7 @@ public final class CaptureRequest extends CameraMetadata<CaptureRequest.Key<?>>
* </ul></p>
* <p><b>Available values for this device:</b><br>
* {@link CameraCharacteristics#LENS_INFO_AVAILABLE_OPTICAL_STABILIZATION android.lens.info.availableOpticalStabilization}</p>
- * <p><b>Optional</b> - This value may be {@code null} on some devices.</p>
+ * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p>
* <p><b>Limited capability</b> -
* Present on all camera devices that report being at least {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL_LIMITED HARDWARE_LEVEL_LIMITED} devices in the
* {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL android.info.supportedHardwareLevel} key</p>
@@ -2441,6 +2477,7 @@ public final class CaptureRequest extends CameraMetadata<CaptureRequest.Key<?>>
* @see #LENS_OPTICAL_STABILIZATION_MODE_ON
*/
@PublicKey
+ @NonNull
public static final Key<Integer> LENS_OPTICAL_STABILIZATION_MODE =
new Key<Integer>("android.lens.opticalStabilizationMode", int.class);
@@ -2481,7 +2518,7 @@ public final class CaptureRequest extends CameraMetadata<CaptureRequest.Key<?>>
* </ul></p>
* <p><b>Available values for this device:</b><br>
* {@link CameraCharacteristics#NOISE_REDUCTION_AVAILABLE_NOISE_REDUCTION_MODES android.noiseReduction.availableNoiseReductionModes}</p>
- * <p><b>Optional</b> - This value may be {@code null} on some devices.</p>
+ * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p>
* <p><b>Full capability</b> -
* Present on all camera devices that report being {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL_FULL HARDWARE_LEVEL_FULL} devices in the
* {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL android.info.supportedHardwareLevel} key</p>
@@ -2496,6 +2533,7 @@ public final class CaptureRequest extends CameraMetadata<CaptureRequest.Key<?>>
* @see #NOISE_REDUCTION_MODE_ZERO_SHUTTER_LAG
*/
@PublicKey
+ @NonNull
public static final Key<Integer> NOISE_REDUCTION_MODE =
new Key<Integer>("android.noiseReduction.mode", int.class);
@@ -2506,7 +2544,7 @@ public final class CaptureRequest extends CameraMetadata<CaptureRequest.Key<?>>
* <p><b>Units</b>: arbitrary integer assigned by application</p>
* <p><b>Range of valid values:</b><br>
* Any int</p>
- * <p><b>Optional</b> - This value may be {@code null} on some devices.</p>
+ * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p>
* @hide
*/
public static final Key<Integer> REQUEST_ID =
@@ -2570,6 +2608,7 @@ public final class CaptureRequest extends CameraMetadata<CaptureRequest.Key<?>>
* @see CameraCharacteristics#SENSOR_INFO_PRE_CORRECTION_ACTIVE_ARRAY_SIZE
*/
@PublicKey
+ @NonNull
public static final Key<android.graphics.Rect> SCALER_CROP_REGION =
new Key<android.graphics.Rect>("android.scaler.cropRegion", android.graphics.Rect.class);
@@ -2584,7 +2623,7 @@ public final class CaptureRequest extends CameraMetadata<CaptureRequest.Key<?>>
* <p><b>Units</b>: Nanoseconds</p>
* <p><b>Range of valid values:</b><br>
* {@link CameraCharacteristics#SENSOR_INFO_EXPOSURE_TIME_RANGE android.sensor.info.exposureTimeRange}</p>
- * <p><b>Optional</b> - This value may be {@code null} on some devices.</p>
+ * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p>
* <p><b>Full capability</b> -
* Present on all camera devices that report being {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL_FULL HARDWARE_LEVEL_FULL} devices in the
* {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL android.info.supportedHardwareLevel} key</p>
@@ -2595,6 +2634,7 @@ public final class CaptureRequest extends CameraMetadata<CaptureRequest.Key<?>>
* @see CameraCharacteristics#SENSOR_INFO_EXPOSURE_TIME_RANGE
*/
@PublicKey
+ @NonNull
public static final Key<Long> SENSOR_EXPOSURE_TIME =
new Key<Long>("android.sensor.exposureTime", long.class);
@@ -2665,7 +2705,7 @@ public final class CaptureRequest extends CameraMetadata<CaptureRequest.Key<?>>
* <p><b>Range of valid values:</b><br>
* See {@link CameraCharacteristics#SENSOR_INFO_MAX_FRAME_DURATION android.sensor.info.maxFrameDuration}, {@link android.hardware.camera2.params.StreamConfigurationMap }.
* The duration is capped to <code>max(duration, exposureTime + overhead)</code>.</p>
- * <p><b>Optional</b> - This value may be {@code null} on some devices.</p>
+ * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p>
* <p><b>Full capability</b> -
* Present on all camera devices that report being {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL_FULL HARDWARE_LEVEL_FULL} devices in the
* {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL android.info.supportedHardwareLevel} key</p>
@@ -2676,6 +2716,7 @@ public final class CaptureRequest extends CameraMetadata<CaptureRequest.Key<?>>
* @see CameraCharacteristics#SENSOR_INFO_MAX_FRAME_DURATION
*/
@PublicKey
+ @NonNull
public static final Key<Long> SENSOR_FRAME_DURATION =
new Key<Long>("android.sensor.frameDuration", long.class);
@@ -2696,7 +2737,7 @@ public final class CaptureRequest extends CameraMetadata<CaptureRequest.Key<?>>
* <p><b>Units</b>: ISO arithmetic units</p>
* <p><b>Range of valid values:</b><br>
* {@link CameraCharacteristics#SENSOR_INFO_SENSITIVITY_RANGE android.sensor.info.sensitivityRange}</p>
- * <p><b>Optional</b> - This value may be {@code null} on some devices.</p>
+ * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p>
* <p><b>Full capability</b> -
* Present on all camera devices that report being {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL_FULL HARDWARE_LEVEL_FULL} devices in the
* {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL android.info.supportedHardwareLevel} key</p>
@@ -2708,6 +2749,7 @@ public final class CaptureRequest extends CameraMetadata<CaptureRequest.Key<?>>
* @see CameraCharacteristics#SENSOR_MAX_ANALOG_SENSITIVITY
*/
@PublicKey
+ @NonNull
public static final Key<Integer> SENSOR_SENSITIVITY =
new Key<Integer>("android.sensor.sensitivity", int.class);
@@ -2720,11 +2762,12 @@ public final class CaptureRequest extends CameraMetadata<CaptureRequest.Key<?>>
* output.</p>
* <p>For example, a sensor with RAW10 Bayer output would use the
* 10 most significant bits from each color channel.</p>
- * <p><b>Optional</b> - This value may be {@code null} on some devices.</p>
+ * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p>
*
* @see CaptureRequest#SENSOR_TEST_PATTERN_MODE
*/
@PublicKey
+ @NonNull
public static final Key<int[]> SENSOR_TEST_PATTERN_DATA =
new Key<int[]>("android.sensor.testPatternData", int[].class);
@@ -2749,7 +2792,7 @@ public final class CaptureRequest extends CameraMetadata<CaptureRequest.Key<?>>
* </ul></p>
* <p><b>Available values for this device:</b><br>
* {@link CameraCharacteristics#SENSOR_AVAILABLE_TEST_PATTERN_MODES android.sensor.availableTestPatternModes}</p>
- * <p><b>Optional</b> - This value may be {@code null} on some devices.</p>
+ * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p>
*
* @see CameraCharacteristics#SENSOR_AVAILABLE_TEST_PATTERN_MODES
* @see #SENSOR_TEST_PATTERN_MODE_OFF
@@ -2760,6 +2803,7 @@ public final class CaptureRequest extends CameraMetadata<CaptureRequest.Key<?>>
* @see #SENSOR_TEST_PATTERN_MODE_CUSTOM1
*/
@PublicKey
+ @NonNull
public static final Key<Integer> SENSOR_TEST_PATTERN_MODE =
new Key<Integer>("android.sensor.testPatternMode", int.class);
@@ -2797,7 +2841,7 @@ public final class CaptureRequest extends CameraMetadata<CaptureRequest.Key<?>>
* </ul></p>
* <p><b>Available values for this device:</b><br>
* {@link CameraCharacteristics#SHADING_AVAILABLE_MODES android.shading.availableModes}</p>
- * <p><b>Optional</b> - This value may be {@code null} on some devices.</p>
+ * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p>
* <p><b>Full capability</b> -
* Present on all camera devices that report being {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL_FULL HARDWARE_LEVEL_FULL} devices in the
* {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL android.info.supportedHardwareLevel} key</p>
@@ -2813,6 +2857,7 @@ public final class CaptureRequest extends CameraMetadata<CaptureRequest.Key<?>>
* @see #SHADING_MODE_HIGH_QUALITY
*/
@PublicKey
+ @NonNull
public static final Key<Integer> SHADING_MODE =
new Key<Integer>("android.shading.mode", int.class);
@@ -2838,6 +2883,7 @@ public final class CaptureRequest extends CameraMetadata<CaptureRequest.Key<?>>
* @see #STATISTICS_FACE_DETECT_MODE_FULL
*/
@PublicKey
+ @NonNull
public static final Key<Integer> STATISTICS_FACE_DETECT_MODE =
new Key<Integer>("android.statistics.faceDetectMode", int.class);
@@ -2847,12 +2893,13 @@ public final class CaptureRequest extends CameraMetadata<CaptureRequest.Key<?>>
* If set to <code>false</code>, no hot pixel map will be returned.</p>
* <p><b>Range of valid values:</b><br>
* {@link CameraCharacteristics#STATISTICS_INFO_AVAILABLE_HOT_PIXEL_MAP_MODES android.statistics.info.availableHotPixelMapModes}</p>
- * <p><b>Optional</b> - This value may be {@code null} on some devices.</p>
+ * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p>
*
* @see CaptureResult#STATISTICS_HOT_PIXEL_MAP
* @see CameraCharacteristics#STATISTICS_INFO_AVAILABLE_HOT_PIXEL_MAP_MODES
*/
@PublicKey
+ @NonNull
public static final Key<Boolean> STATISTICS_HOT_PIXEL_MAP_MODE =
new Key<Boolean>("android.statistics.hotPixelMapMode", boolean.class);
@@ -2870,7 +2917,7 @@ public final class CaptureRequest extends CameraMetadata<CaptureRequest.Key<?>>
* </ul></p>
* <p><b>Available values for this device:</b><br>
* {@link CameraCharacteristics#STATISTICS_INFO_AVAILABLE_LENS_SHADING_MAP_MODES android.statistics.info.availableLensShadingMapModes}</p>
- * <p><b>Optional</b> - This value may be {@code null} on some devices.</p>
+ * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p>
* <p><b>Full capability</b> -
* Present on all camera devices that report being {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL_FULL HARDWARE_LEVEL_FULL} devices in the
* {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL android.info.supportedHardwareLevel} key</p>
@@ -2881,6 +2928,7 @@ public final class CaptureRequest extends CameraMetadata<CaptureRequest.Key<?>>
* @see #STATISTICS_LENS_SHADING_MAP_MODE_ON
*/
@PublicKey
+ @NonNull
public static final Key<Integer> STATISTICS_LENS_SHADING_MAP_MODE =
new Key<Integer>("android.statistics.lensShadingMapMode", int.class);
@@ -2900,13 +2948,14 @@ public final class CaptureRequest extends CameraMetadata<CaptureRequest.Key<?>>
* </ul></p>
* <p><b>Available values for this device:</b><br>
* {@link CameraCharacteristics#STATISTICS_INFO_AVAILABLE_OIS_DATA_MODES android.statistics.info.availableOisDataModes}</p>
- * <p><b>Optional</b> - This value may be {@code null} on some devices.</p>
+ * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p>
*
* @see CameraCharacteristics#STATISTICS_INFO_AVAILABLE_OIS_DATA_MODES
* @see #STATISTICS_OIS_DATA_MODE_OFF
* @see #STATISTICS_OIS_DATA_MODE_ON
*/
@PublicKey
+ @NonNull
public static final Key<Integer> STATISTICS_OIS_DATA_MODE =
new Key<Integer>("android.statistics.oisDataMode", int.class);
@@ -2915,7 +2964,7 @@ public final class CaptureRequest extends CameraMetadata<CaptureRequest.Key<?>>
* channel, to use when {@link CaptureRequest#TONEMAP_MODE android.tonemap.mode} is
* CONTRAST_CURVE.</p>
* <p>See android.tonemap.curveRed for more details.</p>
- * <p><b>Optional</b> - This value may be {@code null} on some devices.</p>
+ * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p>
* <p><b>Full capability</b> -
* Present on all camera devices that report being {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL_FULL HARDWARE_LEVEL_FULL} devices in the
* {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL android.info.supportedHardwareLevel} key</p>
@@ -2932,7 +2981,7 @@ public final class CaptureRequest extends CameraMetadata<CaptureRequest.Key<?>>
* channel, to use when {@link CaptureRequest#TONEMAP_MODE android.tonemap.mode} is
* CONTRAST_CURVE.</p>
* <p>See android.tonemap.curveRed for more details.</p>
- * <p><b>Optional</b> - This value may be {@code null} on some devices.</p>
+ * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p>
* <p><b>Full capability</b> -
* Present on all camera devices that report being {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL_FULL HARDWARE_LEVEL_FULL} devices in the
* {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL android.info.supportedHardwareLevel} key</p>
@@ -2993,7 +3042,7 @@ public final class CaptureRequest extends CameraMetadata<CaptureRequest.Key<?>>
* <p><b>Range of valid values:</b><br>
* 0-1 on both input and output coordinates, normalized
* as a floating-point value such that 0 == black and 1 == white.</p>
- * <p><b>Optional</b> - This value may be {@code null} on some devices.</p>
+ * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p>
* <p><b>Full capability</b> -
* Present on all camera devices that report being {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL_FULL HARDWARE_LEVEL_FULL} devices in the
* {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL android.info.supportedHardwareLevel} key</p>
@@ -3054,7 +3103,7 @@ public final class CaptureRequest extends CameraMetadata<CaptureRequest.Key<?>>
* (0.8000, 0.9063), (0.8667, 0.9389), (0.9333, 0.9701), (1.0000, 1.0000) ]
* </code></pre>
* <p><img alt="sRGB tonemapping curve" src="/reference/images/camera2/metadata/android.tonemap.curveRed/srgb_tonemap.png" /></p>
- * <p><b>Optional</b> - This value may be {@code null} on some devices.</p>
+ * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p>
* <p><b>Full capability</b> -
* Present on all camera devices that report being {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL_FULL HARDWARE_LEVEL_FULL} devices in the
* {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL android.info.supportedHardwareLevel} key</p>
@@ -3064,6 +3113,7 @@ public final class CaptureRequest extends CameraMetadata<CaptureRequest.Key<?>>
* @see CaptureRequest#TONEMAP_MODE
*/
@PublicKey
+ @NonNull
@SyntheticKey
public static final Key<android.hardware.camera2.params.TonemapCurve> TONEMAP_CURVE =
new Key<android.hardware.camera2.params.TonemapCurve>("android.tonemap.curve", android.hardware.camera2.params.TonemapCurve.class);
@@ -3098,7 +3148,7 @@ public final class CaptureRequest extends CameraMetadata<CaptureRequest.Key<?>>
* </ul></p>
* <p><b>Available values for this device:</b><br>
* {@link CameraCharacteristics#TONEMAP_AVAILABLE_TONE_MAP_MODES android.tonemap.availableToneMapModes}</p>
- * <p><b>Optional</b> - This value may be {@code null} on some devices.</p>
+ * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p>
* <p><b>Full capability</b> -
* Present on all camera devices that report being {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL_FULL HARDWARE_LEVEL_FULL} devices in the
* {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL android.info.supportedHardwareLevel} key</p>
@@ -3114,6 +3164,7 @@ public final class CaptureRequest extends CameraMetadata<CaptureRequest.Key<?>>
* @see #TONEMAP_MODE_PRESET_CURVE
*/
@PublicKey
+ @NonNull
public static final Key<Integer> TONEMAP_MODE =
new Key<Integer>("android.tonemap.mode", int.class);
@@ -3130,11 +3181,12 @@ public final class CaptureRequest extends CameraMetadata<CaptureRequest.Key<?>>
* value will be returned in capture result.</p>
* <p>The valid range of gamma value varies on different devices, but values
* within [1.0, 5.0] are guaranteed not to be clipped.</p>
- * <p><b>Optional</b> - This value may be {@code null} on some devices.</p>
+ * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p>
*
* @see CaptureRequest#TONEMAP_MODE
*/
@PublicKey
+ @NonNull
public static final Key<Float> TONEMAP_GAMMA =
new Key<Float>("android.tonemap.gamma", float.class);
@@ -3153,13 +3205,14 @@ public final class CaptureRequest extends CameraMetadata<CaptureRequest.Key<?>>
* <li>{@link #TONEMAP_PRESET_CURVE_SRGB SRGB}</li>
* <li>{@link #TONEMAP_PRESET_CURVE_REC709 REC709}</li>
* </ul></p>
- * <p><b>Optional</b> - This value may be {@code null} on some devices.</p>
+ * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p>
*
* @see CaptureRequest#TONEMAP_MODE
* @see #TONEMAP_PRESET_CURVE_SRGB
* @see #TONEMAP_PRESET_CURVE_REC709
*/
@PublicKey
+ @NonNull
public static final Key<Integer> TONEMAP_PRESET_CURVE =
new Key<Integer>("android.tonemap.presetCurve", int.class);
@@ -3174,7 +3227,7 @@ public final class CaptureRequest extends CameraMetadata<CaptureRequest.Key<?>>
* data is stored locally on the device.</p>
* <p>The LED <em>may</em> be off if a trusted application is using the data that
* doesn't violate the above rules.</p>
- * <p><b>Optional</b> - This value may be {@code null} on some devices.</p>
+ * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p>
* @hide
*/
public static final Key<Boolean> LED_TRANSMIT =
@@ -3218,7 +3271,7 @@ public final class CaptureRequest extends CameraMetadata<CaptureRequest.Key<?>>
* possible, only overriding the lock to OFF when changes to
* other request parameters require a black level recalculation
* or reset.</p>
- * <p><b>Optional</b> - This value may be {@code null} on some devices.</p>
+ * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p>
* <p><b>Full capability</b> -
* Present on all camera devices that report being {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL_FULL HARDWARE_LEVEL_FULL} devices in the
* {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL android.info.supportedHardwareLevel} key</p>
@@ -3226,6 +3279,7 @@ public final class CaptureRequest extends CameraMetadata<CaptureRequest.Key<?>>
* @see CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL
*/
@PublicKey
+ @NonNull
public static final Key<Boolean> BLACK_LEVEL_LOCK =
new Key<Boolean>("android.blackLevel.lock", boolean.class);
@@ -3265,7 +3319,7 @@ public final class CaptureRequest extends CameraMetadata<CaptureRequest.Key<?>>
* <p><b>Units</b>: Relative exposure time increase factor.</p>
* <p><b>Range of valid values:</b><br>
* &gt;= 1.0</p>
- * <p><b>Optional</b> - This value may be {@code null} on some devices.</p>
+ * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p>
* <p><b>Limited capability</b> -
* Present on all camera devices that report being at least {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL_LIMITED HARDWARE_LEVEL_LIMITED} devices in the
* {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL android.info.supportedHardwareLevel} key</p>
@@ -3276,6 +3330,7 @@ public final class CaptureRequest extends CameraMetadata<CaptureRequest.Key<?>>
* @see CameraCharacteristics#REQUEST_AVAILABLE_CAPABILITIES
*/
@PublicKey
+ @NonNull
public static final Key<Float> REPROCESS_EFFECTIVE_EXPOSURE_FACTOR =
new Key<Float>("android.reprocess.effectiveExposureFactor", float.class);
@@ -3322,7 +3377,7 @@ public final class CaptureRequest extends CameraMetadata<CaptureRequest.Key<?>>
* </ul></p>
* <p><b>Available values for this device:</b><br>
* {@link CameraCharacteristics#DISTORTION_CORRECTION_AVAILABLE_MODES android.distortionCorrection.availableModes}</p>
- * <p><b>Optional</b> - This value may be {@code null} on some devices.</p>
+ * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p>
*
* @see CaptureRequest#CONTROL_AE_REGIONS
* @see CaptureRequest#CONTROL_AF_REGIONS
@@ -3338,6 +3393,7 @@ public final class CaptureRequest extends CameraMetadata<CaptureRequest.Key<?>>
* @see #DISTORTION_CORRECTION_MODE_HIGH_QUALITY
*/
@PublicKey
+ @NonNull
public static final Key<Integer> DISTORTION_CORRECTION_MODE =
new Key<Integer>("android.distortionCorrection.mode", int.class);
@@ -3347,4 +3403,7 @@ public final class CaptureRequest extends CameraMetadata<CaptureRequest.Key<?>>
+
+
+
}
diff --git a/core/java/android/hardware/camera2/CaptureResult.java b/core/java/android/hardware/camera2/CaptureResult.java
index 13ad092f6efd..0900f3b11d4c 100644
--- a/core/java/android/hardware/camera2/CaptureResult.java
+++ b/core/java/android/hardware/camera2/CaptureResult.java
@@ -437,7 +437,7 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> {
* <li>{@link #COLOR_CORRECTION_MODE_FAST FAST}</li>
* <li>{@link #COLOR_CORRECTION_MODE_HIGH_QUALITY HIGH_QUALITY}</li>
* </ul></p>
- * <p><b>Optional</b> - This value may be {@code null} on some devices.</p>
+ * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p>
* <p><b>Full capability</b> -
* Present on all camera devices that report being {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL_FULL HARDWARE_LEVEL_FULL} devices in the
* {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL android.info.supportedHardwareLevel} key</p>
@@ -451,6 +451,7 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> {
* @see #COLOR_CORRECTION_MODE_HIGH_QUALITY
*/
@PublicKey
+ @NonNull
public static final Key<Integer> COLOR_CORRECTION_MODE =
new Key<Integer>("android.colorCorrection.mode", int.class);
@@ -469,7 +470,7 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> {
* <p>The valid range of each matrix element varies on different devices, but
* values within [-1.5, 3.0] are guaranteed not to be clipped.</p>
* <p><b>Units</b>: Unitless scale factors</p>
- * <p><b>Optional</b> - This value may be {@code null} on some devices.</p>
+ * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p>
* <p><b>Full capability</b> -
* Present on all camera devices that report being {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL_FULL HARDWARE_LEVEL_FULL} devices in the
* {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL android.info.supportedHardwareLevel} key</p>
@@ -478,6 +479,7 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> {
* @see CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL
*/
@PublicKey
+ @NonNull
public static final Key<android.hardware.camera2.params.ColorSpaceTransform> COLOR_CORRECTION_TRANSFORM =
new Key<android.hardware.camera2.params.ColorSpaceTransform>("android.colorCorrection.transform", android.hardware.camera2.params.ColorSpaceTransform.class);
@@ -496,7 +498,7 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> {
* device allows gains below 1.0, this is usually not recommended because
* this can create color artifacts.</p>
* <p><b>Units</b>: Unitless gain factors</p>
- * <p><b>Optional</b> - This value may be {@code null} on some devices.</p>
+ * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p>
* <p><b>Full capability</b> -
* Present on all camera devices that report being {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL_FULL HARDWARE_LEVEL_FULL} devices in the
* {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL android.info.supportedHardwareLevel} key</p>
@@ -505,6 +507,7 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> {
* @see CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL
*/
@PublicKey
+ @NonNull
public static final Key<android.hardware.camera2.params.RggbChannelVector> COLOR_CORRECTION_GAINS =
new Key<android.hardware.camera2.params.RggbChannelVector>("android.colorCorrection.gains", android.hardware.camera2.params.RggbChannelVector.class);
@@ -537,6 +540,7 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> {
* @see #COLOR_CORRECTION_ABERRATION_MODE_HIGH_QUALITY
*/
@PublicKey
+ @NonNull
public static final Key<Integer> COLOR_CORRECTION_ABERRATION_MODE =
new Key<Integer>("android.colorCorrection.aberrationMode", int.class);
@@ -593,6 +597,7 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> {
* @see #CONTROL_AE_ANTIBANDING_MODE_AUTO
*/
@PublicKey
+ @NonNull
public static final Key<Integer> CONTROL_AE_ANTIBANDING_MODE =
new Key<Integer>("android.control.aeAntibandingMode", int.class);
@@ -626,6 +631,7 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> {
* @see CaptureResult#CONTROL_AE_STATE
*/
@PublicKey
+ @NonNull
public static final Key<Integer> CONTROL_AE_EXPOSURE_COMPENSATION =
new Key<Integer>("android.control.aeExposureCompensation", int.class);
@@ -676,6 +682,7 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> {
* @see CaptureRequest#SENSOR_SENSITIVITY
*/
@PublicKey
+ @NonNull
public static final Key<Boolean> CONTROL_AE_LOCK =
new Key<Boolean>("android.control.aeLock", boolean.class);
@@ -728,6 +735,7 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> {
* @see #CONTROL_AE_MODE_ON_EXTERNAL_FLASH
*/
@PublicKey
+ @NonNull
public static final Key<Integer> CONTROL_AE_MODE =
new Key<Integer>("android.control.aeMode", int.class);
@@ -779,7 +787,7 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> {
* Coordinates must be between <code>[(0,0), (width, height))</code> of
* {@link CameraCharacteristics#SENSOR_INFO_ACTIVE_ARRAY_SIZE android.sensor.info.activeArraySize} or {@link CameraCharacteristics#SENSOR_INFO_PRE_CORRECTION_ACTIVE_ARRAY_SIZE android.sensor.info.preCorrectionActiveArraySize}
* depending on distortion correction capability and mode</p>
- * <p><b>Optional</b> - This value may be {@code null} on some devices.</p>
+ * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p>
*
* @see CameraCharacteristics#CONTROL_MAX_REGIONS_AE
* @see CaptureRequest#DISTORTION_CORRECTION_MODE
@@ -788,6 +796,7 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> {
* @see CameraCharacteristics#SENSOR_INFO_PRE_CORRECTION_ACTIVE_ARRAY_SIZE
*/
@PublicKey
+ @NonNull
public static final Key<android.hardware.camera2.params.MeteringRectangle[]> CONTROL_AE_REGIONS =
new Key<android.hardware.camera2.params.MeteringRectangle[]>("android.control.aeRegions", android.hardware.camera2.params.MeteringRectangle[].class);
@@ -808,6 +817,7 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> {
* @see CaptureRequest#SENSOR_FRAME_DURATION
*/
@PublicKey
+ @NonNull
public static final Key<android.util.Range<Integer>> CONTROL_AE_TARGET_FPS_RANGE =
new Key<android.util.Range<Integer>>("android.control.aeTargetFpsRange", new TypeReference<android.util.Range<Integer>>() {{ }});
@@ -866,7 +876,7 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> {
* <li>{@link #CONTROL_AE_PRECAPTURE_TRIGGER_START START}</li>
* <li>{@link #CONTROL_AE_PRECAPTURE_TRIGGER_CANCEL CANCEL}</li>
* </ul></p>
- * <p><b>Optional</b> - This value may be {@code null} on some devices.</p>
+ * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p>
* <p><b>Limited capability</b> -
* Present on all camera devices that report being at least {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL_LIMITED HARDWARE_LEVEL_LIMITED} devices in the
* {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL android.info.supportedHardwareLevel} key</p>
@@ -881,6 +891,7 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> {
* @see #CONTROL_AE_PRECAPTURE_TRIGGER_CANCEL
*/
@PublicKey
+ @NonNull
public static final Key<Integer> CONTROL_AE_PRECAPTURE_TRIGGER =
new Key<Integer>("android.control.aePrecaptureTrigger", int.class);
@@ -1108,7 +1119,7 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> {
* <li>{@link #CONTROL_AE_STATE_FLASH_REQUIRED FLASH_REQUIRED}</li>
* <li>{@link #CONTROL_AE_STATE_PRECAPTURE PRECAPTURE}</li>
* </ul></p>
- * <p><b>Optional</b> - This value may be {@code null} on some devices.</p>
+ * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p>
* <p><b>Limited capability</b> -
* Present on all camera devices that report being at least {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL_LIMITED HARDWARE_LEVEL_LIMITED} devices in the
* {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL android.info.supportedHardwareLevel} key</p>
@@ -1129,6 +1140,7 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> {
* @see #CONTROL_AE_STATE_PRECAPTURE
*/
@PublicKey
+ @NonNull
public static final Key<Integer> CONTROL_AE_STATE =
new Key<Integer>("android.control.aeState", int.class);
@@ -1170,6 +1182,7 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> {
* @see #CONTROL_AF_MODE_EDOF
*/
@PublicKey
+ @NonNull
public static final Key<Integer> CONTROL_AF_MODE =
new Key<Integer>("android.control.afMode", int.class);
@@ -1222,7 +1235,7 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> {
* Coordinates must be between <code>[(0,0), (width, height))</code> of
* {@link CameraCharacteristics#SENSOR_INFO_ACTIVE_ARRAY_SIZE android.sensor.info.activeArraySize} or {@link CameraCharacteristics#SENSOR_INFO_PRE_CORRECTION_ACTIVE_ARRAY_SIZE android.sensor.info.preCorrectionActiveArraySize}
* depending on distortion correction capability and mode</p>
- * <p><b>Optional</b> - This value may be {@code null} on some devices.</p>
+ * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p>
*
* @see CameraCharacteristics#CONTROL_MAX_REGIONS_AF
* @see CaptureRequest#DISTORTION_CORRECTION_MODE
@@ -1231,6 +1244,7 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> {
* @see CameraCharacteristics#SENSOR_INFO_PRE_CORRECTION_ACTIVE_ARRAY_SIZE
*/
@PublicKey
+ @NonNull
public static final Key<android.hardware.camera2.params.MeteringRectangle[]> CONTROL_AF_REGIONS =
new Key<android.hardware.camera2.params.MeteringRectangle[]>("android.control.afRegions", android.hardware.camera2.params.MeteringRectangle[].class);
@@ -1268,6 +1282,7 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> {
* @see #CONTROL_AF_TRIGGER_CANCEL
*/
@PublicKey
+ @NonNull
public static final Key<Integer> CONTROL_AF_TRIGGER =
new Key<Integer>("android.control.afTrigger", int.class);
@@ -1677,6 +1692,7 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> {
* @see #CONTROL_AF_STATE_PASSIVE_UNFOCUSED
*/
@PublicKey
+ @NonNull
public static final Key<Integer> CONTROL_AF_STATE =
new Key<Integer>("android.control.afState", int.class);
@@ -1707,6 +1723,7 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> {
* @see CaptureRequest#CONTROL_AWB_MODE
*/
@PublicKey
+ @NonNull
public static final Key<Boolean> CONTROL_AWB_LOCK =
new Key<Boolean>("android.control.awbLock", boolean.class);
@@ -1767,6 +1784,7 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> {
* @see #CONTROL_AWB_MODE_SHADE
*/
@PublicKey
+ @NonNull
public static final Key<Integer> CONTROL_AWB_MODE =
new Key<Integer>("android.control.awbMode", int.class);
@@ -1819,7 +1837,7 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> {
* Coordinates must be between <code>[(0,0), (width, height))</code> of
* {@link CameraCharacteristics#SENSOR_INFO_ACTIVE_ARRAY_SIZE android.sensor.info.activeArraySize} or {@link CameraCharacteristics#SENSOR_INFO_PRE_CORRECTION_ACTIVE_ARRAY_SIZE android.sensor.info.preCorrectionActiveArraySize}
* depending on distortion correction capability and mode</p>
- * <p><b>Optional</b> - This value may be {@code null} on some devices.</p>
+ * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p>
*
* @see CameraCharacteristics#CONTROL_MAX_REGIONS_AWB
* @see CaptureRequest#DISTORTION_CORRECTION_MODE
@@ -1828,6 +1846,7 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> {
* @see CameraCharacteristics#SENSOR_INFO_PRE_CORRECTION_ACTIVE_ARRAY_SIZE
*/
@PublicKey
+ @NonNull
public static final Key<android.hardware.camera2.params.MeteringRectangle[]> CONTROL_AWB_REGIONS =
new Key<android.hardware.camera2.params.MeteringRectangle[]>("android.control.awbRegions", android.hardware.camera2.params.MeteringRectangle[].class);
@@ -1870,6 +1889,7 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> {
* @see #CONTROL_CAPTURE_INTENT_MOTION_TRACKING
*/
@PublicKey
+ @NonNull
public static final Key<Integer> CONTROL_CAPTURE_INTENT =
new Key<Integer>("android.control.captureIntent", int.class);
@@ -1997,7 +2017,7 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> {
* <li>{@link #CONTROL_AWB_STATE_CONVERGED CONVERGED}</li>
* <li>{@link #CONTROL_AWB_STATE_LOCKED LOCKED}</li>
* </ul></p>
- * <p><b>Optional</b> - This value may be {@code null} on some devices.</p>
+ * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p>
* <p><b>Limited capability</b> -
* Present on all camera devices that report being at least {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL_LIMITED HARDWARE_LEVEL_LIMITED} devices in the
* {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL android.info.supportedHardwareLevel} key</p>
@@ -2013,6 +2033,7 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> {
* @see #CONTROL_AWB_STATE_LOCKED
*/
@PublicKey
+ @NonNull
public static final Key<Integer> CONTROL_AWB_STATE =
new Key<Integer>("android.control.awbState", int.class);
@@ -2052,6 +2073,7 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> {
* @see #CONTROL_EFFECT_MODE_AQUA
*/
@PublicKey
+ @NonNull
public static final Key<Integer> CONTROL_EFFECT_MODE =
new Key<Integer>("android.control.effectMode", int.class);
@@ -2092,6 +2114,7 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> {
* @see #CONTROL_MODE_OFF_KEEP_STATE
*/
@PublicKey
+ @NonNull
public static final Key<Integer> CONTROL_MODE =
new Key<Integer>("android.control.mode", int.class);
@@ -2159,6 +2182,7 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> {
* @see #CONTROL_SCENE_MODE_HDR
*/
@PublicKey
+ @NonNull
public static final Key<Integer> CONTROL_SCENE_MODE =
new Key<Integer>("android.control.sceneMode", int.class);
@@ -2202,6 +2226,7 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> {
* @see #CONTROL_VIDEO_STABILIZATION_MODE_ON
*/
@PublicKey
+ @NonNull
public static final Key<Integer> CONTROL_VIDEO_STABILIZATION_MODE =
new Key<Integer>("android.control.videoStabilizationMode", int.class);
@@ -2228,7 +2253,7 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> {
* <p><b>Units</b>: ISO arithmetic units, the same as {@link CaptureRequest#SENSOR_SENSITIVITY android.sensor.sensitivity}</p>
* <p><b>Range of valid values:</b><br>
* {@link CameraCharacteristics#CONTROL_POST_RAW_SENSITIVITY_BOOST_RANGE android.control.postRawSensitivityBoostRange}</p>
- * <p><b>Optional</b> - This value may be {@code null} on some devices.</p>
+ * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p>
*
* @see CaptureRequest#CONTROL_AE_MODE
* @see CaptureRequest#CONTROL_MODE
@@ -2237,6 +2262,7 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> {
* @see CaptureRequest#SENSOR_SENSITIVITY
*/
@PublicKey
+ @NonNull
public static final Key<Integer> CONTROL_POST_RAW_SENSITIVITY_BOOST =
new Key<Integer>("android.control.postRawSensitivityBoost", int.class);
@@ -2264,12 +2290,13 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> {
* <p>For applications targeting SDK versions older than O, the value of enableZsl in all
* capture templates is always <code>false</code> if present.</p>
* <p>For application-operated ZSL, use CAMERA3_TEMPLATE_ZERO_SHUTTER_LAG template.</p>
- * <p><b>Optional</b> - This value may be {@code null} on some devices.</p>
+ * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p>
*
* @see CaptureRequest#CONTROL_CAPTURE_INTENT
* @see CaptureResult#SENSOR_TIMESTAMP
*/
@PublicKey
+ @NonNull
public static final Key<Boolean> CONTROL_ENABLE_ZSL =
new Key<Boolean>("android.control.enableZsl", boolean.class);
@@ -2287,11 +2314,12 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> {
* <li>{@link #CONTROL_AF_SCENE_CHANGE_NOT_DETECTED NOT_DETECTED}</li>
* <li>{@link #CONTROL_AF_SCENE_CHANGE_DETECTED DETECTED}</li>
* </ul></p>
- * <p><b>Optional</b> - This value may be {@code null} on some devices.</p>
+ * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p>
* @see #CONTROL_AF_SCENE_CHANGE_NOT_DETECTED
* @see #CONTROL_AF_SCENE_CHANGE_DETECTED
*/
@PublicKey
+ @NonNull
public static final Key<Integer> CONTROL_AF_SCENE_CHANGE =
new Key<Integer>("android.control.afSceneChange", int.class);
@@ -2326,7 +2354,7 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> {
* </ul></p>
* <p><b>Available values for this device:</b><br>
* {@link CameraCharacteristics#EDGE_AVAILABLE_EDGE_MODES android.edge.availableEdgeModes}</p>
- * <p><b>Optional</b> - This value may be {@code null} on some devices.</p>
+ * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p>
* <p><b>Full capability</b> -
* Present on all camera devices that report being {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL_FULL HARDWARE_LEVEL_FULL} devices in the
* {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL android.info.supportedHardwareLevel} key</p>
@@ -2340,6 +2368,7 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> {
* @see #EDGE_MODE_ZERO_SHUTTER_LAG
*/
@PublicKey
+ @NonNull
public static final Key<Integer> EDGE_MODE =
new Key<Integer>("android.edge.mode", int.class);
@@ -2375,6 +2404,7 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> {
* @see #FLASH_MODE_TORCH
*/
@PublicKey
+ @NonNull
public static final Key<Integer> FLASH_MODE =
new Key<Integer>("android.flash.mode", int.class);
@@ -2402,7 +2432,7 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> {
* <li>{@link #FLASH_STATE_FIRED FIRED}</li>
* <li>{@link #FLASH_STATE_PARTIAL PARTIAL}</li>
* </ul></p>
- * <p><b>Optional</b> - This value may be {@code null} on some devices.</p>
+ * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p>
* <p><b>Limited capability</b> -
* Present on all camera devices that report being at least {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL_LIMITED HARDWARE_LEVEL_LIMITED} devices in the
* {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL android.info.supportedHardwareLevel} key</p>
@@ -2418,6 +2448,7 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> {
* @see #FLASH_STATE_PARTIAL
*/
@PublicKey
+ @NonNull
public static final Key<Integer> FLASH_STATE =
new Key<Integer>("android.flash.state", int.class);
@@ -2434,7 +2465,7 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> {
* </ul></p>
* <p><b>Available values for this device:</b><br>
* {@link CameraCharacteristics#HOT_PIXEL_AVAILABLE_HOT_PIXEL_MODES android.hotPixel.availableHotPixelModes}</p>
- * <p><b>Optional</b> - This value may be {@code null} on some devices.</p>
+ * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p>
*
* @see CameraCharacteristics#HOT_PIXEL_AVAILABLE_HOT_PIXEL_MODES
* @see #HOT_PIXEL_MODE_OFF
@@ -2442,6 +2473,7 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> {
* @see #HOT_PIXEL_MODE_HIGH_QUALITY
*/
@PublicKey
+ @NonNull
public static final Key<Integer> HOT_PIXEL_MODE =
new Key<Integer>("android.hotPixel.mode", int.class);
@@ -2454,6 +2486,7 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> {
* <p>This key is available on all devices.</p>
*/
@PublicKey
+ @NonNull
@SyntheticKey
public static final Key<android.location.Location> JPEG_GPS_LOCATION =
new Key<android.location.Location>("android.jpeg.gpsLocation", android.location.Location.class);
@@ -2535,6 +2568,7 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> {
* @see CameraCharacteristics#SENSOR_ORIENTATION
*/
@PublicKey
+ @NonNull
public static final Key<Integer> JPEG_ORIENTATION =
new Key<Integer>("android.jpeg.orientation", int.class);
@@ -2548,6 +2582,7 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> {
* <p>This key is available on all devices.</p>
*/
@PublicKey
+ @NonNull
public static final Key<Byte> JPEG_QUALITY =
new Key<Byte>("android.jpeg.quality", byte.class);
@@ -2560,6 +2595,7 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> {
* <p>This key is available on all devices.</p>
*/
@PublicKey
+ @NonNull
public static final Key<Byte> JPEG_THUMBNAIL_QUALITY =
new Key<Byte>("android.jpeg.thumbnailQuality", byte.class);
@@ -2599,6 +2635,7 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> {
* @see CaptureRequest#JPEG_ORIENTATION
*/
@PublicKey
+ @NonNull
public static final Key<android.util.Size> JPEG_THUMBNAIL_SIZE =
new Key<android.util.Size>("android.jpeg.thumbnailSize", android.util.Size.class);
@@ -2622,7 +2659,7 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> {
* <p><b>Units</b>: The f-number (f/N)</p>
* <p><b>Range of valid values:</b><br>
* {@link CameraCharacteristics#LENS_INFO_AVAILABLE_APERTURES android.lens.info.availableApertures}</p>
- * <p><b>Optional</b> - This value may be {@code null} on some devices.</p>
+ * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p>
* <p><b>Full capability</b> -
* Present on all camera devices that report being {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL_FULL HARDWARE_LEVEL_FULL} devices in the
* {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL android.info.supportedHardwareLevel} key</p>
@@ -2636,6 +2673,7 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> {
* @see CaptureRequest#SENSOR_SENSITIVITY
*/
@PublicKey
+ @NonNull
public static final Key<Float> LENS_APERTURE =
new Key<Float>("android.lens.aperture", float.class);
@@ -2656,7 +2694,7 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> {
* <p><b>Units</b>: Exposure Value (EV)</p>
* <p><b>Range of valid values:</b><br>
* {@link CameraCharacteristics#LENS_INFO_AVAILABLE_FILTER_DENSITIES android.lens.info.availableFilterDensities}</p>
- * <p><b>Optional</b> - This value may be {@code null} on some devices.</p>
+ * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p>
* <p><b>Full capability</b> -
* Present on all camera devices that report being {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL_FULL HARDWARE_LEVEL_FULL} devices in the
* {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL android.info.supportedHardwareLevel} key</p>
@@ -2666,6 +2704,7 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> {
* @see CaptureResult#LENS_STATE
*/
@PublicKey
+ @NonNull
public static final Key<Float> LENS_FILTER_DENSITY =
new Key<Float>("android.lens.filterDensity", float.class);
@@ -2691,6 +2730,7 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> {
* @see CaptureResult#LENS_STATE
*/
@PublicKey
+ @NonNull
public static final Key<Float> LENS_FOCAL_LENGTH =
new Key<Float>("android.lens.focalLength", float.class);
@@ -2701,7 +2741,7 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> {
* <p><b>Units</b>: See {@link CameraCharacteristics#LENS_INFO_FOCUS_DISTANCE_CALIBRATION android.lens.info.focusDistanceCalibration} for details</p>
* <p><b>Range of valid values:</b><br>
* &gt;= 0</p>
- * <p><b>Optional</b> - This value may be {@code null} on some devices.</p>
+ * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p>
* <p><b>Full capability</b> -
* Present on all camera devices that report being {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL_FULL HARDWARE_LEVEL_FULL} devices in the
* {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL android.info.supportedHardwareLevel} key</p>
@@ -2710,6 +2750,7 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> {
* @see CameraCharacteristics#LENS_INFO_FOCUS_DISTANCE_CALIBRATION
*/
@PublicKey
+ @NonNull
public static final Key<Float> LENS_FOCUS_DISTANCE =
new Key<Float>("android.lens.focusDistance", float.class);
@@ -2722,7 +2763,7 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> {
* far); see {@link CameraCharacteristics#LENS_INFO_FOCUS_DISTANCE_CALIBRATION android.lens.info.focusDistanceCalibration} for details.</p>
* <p><b>Range of valid values:</b><br>
* &gt;=0</p>
- * <p><b>Optional</b> - This value may be {@code null} on some devices.</p>
+ * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p>
* <p><b>Limited capability</b> -
* Present on all camera devices that report being at least {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL_LIMITED HARDWARE_LEVEL_LIMITED} devices in the
* {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL android.info.supportedHardwareLevel} key</p>
@@ -2731,6 +2772,7 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> {
* @see CameraCharacteristics#LENS_INFO_FOCUS_DISTANCE_CALIBRATION
*/
@PublicKey
+ @NonNull
public static final Key<android.util.Pair<Float,Float>> LENS_FOCUS_RANGE =
new Key<android.util.Pair<Float,Float>>("android.lens.focusRange", new TypeReference<android.util.Pair<Float,Float>>() {{ }});
@@ -2761,7 +2803,7 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> {
* </ul></p>
* <p><b>Available values for this device:</b><br>
* {@link CameraCharacteristics#LENS_INFO_AVAILABLE_OPTICAL_STABILIZATION android.lens.info.availableOpticalStabilization}</p>
- * <p><b>Optional</b> - This value may be {@code null} on some devices.</p>
+ * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p>
* <p><b>Limited capability</b> -
* Present on all camera devices that report being at least {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL_LIMITED HARDWARE_LEVEL_LIMITED} devices in the
* {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL android.info.supportedHardwareLevel} key</p>
@@ -2773,6 +2815,7 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> {
* @see #LENS_OPTICAL_STABILIZATION_MODE_ON
*/
@PublicKey
+ @NonNull
public static final Key<Integer> LENS_OPTICAL_STABILIZATION_MODE =
new Key<Integer>("android.lens.opticalStabilizationMode", int.class);
@@ -2802,7 +2845,7 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> {
* <li>{@link #LENS_STATE_STATIONARY STATIONARY}</li>
* <li>{@link #LENS_STATE_MOVING MOVING}</li>
* </ul></p>
- * <p><b>Optional</b> - This value may be {@code null} on some devices.</p>
+ * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p>
* <p><b>Limited capability</b> -
* Present on all camera devices that report being at least {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL_LIMITED HARDWARE_LEVEL_LIMITED} devices in the
* {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL android.info.supportedHardwareLevel} key</p>
@@ -2820,6 +2863,7 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> {
* @see #LENS_STATE_MOVING
*/
@PublicKey
+ @NonNull
public static final Key<Integer> LENS_STATE =
new Key<Integer>("android.lens.state", int.class);
@@ -2854,10 +2898,11 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> {
* <code>p'</code> is in the camera-oriented coordinate system.</p>
* <p><b>Units</b>:
* Quaternion coefficients</p>
- * <p><b>Optional</b> - This value may be {@code null} on some devices.</p>
+ * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p>
* <p><b>Permission {@link android.Manifest.permission#CAMERA } is needed to access this property</b></p>
*/
@PublicKey
+ @NonNull
public static final Key<float[]> LENS_POSE_ROTATION =
new Key<float[]>("android.lens.poseRotation", float[].class);
@@ -2890,7 +2935,7 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> {
* the center of the primary gyroscope on the device. The axis definitions are the same as
* with PRIMARY_CAMERA.</p>
* <p><b>Units</b>: Meters</p>
- * <p><b>Optional</b> - This value may be {@code null} on some devices.</p>
+ * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p>
* <p><b>Permission {@link android.Manifest.permission#CAMERA } is needed to access this property</b></p>
*
* @see CameraCharacteristics#LENS_DISTORTION
@@ -2899,6 +2944,7 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> {
* @see CameraCharacteristics#LENS_POSE_ROTATION
*/
@PublicKey
+ @NonNull
public static final Key<float[]> LENS_POSE_TRANSLATION =
new Key<float[]>("android.lens.poseTranslation", float[].class);
@@ -2962,7 +3008,7 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> {
* Pixels in the
* {@link CameraCharacteristics#SENSOR_INFO_PRE_CORRECTION_ACTIVE_ARRAY_SIZE android.sensor.info.preCorrectionActiveArraySize}
* coordinate system.</p>
- * <p><b>Optional</b> - This value may be {@code null} on some devices.</p>
+ * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p>
* <p><b>Permission {@link android.Manifest.permission#CAMERA } is needed to access this property</b></p>
*
* @see CameraCharacteristics#LENS_DISTORTION
@@ -2972,6 +3018,7 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> {
* @see CameraCharacteristics#SENSOR_INFO_PRE_CORRECTION_ACTIVE_ARRAY_SIZE
*/
@PublicKey
+ @NonNull
public static final Key<float[]> LENS_INTRINSIC_CALIBRATION =
new Key<float[]>("android.lens.intrinsicCalibration", float[].class);
@@ -3006,7 +3053,7 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> {
* <p>The distortion model used is the Brown-Conrady model.</p>
* <p><b>Units</b>:
* Unitless coefficients.</p>
- * <p><b>Optional</b> - This value may be {@code null} on some devices.</p>
+ * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p>
* <p><b>Permission {@link android.Manifest.permission#CAMERA } is needed to access this property</b></p>
*
* @see CameraCharacteristics#LENS_INTRINSIC_CALIBRATION
@@ -3019,6 +3066,7 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> {
*/
@Deprecated
@PublicKey
+ @NonNull
public static final Key<float[]> LENS_RADIAL_DISTORTION =
new Key<float[]>("android.lens.radialDistortion", float[].class);
@@ -3053,13 +3101,14 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> {
* <p>The distortion model used is the Brown-Conrady model.</p>
* <p><b>Units</b>:
* Unitless coefficients.</p>
- * <p><b>Optional</b> - This value may be {@code null} on some devices.</p>
+ * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p>
* <p><b>Permission {@link android.Manifest.permission#CAMERA } is needed to access this property</b></p>
*
* @see CameraCharacteristics#LENS_INTRINSIC_CALIBRATION
* @see CameraCharacteristics#LENS_RADIAL_DISTORTION
*/
@PublicKey
+ @NonNull
public static final Key<float[]> LENS_DISTORTION =
new Key<float[]>("android.lens.distortion", float[].class);
@@ -3100,7 +3149,7 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> {
* </ul></p>
* <p><b>Available values for this device:</b><br>
* {@link CameraCharacteristics#NOISE_REDUCTION_AVAILABLE_NOISE_REDUCTION_MODES android.noiseReduction.availableNoiseReductionModes}</p>
- * <p><b>Optional</b> - This value may be {@code null} on some devices.</p>
+ * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p>
* <p><b>Full capability</b> -
* Present on all camera devices that report being {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL_FULL HARDWARE_LEVEL_FULL} devices in the
* {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL android.info.supportedHardwareLevel} key</p>
@@ -3115,6 +3164,7 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> {
* @see #NOISE_REDUCTION_MODE_ZERO_SHUTTER_LAG
*/
@PublicKey
+ @NonNull
public static final Key<Integer> NOISE_REDUCTION_MODE =
new Key<Integer>("android.noiseReduction.mode", int.class);
@@ -3134,7 +3184,7 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> {
* only be used by the camera device if quirks.usePartialResult is set to 1.</p>
* <p><b>Range of valid values:</b><br>
* Optional. Default value is FINAL.</p>
- * <p><b>Optional</b> - This value may be {@code null} on some devices.</p>
+ * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p>
* @deprecated
* <p>Not used in HALv3 or newer</p>
@@ -3152,7 +3202,7 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> {
* <p><b>Units</b>: count of frames</p>
* <p><b>Range of valid values:</b><br>
* &gt; 0</p>
- * <p><b>Optional</b> - This value may be {@code null} on some devices.</p>
+ * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p>
* @deprecated
* <p>Not used in HALv3 or newer</p>
@@ -3169,7 +3219,7 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> {
* <p><b>Units</b>: arbitrary integer assigned by application</p>
* <p><b>Range of valid values:</b><br>
* Any int</p>
- * <p><b>Optional</b> - This value may be {@code null} on some devices.</p>
+ * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p>
* @hide
*/
public static final Key<Integer> REQUEST_ID =
@@ -3190,6 +3240,7 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> {
* @see CameraCharacteristics#REQUEST_PIPELINE_MAX_DEPTH
*/
@PublicKey
+ @NonNull
public static final Key<Byte> REQUEST_PIPELINE_DEPTH =
new Key<Byte>("android.request.pipelineDepth", byte.class);
@@ -3251,6 +3302,7 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> {
* @see CameraCharacteristics#SENSOR_INFO_PRE_CORRECTION_ACTIVE_ARRAY_SIZE
*/
@PublicKey
+ @NonNull
public static final Key<android.graphics.Rect> SCALER_CROP_REGION =
new Key<android.graphics.Rect>("android.scaler.cropRegion", android.graphics.Rect.class);
@@ -3265,7 +3317,7 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> {
* <p><b>Units</b>: Nanoseconds</p>
* <p><b>Range of valid values:</b><br>
* {@link CameraCharacteristics#SENSOR_INFO_EXPOSURE_TIME_RANGE android.sensor.info.exposureTimeRange}</p>
- * <p><b>Optional</b> - This value may be {@code null} on some devices.</p>
+ * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p>
* <p><b>Full capability</b> -
* Present on all camera devices that report being {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL_FULL HARDWARE_LEVEL_FULL} devices in the
* {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL android.info.supportedHardwareLevel} key</p>
@@ -3276,6 +3328,7 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> {
* @see CameraCharacteristics#SENSOR_INFO_EXPOSURE_TIME_RANGE
*/
@PublicKey
+ @NonNull
public static final Key<Long> SENSOR_EXPOSURE_TIME =
new Key<Long>("android.sensor.exposureTime", long.class);
@@ -3346,7 +3399,7 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> {
* <p><b>Range of valid values:</b><br>
* See {@link CameraCharacteristics#SENSOR_INFO_MAX_FRAME_DURATION android.sensor.info.maxFrameDuration}, {@link android.hardware.camera2.params.StreamConfigurationMap }.
* The duration is capped to <code>max(duration, exposureTime + overhead)</code>.</p>
- * <p><b>Optional</b> - This value may be {@code null} on some devices.</p>
+ * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p>
* <p><b>Full capability</b> -
* Present on all camera devices that report being {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL_FULL HARDWARE_LEVEL_FULL} devices in the
* {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL android.info.supportedHardwareLevel} key</p>
@@ -3357,6 +3410,7 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> {
* @see CameraCharacteristics#SENSOR_INFO_MAX_FRAME_DURATION
*/
@PublicKey
+ @NonNull
public static final Key<Long> SENSOR_FRAME_DURATION =
new Key<Long>("android.sensor.frameDuration", long.class);
@@ -3377,7 +3431,7 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> {
* <p><b>Units</b>: ISO arithmetic units</p>
* <p><b>Range of valid values:</b><br>
* {@link CameraCharacteristics#SENSOR_INFO_SENSITIVITY_RANGE android.sensor.info.sensitivityRange}</p>
- * <p><b>Optional</b> - This value may be {@code null} on some devices.</p>
+ * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p>
* <p><b>Full capability</b> -
* Present on all camera devices that report being {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL_FULL HARDWARE_LEVEL_FULL} devices in the
* {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL android.info.supportedHardwareLevel} key</p>
@@ -3389,6 +3443,7 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> {
* @see CameraCharacteristics#SENSOR_MAX_ANALOG_SENSITIVITY
*/
@PublicKey
+ @NonNull
public static final Key<Integer> SENSOR_SENSITIVITY =
new Key<Integer>("android.sensor.sensitivity", int.class);
@@ -3419,6 +3474,7 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> {
* @see CameraCharacteristics#SENSOR_INFO_TIMESTAMP_SOURCE
*/
@PublicKey
+ @NonNull
public static final Key<Long> SENSOR_TIMESTAMP =
new Key<Long>("android.sensor.timestamp", long.class);
@@ -3433,9 +3489,10 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> {
* <p>The order of the values is R, G, B; where R is in the lowest index.</p>
* <p>Starting from Android Q, this key will not be present for a MONOCHROME camera, even if
* the camera device has RAW capability.</p>
- * <p><b>Optional</b> - This value may be {@code null} on some devices.</p>
+ * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p>
*/
@PublicKey
+ @NonNull
public static final Key<Rational[]> SENSOR_NEUTRAL_COLOR_POINT =
new Key<Rational[]>("android.sensor.neutralColorPoint", Rational[].class);
@@ -3460,11 +3517,12 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> {
* Adobe DNG specification for the NoiseProfile tag.</p>
* <p>For a MONOCHROME camera, there is only one color channel. So the noise model coefficients
* will only contain one S and one O.</p>
- * <p><b>Optional</b> - This value may be {@code null} on some devices.</p>
+ * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p>
*
* @see CameraCharacteristics#SENSOR_INFO_COLOR_FILTER_ARRANGEMENT
*/
@PublicKey
+ @NonNull
public static final Key<android.util.Pair<Double,Double>[]> SENSOR_NOISE_PROFILE =
new Key<android.util.Pair<Double,Double>[]>("android.sensor.noiseProfile", new TypeReference<android.util.Pair<Double,Double>[]>() {{ }});
@@ -3504,9 +3562,10 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> {
* the camera device has RAW capability.</p>
* <p><b>Range of valid values:</b><br></p>
* <p>&gt;= 0</p>
- * <p><b>Optional</b> - This value may be {@code null} on some devices.</p>
+ * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p>
*/
@PublicKey
+ @NonNull
public static final Key<Float> SENSOR_GREEN_SPLIT =
new Key<Float>("android.sensor.greenSplit", float.class);
@@ -3519,11 +3578,12 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> {
* output.</p>
* <p>For example, a sensor with RAW10 Bayer output would use the
* 10 most significant bits from each color channel.</p>
- * <p><b>Optional</b> - This value may be {@code null} on some devices.</p>
+ * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p>
*
* @see CaptureRequest#SENSOR_TEST_PATTERN_MODE
*/
@PublicKey
+ @NonNull
public static final Key<int[]> SENSOR_TEST_PATTERN_DATA =
new Key<int[]>("android.sensor.testPatternData", int[].class);
@@ -3548,7 +3608,7 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> {
* </ul></p>
* <p><b>Available values for this device:</b><br>
* {@link CameraCharacteristics#SENSOR_AVAILABLE_TEST_PATTERN_MODES android.sensor.availableTestPatternModes}</p>
- * <p><b>Optional</b> - This value may be {@code null} on some devices.</p>
+ * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p>
*
* @see CameraCharacteristics#SENSOR_AVAILABLE_TEST_PATTERN_MODES
* @see #SENSOR_TEST_PATTERN_MODE_OFF
@@ -3559,6 +3619,7 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> {
* @see #SENSOR_TEST_PATTERN_MODE_CUSTOM1
*/
@PublicKey
+ @NonNull
public static final Key<Integer> SENSOR_TEST_PATTERN_MODE =
new Key<Integer>("android.sensor.testPatternMode", int.class);
@@ -3575,7 +3636,7 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> {
* <p><b>Range of valid values:</b><br>
* &gt;= 0 and &lt;
* {@link android.hardware.camera2.params.StreamConfigurationMap#getOutputMinFrameDuration }.</p>
- * <p><b>Optional</b> - This value may be {@code null} on some devices.</p>
+ * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p>
* <p><b>Limited capability</b> -
* Present on all camera devices that report being at least {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL_LIMITED HARDWARE_LEVEL_LIMITED} devices in the
* {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL android.info.supportedHardwareLevel} key</p>
@@ -3584,6 +3645,7 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> {
* @see CameraCharacteristics#SENSOR_INFO_ACTIVE_ARRAY_SIZE
*/
@PublicKey
+ @NonNull
public static final Key<Long> SENSOR_ROLLING_SHUTTER_SKEW =
new Key<Long>("android.sensor.rollingShutterSkew", long.class);
@@ -3617,7 +3679,7 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> {
* camera device advertises this key via {@link android.hardware.camera2.CameraCharacteristics#getAvailableCaptureResultKeys }.</p>
* <p><b>Range of valid values:</b><br>
* &gt;= 0 for each.</p>
- * <p><b>Optional</b> - This value may be {@code null} on some devices.</p>
+ * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p>
*
* @see CameraCharacteristics#SENSOR_BLACK_LEVEL_PATTERN
* @see CameraCharacteristics#SENSOR_INFO_COLOR_FILTER_ARRANGEMENT
@@ -3625,6 +3687,7 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> {
* @see CaptureRequest#SENSOR_SENSITIVITY
*/
@PublicKey
+ @NonNull
public static final Key<float[]> SENSOR_DYNAMIC_BLACK_LEVEL =
new Key<float[]>("android.sensor.dynamicBlackLevel", float[].class);
@@ -3640,7 +3703,7 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> {
* {@link android.hardware.camera2.CameraCharacteristics#getAvailableCaptureRequestKeys }.</p>
* <p><b>Range of valid values:</b><br>
* &gt;= 0</p>
- * <p><b>Optional</b> - This value may be {@code null} on some devices.</p>
+ * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p>
*
* @see CameraCharacteristics#SENSOR_BLACK_LEVEL_PATTERN
* @see CameraCharacteristics#SENSOR_INFO_WHITE_LEVEL
@@ -3648,6 +3711,7 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> {
* @see CaptureRequest#SENSOR_SENSITIVITY
*/
@PublicKey
+ @NonNull
public static final Key<Integer> SENSOR_DYNAMIC_WHITE_LEVEL =
new Key<Integer>("android.sensor.dynamicWhiteLevel", int.class);
@@ -3685,7 +3749,7 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> {
* </ul></p>
* <p><b>Available values for this device:</b><br>
* {@link CameraCharacteristics#SHADING_AVAILABLE_MODES android.shading.availableModes}</p>
- * <p><b>Optional</b> - This value may be {@code null} on some devices.</p>
+ * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p>
* <p><b>Full capability</b> -
* Present on all camera devices that report being {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL_FULL HARDWARE_LEVEL_FULL} devices in the
* {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL android.info.supportedHardwareLevel} key</p>
@@ -3701,6 +3765,7 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> {
* @see #SHADING_MODE_HIGH_QUALITY
*/
@PublicKey
+ @NonNull
public static final Key<Integer> SHADING_MODE =
new Key<Integer>("android.shading.mode", int.class);
@@ -3726,6 +3791,7 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> {
* @see #STATISTICS_FACE_DETECT_MODE_FULL
*/
@PublicKey
+ @NonNull
public static final Key<Integer> STATISTICS_FACE_DETECT_MODE =
new Key<Integer>("android.statistics.faceDetectMode", int.class);
@@ -3818,6 +3884,7 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> {
* @see CaptureRequest#STATISTICS_FACE_DETECT_MODE
*/
@PublicKey
+ @NonNull
@SyntheticKey
public static final Key<android.hardware.camera2.params.Face[]> STATISTICS_FACES =
new Key<android.hardware.camera2.params.Face[]>("android.statistics.faces", android.hardware.camera2.params.Face[].class);
@@ -3886,7 +3953,7 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> {
* </code></pre>
* <p><b>Range of valid values:</b><br>
* Each gain factor is &gt;= 1</p>
- * <p><b>Optional</b> - This value may be {@code null} on some devices.</p>
+ * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p>
* <p><b>Full capability</b> -
* Present on all camera devices that report being {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL_FULL HARDWARE_LEVEL_FULL} devices in the
* {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL android.info.supportedHardwareLevel} key</p>
@@ -3896,6 +3963,7 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> {
* @see CameraCharacteristics#SENSOR_INFO_LENS_SHADING_APPLIED
*/
@PublicKey
+ @NonNull
public static final Key<android.hardware.camera2.params.LensShadingMap> STATISTICS_LENS_SHADING_CORRECTION_MAP =
new Key<android.hardware.camera2.params.LensShadingMap>("android.statistics.lensShadingCorrectionMap", android.hardware.camera2.params.LensShadingMap.class);
@@ -3976,7 +4044,7 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> {
* formats.</p>
* <p><b>Range of valid values:</b><br>
* Each gain factor is &gt;= 1</p>
- * <p><b>Optional</b> - This value may be {@code null} on some devices.</p>
+ * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p>
* <p><b>Full capability</b> -
* Present on all camera devices that report being {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL_FULL HARDWARE_LEVEL_FULL} devices in the
* {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL android.info.supportedHardwareLevel} key</p>
@@ -4001,7 +4069,7 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> {
* see {@link CaptureRequest#COLOR_CORRECTION_GAINS android.colorCorrection.gains} for details.</p>
* <p>This value should always be calculated by the auto-white balance (AWB) block,
* regardless of the android.control.* current values.</p>
- * <p><b>Optional</b> - This value may be {@code null} on some devices.</p>
+ * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p>
*
* @see CaptureRequest#COLOR_CORRECTION_GAINS
* @deprecated
@@ -4029,7 +4097,7 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> {
* capture settings and color transforms are set by the application.</p>
* <p>This value should always be calculated by the auto-white balance (AWB) block,
* regardless of the android.control.* current values.</p>
- * <p><b>Optional</b> - This value may be {@code null} on some devices.</p>
+ * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p>
* @deprecated
* <p>Never fully implemented or specified; do not use</p>
@@ -4061,7 +4129,7 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> {
* <li>{@link #STATISTICS_SCENE_FLICKER_50HZ 50HZ}</li>
* <li>{@link #STATISTICS_SCENE_FLICKER_60HZ 60HZ}</li>
* </ul></p>
- * <p><b>Optional</b> - This value may be {@code null} on some devices.</p>
+ * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p>
* <p><b>Full capability</b> -
* Present on all camera devices that report being {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL_FULL HARDWARE_LEVEL_FULL} devices in the
* {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL android.info.supportedHardwareLevel} key</p>
@@ -4075,6 +4143,7 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> {
* @see #STATISTICS_SCENE_FLICKER_60HZ
*/
@PublicKey
+ @NonNull
public static final Key<Integer> STATISTICS_SCENE_FLICKER =
new Key<Integer>("android.statistics.sceneFlicker", int.class);
@@ -4084,12 +4153,13 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> {
* If set to <code>false</code>, no hot pixel map will be returned.</p>
* <p><b>Range of valid values:</b><br>
* {@link CameraCharacteristics#STATISTICS_INFO_AVAILABLE_HOT_PIXEL_MAP_MODES android.statistics.info.availableHotPixelMapModes}</p>
- * <p><b>Optional</b> - This value may be {@code null} on some devices.</p>
+ * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p>
*
* @see CaptureResult#STATISTICS_HOT_PIXEL_MAP
* @see CameraCharacteristics#STATISTICS_INFO_AVAILABLE_HOT_PIXEL_MAP_MODES
*/
@PublicKey
+ @NonNull
public static final Key<Boolean> STATISTICS_HOT_PIXEL_MAP_MODE =
new Key<Boolean>("android.statistics.hotPixelMapMode", boolean.class);
@@ -4105,12 +4175,13 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> {
* <p>n &lt;= number of pixels on the sensor.
* The <code>(x, y)</code> coordinates must be bounded by
* {@link CameraCharacteristics#SENSOR_INFO_PIXEL_ARRAY_SIZE android.sensor.info.pixelArraySize}.</p>
- * <p><b>Optional</b> - This value may be {@code null} on some devices.</p>
+ * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p>
*
* @see CameraCharacteristics#SENSOR_INFO_ACTIVE_ARRAY_SIZE
* @see CameraCharacteristics#SENSOR_INFO_PIXEL_ARRAY_SIZE
*/
@PublicKey
+ @NonNull
public static final Key<android.graphics.Point[]> STATISTICS_HOT_PIXEL_MAP =
new Key<android.graphics.Point[]>("android.statistics.hotPixelMap", android.graphics.Point[].class);
@@ -4128,7 +4199,7 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> {
* </ul></p>
* <p><b>Available values for this device:</b><br>
* {@link CameraCharacteristics#STATISTICS_INFO_AVAILABLE_LENS_SHADING_MAP_MODES android.statistics.info.availableLensShadingMapModes}</p>
- * <p><b>Optional</b> - This value may be {@code null} on some devices.</p>
+ * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p>
* <p><b>Full capability</b> -
* Present on all camera devices that report being {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL_FULL HARDWARE_LEVEL_FULL} devices in the
* {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL android.info.supportedHardwareLevel} key</p>
@@ -4139,6 +4210,7 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> {
* @see #STATISTICS_LENS_SHADING_MAP_MODE_ON
*/
@PublicKey
+ @NonNull
public static final Key<Integer> STATISTICS_LENS_SHADING_MAP_MODE =
new Key<Integer>("android.statistics.lensShadingMapMode", int.class);
@@ -4158,13 +4230,14 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> {
* </ul></p>
* <p><b>Available values for this device:</b><br>
* {@link CameraCharacteristics#STATISTICS_INFO_AVAILABLE_OIS_DATA_MODES android.statistics.info.availableOisDataModes}</p>
- * <p><b>Optional</b> - This value may be {@code null} on some devices.</p>
+ * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p>
*
* @see CameraCharacteristics#STATISTICS_INFO_AVAILABLE_OIS_DATA_MODES
* @see #STATISTICS_OIS_DATA_MODE_OFF
* @see #STATISTICS_OIS_DATA_MODE_ON
*/
@PublicKey
+ @NonNull
public static final Key<Integer> STATISTICS_OIS_DATA_MODE =
new Key<Integer>("android.statistics.oisDataMode", int.class);
@@ -4173,7 +4246,7 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> {
* <p>The array contains the timestamps of OIS samples. The timestamps are in the same
* timebase as and comparable to {@link CaptureResult#SENSOR_TIMESTAMP android.sensor.timestamp}.</p>
* <p><b>Units</b>: nanoseconds</p>
- * <p><b>Optional</b> - This value may be {@code null} on some devices.</p>
+ * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p>
*
* @see CaptureResult#SENSOR_TIMESTAMP
* @hide
@@ -4194,7 +4267,7 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> {
* since the scaling of OIS shifts would depend on the specific spot on the sensor the shift
* is needed.</p>
* <p><b>Units</b>: Pixels in active array.</p>
- * <p><b>Optional</b> - This value may be {@code null} on some devices.</p>
+ * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p>
* @hide
*/
public static final Key<float[]> STATISTICS_OIS_X_SHIFTS =
@@ -4213,7 +4286,7 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> {
* since the scaling of OIS shifts would depend on the specific spot on the sensor the shift
* is needed.</p>
* <p><b>Units</b>: Pixels in active array.</p>
- * <p><b>Optional</b> - This value may be {@code null} on some devices.</p>
+ * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p>
* @hide
*/
public static final Key<float[]> STATISTICS_OIS_Y_SHIFTS =
@@ -4235,9 +4308,10 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> {
* supporting devices). They are always reported in pre-correction active array coordinates,
* since the scaling of OIS shifts would depend on the specific spot on the sensor the shift
* is needed.</p>
- * <p><b>Optional</b> - This value may be {@code null} on some devices.</p>
+ * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p>
*/
@PublicKey
+ @NonNull
@SyntheticKey
public static final Key<android.hardware.camera2.params.OisSample[]> STATISTICS_OIS_SAMPLES =
new Key<android.hardware.camera2.params.OisSample[]>("android.statistics.oisSamples", android.hardware.camera2.params.OisSample[].class);
@@ -4247,7 +4321,7 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> {
* channel, to use when {@link CaptureRequest#TONEMAP_MODE android.tonemap.mode} is
* CONTRAST_CURVE.</p>
* <p>See android.tonemap.curveRed for more details.</p>
- * <p><b>Optional</b> - This value may be {@code null} on some devices.</p>
+ * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p>
* <p><b>Full capability</b> -
* Present on all camera devices that report being {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL_FULL HARDWARE_LEVEL_FULL} devices in the
* {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL android.info.supportedHardwareLevel} key</p>
@@ -4264,7 +4338,7 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> {
* channel, to use when {@link CaptureRequest#TONEMAP_MODE android.tonemap.mode} is
* CONTRAST_CURVE.</p>
* <p>See android.tonemap.curveRed for more details.</p>
- * <p><b>Optional</b> - This value may be {@code null} on some devices.</p>
+ * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p>
* <p><b>Full capability</b> -
* Present on all camera devices that report being {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL_FULL HARDWARE_LEVEL_FULL} devices in the
* {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL android.info.supportedHardwareLevel} key</p>
@@ -4325,7 +4399,7 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> {
* <p><b>Range of valid values:</b><br>
* 0-1 on both input and output coordinates, normalized
* as a floating-point value such that 0 == black and 1 == white.</p>
- * <p><b>Optional</b> - This value may be {@code null} on some devices.</p>
+ * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p>
* <p><b>Full capability</b> -
* Present on all camera devices that report being {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL_FULL HARDWARE_LEVEL_FULL} devices in the
* {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL android.info.supportedHardwareLevel} key</p>
@@ -4386,7 +4460,7 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> {
* (0.8000, 0.9063), (0.8667, 0.9389), (0.9333, 0.9701), (1.0000, 1.0000) ]
* </code></pre>
* <p><img alt="sRGB tonemapping curve" src="/reference/images/camera2/metadata/android.tonemap.curveRed/srgb_tonemap.png" /></p>
- * <p><b>Optional</b> - This value may be {@code null} on some devices.</p>
+ * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p>
* <p><b>Full capability</b> -
* Present on all camera devices that report being {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL_FULL HARDWARE_LEVEL_FULL} devices in the
* {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL android.info.supportedHardwareLevel} key</p>
@@ -4396,6 +4470,7 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> {
* @see CaptureRequest#TONEMAP_MODE
*/
@PublicKey
+ @NonNull
@SyntheticKey
public static final Key<android.hardware.camera2.params.TonemapCurve> TONEMAP_CURVE =
new Key<android.hardware.camera2.params.TonemapCurve>("android.tonemap.curve", android.hardware.camera2.params.TonemapCurve.class);
@@ -4430,7 +4505,7 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> {
* </ul></p>
* <p><b>Available values for this device:</b><br>
* {@link CameraCharacteristics#TONEMAP_AVAILABLE_TONE_MAP_MODES android.tonemap.availableToneMapModes}</p>
- * <p><b>Optional</b> - This value may be {@code null} on some devices.</p>
+ * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p>
* <p><b>Full capability</b> -
* Present on all camera devices that report being {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL_FULL HARDWARE_LEVEL_FULL} devices in the
* {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL android.info.supportedHardwareLevel} key</p>
@@ -4446,6 +4521,7 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> {
* @see #TONEMAP_MODE_PRESET_CURVE
*/
@PublicKey
+ @NonNull
public static final Key<Integer> TONEMAP_MODE =
new Key<Integer>("android.tonemap.mode", int.class);
@@ -4462,11 +4538,12 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> {
* value will be returned in capture result.</p>
* <p>The valid range of gamma value varies on different devices, but values
* within [1.0, 5.0] are guaranteed not to be clipped.</p>
- * <p><b>Optional</b> - This value may be {@code null} on some devices.</p>
+ * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p>
*
* @see CaptureRequest#TONEMAP_MODE
*/
@PublicKey
+ @NonNull
public static final Key<Float> TONEMAP_GAMMA =
new Key<Float>("android.tonemap.gamma", float.class);
@@ -4485,13 +4562,14 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> {
* <li>{@link #TONEMAP_PRESET_CURVE_SRGB SRGB}</li>
* <li>{@link #TONEMAP_PRESET_CURVE_REC709 REC709}</li>
* </ul></p>
- * <p><b>Optional</b> - This value may be {@code null} on some devices.</p>
+ * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p>
*
* @see CaptureRequest#TONEMAP_MODE
* @see #TONEMAP_PRESET_CURVE_SRGB
* @see #TONEMAP_PRESET_CURVE_REC709
*/
@PublicKey
+ @NonNull
public static final Key<Integer> TONEMAP_PRESET_CURVE =
new Key<Integer>("android.tonemap.presetCurve", int.class);
@@ -4506,7 +4584,7 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> {
* data is stored locally on the device.</p>
* <p>The LED <em>may</em> be off if a trusted application is using the data that
* doesn't violate the above rules.</p>
- * <p><b>Optional</b> - This value may be {@code null} on some devices.</p>
+ * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p>
* @hide
*/
public static final Key<Boolean> LED_TRANSMIT =
@@ -4519,7 +4597,7 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> {
* ON if {@link CaptureRequest#BLACK_LEVEL_LOCK android.blackLevel.lock} was ON in the capture request, unless
* a change in other capture settings forced the camera device to
* perform a black level reset.</p>
- * <p><b>Optional</b> - This value may be {@code null} on some devices.</p>
+ * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p>
* <p><b>Full capability</b> -
* Present on all camera devices that report being {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL_FULL HARDWARE_LEVEL_FULL} devices in the
* {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL android.info.supportedHardwareLevel} key</p>
@@ -4528,6 +4606,7 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> {
* @see CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL
*/
@PublicKey
+ @NonNull
public static final Key<Boolean> BLACK_LEVEL_LOCK =
new Key<Boolean>("android.blackLevel.lock", boolean.class);
@@ -4637,7 +4716,7 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> {
* <p><b>Units</b>: Relative exposure time increase factor.</p>
* <p><b>Range of valid values:</b><br>
* &gt;= 1.0</p>
- * <p><b>Optional</b> - This value may be {@code null} on some devices.</p>
+ * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p>
* <p><b>Limited capability</b> -
* Present on all camera devices that report being at least {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL_LIMITED HARDWARE_LEVEL_LIMITED} devices in the
* {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL android.info.supportedHardwareLevel} key</p>
@@ -4648,6 +4727,7 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> {
* @see CameraCharacteristics#REQUEST_AVAILABLE_CAPABILITIES
*/
@PublicKey
+ @NonNull
public static final Key<Float> REPROCESS_EFFECTIVE_EXPOSURE_FACTOR =
new Key<Float>("android.reprocess.effectiveExposureFactor", float.class);
@@ -4662,9 +4742,10 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> {
* cameras when application changes FOCAL_LENGTH or SCALER_CROP_REGION.
* At the time of lens switch, this result metadata reflects the new active physical camera
* ID.</p>
- * <p><b>Optional</b> - This value may be {@code null} on some devices.</p>
+ * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p>
*/
@PublicKey
+ @NonNull
public static final Key<String> LOGICAL_MULTI_CAMERA_ACTIVE_PHYSICAL_ID =
new Key<String>("android.logicalMultiCamera.activePhysicalId", String.class);
@@ -4711,7 +4792,7 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> {
* </ul></p>
* <p><b>Available values for this device:</b><br>
* {@link CameraCharacteristics#DISTORTION_CORRECTION_AVAILABLE_MODES android.distortionCorrection.availableModes}</p>
- * <p><b>Optional</b> - This value may be {@code null} on some devices.</p>
+ * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p>
*
* @see CaptureRequest#CONTROL_AE_REGIONS
* @see CaptureRequest#CONTROL_AF_REGIONS
@@ -4727,6 +4808,7 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> {
* @see #DISTORTION_CORRECTION_MODE_HIGH_QUALITY
*/
@PublicKey
+ @NonNull
public static final Key<Integer> DISTORTION_CORRECTION_MODE =
new Key<Integer>("android.distortionCorrection.mode", int.class);
@@ -4736,4 +4818,7 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> {
+
+
+
}
diff --git a/core/java/android/hardware/display/BrightnessConfiguration.java b/core/java/android/hardware/display/BrightnessConfiguration.java
index ed8a97c7e263..316c0c61e808 100644
--- a/core/java/android/hardware/display/BrightnessConfiguration.java
+++ b/core/java/android/hardware/display/BrightnessConfiguration.java
@@ -444,6 +444,7 @@ public final class BrightnessConfiguration implements Parcelable {
* {@link #getMaxCorrectionsByPackageName}).
*
*/
+ @NonNull
public Builder addCorrectionByPackageName(@NonNull String packageName,
@NonNull BrightnessCorrection correction) {
Objects.requireNonNull(packageName, "packageName must not be null");
@@ -472,6 +473,7 @@ public final class BrightnessConfiguration implements Parcelable {
* {@link #getMaxCorrectionsByCategory}).
*
*/
+ @NonNull
public Builder addCorrectionByCategory(@ApplicationInfo.Category int category,
@NonNull BrightnessCorrection correction) {
Objects.requireNonNull(correction, "correction must not be null");
@@ -488,6 +490,7 @@ public final class BrightnessConfiguration implements Parcelable {
* @param description brief text describing the curve pushed. It maybe truncated
* and will not be displayed in the UI
*/
+ @NonNull
public Builder setDescription(@Nullable String description) {
mDescription = description;
return this;
@@ -496,6 +499,7 @@ public final class BrightnessConfiguration implements Parcelable {
/**
* Builds the {@link BrightnessConfiguration}.
*/
+ @NonNull
public BrightnessConfiguration build() {
if (mCurveLux == null || mCurveNits == null) {
throw new IllegalStateException("A curve must be set!");
diff --git a/core/java/android/hardware/display/IDisplayManager.aidl b/core/java/android/hardware/display/IDisplayManager.aidl
index 5ea8bd67ce75..edd20519bb53 100644
--- a/core/java/android/hardware/display/IDisplayManager.aidl
+++ b/core/java/android/hardware/display/IDisplayManager.aidl
@@ -30,6 +30,7 @@ import android.view.Surface;
/** @hide */
interface IDisplayManager {
+ @UnsupportedAppUsage
DisplayInfo getDisplayInfo(int displayId);
int[] getDisplayIds();
diff --git a/core/java/android/hardware/input/IInputManager.aidl b/core/java/android/hardware/input/IInputManager.aidl
index 64448fd98bf3..2923bbf14c30 100644
--- a/core/java/android/hardware/input/IInputManager.aidl
+++ b/core/java/android/hardware/input/IInputManager.aidl
@@ -45,6 +45,7 @@ interface IInputManager {
// Injects an input event into the system. To inject into windows owned by other
// applications, the caller must have the INJECT_EVENTS permission.
+ @UnsupportedAppUsage
boolean injectInputEvent(in InputEvent ev, int mode);
// Calibrate input device position
diff --git a/core/java/android/hardware/location/IActivityRecognitionHardwareClient.aidl b/core/java/android/hardware/location/IActivityRecognitionHardwareClient.aidl
index 3fe645c59a30..2dfaf601c6f5 100644
--- a/core/java/android/hardware/location/IActivityRecognitionHardwareClient.aidl
+++ b/core/java/android/hardware/location/IActivityRecognitionHardwareClient.aidl
@@ -32,5 +32,6 @@ oneway interface IActivityRecognitionHardwareClient {
* @param isSupported whether the platform has hardware support for the feature
* @param instance the available instance to provide access to the feature
*/
+ @UnsupportedAppUsage
void onAvailabilityChanged(in boolean isSupported, in IActivityRecognitionHardware instance);
}
diff --git a/core/java/android/net/ConnectivityManager.java b/core/java/android/net/ConnectivityManager.java
index c1bce5e52a8d..64ed32266217 100644
--- a/core/java/android/net/ConnectivityManager.java
+++ b/core/java/android/net/ConnectivityManager.java
@@ -3684,7 +3684,8 @@ public class ConnectivityManager {
/**
* Registers to receive notifications about all networks which satisfy the given
* {@link NetworkRequest}. The callbacks will continue to be called until
- * either the application exits or link #unregisterNetworkCallback(NetworkCallback)} is called.
+ * either the application exits or {@link #unregisterNetworkCallback(NetworkCallback)} is
+ * called.
*
* @param request {@link NetworkRequest} describing this request.
* @param networkCallback The {@link NetworkCallback} that the system will call as suitable
@@ -3700,7 +3701,8 @@ public class ConnectivityManager {
/**
* Registers to receive notifications about all networks which satisfy the given
* {@link NetworkRequest}. The callbacks will continue to be called until
- * either the application exits or link #unregisterNetworkCallback(NetworkCallback)} is called.
+ * either the application exits or {@link #unregisterNetworkCallback(NetworkCallback)} is
+ * called.
*
* @param request {@link NetworkRequest} describing this request.
* @param networkCallback The {@link NetworkCallback} that the system will call as suitable
diff --git a/core/java/android/net/IConnectivityManager.aidl b/core/java/android/net/IConnectivityManager.aidl
index 87c62d2f10a7..6728712fe686 100644
--- a/core/java/android/net/IConnectivityManager.aidl
+++ b/core/java/android/net/IConnectivityManager.aidl
@@ -47,10 +47,12 @@ interface IConnectivityManager
{
Network getActiveNetwork();
Network getActiveNetworkForUid(int uid, boolean ignoreBlocked);
+ @UnsupportedAppUsage
NetworkInfo getActiveNetworkInfo();
NetworkInfo getActiveNetworkInfoForUid(int uid, boolean ignoreBlocked);
NetworkInfo getNetworkInfo(int networkType);
NetworkInfo getNetworkInfoForUid(in Network network, int uid, boolean ignoreBlocked);
+ @UnsupportedAppUsage
NetworkInfo[] getAllNetworkInfo();
Network getNetworkForType(int networkType);
Network[] getAllNetworks();
@@ -58,12 +60,14 @@ interface IConnectivityManager
boolean isNetworkSupported(int networkType);
+ @UnsupportedAppUsage
LinkProperties getActiveLinkProperties();
LinkProperties getLinkPropertiesForType(int networkType);
LinkProperties getLinkProperties(in Network network);
NetworkCapabilities getNetworkCapabilities(in Network network);
+ @UnsupportedAppUsage
NetworkState[] getAllNetworkState();
NetworkQuotaInfo getActiveNetworkQuotaInfo();
@@ -75,6 +79,7 @@ interface IConnectivityManager
int untether(String iface, String callerPkg);
+ @UnsupportedAppUsage
int getLastTetherError(String iface);
boolean isTetheringSupported(String callerPkg);
@@ -84,16 +89,21 @@ interface IConnectivityManager
void stopTethering(int type, String callerPkg);
+ @UnsupportedAppUsage
String[] getTetherableIfaces();
+ @UnsupportedAppUsage
String[] getTetheredIfaces();
+ @UnsupportedAppUsage
String[] getTetheringErroredIfaces();
String[] getTetheredDhcpRanges();
+ @UnsupportedAppUsage
String[] getTetherableUsbRegexs();
+ @UnsupportedAppUsage
String[] getTetherableWifiRegexs();
String[] getTetherableBluetoothRegexs();
@@ -118,12 +128,11 @@ interface IConnectivityManager
VpnConfig getVpnConfig(int userId);
+ @UnsupportedAppUsage
void startLegacyVpn(in VpnProfile profile);
LegacyVpnInfo getLegacyVpnInfo(int userId);
- VpnInfo[] getAllVpnInfo();
-
boolean updateLockdownVpn();
boolean isAlwaysOnVpnPackageSupported(int userId, String packageName);
boolean setAlwaysOnVpnPackage(int userId, String packageName, boolean lockdown,
diff --git a/core/java/android/net/INetworkPolicyManager.aidl b/core/java/android/net/INetworkPolicyManager.aidl
index e92302a939d8..385cb1d68b57 100644
--- a/core/java/android/net/INetworkPolicyManager.aidl
+++ b/core/java/android/net/INetworkPolicyManager.aidl
@@ -31,9 +31,11 @@ import android.telephony.SubscriptionPlan;
interface INetworkPolicyManager {
/** Control UID policies. */
+ @UnsupportedAppUsage
void setUidPolicy(int uid, int policy);
void addUidPolicy(int uid, int policy);
void removeUidPolicy(int uid, int policy);
+ @UnsupportedAppUsage
int getUidPolicy(int uid);
int[] getUidsWithPolicy(int policy);
@@ -41,14 +43,18 @@ interface INetworkPolicyManager {
void unregisterListener(INetworkPolicyListener listener);
/** Control network policies atomically. */
+ @UnsupportedAppUsage
void setNetworkPolicies(in NetworkPolicy[] policies);
NetworkPolicy[] getNetworkPolicies(String callingPackage);
/** Snooze limit on policy matching given template. */
+ @UnsupportedAppUsage
void snoozeLimit(in NetworkTemplate template);
/** Control if background data is restricted system-wide. */
+ @UnsupportedAppUsage
void setRestrictBackground(boolean restrictBackground);
+ @UnsupportedAppUsage
boolean getRestrictBackground();
/** Callback used to change internal state on tethering */
@@ -64,6 +70,7 @@ interface INetworkPolicyManager {
void setDeviceIdleMode(boolean enabled);
void setWifiMeteredOverride(String networkId, int meteredOverride);
+ @UnsupportedAppUsage
NetworkQuotaInfo getNetworkQuotaInfo(in NetworkState state);
SubscriptionPlan[] getSubscriptionPlans(int subId, String callingPackage);
diff --git a/core/java/android/net/INetworkStatsService.aidl b/core/java/android/net/INetworkStatsService.aidl
index 8e6f27238846..41efc5040885 100644
--- a/core/java/android/net/INetworkStatsService.aidl
+++ b/core/java/android/net/INetworkStatsService.aidl
@@ -19,16 +19,19 @@ package android.net;
import android.net.DataUsageRequest;
import android.net.INetworkStatsSession;
import android.net.Network;
+import android.net.NetworkState;
import android.net.NetworkStats;
import android.net.NetworkStatsHistory;
import android.net.NetworkTemplate;
import android.os.IBinder;
import android.os.Messenger;
+import com.android.internal.net.VpnInfo;
/** {@hide} */
interface INetworkStatsService {
/** Start a statistics query session. */
+ @UnsupportedAppUsage
INetworkStatsSession openSession();
/** Start a statistics query session. If calling package is profile or device owner then it is
@@ -37,9 +40,11 @@ interface INetworkStatsService {
* PACKAGE_USAGE_STATS permission is always checked. If PACKAGE_USAGE_STATS is not granted
* READ_NETWORK_USAGE_STATS is checked for.
*/
+ @UnsupportedAppUsage
INetworkStatsSession openSessionForUsageStats(int flags, String callingPackage);
/** Return data layer snapshot of UID network usage. */
+ @UnsupportedAppUsage
NetworkStats getDataLayerSnapshotForUid(int uid);
/** Get a detailed snapshot of stats since boot for all UIDs.
@@ -52,14 +57,20 @@ interface INetworkStatsService {
NetworkStats getDetailedUidStats(in String[] requiredIfaces);
/** Return set of any ifaces associated with mobile networks since boot. */
+ @UnsupportedAppUsage
String[] getMobileIfaces();
/** Increment data layer count of operations performed for UID and tag. */
void incrementOperationCount(int uid, int tag, int operationCount);
/** Force update of ifaces. */
- void forceUpdateIfaces(in Network[] defaultNetworks);
+ void forceUpdateIfaces(
+ in Network[] defaultNetworks,
+ in VpnInfo[] vpnArray,
+ in NetworkState[] networkStates,
+ in String activeIface);
/** Force update of statistics. */
+ @UnsupportedAppUsage
void forceUpdate();
/** Registers a callback on data usage. */
diff --git a/core/java/android/net/INetworkStatsSession.aidl b/core/java/android/net/INetworkStatsSession.aidl
index 5229a3b3b9f6..f13f2cb664ba 100644
--- a/core/java/android/net/INetworkStatsSession.aidl
+++ b/core/java/android/net/INetworkStatsSession.aidl
@@ -27,13 +27,17 @@ interface INetworkStatsSession {
NetworkStats getDeviceSummaryForNetwork(in NetworkTemplate template, long start, long end);
/** Return network layer usage summary for traffic that matches template. */
+ @UnsupportedAppUsage
NetworkStats getSummaryForNetwork(in NetworkTemplate template, long start, long end);
/** Return historical network layer stats for traffic that matches template. */
+ @UnsupportedAppUsage
NetworkStatsHistory getHistoryForNetwork(in NetworkTemplate template, int fields);
/** Return network layer usage summary per UID for traffic that matches template. */
+ @UnsupportedAppUsage
NetworkStats getSummaryForAllUid(in NetworkTemplate template, long start, long end, boolean includeTags);
/** Return historical network layer stats for specific UID traffic that matches template. */
+ @UnsupportedAppUsage
NetworkStatsHistory getHistoryForUid(in NetworkTemplate template, int uid, int set, int tag, int fields);
/** Return historical network layer stats for specific UID traffic that matches template. */
NetworkStatsHistory getHistoryIntervalForUid(in NetworkTemplate template, int uid, int set, int tag, int fields, long start, long end);
@@ -41,6 +45,7 @@ interface INetworkStatsSession {
/** Return array of uids that have stats and are accessible to the calling user */
int[] getRelevantUids();
+ @UnsupportedAppUsage
void close();
}
diff --git a/core/java/android/nfc/INfcAdapterExtras.aidl b/core/java/android/nfc/INfcAdapterExtras.aidl
index 41ebf636c89e..dd260bc6f2f6 100644
--- a/core/java/android/nfc/INfcAdapterExtras.aidl
+++ b/core/java/android/nfc/INfcAdapterExtras.aidl
@@ -23,11 +23,18 @@ import android.os.Bundle;
* {@hide}
*/
interface INfcAdapterExtras {
+ @UnsupportedAppUsage
Bundle open(in String pkg, IBinder b);
+ @UnsupportedAppUsage
Bundle close(in String pkg, IBinder b);
+ @UnsupportedAppUsage
Bundle transceive(in String pkg, in byte[] data_in);
+ @UnsupportedAppUsage
int getCardEmulationRoute(in String pkg);
+ @UnsupportedAppUsage
void setCardEmulationRoute(in String pkg, int route);
+ @UnsupportedAppUsage
void authenticate(in String pkg, in byte[] token);
+ @UnsupportedAppUsage
String getDriverName(in String pkg);
}
diff --git a/core/java/android/os/VibrationEffect.java b/core/java/android/os/VibrationEffect.java
index 99fb608b80dc..471ae30a4058 100644
--- a/core/java/android/os/VibrationEffect.java
+++ b/core/java/android/os/VibrationEffect.java
@@ -240,7 +240,7 @@ public abstract class VibrationEffect implements Parcelable {
*
* @return The desired effect.
*/
- public static VibrationEffect createPrebaked(@EffectType int effectId) {
+ public static VibrationEffect createPredefined(@EffectType int effectId) {
return get(effectId, true);
}
diff --git a/core/java/android/os/storage/StorageManager.java b/core/java/android/os/storage/StorageManager.java
index 90a5f7660e0d..27e391423d21 100644
--- a/core/java/android/os/storage/StorageManager.java
+++ b/core/java/android/os/storage/StorageManager.java
@@ -136,6 +136,8 @@ public class StorageManager {
public static final String PROP_ISOLATED_STORAGE = "persist.sys.isolated_storage";
/** {@hide} */
public static final String PROP_ISOLATED_STORAGE_SNAPSHOT = "sys.isolated_storage_snapshot";
+ /** {@hide} */
+ public static final String PROP_LEGACY_GREYLIST = "persist.sys.legacy_greylist";
/** {@hide} */
public static final String PROP_FORCE_AUDIO = "persist.fw.force_audio";
@@ -233,6 +235,8 @@ public class StorageManager {
public static final int DEBUG_ISOLATED_STORAGE_FORCE_ON = 1 << 6;
/** {@hide} */
public static final int DEBUG_ISOLATED_STORAGE_FORCE_OFF = 1 << 7;
+ /** {@hide} */
+ public static final int DEBUG_LEGACY_GREYLIST = 1 << 8;
/** {@hide} */
public static final int FLAG_STORAGE_DE = IInstalld.FLAG_STORAGE_DE;
diff --git a/core/java/android/provider/CalendarContract.java b/core/java/android/provider/CalendarContract.java
index 3e5bd4b72513..5d34aa65937d 100644
--- a/core/java/android/provider/CalendarContract.java
+++ b/core/java/android/provider/CalendarContract.java
@@ -183,6 +183,22 @@ public final class CalendarContract {
public static final Uri CONTENT_URI = Uri.parse("content://" + AUTHORITY);
/**
+ * The content:// style URL for the top-level cross-profile calendar uris.
+ * {@link android.database.ContentObserver} for this URL in the primary profile will be
+ * notified when there is a change in the managed profile calendar provider.
+ *
+ * @see Events#ENTERPRISE_CONTENT_URI
+ * @see Calendars#ENTERPRISE_CONTENT_URI
+ * @see Instances#ENTERPRISE_CONTENT_URI
+ * @see Instances#ENTERPRISE_CONTENT_BY_DAY_URI
+ * @see Instances#ENTERPRISE_CONTENT_SEARCH_URI
+ * @see Instances#ENTERPRISE_CONTENT_SEARCH_BY_DAY_URI
+ * @hide
+ */
+ public static final Uri ENTERPRISE_CONTENT_URI = Uri.parse(
+ "content://" + AUTHORITY + "/enterprise");
+
+ /**
* An optional insert, update or delete URI parameter that allows the caller
* to specify that it is a sync adapter. The default value is false. If set
* to true, the modified row is not marked as "dirty" (needs to be synced)
diff --git a/core/java/android/provider/DeviceConfig.java b/core/java/android/provider/DeviceConfig.java
index ddb8758e18f4..fc89e2ca07e3 100644
--- a/core/java/android/provider/DeviceConfig.java
+++ b/core/java/android/provider/DeviceConfig.java
@@ -55,6 +55,15 @@ public final class DeviceConfig {
public static final Uri CONTENT_URI = Uri.parse("content://" + Settings.AUTHORITY + "/config");
/**
+ * Namespace for activity manager related features. These features will be applied
+ * immediately upon change.
+ *
+ * @hide
+ */
+ @SystemApi
+ public static final String NAMESPACE_ACTIVITY_MANAGER = "activity_manager";
+
+ /**
* Namespace for all Game Driver features.
*
* @hide
@@ -281,35 +290,6 @@ public final class DeviceConfig {
}
/**
- * Namespace for activity manager related features. These features will be applied
- * immediately upon change.
- *
- * @hide
- */
- @SystemApi
- public interface ActivityManager {
- String NAMESPACE = "activity_manager";
-
- /**
- * App compaction flags. See {@link com.android.server.am.AppCompactor}.
- */
- String KEY_USE_COMPACTION = "use_compaction";
- String KEY_COMPACT_ACTION_1 = "compact_action_1";
- String KEY_COMPACT_ACTION_2 = "compact_action_2";
- String KEY_COMPACT_THROTTLE_1 = "compact_throttle_1";
- String KEY_COMPACT_THROTTLE_2 = "compact_throttle_2";
- String KEY_COMPACT_THROTTLE_3 = "compact_throttle_3";
- String KEY_COMPACT_THROTTLE_4 = "compact_throttle_4";
- String KEY_COMPACT_STATSD_SAMPLE_RATE = "compact_statsd_sample_rate";
-
- /**
- * Maximum number of cached processes. See
- * {@link com.android.server.am.ActivityManagerConstants}.
- */
- String KEY_MAX_CACHED_PROCESSES = "max_cached_processes";
- }
-
- /**
* Namespace for {@link AttentionManagerService} related features.
*
* @hide
@@ -412,6 +392,100 @@ public final class DeviceConfig {
}
/**
+ * Look up the String value of a property for a particular namespace.
+ *
+ * @param namespace The namespace containing the property to look up.
+ * @param name The name of the property to look up.
+ * @return the corresponding value, or defaultValue if none exists.
+ * @hide
+ */
+ @SystemApi
+ @TestApi
+ @RequiresPermission(READ_DEVICE_CONFIG)
+ public static String getString(String namespace, String name, String defaultValue) {
+ String value = getProperty(namespace, name);
+ return value != null ? value : defaultValue;
+ }
+
+ /**
+ * Look up the boolean value of a property for a particular namespace.
+ *
+ * @param namespace The namespace containing the property to look up.
+ * @param name The name of the property to look up.
+ * @return the corresponding value, or defaultValue if none exists.
+ * @hide
+ */
+ @SystemApi
+ @TestApi
+ @RequiresPermission(READ_DEVICE_CONFIG)
+ public static boolean getBoolean(String namespace, String name, boolean defaultValue) {
+ String value = getProperty(namespace, name);
+ return value != null ? Boolean.parseBoolean(value) : defaultValue;
+ }
+
+ /**
+ * Look up the int value of a property for a particular namespace.
+ *
+ * @param namespace The namespace containing the property to look up.
+ * @param name The name of the property to look up.
+ * @return the corresponding value, or defaultValue if either none exists or it does not parse.
+ * @hide
+ */
+ @SystemApi
+ @TestApi
+ @RequiresPermission(READ_DEVICE_CONFIG)
+ public static int getInt(String namespace, String name, int defaultValue) {
+ String value = getProperty(namespace, name);
+ try {
+ return Integer.parseInt(value);
+ } catch (NumberFormatException e) {
+ return defaultValue;
+ }
+ }
+
+ /**
+ * Look up the long value of a property for a particular namespace.
+ *
+ * @param namespace The namespace containing the property to look up.
+ * @param name The name of the property to look up.
+ * @return the corresponding value, or defaultValue if either none exists or it does not parse.
+ * @hide
+ */
+ @SystemApi
+ @TestApi
+ @RequiresPermission(READ_DEVICE_CONFIG)
+ public static long getLong(String namespace, String name, long defaultValue) {
+ String value = getProperty(namespace, name);
+ try {
+ return Long.parseLong(value);
+ } catch (NumberFormatException e) {
+ return defaultValue;
+ }
+ }
+
+ /**
+ * Look up the float value of a property for a particular namespace.
+ *
+ * @param namespace The namespace containing the property to look up.
+ * @param name The name of the property to look up.
+ * @return the corresponding value, or defaultValue if either none exists or it does not parse.
+ * @hide
+ */
+ @SystemApi
+ @TestApi
+ @RequiresPermission(READ_DEVICE_CONFIG)
+ public static float getFloat(String namespace, String name, float defaultValue) {
+ String value = getProperty(namespace, name);
+ try {
+ return Float.parseFloat(value);
+ } catch (NumberFormatException e) {
+ return defaultValue;
+ } catch (NullPointerException e) {
+ return defaultValue;
+ }
+ }
+
+ /**
* Create a new property with the the provided name and value in the provided namespace, or
* update the value of such a property if it already exists. The same name can exist in multiple
* namespaces and might have different values in any or all namespaces.
diff --git a/core/java/android/provider/MediaStore.java b/core/java/android/provider/MediaStore.java
index 643307eb89ae..35c60981bc9d 100644
--- a/core/java/android/provider/MediaStore.java
+++ b/core/java/android/provider/MediaStore.java
@@ -529,7 +529,6 @@ public final class MediaStore {
*
* @see MediaColumns#IS_PENDING
* @see MediaStore#setIncludePending(Uri)
- * @see MediaStore#createPending(Context, PendingParams)
*/
public static @NonNull Uri setIncludePending(@NonNull Uri uri) {
return setIncludePending(uri.buildUpon()).build();
@@ -586,7 +585,9 @@ public final class MediaStore {
* @see MediaColumns#IS_PENDING
* @see MediaStore#setIncludePending(Uri)
* @see MediaStore#createPending(Context, PendingParams)
+ * @removed
*/
+ @Deprecated
public static @NonNull Uri createPending(@NonNull Context context,
@NonNull PendingParams params) {
return context.getContentResolver().insert(params.insertUri, params.insertValues);
@@ -599,14 +600,19 @@ public final class MediaStore {
*
* @param uri token which was previously returned from
* {@link #createPending(Context, PendingParams)}.
+ * @removed
*/
+ @Deprecated
public static @NonNull PendingSession openPending(@NonNull Context context, @NonNull Uri uri) {
return new PendingSession(context, uri);
}
/**
* Parameters that describe a pending media item.
+ *
+ * @removed
*/
+ @Deprecated
public static class PendingParams {
/** {@hide} */
public final Uri insertUri;
@@ -711,7 +717,10 @@ public final class MediaStore {
* expected to have a short lifetime, and owners should either
* {@link PendingSession#publish()} or {@link PendingSession#abandon()} a
* pending item within a few hours after first creating it.
+ *
+ * @removed
*/
+ @Deprecated
public static class PendingSession implements AutoCloseable {
/** {@hide} */
private final Context mContext;
@@ -976,9 +985,7 @@ public final class MediaStore {
* Flag indicating if a media item is pending, and still being inserted
* by its owner.
*
- * @see MediaColumns#IS_PENDING
* @see MediaStore#setIncludePending(Uri)
- * @see MediaStore#createPending(Context, PendingParams)
*/
@Column(Cursor.FIELD_TYPE_INTEGER)
public static final String IS_PENDING = "is_pending";
@@ -998,12 +1005,8 @@ public final class MediaStore {
/**
* The time the media item should be considered expired. Typically only
- * meaningful in the context of {@link #IS_PENDING} or
- * {@link #IS_TRASHED}.
- *
- * @removed
+ * meaningful in the context of {@link #IS_PENDING}.
*/
- @Deprecated
@CurrentTimeSecondsLong
@Column(Cursor.FIELD_TYPE_INTEGER)
public static final String DATE_EXPIRES = "date_expires";
@@ -1030,8 +1033,6 @@ public final class MediaStore {
/**
* The primary directory name this media exists under. The value may be
* {@code NULL} if the media doesn't have a primary directory name.
- *
- * @see PendingParams#setPrimaryDirectory(String)
*/
@Column(Cursor.FIELD_TYPE_STRING)
public static final String PRIMARY_DIRECTORY = "primary_directory";
@@ -1039,8 +1040,6 @@ public final class MediaStore {
/**
* The secondary directory name this media exists under. The value may
* be {@code NULL} if the media doesn't have a secondary directory name.
- *
- * @see PendingParams#setSecondaryDirectory(String)
*/
@Column(Cursor.FIELD_TYPE_STRING)
public static final String SECONDARY_DIRECTORY = "secondary_directory";
@@ -1292,12 +1291,7 @@ public final class MediaStore {
}
/**
- * Container for downloaded files.
- *
- * <p>
- * Querying for downloads from this table will return files contributed via
- * {@link PendingSession} and also ones which were downloaded using
- * {@link android.app.DownloadManager} APIs.
+ * Collection of downloaded items.
*/
public static final class Downloads implements DownloadColumns {
private Downloads() {}
@@ -1305,6 +1299,7 @@ public final class MediaStore {
/**
* The content:// style URI for the internal storage.
*/
+ @NonNull
public static final Uri INTERNAL_CONTENT_URI =
getContentUri("internal");
@@ -1312,6 +1307,7 @@ public final class MediaStore {
* The content:// style URI for the "primary" external storage
* volume.
*/
+ @NonNull
public static final Uri EXTERNAL_CONTENT_URI =
getContentUri("external");
@@ -1336,13 +1332,13 @@ public final class MediaStore {
* @param volumeName the name of the volume to get the URI for
* @return the URI to the image media table on the given volume
*/
- public static Uri getContentUri(String volumeName) {
+ public static @NonNull Uri getContentUri(@NonNull String volumeName) {
return AUTHORITY_URI.buildUpon().appendPath(volumeName)
.appendPath("downloads").build();
}
/** @hide */
- public static Uri getContentUriForPath(@NonNull String path) {
+ public static @NonNull Uri getContentUriForPath(@NonNull String path) {
return getContentUri(getVolumeName(new File(path)));
}
@@ -1620,9 +1616,9 @@ public final class MediaStore {
* @param name The name of the image
* @param description The description of the image
* @return The URL to the newly created image
- * @deprecated inserting of images should be performed through
- * {@link MediaStore#createPending(Context, PendingParams)},
- * which offers richer control over lifecycle.
+ * @deprecated inserting of images should be performed using
+ * {@link MediaColumns#IS_PENDING}, which offers richer
+ * control over lifecycle.
*/
@Deprecated
public static final String insertImage(ContentResolver cr, String imagePath,
@@ -1651,9 +1647,9 @@ public final class MediaStore {
* @param description The description of the image
* @return The URL to the newly created image, or <code>null</code> if the image failed to be stored
* for any reason.
- * @deprecated inserting of images should be performed through
- * {@link MediaStore#createPending(Context, PendingParams)},
- * which offers richer control over lifecycle.
+ * @deprecated inserting of images should be performed using
+ * {@link MediaColumns#IS_PENDING}, which offers richer
+ * control over lifecycle.
*/
@Deprecated
public static final String insertImage(ContentResolver cr, Bitmap source,
diff --git a/core/java/android/service/autofill/FillContext.java b/core/java/android/service/autofill/FillContext.java
index 535c00bc5319..5ed978eafe11 100644
--- a/core/java/android/service/autofill/FillContext.java
+++ b/core/java/android/service/autofill/FillContext.java
@@ -49,6 +49,7 @@ import java.util.LinkedList;
public final class FillContext implements Parcelable {
private final int mRequestId;
private final @NonNull AssistStructure mStructure;
+ private final @NonNull AutofillId mFocusedId;
/**
* Lookup table AutofillId->ViewNode to speed up {@link #findViewNodesByAutofillIds}
@@ -58,13 +59,15 @@ public final class FillContext implements Parcelable {
/** @hide */
- public FillContext(int requestId, @NonNull AssistStructure structure) {
+ public FillContext(int requestId, @NonNull AssistStructure structure,
+ @NonNull AutofillId autofillId) {
mRequestId = requestId;
mStructure = structure;
+ mFocusedId = autofillId;
}
private FillContext(Parcel parcel) {
- this(parcel.readInt(), parcel.readParcelable(null));
+ this(parcel.readInt(), parcel.readParcelable(null), parcel.readParcelable(null));
}
/**
@@ -82,15 +85,24 @@ public final class FillContext implements Parcelable {
/**
* @return The screen content.
*/
+ @NonNull
public AssistStructure getStructure() {
return mStructure;
}
+ /**
+ * @return the AutofillId of the view that triggered autofill.
+ */
+ @NonNull
+ public AutofillId getFocusedId() {
+ return mFocusedId;
+ }
+
@Override
public String toString() {
if (!sDebug) return super.toString();
- return "FillContext [reqId=" + mRequestId + "]";
+ return "FillContext [reqId=" + mRequestId + ", focusedId=" + mFocusedId + "]";
}
@Override
@@ -102,6 +114,7 @@ public final class FillContext implements Parcelable {
public void writeToParcel(Parcel parcel, int flags) {
parcel.writeInt(mRequestId);
parcel.writeParcelable(mStructure, flags);
+ parcel.writeParcelable(mFocusedId, flags);
}
/**
@@ -180,11 +193,13 @@ public final class FillContext implements Parcelable {
public static final Parcelable.Creator<FillContext> CREATOR =
new Parcelable.Creator<FillContext>() {
@Override
+ @NonNull
public FillContext createFromParcel(Parcel parcel) {
return new FillContext(parcel);
}
@Override
+ @NonNull
public FillContext[] newArray(int size) {
return new FillContext[size];
}
diff --git a/core/java/android/service/autofill/VisibilitySetterAction.java b/core/java/android/service/autofill/VisibilitySetterAction.java
index 9f977d79c184..81f5d38651cd 100644
--- a/core/java/android/service/autofill/VisibilitySetterAction.java
+++ b/core/java/android/service/autofill/VisibilitySetterAction.java
@@ -70,7 +70,7 @@ public final class VisibilitySetterAction extends InternalOnClickAction implemen
/**
* Builder for {@link VisibilitySetterAction} objects.
*/
- public static class Builder {
+ public static final class Builder {
private final SparseIntArray mVisibilities = new SparseIntArray();
private boolean mDestroyed;
@@ -96,6 +96,7 @@ public final class VisibilitySetterAction extends InternalOnClickAction implemen
* @throws IllegalArgumentException if visibility is not one of {@link View#VISIBLE},
* {@link View#INVISIBLE}, or {@link View#GONE}.
*/
+ @NonNull
public Builder setVisibility(@IdRes int id, @Visibility int visibility) {
throwIfDestroyed();
switch (visibility) {
@@ -111,6 +112,7 @@ public final class VisibilitySetterAction extends InternalOnClickAction implemen
/**
* Creates a new {@link VisibilitySetterAction} instance.
*/
+ @NonNull
public VisibilitySetterAction build() {
throwIfDestroyed();
mDestroyed = true;
@@ -147,6 +149,8 @@ public final class VisibilitySetterAction extends InternalOnClickAction implemen
public static final Parcelable.Creator<VisibilitySetterAction> CREATOR =
new Parcelable.Creator<VisibilitySetterAction>() {
+
+ @NonNull
@Override
public VisibilitySetterAction createFromParcel(Parcel parcel) {
// Always go through the builder to ensure the data ingested by
@@ -165,6 +169,7 @@ public final class VisibilitySetterAction extends InternalOnClickAction implemen
return builder == null ? null : builder.build();
}
+ @NonNull
@Override
public VisibilitySetterAction[] newArray(int size) {
return new VisibilitySetterAction[size];
diff --git a/core/java/android/service/autofill/augmented/FillResponse.java b/core/java/android/service/autofill/augmented/FillResponse.java
index 2ac406c5b08c..48a3c1b18334 100644
--- a/core/java/android/service/autofill/augmented/FillResponse.java
+++ b/core/java/android/service/autofill/augmented/FillResponse.java
@@ -19,9 +19,6 @@ import android.annotation.NonNull;
import android.annotation.Nullable;
import android.annotation.SystemApi;
import android.annotation.TestApi;
-import android.view.autofill.AutofillId;
-
-import java.util.List;
/**
* Response to a {@link FillRequest}.
@@ -63,6 +60,7 @@ public final class FillResponse {
*
* @return this builder
*/
+ @NonNull
public Builder setFillWindow(@NonNull FillWindow fillWindow) {
// TODO(b/123100712): check not null / unit test / throw exception if FillWindow not
// updated yet
@@ -71,19 +69,6 @@ public final class FillResponse {
}
/**
- * Tells the Android System that the given {@code ids} should not trigger further
- * {@link FillRequest requests} when focused.
- *
- * @param ids ids of the fields that should be ignored
- *
- * @return this builder
- */
- public Builder setIgnoredIds(@NonNull List<AutofillId> ids) {
- // TODO(b/123100695): implement / check not null / unit test
- return this;
- }
-
- /**
* Builds a new {@link FillResponse} instance.
*
* @throws IllegalStateException if any of the following conditions occur:
@@ -95,6 +80,7 @@ public final class FillResponse {
*
* @return A built response.
*/
+ @NonNull
public FillResponse build() {
// TODO(b/123100712): check conditions / add unit test
return new FillResponse(this);
diff --git a/core/java/android/service/carrier/CarrierMessagingClientService.java b/core/java/android/service/carrier/CarrierMessagingClientService.java
index 13f4fc4b0dcb..767c1d1a49c6 100644
--- a/core/java/android/service/carrier/CarrierMessagingClientService.java
+++ b/core/java/android/service/carrier/CarrierMessagingClientService.java
@@ -15,6 +15,8 @@
*/
package android.service.carrier;
+import android.annotation.NonNull;
+import android.annotation.Nullable;
import android.app.Service;
import android.content.ComponentName;
import android.content.Intent;
@@ -71,7 +73,8 @@ public class CarrierMessagingClientService extends Service {
}
@Override
- public final IBinder onBind(Intent intent) {
+ @NonNull
+ public final IBinder onBind(@Nullable Intent intent) {
return mImpl.asBinder();
}
diff --git a/core/java/android/service/contentcapture/SnapshotData.java b/core/java/android/service/contentcapture/SnapshotData.java
index c3af1f0cc608..58ec2fffb98a 100644
--- a/core/java/android/service/contentcapture/SnapshotData.java
+++ b/core/java/android/service/contentcapture/SnapshotData.java
@@ -60,6 +60,7 @@ public final class SnapshotData implements Parcelable {
/**
* Returns the assist data for this snapshot.
*/
+ @NonNull
public Bundle getAssistData() {
return mAssistData;
}
@@ -67,6 +68,7 @@ public final class SnapshotData implements Parcelable {
/**
* Returns the assist structure for this snapshot.
*/
+ @NonNull
public AssistStructure getAssistStructure() {
return mAssistStructure;
}
@@ -74,6 +76,7 @@ public final class SnapshotData implements Parcelable {
/**
* Returns the assist context for this snapshot.
*/
+ @Nullable
public AssistContent getAssistContent() {
return mAssistContent;
}
@@ -94,11 +97,13 @@ public final class SnapshotData implements Parcelable {
new Creator<SnapshotData>() {
@Override
+ @NonNull
public SnapshotData createFromParcel(@NonNull Parcel parcel) {
return new SnapshotData(parcel);
}
@Override
+ @NonNull
public SnapshotData[] newArray(int size) {
return new SnapshotData[size];
}
diff --git a/core/java/android/service/contentsuggestions/ContentSuggestionsService.java b/core/java/android/service/contentsuggestions/ContentSuggestionsService.java
index 333f4bec8f7e..40333bf7709e 100644
--- a/core/java/android/service/contentsuggestions/ContentSuggestionsService.java
+++ b/core/java/android/service/contentsuggestions/ContentSuggestionsService.java
@@ -60,11 +60,17 @@ public abstract class ContentSuggestionsService extends Service {
@Override
public void provideContextImage(int taskId, GraphicBuffer contextImage,
Bundle imageContextRequestExtras) {
+
+ Bitmap wrappedBuffer = null;
+ if (contextImage != null) {
+ wrappedBuffer = Bitmap.wrapHardwareBuffer(
+ HardwareBuffer.createFromGraphicBuffer(contextImage), null);
+ }
+
mHandler.sendMessage(
obtainMessage(ContentSuggestionsService::processContextImage,
ContentSuggestionsService.this, taskId,
- Bitmap.wrapHardwareBuffer(
- HardwareBuffer.createFromGraphicBuffer(contextImage), null),
+ wrappedBuffer,
imageContextRequestExtras));
}
diff --git a/core/java/android/service/euicc/IDeleteSubscriptionCallback.aidl b/core/java/android/service/euicc/IDeleteSubscriptionCallback.aidl
index 4667066df866..aff8f1b7b346 100644
--- a/core/java/android/service/euicc/IDeleteSubscriptionCallback.aidl
+++ b/core/java/android/service/euicc/IDeleteSubscriptionCallback.aidl
@@ -18,5 +18,6 @@ package android.service.euicc;
/** @hide */
oneway interface IDeleteSubscriptionCallback {
+ @UnsupportedAppUsage
void onComplete(int result);
} \ No newline at end of file
diff --git a/core/java/android/service/euicc/IEraseSubscriptionsCallback.aidl b/core/java/android/service/euicc/IEraseSubscriptionsCallback.aidl
index c975f1894aa2..34b53cc71dfb 100644
--- a/core/java/android/service/euicc/IEraseSubscriptionsCallback.aidl
+++ b/core/java/android/service/euicc/IEraseSubscriptionsCallback.aidl
@@ -18,5 +18,6 @@ package android.service.euicc;
/** @hide */
oneway interface IEraseSubscriptionsCallback {
+ @UnsupportedAppUsage
void onComplete(int result);
} \ No newline at end of file
diff --git a/core/java/android/service/euicc/IGetDefaultDownloadableSubscriptionListCallback.aidl b/core/java/android/service/euicc/IGetDefaultDownloadableSubscriptionListCallback.aidl
index 0c5a0c692cb5..ad69ef132428 100644
--- a/core/java/android/service/euicc/IGetDefaultDownloadableSubscriptionListCallback.aidl
+++ b/core/java/android/service/euicc/IGetDefaultDownloadableSubscriptionListCallback.aidl
@@ -20,5 +20,6 @@ import android.service.euicc.GetDefaultDownloadableSubscriptionListResult;
/** @hide */
oneway interface IGetDefaultDownloadableSubscriptionListCallback {
+ @UnsupportedAppUsage
void onComplete(in GetDefaultDownloadableSubscriptionListResult result);
} \ No newline at end of file
diff --git a/core/java/android/service/euicc/IGetDownloadableSubscriptionMetadataCallback.aidl b/core/java/android/service/euicc/IGetDownloadableSubscriptionMetadataCallback.aidl
index 3353061ad93e..01f187ed11e2 100644
--- a/core/java/android/service/euicc/IGetDownloadableSubscriptionMetadataCallback.aidl
+++ b/core/java/android/service/euicc/IGetDownloadableSubscriptionMetadataCallback.aidl
@@ -20,5 +20,6 @@ import android.service.euicc.GetDownloadableSubscriptionMetadataResult;
/** @hide */
oneway interface IGetDownloadableSubscriptionMetadataCallback {
+ @UnsupportedAppUsage
void onComplete(in GetDownloadableSubscriptionMetadataResult result);
} \ No newline at end of file
diff --git a/core/java/android/service/euicc/IGetEidCallback.aidl b/core/java/android/service/euicc/IGetEidCallback.aidl
index 35ee9c25a48e..e405a981c85a 100644
--- a/core/java/android/service/euicc/IGetEidCallback.aidl
+++ b/core/java/android/service/euicc/IGetEidCallback.aidl
@@ -18,5 +18,6 @@ package android.service.euicc;
/** @hide */
oneway interface IGetEidCallback {
+ @UnsupportedAppUsage
void onSuccess(String eid);
} \ No newline at end of file
diff --git a/core/java/android/service/euicc/IGetEuiccInfoCallback.aidl b/core/java/android/service/euicc/IGetEuiccInfoCallback.aidl
index 6d281487602a..c0611825ff0f 100644
--- a/core/java/android/service/euicc/IGetEuiccInfoCallback.aidl
+++ b/core/java/android/service/euicc/IGetEuiccInfoCallback.aidl
@@ -20,5 +20,6 @@ import android.telephony.euicc.EuiccInfo;
/** @hide */
oneway interface IGetEuiccInfoCallback {
+ @UnsupportedAppUsage
void onSuccess(in EuiccInfo euiccInfo);
} \ No newline at end of file
diff --git a/core/java/android/service/euicc/IGetEuiccProfileInfoListCallback.aidl b/core/java/android/service/euicc/IGetEuiccProfileInfoListCallback.aidl
index 761ec1f01324..0485f7be29d3 100644
--- a/core/java/android/service/euicc/IGetEuiccProfileInfoListCallback.aidl
+++ b/core/java/android/service/euicc/IGetEuiccProfileInfoListCallback.aidl
@@ -20,5 +20,6 @@ import android.service.euicc.GetEuiccProfileInfoListResult;
/** @hide */
oneway interface IGetEuiccProfileInfoListCallback {
+ @UnsupportedAppUsage
void onComplete(in GetEuiccProfileInfoListResult result);
} \ No newline at end of file
diff --git a/core/java/android/service/euicc/IRetainSubscriptionsForFactoryResetCallback.aidl b/core/java/android/service/euicc/IRetainSubscriptionsForFactoryResetCallback.aidl
index 127683059c02..340401fe89cb 100644
--- a/core/java/android/service/euicc/IRetainSubscriptionsForFactoryResetCallback.aidl
+++ b/core/java/android/service/euicc/IRetainSubscriptionsForFactoryResetCallback.aidl
@@ -18,5 +18,6 @@ package android.service.euicc;
/** @hide */
oneway interface IRetainSubscriptionsForFactoryResetCallback {
+ @UnsupportedAppUsage
void onComplete(int result);
} \ No newline at end of file
diff --git a/core/java/android/service/euicc/ISwitchToSubscriptionCallback.aidl b/core/java/android/service/euicc/ISwitchToSubscriptionCallback.aidl
index 0f91a6b29e26..b8f984d1c28b 100644
--- a/core/java/android/service/euicc/ISwitchToSubscriptionCallback.aidl
+++ b/core/java/android/service/euicc/ISwitchToSubscriptionCallback.aidl
@@ -18,5 +18,6 @@ package android.service.euicc;
/** @hide */
oneway interface ISwitchToSubscriptionCallback {
+ @UnsupportedAppUsage
void onComplete(int result);
} \ No newline at end of file
diff --git a/core/java/android/service/euicc/IUpdateSubscriptionNicknameCallback.aidl b/core/java/android/service/euicc/IUpdateSubscriptionNicknameCallback.aidl
index 66669330c8c0..0aa66978bb91 100644
--- a/core/java/android/service/euicc/IUpdateSubscriptionNicknameCallback.aidl
+++ b/core/java/android/service/euicc/IUpdateSubscriptionNicknameCallback.aidl
@@ -18,5 +18,6 @@ package android.service.euicc;
/** @hide */
oneway interface IUpdateSubscriptionNicknameCallback {
+ @UnsupportedAppUsage
void onComplete(int result);
} \ No newline at end of file
diff --git a/core/java/android/service/vr/IVrManager.aidl b/core/java/android/service/vr/IVrManager.aidl
index b0269e3325bf..a8293b47db30 100644
--- a/core/java/android/service/vr/IVrManager.aidl
+++ b/core/java/android/service/vr/IVrManager.aidl
@@ -57,6 +57,7 @@ interface IVrManager {
*
* @return {@code true} if VR mode is enabled.
*/
+ @UnsupportedAppUsage
boolean getVrModeState();
/**
@@ -93,6 +94,7 @@ interface IVrManager {
* @return {@link android.view.Display.INVALID_DISPLAY} if there is no virtual display
* currently, else return the display id of the virtual display
*/
+ @UnsupportedAppUsage
int getVr2dDisplayId();
/**
diff --git a/core/java/android/service/wallpaper/IWallpaperEngine.aidl b/core/java/android/service/wallpaper/IWallpaperEngine.aidl
index ebce4846c16b..00e0b7c170be 100644
--- a/core/java/android/service/wallpaper/IWallpaperEngine.aidl
+++ b/core/java/android/service/wallpaper/IWallpaperEngine.aidl
@@ -26,11 +26,15 @@ import android.os.Bundle;
oneway interface IWallpaperEngine {
void setDesiredSize(int width, int height);
void setDisplayPadding(in Rect padding);
+ @UnsupportedAppUsage
void setVisibility(boolean visible);
void setInAmbientMode(boolean inAmbientDisplay, long animationDuration);
+ @UnsupportedAppUsage
void dispatchPointer(in MotionEvent event);
+ @UnsupportedAppUsage
void dispatchWallpaperCommand(String action, int x, int y,
int z, in Bundle extras);
void requestWallpaperColors();
+ @UnsupportedAppUsage
void destroy();
}
diff --git a/core/java/android/speech/IRecognitionListener.aidl b/core/java/android/speech/IRecognitionListener.aidl
index 3d3c44bf1efe..e77851b0e405 100644
--- a/core/java/android/speech/IRecognitionListener.aidl
+++ b/core/java/android/speech/IRecognitionListener.aidl
@@ -83,5 +83,6 @@ oneway interface IRecognitionListener {
* @param eventType the type of the occurred event
* @param params a Bundle containing the passed parameters
*/
+ @UnsupportedAppUsage
void onEvent(in int eventType, in Bundle params);
}
diff --git a/core/java/android/util/FeatureFlagUtils.java b/core/java/android/util/FeatureFlagUtils.java
index 2d6cbd6cbcef..fac699ece642 100644
--- a/core/java/android/util/FeatureFlagUtils.java
+++ b/core/java/android/util/FeatureFlagUtils.java
@@ -50,7 +50,7 @@ public class FeatureFlagUtils {
DEFAULT_FLAGS.put("settings_slice_injection", "true");
DEFAULT_FLAGS.put("settings_systemui_theme", "true");
DEFAULT_FLAGS.put("settings_wifi_mac_randomization", "true");
- DEFAULT_FLAGS.put("settings_mainline_module", "true");
+ DEFAULT_FLAGS.put("settings_mainline_module", "false");
DEFAULT_FLAGS.put("settings_dynamic_android", "false");
DEFAULT_FLAGS.put(SEAMLESS_TRANSFER, "false");
DEFAULT_FLAGS.put(HEARING_AID_SETTINGS, "false");
diff --git a/core/java/android/view/GestureExclusionTracker.java b/core/java/android/view/GestureExclusionTracker.java
new file mode 100644
index 000000000000..8eccc04fa647
--- /dev/null
+++ b/core/java/android/view/GestureExclusionTracker.java
@@ -0,0 +1,125 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.view;
+
+import android.annotation.NonNull;
+import android.annotation.Nullable;
+import android.graphics.Rect;
+
+import java.lang.ref.WeakReference;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Iterator;
+import java.util.List;
+
+/**
+ * Used by {@link ViewRootImpl} to track system gesture exclusion rects reported by views.
+ */
+class GestureExclusionTracker {
+ private boolean mGestureExclusionViewsChanged = false;
+ private List<GestureExclusionViewInfo> mGestureExclusionViewInfos = new ArrayList<>();
+ private List<Rect> mGestureExclusionRects = Collections.emptyList();
+
+ public void updateRectsForView(@NonNull View view) {
+ boolean found = false;
+ final Iterator<GestureExclusionViewInfo> i = mGestureExclusionViewInfos.iterator();
+ while (i.hasNext()) {
+ final GestureExclusionViewInfo info = i.next();
+ final View v = info.getView();
+ if (v == null || !v.isAttachedToWindow()) {
+ mGestureExclusionViewsChanged = true;
+ i.remove();
+ continue;
+ }
+ if (v == view) {
+ found = true;
+ info.mDirty = true;
+ break;
+ }
+ }
+ if (!found && view.isAttachedToWindow()) {
+ mGestureExclusionViewInfos.add(new GestureExclusionViewInfo(view));
+ mGestureExclusionViewsChanged = true;
+ }
+ }
+
+ @Nullable
+ public List<Rect> computeChangedRects() {
+ boolean changed = false;
+ final Iterator<GestureExclusionViewInfo> i = mGestureExclusionViewInfos.iterator();
+ final List<Rect> rects = new ArrayList<>();
+ while (i.hasNext()) {
+ final GestureExclusionViewInfo info = i.next();
+ switch (info.update()) {
+ case GestureExclusionViewInfo.CHANGED:
+ changed = true;
+ // Deliberate fall-through
+ case GestureExclusionViewInfo.UNCHANGED:
+ rects.addAll(info.mExclusionRects);
+ break;
+ case GestureExclusionViewInfo.GONE:
+ mGestureExclusionViewsChanged = true;
+ i.remove();
+ break;
+ }
+ }
+ if (changed || mGestureExclusionViewsChanged) {
+ mGestureExclusionViewsChanged = false;
+ if (!mGestureExclusionRects.equals(rects)) {
+ mGestureExclusionRects = rects;
+ return rects;
+ }
+ }
+ return null;
+ }
+
+ private static class GestureExclusionViewInfo {
+ public static final int CHANGED = 0;
+ public static final int UNCHANGED = 1;
+ public static final int GONE = 2;
+
+ private final WeakReference<View> mView;
+ boolean mDirty = true;
+ List<Rect> mExclusionRects = Collections.emptyList();
+
+ GestureExclusionViewInfo(View view) {
+ mView = new WeakReference<>(view);
+ }
+
+ public View getView() {
+ return mView.get();
+ }
+
+ public int update() {
+ final View excludedView = getView();
+ if (excludedView == null || !excludedView.isAttachedToWindow()) return GONE;
+ final List<Rect> localRects = excludedView.getSystemGestureExclusionRects();
+ final List<Rect> newRects = new ArrayList<>(localRects.size());
+ for (Rect src : localRects) {
+ Rect mappedRect = new Rect(src);
+ ViewParent p = excludedView.getParent();
+ if (p != null && p.getChildVisibleRect(excludedView, mappedRect, null)) {
+ newRects.add(mappedRect);
+ }
+ }
+
+ if (mExclusionRects.equals(localRects)) return UNCHANGED;
+ mExclusionRects = newRects;
+ return CHANGED;
+ }
+ }
+}
diff --git a/core/java/android/view/IRecentsAnimationController.aidl b/core/java/android/view/IRecentsAnimationController.aidl
index 94b9bc099d56..b1f934a44cdb 100644
--- a/core/java/android/view/IRecentsAnimationController.aidl
+++ b/core/java/android/view/IRecentsAnimationController.aidl
@@ -33,6 +33,7 @@ interface IRecentsAnimationController {
* Takes a screenshot of the task associated with the given {@param taskId}. Only valid for the
* current set of task ids provided to the handler.
*/
+ @UnsupportedAppUsage
ActivityManager.TaskSnapshot screenshotTask(int taskId);
/**
@@ -41,6 +42,7 @@ interface IRecentsAnimationController {
* the home activity should be moved to the top. Otherwise, the home activity is hidden and the
* user is returned to the app.
*/
+ @UnsupportedAppUsage
void finish(boolean moveHomeToTop);
/**
@@ -50,6 +52,7 @@ interface IRecentsAnimationController {
* may register the recents animation input consumer prior to starting the recents animation
* and then enable it mid-animation to start receiving touch events.
*/
+ @UnsupportedAppUsage
void setInputConsumerEnabled(boolean enabled);
/**
@@ -58,6 +61,7 @@ interface IRecentsAnimationController {
* they can control the SystemUI flags, otherwise the SystemUI flags from home activity will be
* taken.
*/
+ @UnsupportedAppUsage
void setAnimationTargetsBehindSystemBars(boolean behindSystemBars);
/**
diff --git a/core/java/android/view/IRecentsAnimationRunner.aidl b/core/java/android/view/IRecentsAnimationRunner.aidl
index 4cdf66441514..6e382f416b62 100644
--- a/core/java/android/view/IRecentsAnimationRunner.aidl
+++ b/core/java/android/view/IRecentsAnimationRunner.aidl
@@ -33,6 +33,7 @@ oneway interface IRecentsAnimationRunner {
* wallpaper not drawing in time, or the handler not finishing the animation within a predefined
* amount of time.
*/
+ @UnsupportedAppUsage
void onAnimationCanceled() = 1;
/**
@@ -42,6 +43,7 @@ oneway interface IRecentsAnimationRunner {
* @param minimizedHomeBounds Specifies the bounds of the minimized home app, will be
* {@code null} if the device is not currently in split screen
*/
+ @UnsupportedAppUsage
void onAnimationStart(in IRecentsAnimationController controller,
in RemoteAnimationTarget[] apps, in Rect homeContentInsets,
in Rect minimizedHomeBounds) = 2;
diff --git a/core/java/android/view/IRemoteAnimationFinishedCallback.aidl b/core/java/android/view/IRemoteAnimationFinishedCallback.aidl
index ae58b226ec03..a99162b6c857 100644
--- a/core/java/android/view/IRemoteAnimationFinishedCallback.aidl
+++ b/core/java/android/view/IRemoteAnimationFinishedCallback.aidl
@@ -23,5 +23,6 @@ package android.view;
* {@hide}
*/
interface IRemoteAnimationFinishedCallback {
+ @UnsupportedAppUsage
void onAnimationFinished();
}
diff --git a/core/java/android/view/IRemoteAnimationRunner.aidl b/core/java/android/view/IRemoteAnimationRunner.aidl
index 1350ebf10a4f..73b023c99665 100644
--- a/core/java/android/view/IRemoteAnimationRunner.aidl
+++ b/core/java/android/view/IRemoteAnimationRunner.aidl
@@ -33,6 +33,7 @@ oneway interface IRemoteAnimationRunner {
* @param apps The list of apps to animate.
* @param finishedCallback The callback to invoke when the animation is finished.
*/
+ @UnsupportedAppUsage
void onAnimationStart(in RemoteAnimationTarget[] apps,
in IRemoteAnimationFinishedCallback finishedCallback);
@@ -40,5 +41,6 @@ oneway interface IRemoteAnimationRunner {
* Called when the animation was cancelled. From this point on, any updates onto the leashes
* won't have any effect anymore.
*/
+ @UnsupportedAppUsage
void onAnimationCancelled();
}
diff --git a/core/java/android/view/IWindowManager.aidl b/core/java/android/view/IWindowManager.aidl
index 5dc54a566676..e32c4e136a6e 100644
--- a/core/java/android/view/IWindowManager.aidl
+++ b/core/java/android/view/IWindowManager.aidl
@@ -74,10 +74,13 @@ interface IWindowManager
IWindowSession openSession(in IWindowSessionCallback callback);
+ @UnsupportedAppUsage
void getInitialDisplaySize(int displayId, out Point size);
+ @UnsupportedAppUsage
void getBaseDisplaySize(int displayId, out Point size);
void setForcedDisplaySize(int displayId, int width, int height);
void clearForcedDisplaySize(int displayId);
+ @UnsupportedAppUsage
int getInitialDisplayDensity(int displayId);
int getBaseDisplayDensity(int displayId);
void setForcedDisplayDensityForUser(int displayId, int density, int userId);
@@ -97,17 +100,21 @@ interface IWindowManager
* used for recents, where generating the thumbnails of the specs takes a non-trivial amount of
* time, so we want to move that off the critical path for starting the new activity.
*/
+ @UnsupportedAppUsage
void overridePendingAppTransitionMultiThumbFuture(
IAppTransitionAnimationSpecsFuture specsFuture, IRemoteCallback startedCallback,
boolean scaleUp, int displayId);
+ @UnsupportedAppUsage
void overridePendingAppTransitionRemote(in RemoteAnimationAdapter remoteAnimationAdapter,
int displayId);
+ @UnsupportedAppUsage
void executeAppTransition();
/**
* Used by system ui to report that recents has shown itself.
* @deprecated to be removed once prebuilts are updated
*/
+ @UnsupportedAppUsage
void endProlongedAnimations();
void startFreezingScreen(int exitAnim, int enterAnim);
@@ -119,7 +126,9 @@ interface IWindowManager
/** @deprecated use Activity.setShowWhenLocked instead. */
void reenableKeyguard(IBinder token, int userId);
void exitKeyguardSecurely(IOnKeyguardExitResult callback);
+ @UnsupportedAppUsage
boolean isKeyguardLocked();
+ @UnsupportedAppUsage
boolean isKeyguardSecure();
void dismissKeyguard(IKeyguardDismissCallback callback, CharSequence message);
@@ -129,9 +138,13 @@ interface IWindowManager
void closeSystemDialogs(String reason);
// These can only be called with the SET_ANIMATON_SCALE permission.
+ @UnsupportedAppUsage
float getAnimationScale(int which);
+ @UnsupportedAppUsage
float[] getAnimationScales();
+ @UnsupportedAppUsage
void setAnimationScale(int which, float scale);
+ @UnsupportedAppUsage
void setAnimationScales(in float[] scales);
float getCurrentAnimatorScale();
@@ -150,6 +163,7 @@ interface IWindowManager
// should be enabled. The 'enabled' value is null or blank for
// the system default (differs per build variant) or any valid
// boolean string as parsed by SystemProperties.getBoolean().
+ @UnsupportedAppUsage
void setStrictModeVisualIndicatorPreference(String enabled);
/**
@@ -188,6 +202,7 @@ interface IWindowManager
* Remove a rotation watcher set using watchRotation.
* @hide
*/
+ @UnsupportedAppUsage
void removeRotationWatcher(IRotationWatcher watcher);
/**
@@ -203,12 +218,14 @@ interface IWindowManager
* Equivalent to calling {@link #freezeDisplayRotation(int, int)} with {@link
* android.view.Display#DEFAULT_DISPLAY} and given rotation.
*/
+ @UnsupportedAppUsage
void freezeRotation(int rotation);
/**
* Equivalent to calling {@link #thawDisplayRotation(int)} with {@link
* android.view.Display#DEFAULT_DISPLAY}.
*/
+ @UnsupportedAppUsage
void thawRotation();
/**
@@ -286,11 +303,13 @@ interface IWindowManager
/**
* Called by System UI to notify of changes to the visibility and height of the shelf.
*/
+ @UnsupportedAppUsage
void setShelfHeight(boolean visible, int shelfHeight);
/**
* Called by System UI to enable or disable haptic feedback on the navigation bar buttons.
*/
+ @UnsupportedAppUsage
void setNavBarVirtualKeyHapticFeedbackEnabled(boolean enabled);
/**
@@ -298,6 +317,7 @@ interface IWindowManager
*
* @param displayId the id of display to check if there is a software navigation bar.
*/
+ @UnsupportedAppUsage
boolean hasNavigationBar(int displayId);
/**
@@ -308,11 +328,13 @@ interface IWindowManager
/**
* Lock the device immediately with the specified options (can be null).
*/
+ @UnsupportedAppUsage
void lockNow(in Bundle options);
/**
* Device is in safe mode.
*/
+ @UnsupportedAppUsage
boolean isSafeModeEnabled();
/**
@@ -340,6 +362,7 @@ interface IWindowManager
* @return the dock side the current docked stack is at; must be one of the
* WindowManagerGlobal.DOCKED_* values
*/
+ @UnsupportedAppUsage
int getDockedStackSide();
/**
@@ -352,6 +375,7 @@ interface IWindowManager
* Registers a listener that will be called when the dock divider changes its visibility or when
* the docked stack gets added/removed.
*/
+ @UnsupportedAppUsage
void registerDockedStackListener(IDockedStackListener listener);
/**
@@ -378,6 +402,7 @@ interface IWindowManager
/**
* Retrieves the current stable insets from the primary display.
*/
+ @UnsupportedAppUsage
void getStableInsets(int displayId, out Rect outInsets);
/**
@@ -400,6 +425,7 @@ interface IWindowManager
/**
* Create an input consumer by name and display id.
*/
+ @UnsupportedAppUsage
void createInputConsumer(IBinder token, String name, int displayId,
out InputChannel inputChannel);
@@ -407,6 +433,7 @@ interface IWindowManager
* Destroy an input consumer by name and display id.
* This method will also dispose the input channels associated with that InputConsumer.
*/
+ @UnsupportedAppUsage
boolean destroyInputConsumer(String name, int displayId);
/**
diff --git a/core/java/android/view/IWindowSession.aidl b/core/java/android/view/IWindowSession.aidl
index 240aad5a0c56..1fcd4321cdde 100644
--- a/core/java/android/view/IWindowSession.aidl
+++ b/core/java/android/view/IWindowSession.aidl
@@ -46,6 +46,7 @@ interface IWindowSession {
int addToDisplayWithoutInputChannel(IWindow window, int seq, in WindowManager.LayoutParams attrs,
in int viewVisibility, in int layerStackId, out Rect outContentInsets,
out Rect outStableInsets, out InsetsState insetsState);
+ @UnsupportedAppUsage
void remove(IWindow window);
/**
@@ -122,6 +123,7 @@ interface IWindowSession {
* completely transparent, allowing it to work with the surface flinger
* to optimize compositing of this part of the window.
*/
+ @UnsupportedAppUsage
void setTransparentRegion(IWindow window, in Region region);
/**
@@ -143,11 +145,15 @@ interface IWindowSession {
*/
void getDisplayFrame(IWindow window, out Rect outDisplayFrame);
+ @UnsupportedAppUsage
void finishDrawing(IWindow window);
+ @UnsupportedAppUsage
void setInTouchMode(boolean showFocus);
+ @UnsupportedAppUsage
boolean getInTouchMode();
+ @UnsupportedAppUsage
boolean performHapticFeedback(int effectId, boolean always);
/**
@@ -166,6 +172,7 @@ interface IWindowSession {
* @param data Data transferred by drag and drop
* @return Token of drag operation which will be passed to cancelDragAndDrop.
*/
+ @UnsupportedAppUsage
IBinder performDrag(IWindow window, int flags, in SurfaceControl surface, int touchSource,
float touchX, float touchY, float thumbCenterX, float thumbCenterY, in ClipData data);
@@ -199,6 +206,7 @@ interface IWindowSession {
*/
void setWallpaperPosition(IBinder windowToken, float x, float y, float xstep, float ystep);
+ @UnsupportedAppUsage
void wallpaperOffsetsComplete(IBinder window);
/**
@@ -209,6 +217,7 @@ interface IWindowSession {
Bundle sendWallpaperCommand(IBinder window, String action, int x, int y,
int z, in Bundle extras, boolean sync);
+ @UnsupportedAppUsage
void wallpaperCommandComplete(IBinder window, in Bundle result);
/**
diff --git a/core/java/android/view/RenderNodeAnimator.java b/core/java/android/view/RenderNodeAnimator.java
index 23f2b8a0a3ca..7ab9534941c7 100644
--- a/core/java/android/view/RenderNodeAnimator.java
+++ b/core/java/android/view/RenderNodeAnimator.java
@@ -336,6 +336,7 @@ public class RenderNodeAnimator extends Animator {
return mUnscaledStartDelay;
}
+ @UnsupportedAppUsage
@Override
public RenderNodeAnimator setDuration(long duration) {
checkMutable();
diff --git a/core/java/android/view/SurfaceControl.java b/core/java/android/view/SurfaceControl.java
index ea7f31dd8507..3768acaaaad5 100644
--- a/core/java/android/view/SurfaceControl.java
+++ b/core/java/android/view/SurfaceControl.java
@@ -160,6 +160,7 @@ public final class SurfaceControl implements Parcelable {
private static native boolean nativeSetActiveConfig(IBinder displayToken, int id);
private static native boolean nativeSetAllowedDisplayConfigs(IBinder displayToken,
int[] allowedConfigs);
+ private static native int[] nativeGetAllowedDisplayConfigs(IBinder displayToken);
private static native int[] nativeGetDisplayColorModes(IBinder displayToken);
private static native SurfaceControl.DisplayPrimaries nativeGetDisplayNativePrimaries(
IBinder displayToken);
@@ -1538,6 +1539,16 @@ public final class SurfaceControl implements Parcelable {
/**
* @hide
*/
+ public static int[] getAllowedDisplayConfigs(IBinder displayToken) {
+ if (displayToken == null) {
+ throw new IllegalArgumentException("displayToken must not be null");
+ }
+ return nativeGetAllowedDisplayConfigs(displayToken);
+ }
+
+ /**
+ * @hide
+ */
public static int[] getDisplayColorModes(IBinder displayToken) {
if (displayToken == null) {
throw new IllegalArgumentException("displayToken must not be null");
diff --git a/core/java/android/view/SurfaceView.java b/core/java/android/view/SurfaceView.java
index fe9aa234ba54..ee8d66313ea2 100644
--- a/core/java/android/view/SurfaceView.java
+++ b/core/java/android/view/SurfaceView.java
@@ -210,7 +210,7 @@ public class SurfaceView extends View implements ViewRootImpl.WindowStoppedCallb
public SurfaceView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
super(context, attrs, defStyleAttr, defStyleRes);
- mRenderNode.requestPositionUpdates(mPositionListener);
+ mRenderNode.addPositionUpdateListener(mPositionListener);
setWillNotDraw(true);
}
diff --git a/core/java/android/view/View.java b/core/java/android/view/View.java
index 7afdc7055e42..cc585b0294c7 100644
--- a/core/java/android/view/View.java
+++ b/core/java/android/view/View.java
@@ -881,12 +881,6 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
private static boolean sAlwaysRemeasureExactly = false;
/**
- * Relax constraints around whether setLayoutParams() must be called after
- * modifying the layout params.
- */
- private static boolean sLayoutParamsAlwaysChanged = false;
-
- /**
* Allow setForeground/setBackground to be called (and ignored) on a textureview,
* without throwing
*/
@@ -4603,6 +4597,16 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
private ArrayList<OnUnhandledKeyEventListener> mUnhandledKeyListeners;
private WindowInsetsAnimationListener mWindowInsetsAnimationListener;
+
+ /**
+ * This lives here since it's only valid for interactive views.
+ */
+ private List<Rect> mSystemGestureExclusionRects;
+
+ /**
+ * Used to track {@link #mSystemGestureExclusionRects}
+ */
+ public RenderNode.PositionUpdateListener mPositionUpdateListener;
}
@UnsupportedAppUsage
@@ -5170,11 +5174,6 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
// modes, so we always need to run an additional EXACTLY pass.
sAlwaysRemeasureExactly = targetSdkVersion <= Build.VERSION_CODES.M;
- // Prior to N, layout params could change without requiring a
- // subsequent call to setLayoutParams() and they would usually
- // work. Partial layout breaks this assumption.
- sLayoutParamsAlwaysChanged = targetSdkVersion <= Build.VERSION_CODES.M;
-
// Prior to N, TextureView would silently ignore calls to setBackground/setForeground.
// On N+, we throw, but that breaks compatibility with apps that use these methods.
sTextureViewIgnoresDrawableSetters = targetSdkVersion <= Build.VERSION_CODES.M;
@@ -10974,6 +10973,95 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
}
/**
+ * Sets a list of areas within this view's post-layout coordinate space where the system
+ * should not intercept touch or other pointing device gestures. <em>This method should
+ * be called by {@link #onLayout(boolean, int, int, int, int)} or {@link #onDraw(Canvas)}.</em>
+ *
+ * <p>Use this to tell the system which specific sub-areas of a view need to receive gesture
+ * input in order to function correctly in the presence of global system gestures that may
+ * conflict. For example, if the system wishes to capture swipe-in-from-screen-edge gestures
+ * to provide system-level navigation functionality, a view such as a navigation drawer
+ * container can mark the left (or starting) edge of itself as requiring gesture capture
+ * priority using this API. The system may then choose to relax its own gesture recognition
+ * to allow the app to consume the user's gesture. It is not necessary for an app to register
+ * exclusion rects for broadly spanning regions such as the entirety of a
+ * <code>ScrollView</code> or for simple press and release click targets such as
+ * <code>Button</code>. Mark an exclusion rect when interacting with a view requires
+ * a precision touch gesture in a small area in either the X or Y dimension, such as
+ * an edge swipe or dragging a <code>SeekBar</code> thumb.</p>
+ *
+ * <p>Do not modify the provided list after this method is called.</p>
+ *
+ * @param rects A list of precision gesture regions that this view needs to function correctly
+ */
+ public void setSystemGestureExclusionRects(@NonNull List<Rect> rects) {
+ if (rects.isEmpty() && mListenerInfo == null) return;
+
+ final ListenerInfo info = getListenerInfo();
+ if (rects.isEmpty()) {
+ info.mSystemGestureExclusionRects = null;
+ if (info.mPositionUpdateListener != null) {
+ mRenderNode.removePositionUpdateListener(info.mPositionUpdateListener);
+ }
+ } else {
+ info.mSystemGestureExclusionRects = rects;
+ if (info.mPositionUpdateListener == null) {
+ info.mPositionUpdateListener = new RenderNode.PositionUpdateListener() {
+ @Override
+ public void positionChanged(long n, int l, int t, int r, int b) {
+ postUpdateSystemGestureExclusionRects();
+ }
+
+ @Override
+ public void positionLost(long frameNumber) {
+ postUpdateSystemGestureExclusionRects();
+ }
+ };
+ mRenderNode.addPositionUpdateListener(info.mPositionUpdateListener);
+ }
+ }
+ postUpdateSystemGestureExclusionRects();
+ }
+
+ /**
+ * WARNING: this can be called by a hwui worker thread, not just the UI thread!
+ */
+ void postUpdateSystemGestureExclusionRects() {
+ // Potentially racey from a background thread. It's ok if it's not perfect.
+ final Handler h = getHandler();
+ if (h != null) {
+ h.postAtFrontOfQueue(this::updateSystemGestureExclusionRects);
+ }
+ }
+
+ void updateSystemGestureExclusionRects() {
+ final AttachInfo ai = mAttachInfo;
+ if (ai != null) {
+ ai.mViewRootImpl.updateSystemGestureExclusionRectsForView(this);
+ }
+ }
+
+ /**
+ * Retrieve the list of areas within this view's post-layout coordinate space where the system
+ * should not intercept touch or other pointing device gestures.
+ *
+ * <p>Do not modify the returned list.</p>
+ *
+ * @return the list set by {@link #setSystemGestureExclusionRects(List)}
+ */
+ @NonNull
+ public List<Rect> getSystemGestureExclusionRects() {
+ final ListenerInfo info = mListenerInfo;
+ if (info != null) {
+ final List<Rect> list = info.mSystemGestureExclusionRects;
+ if (list != null) {
+ return list;
+ }
+ }
+ return Collections.emptyList();
+ }
+
+ /**
* Compute the view's coordinate within the surface.
*
* <p>Computes the coordinates of this view in its surface. The argument
@@ -17988,21 +18076,6 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
}
/**
- * Utility method to transform a given Rect by the current matrix of this view.
- */
- void transformRect(final Rect rect) {
- if (!getMatrix().isIdentity()) {
- RectF boundingRect = mAttachInfo.mTmpTransformRect;
- boundingRect.set(rect);
- getMatrix().mapRect(boundingRect);
- rect.set((int) Math.floor(boundingRect.left),
- (int) Math.floor(boundingRect.top),
- (int) Math.ceil(boundingRect.right),
- (int) Math.ceil(boundingRect.bottom));
- }
- }
-
- /**
* Used to indicate that the parent of this view should clear its caches. This functionality
* is used to force the parent to rebuild its display list (when hardware-accelerated),
* which is necessary when various parent-managed properties of the view change, such as
diff --git a/core/java/android/view/ViewRootImpl.java b/core/java/android/view/ViewRootImpl.java
index ad0aaa6edff6..65b1abd715d9 100644
--- a/core/java/android/view/ViewRootImpl.java
+++ b/core/java/android/view/ViewRootImpl.java
@@ -605,6 +605,8 @@ public final class ViewRootImpl implements ViewParent,
private final InsetsController mInsetsController = new InsetsController(this);
+ private final GestureExclusionTracker mGestureExclusionTracker = new GestureExclusionTracker();
+
static final class SystemUiVisibilityInfo {
int seq;
int globalVisibility;
@@ -3977,6 +3979,20 @@ public final class ViewRootImpl implements ViewParent,
return mAttachInfo.mAccessibilityFocusDrawable;
}
+ void updateSystemGestureExclusionRectsForView(View view) {
+ mGestureExclusionTracker.updateRectsForView(view);
+ mHandler.sendEmptyMessage(MSG_SYSTEM_GESTURE_EXCLUSION_CHANGED);
+ }
+
+ void systemGestureExclusionChanged() {
+ final List<Rect> rectsForWindowManager = mGestureExclusionTracker.computeChangedRects();
+ if (rectsForWindowManager != null) {
+ // TODO Send to WM
+ mAttachInfo.mTreeObserver
+ .dispatchOnSystemGestureExclusionRectsChanged(rectsForWindowManager);
+ }
+ }
+
/**
* Requests that the root render node is invalidated next time we perform a draw, such that
* {@link WindowCallbacks#onPostDraw} gets called.
@@ -4433,35 +4449,36 @@ public final class ViewRootImpl implements ViewParent,
}
}
- private final static int MSG_INVALIDATE = 1;
- private final static int MSG_INVALIDATE_RECT = 2;
- private final static int MSG_DIE = 3;
- private final static int MSG_RESIZED = 4;
- private final static int MSG_RESIZED_REPORT = 5;
- private final static int MSG_WINDOW_FOCUS_CHANGED = 6;
- private final static int MSG_DISPATCH_INPUT_EVENT = 7;
- private final static int MSG_DISPATCH_APP_VISIBILITY = 8;
- private final static int MSG_DISPATCH_GET_NEW_SURFACE = 9;
- private final static int MSG_DISPATCH_KEY_FROM_IME = 11;
- private final static int MSG_DISPATCH_KEY_FROM_AUTOFILL = 12;
- private final static int MSG_CHECK_FOCUS = 13;
- private final static int MSG_CLOSE_SYSTEM_DIALOGS = 14;
- private final static int MSG_DISPATCH_DRAG_EVENT = 15;
- private final static int MSG_DISPATCH_DRAG_LOCATION_EVENT = 16;
- private final static int MSG_DISPATCH_SYSTEM_UI_VISIBILITY = 17;
- private final static int MSG_UPDATE_CONFIGURATION = 18;
- private final static int MSG_PROCESS_INPUT_EVENTS = 19;
- private final static int MSG_CLEAR_ACCESSIBILITY_FOCUS_HOST = 21;
- private final static int MSG_INVALIDATE_WORLD = 22;
- private final static int MSG_WINDOW_MOVED = 23;
- private final static int MSG_SYNTHESIZE_INPUT_EVENT = 24;
- private final static int MSG_DISPATCH_WINDOW_SHOWN = 25;
- private final static int MSG_REQUEST_KEYBOARD_SHORTCUTS = 26;
- private final static int MSG_UPDATE_POINTER_ICON = 27;
- private final static int MSG_POINTER_CAPTURE_CHANGED = 28;
- private final static int MSG_DRAW_FINISHED = 29;
- private final static int MSG_INSETS_CHANGED = 30;
- private final static int MSG_INSETS_CONTROL_CHANGED = 31;
+ private static final int MSG_INVALIDATE = 1;
+ private static final int MSG_INVALIDATE_RECT = 2;
+ private static final int MSG_DIE = 3;
+ private static final int MSG_RESIZED = 4;
+ private static final int MSG_RESIZED_REPORT = 5;
+ private static final int MSG_WINDOW_FOCUS_CHANGED = 6;
+ private static final int MSG_DISPATCH_INPUT_EVENT = 7;
+ private static final int MSG_DISPATCH_APP_VISIBILITY = 8;
+ private static final int MSG_DISPATCH_GET_NEW_SURFACE = 9;
+ private static final int MSG_DISPATCH_KEY_FROM_IME = 11;
+ private static final int MSG_DISPATCH_KEY_FROM_AUTOFILL = 12;
+ private static final int MSG_CHECK_FOCUS = 13;
+ private static final int MSG_CLOSE_SYSTEM_DIALOGS = 14;
+ private static final int MSG_DISPATCH_DRAG_EVENT = 15;
+ private static final int MSG_DISPATCH_DRAG_LOCATION_EVENT = 16;
+ private static final int MSG_DISPATCH_SYSTEM_UI_VISIBILITY = 17;
+ private static final int MSG_UPDATE_CONFIGURATION = 18;
+ private static final int MSG_PROCESS_INPUT_EVENTS = 19;
+ private static final int MSG_CLEAR_ACCESSIBILITY_FOCUS_HOST = 21;
+ private static final int MSG_INVALIDATE_WORLD = 22;
+ private static final int MSG_WINDOW_MOVED = 23;
+ private static final int MSG_SYNTHESIZE_INPUT_EVENT = 24;
+ private static final int MSG_DISPATCH_WINDOW_SHOWN = 25;
+ private static final int MSG_REQUEST_KEYBOARD_SHORTCUTS = 26;
+ private static final int MSG_UPDATE_POINTER_ICON = 27;
+ private static final int MSG_POINTER_CAPTURE_CHANGED = 28;
+ private static final int MSG_DRAW_FINISHED = 29;
+ private static final int MSG_INSETS_CHANGED = 30;
+ private static final int MSG_INSETS_CONTROL_CHANGED = 31;
+ private static final int MSG_SYSTEM_GESTURE_EXCLUSION_CHANGED = 32;
final class ViewRootHandler extends Handler {
@Override
@@ -4519,6 +4536,10 @@ public final class ViewRootImpl implements ViewParent,
return "MSG_DRAW_FINISHED";
case MSG_INSETS_CHANGED:
return "MSG_INSETS_CHANGED";
+ case MSG_INSETS_CONTROL_CHANGED:
+ return "MSG_INSETS_CONTROL_CHANGED";
+ case MSG_SYSTEM_GESTURE_EXCLUSION_CHANGED:
+ return "MSG_SYSTEM_GESTURE_EXCLUSION_CHANGED";
}
return super.getMessageName(message);
}
@@ -4750,6 +4771,9 @@ public final class ViewRootImpl implements ViewParent,
case MSG_DRAW_FINISHED: {
pendingDrawFinished();
} break;
+ case MSG_SYSTEM_GESTURE_EXCLUSION_CHANGED: {
+ systemGestureExclusionChanged();
+ } break;
}
}
}
diff --git a/core/java/android/view/ViewTreeObserver.java b/core/java/android/view/ViewTreeObserver.java
index 763ce4f45b01..2896bd049e7c 100644
--- a/core/java/android/view/ViewTreeObserver.java
+++ b/core/java/android/view/ViewTreeObserver.java
@@ -26,7 +26,9 @@ import android.os.Build;
import android.util.Log;
import java.util.ArrayList;
+import java.util.List;
import java.util.concurrent.CopyOnWriteArrayList;
+import java.util.function.Consumer;
/**
* A view tree observer is used to register listeners that can be notified of global
@@ -57,6 +59,7 @@ public final class ViewTreeObserver {
private CopyOnWriteArray<OnScrollChangedListener> mOnScrollChangedListeners;
private CopyOnWriteArray<OnPreDrawListener> mOnPreDrawListeners;
private CopyOnWriteArray<OnWindowShownListener> mOnWindowShownListeners;
+ private CopyOnWriteArray<Consumer<List<Rect>>> mGestureExclusionListeners;
// These listeners cannot be mutated during dispatch
private boolean mInDispatchOnDraw;
@@ -450,6 +453,14 @@ public final class ViewTreeObserver {
}
}
+ if (observer.mGestureExclusionListeners != null) {
+ if (mGestureExclusionListeners != null) {
+ mGestureExclusionListeners.addAll(observer.mGestureExclusionListeners);
+ } else {
+ mGestureExclusionListeners = observer.mGestureExclusionListeners;
+ }
+ }
+
observer.kill();
}
@@ -913,6 +924,35 @@ public final class ViewTreeObserver {
mOnEnterAnimationCompleteListeners.remove(listener);
}
+ /**
+ * Add a listener to be notified when the tree's <em>transformed</em> gesture exclusion rects
+ * change. This could be the result of an animation or other layout change, or a view calling
+ * {@link View#setSystemGestureExclusionRects(List)}.
+ *
+ * @param listener listener to add
+ * @see View#setSystemGestureExclusionRects(List)
+ */
+ public void addOnSystemGestureExclusionRectsChangedListener(Consumer<List<Rect>> listener) {
+ checkIsAlive();
+ if (mGestureExclusionListeners == null) {
+ mGestureExclusionListeners = new CopyOnWriteArray<>();
+ }
+ mGestureExclusionListeners.add(listener);
+ }
+
+ /**
+ * Unsubscribe the given listener from gesture exclusion rect changes.
+ * @see #addOnSystemGestureExclusionRectsChangedListener(Consumer)
+ * @see View#setSystemGestureExclusionRects(List)
+ */
+ public void removeOnSystemGestureExclusionRectsChangedListener(Consumer<List<Rect>> listener) {
+ checkIsAlive();
+ if (mGestureExclusionListeners == null) {
+ return;
+ }
+ mGestureExclusionListeners.remove(listener);
+ }
+
private void checkIsAlive() {
if (!mAlive) {
throw new IllegalStateException("This ViewTreeObserver is not alive, call "
@@ -1178,6 +1218,21 @@ public final class ViewTreeObserver {
}
}
+ void dispatchOnSystemGestureExclusionRectsChanged(@NonNull List<Rect> rects) {
+ final CopyOnWriteArray<Consumer<List<Rect>>> listeners = mGestureExclusionListeners;
+ if (listeners != null && listeners.size() > 0) {
+ CopyOnWriteArray.Access<Consumer<List<Rect>>> access = listeners.start();
+ try {
+ final int count = access.size();
+ for (int i = 0; i < count; i++) {
+ access.get(i).accept(rects);
+ }
+ } finally {
+ listeners.end();
+ }
+ }
+ }
+
/**
* Copy on write array. This array is not thread safe, and only one loop can
* iterate over this array at any given time. This class avoids allocations
diff --git a/core/java/android/view/accessibility/AccessibilityCache.java b/core/java/android/view/accessibility/AccessibilityCache.java
index 87e18b71069c..5d59e4205579 100644
--- a/core/java/android/view/accessibility/AccessibilityCache.java
+++ b/core/java/android/view/accessibility/AccessibilityCache.java
@@ -424,20 +424,28 @@ public class AccessibilityCache {
*
* @param nodes The nodes in the hosting window.
* @param rootNodeId The id of the root to evict.
+ *
+ * @return {@code true} if the cache was cleared
*/
- private void clearSubTreeRecursiveLocked(LongSparseArray<AccessibilityNodeInfo> nodes,
+ private boolean clearSubTreeRecursiveLocked(LongSparseArray<AccessibilityNodeInfo> nodes,
long rootNodeId) {
AccessibilityNodeInfo current = nodes.get(rootNodeId);
if (current == null) {
- return;
+ // The node isn't in the cache, but its descendents might be.
+ clear();
+ return true;
}
nodes.remove(rootNodeId);
final int childCount = current.getChildCount();
for (int i = 0; i < childCount; i++) {
final long childNodeId = current.getChildId(i);
- clearSubTreeRecursiveLocked(nodes, childNodeId);
+ if (clearSubTreeRecursiveLocked(nodes, childNodeId)) {
+ current.recycle();
+ return true;
+ }
}
current.recycle();
+ return false;
}
/**
diff --git a/core/java/android/view/animation/Animation.java b/core/java/android/view/animation/Animation.java
index e0950948afb8..3b60aee8f604 100644
--- a/core/java/android/view/animation/Animation.java
+++ b/core/java/android/view/animation/Animation.java
@@ -207,6 +207,7 @@ public abstract class Animation implements Cloneable {
private float mScaleFactor = 1f;
private boolean mShowWallpaper;
+ private boolean mHasRoundedCorners;
private boolean mMore = true;
private boolean mOneMoreTime = true;
@@ -263,6 +264,8 @@ public abstract class Animation implements Cloneable {
a.getBoolean(com.android.internal.R.styleable.Animation_detachWallpaper, false));
setShowWallpaper(
a.getBoolean(com.android.internal.R.styleable.Animation_showWallpaper, false));
+ setHasRoundedCorners(
+ a.getBoolean(com.android.internal.R.styleable.Animation_hasRoundedCorners, false));
final int resID = a.getResourceId(com.android.internal.R.styleable.Animation_interpolator, 0);
@@ -678,6 +681,19 @@ public abstract class Animation implements Cloneable {
}
/**
+ * If this is a window animation, the window will have rounded corners matching the display
+ * corner radius.
+ *
+ * @param hasRoundedCorners Whether the window should have rounded corners or not.
+ * @attr ref android.R.styleable#Animation_hasRoundedCorners
+ * @see com.android.internal.policy.ScreenDecorationsUtils#getWindowCornerRadius(Resources)
+ * @hide
+ */
+ public void setHasRoundedCorners(boolean hasRoundedCorners) {
+ mHasRoundedCorners = hasRoundedCorners;
+ }
+
+ /**
* Gets the acceleration curve type for this animation.
*
* @return the {@link Interpolator} associated to this animation
@@ -804,6 +820,16 @@ public abstract class Animation implements Cloneable {
}
/**
+ * @return if a window animation should have rounded corners or not.
+ *
+ * @attr ref android.R.styleable#Animation_hasRoundedCorners
+ * @hide
+ */
+ public boolean hasRoundedCorners() {
+ return mHasRoundedCorners;
+ }
+
+ /**
* <p>Indicates whether or not this animation will affect the transformation
* matrix. For instance, a fade animation will not affect the matrix whereas
* a scale animation will.</p>
diff --git a/core/java/android/view/contentcapture/ContentCaptureContext.java b/core/java/android/view/contentcapture/ContentCaptureContext.java
index 8bb4d210ad44..f2d958faa160 100644
--- a/core/java/android/view/contentcapture/ContentCaptureContext.java
+++ b/core/java/android/view/contentcapture/ContentCaptureContext.java
@@ -214,6 +214,7 @@ public final class ContentCaptureContext implements Parcelable {
/**
* Helper that creates a {@link ContentCaptureContext} associated with the given {@code uri}.
*/
+ @NonNull
public static ContentCaptureContext forLocusId(@NonNull Uri uri) {
return new Builder(new LocusId(uri)).build();
}
@@ -269,6 +270,7 @@ public final class ContentCaptureContext implements Parcelable {
*
* @return the built {@code ContentCaptureContext}
*/
+ @NonNull
public ContentCaptureContext build() {
throwIfDestroyed();
mDestroyed = true;
@@ -355,6 +357,7 @@ public final class ContentCaptureContext implements Parcelable {
new Parcelable.Creator<ContentCaptureContext>() {
@Override
+ @NonNull
public ContentCaptureContext createFromParcel(Parcel parcel) {
final boolean hasClientContext = parcel.readInt() == 1;
@@ -383,6 +386,7 @@ public final class ContentCaptureContext implements Parcelable {
}
@Override
+ @NonNull
public ContentCaptureContext[] newArray(int size) {
return new ContentCaptureContext[size];
}
diff --git a/core/java/android/view/contentcapture/ContentCaptureEvent.java b/core/java/android/view/contentcapture/ContentCaptureEvent.java
index 2585b746583d..46c3414a521c 100644
--- a/core/java/android/view/contentcapture/ContentCaptureEvent.java
+++ b/core/java/android/view/contentcapture/ContentCaptureEvent.java
@@ -387,6 +387,7 @@ public final class ContentCaptureEvent implements Parcelable {
new Parcelable.Creator<ContentCaptureEvent>() {
@Override
+ @NonNull
public ContentCaptureEvent createFromParcel(Parcel parcel) {
final String sessionId = parcel.readString();
final int type = parcel.readInt();
@@ -415,6 +416,7 @@ public final class ContentCaptureEvent implements Parcelable {
}
@Override
+ @NonNull
public ContentCaptureEvent[] newArray(int size) {
return new ContentCaptureEvent[size];
}
diff --git a/core/java/android/view/contentcapture/ContentCaptureSession.java b/core/java/android/view/contentcapture/ContentCaptureSession.java
index ab8f346bdd2e..6bf1eba30f55 100644
--- a/core/java/android/view/contentcapture/ContentCaptureSession.java
+++ b/core/java/android/view/contentcapture/ContentCaptureSession.java
@@ -208,6 +208,7 @@ public abstract class ContentCaptureSession implements AutoCloseable {
/**
* Gets the id used to identify this session.
*/
+ @NonNull
public final ContentCaptureSessionId getContentCaptureSessionId() {
if (mContentCaptureSessionId == null) {
mContentCaptureSessionId = new ContentCaptureSessionId(mId);
diff --git a/core/java/android/view/contentcapture/ContentCaptureSessionId.java b/core/java/android/view/contentcapture/ContentCaptureSessionId.java
index d7f9fcc4f7af..9b1f172e0507 100644
--- a/core/java/android/view/contentcapture/ContentCaptureSessionId.java
+++ b/core/java/android/view/contentcapture/ContentCaptureSessionId.java
@@ -100,11 +100,13 @@ public final class ContentCaptureSessionId implements Parcelable {
new Parcelable.Creator<ContentCaptureSessionId>() {
@Override
+ @NonNull
public ContentCaptureSessionId createFromParcel(Parcel parcel) {
return new ContentCaptureSessionId(parcel.readString());
}
@Override
+ @NonNull
public ContentCaptureSessionId[] newArray(int size) {
return new ContentCaptureSessionId[size];
}
diff --git a/core/java/android/view/contentcapture/UserDataRemovalRequest.java b/core/java/android/view/contentcapture/UserDataRemovalRequest.java
index 7d66af92e9f6..170a3a986358 100644
--- a/core/java/android/view/contentcapture/UserDataRemovalRequest.java
+++ b/core/java/android/view/contentcapture/UserDataRemovalRequest.java
@@ -121,6 +121,7 @@ public final class UserDataRemovalRequest implements Parcelable {
*
* @return this builder
*/
+ @NonNull
public Builder addLocusId(@NonNull LocusId locusId, boolean recursive) {
throwIfDestroyed();
Preconditions.checkState(!mForEverything, "Already is for everything");
@@ -178,11 +179,13 @@ public final class UserDataRemovalRequest implements Parcelable {
new Parcelable.Creator<UserDataRemovalRequest>() {
@Override
+ @NonNull
public UserDataRemovalRequest createFromParcel(Parcel parcel) {
return new UserDataRemovalRequest(parcel);
}
@Override
+ @NonNull
public UserDataRemovalRequest[] newArray(int size) {
return new UserDataRemovalRequest[size];
}
diff --git a/core/java/android/webkit/IWebViewUpdateService.aidl b/core/java/android/webkit/IWebViewUpdateService.aidl
index dbca7ff72c7b..10cfea166abd 100644
--- a/core/java/android/webkit/IWebViewUpdateService.aidl
+++ b/core/java/android/webkit/IWebViewUpdateService.aidl
@@ -51,6 +51,7 @@ interface IWebViewUpdateService {
* DevelopmentSettings uses this to get the current available WebView
* providers (to display as choices to the user).
*/
+ @UnsupportedAppUsage
WebViewProviderInfo[] getValidWebViewPackages();
/**
@@ -61,6 +62,7 @@ interface IWebViewUpdateService {
/**
* Used by DevelopmentSetting to get the name of the WebView provider currently in use.
*/
+ @UnsupportedAppUsage
String getCurrentWebViewPackageName();
/**
@@ -72,6 +74,7 @@ interface IWebViewUpdateService {
* Used by Settings to determine whether a certain package can be enabled/disabled by the user -
* the package should not be modifiable in this way if it is a fallback package.
*/
+ @UnsupportedAppUsage
boolean isFallbackPackage(String packageName);
/**
diff --git a/core/java/android/webkit/WebViewProvider.java b/core/java/android/webkit/WebViewProvider.java
index baf582693bd8..4c8f72aa77eb 100644
--- a/core/java/android/webkit/WebViewProvider.java
+++ b/core/java/android/webkit/WebViewProvider.java
@@ -351,7 +351,7 @@ public interface WebViewProvider {
}
default void onProvideContentCaptureStructure(
- @SuppressWarnings("unused") android.view.ViewStructure structure,
+ @NonNull @SuppressWarnings("unused") android.view.ViewStructure structure,
@SuppressWarnings("unused") int flags) {
}
diff --git a/core/java/android/widget/ZoomControls.java b/core/java/android/widget/ZoomControls.java
index dd6a27b8f1e4..7a5b7e8058f3 100644
--- a/core/java/android/widget/ZoomControls.java
+++ b/core/java/android/widget/ZoomControls.java
@@ -30,7 +30,11 @@ import com.android.internal.R;
/**
* The {@code ZoomControls} class displays a simple set of controls used for zooming and
- * provides callbacks to register for events. */
+ * provides callbacks to register for events.
+ * @deprecated This functionality and UI is better handled with custom views and layouts
+ * rather than a dedicated zoom-control widget
+ */
+@Deprecated
@Widget
public class ZoomControls extends LinearLayout {
diff --git a/core/java/com/android/internal/app/IAppOpsService.aidl b/core/java/com/android/internal/app/IAppOpsService.aidl
index 8a90cade35a2..c096961c57b8 100644
--- a/core/java/com/android/internal/app/IAppOpsService.aidl
+++ b/core/java/com/android/internal/app/IAppOpsService.aidl
@@ -32,6 +32,7 @@ interface IAppOpsService {
int noteOperation(int code, int uid, String packageName);
int startOperation(IBinder token, int code, int uid, String packageName,
boolean startIfModeDefault);
+ @UnsupportedAppUsage
void finishOperation(IBinder token, int code, int uid, String packageName);
void startWatchingMode(int op, String packageName, IAppOpsCallback callback);
void stopWatchingMode(IAppOpsCallback callback);
@@ -42,7 +43,9 @@ interface IAppOpsService {
// Remaining methods are only used in Java.
int checkPackage(int uid, String packageName);
+ @UnsupportedAppUsage
List<AppOpsManager.PackageOps> getPackagesForOps(in int[] ops);
+ @UnsupportedAppUsage
List<AppOpsManager.PackageOps> getOpsForPackage(int uid, String packageName, in int[] ops);
void getHistoricalOps(int uid, String packageName, in List<String> ops, long beginTimeMillis,
long endTimeMillis, in RemoteCallback callback);
@@ -55,7 +58,9 @@ interface IAppOpsService {
void clearHistory();
List<AppOpsManager.PackageOps> getUidOps(int uid, in int[] ops);
void setUidMode(int code, int uid, int mode);
+ @UnsupportedAppUsage
void setMode(int code, int uid, String packageName, int mode);
+ @UnsupportedAppUsage
void resetAllModes(int reqUserId, String reqPackageName);
int checkAudioOperation(int code, int usage, int uid, String packageName);
void setAudioRestriction(int code, int usage, int uid, int mode, in String[] exceptionPackages);
diff --git a/core/java/com/android/internal/app/IBatteryStats.aidl b/core/java/com/android/internal/app/IBatteryStats.aidl
index d7514d1fe26c..114d31f207bd 100644
--- a/core/java/com/android/internal/app/IBatteryStats.aidl
+++ b/core/java/com/android/internal/app/IBatteryStats.aidl
@@ -49,11 +49,13 @@ interface IBatteryStats {
void noteResetFlashlight();
// Remaining methods are only used in Java.
+ @UnsupportedAppUsage
byte[] getStatistics();
ParcelFileDescriptor getStatisticsStream();
// Return true if we see the battery as currently charging.
+ @UnsupportedAppUsage
boolean isCharging();
// Return the computed amount of time remaining on battery, in milliseconds.
@@ -62,6 +64,7 @@ interface IBatteryStats {
// Return the computed amount of time remaining to fully charge, in milliseconds.
// Returns -1 if nothing could be computed.
+ @UnsupportedAppUsage
long computeChargeTimeRemaining();
void noteEvent(int code, String name, int uid);
@@ -131,6 +134,7 @@ interface IBatteryStats {
void noteDeviceIdleMode(int mode, String activeReason, int activeUid);
void setBatteryState(int status, int health, int plugType, int level, int temp, int volt,
int chargeUAh, int chargeFullUAh);
+ @UnsupportedAppUsage
long getAwakeTimeBattery();
long getAwakeTimePlugged();
diff --git a/core/java/com/android/internal/app/IVoiceInteractionManagerService.aidl b/core/java/com/android/internal/app/IVoiceInteractionManagerService.aidl
index 9ce7ed1562ce..420749e558e0 100644
--- a/core/java/com/android/internal/app/IVoiceInteractionManagerService.aidl
+++ b/core/java/com/android/internal/app/IVoiceInteractionManagerService.aidl
@@ -51,6 +51,7 @@ interface IVoiceInteractionManagerService {
* @param keyphraseId The unique identifier for the keyphrase.
* @param bcp47Locale The BCP47 language tag for the keyphrase's locale.
*/
+ @UnsupportedAppUsage
SoundTrigger.KeyphraseSoundModel getKeyphraseSoundModel(int keyphraseId, in String bcp47Locale);
/**
* Add/Update the given keyphrase sound model.
diff --git a/core/java/com/android/internal/appwidget/IAppWidgetService.aidl b/core/java/com/android/internal/appwidget/IAppWidgetService.aidl
index f9bf3736422b..6d1d1abd1ec4 100644
--- a/core/java/com/android/internal/appwidget/IAppWidgetService.aidl
+++ b/core/java/com/android/internal/appwidget/IAppWidgetService.aidl
@@ -42,6 +42,7 @@ interface IAppWidgetService {
void deleteAppWidgetId(String callingPackage, int appWidgetId);
void deleteHost(String packageName, int hostId);
void deleteAllHosts();
+ @UnsupportedAppUsage
RemoteViews getAppWidgetViews(String callingPackage, int appWidgetId);
int[] getAppWidgetIdsForHost(String callingPackage, int hostId);
IntentSender createAppWidgetConfigIntentSender(String callingPackage, int appWidgetId,
@@ -63,11 +64,14 @@ interface IAppWidgetService {
AppWidgetProviderInfo getAppWidgetInfo(String callingPackage, int appWidgetId);
boolean hasBindAppWidgetPermission(in String packageName, int userId);
void setBindAppWidgetPermission(in String packageName, int userId, in boolean permission);
+ @UnsupportedAppUsage
boolean bindAppWidgetId(in String callingPackage, int appWidgetId,
int providerProfileId, in ComponentName providerComponent, in Bundle options);
+ @UnsupportedAppUsage
boolean bindRemoteViewsService(String callingPackage, int appWidgetId, in Intent intent,
IApplicationThread caller, IBinder token, IServiceConnection connection, int flags);
+ @UnsupportedAppUsage
int[] getAppWidgetIds(in ComponentName providerComponent);
boolean isBoundWidgetPackage(String packageName, int userId);
boolean requestPinAppWidget(String packageName, in ComponentName providerComponent,
diff --git a/core/java/com/android/internal/config/sysui/SystemUiDeviceConfigFlags.java b/core/java/com/android/internal/config/sysui/SystemUiDeviceConfigFlags.java
index 74c6651003e5..f3bf9130b163 100644
--- a/core/java/com/android/internal/config/sysui/SystemUiDeviceConfigFlags.java
+++ b/core/java/com/android/internal/config/sysui/SystemUiDeviceConfigFlags.java
@@ -81,5 +81,13 @@ public final class SystemUiDeviceConfigFlags {
*/
public static final String SSIN_MAX_NUM_ACTIONS = "ssin_max_num_actions";
+ // Flags related to media notifications
+
+ /**
+ * (boolean) If {@code true}, enables the seekbar in compact media notifications.
+ */
+ public static final String COMPACT_MEDIA_SEEKBAR_ENABLED =
+ "compact_media_notification_seekbar_enabled";
+
private SystemUiDeviceConfigFlags() { }
}
diff --git a/core/java/com/android/internal/os/IDropBoxManagerService.aidl b/core/java/com/android/internal/os/IDropBoxManagerService.aidl
index 70844ee4ef11..5e60394e5675 100644
--- a/core/java/com/android/internal/os/IDropBoxManagerService.aidl
+++ b/core/java/com/android/internal/os/IDropBoxManagerService.aidl
@@ -37,5 +37,6 @@ interface IDropBoxManagerService {
boolean isTagEnabled(String tag);
/** @see DropBoxManager#getNextEntry */
+ @UnsupportedAppUsage
DropBoxManager.Entry getNextEntry(String tag, long millis, String packageName);
}
diff --git a/core/java/com/android/internal/policy/IKeyguardService.aidl b/core/java/com/android/internal/policy/IKeyguardService.aidl
index e5d5685ab3e8..54f31f9199cb 100644
--- a/core/java/com/android/internal/policy/IKeyguardService.aidl
+++ b/core/java/com/android/internal/policy/IKeyguardService.aidl
@@ -88,8 +88,10 @@ oneway interface IKeyguardService {
*/
void onScreenTurnedOff();
+ @UnsupportedAppUsage
void setKeyguardEnabled(boolean enabled);
void onSystemReady();
+ @UnsupportedAppUsage
void doKeyguardTimeout(in Bundle options);
void setSwitchingUser(boolean switching);
void setCurrentUser(int userId);
diff --git a/core/java/com/android/internal/statusbar/IStatusBarService.aidl b/core/java/com/android/internal/statusbar/IStatusBarService.aidl
index bfb50848df26..343761430762 100644
--- a/core/java/com/android/internal/statusbar/IStatusBarService.aidl
+++ b/core/java/com/android/internal/statusbar/IStatusBarService.aidl
@@ -31,16 +31,21 @@ import com.android.internal.statusbar.NotificationVisibility;
/** @hide */
interface IStatusBarService
{
+ @UnsupportedAppUsage
void expandNotificationsPanel();
+ @UnsupportedAppUsage
void collapsePanels();
void togglePanel();
+ @UnsupportedAppUsage
void disable(int what, IBinder token, String pkg);
void disableForUser(int what, IBinder token, String pkg, int userId);
void disable2(int what, IBinder token, String pkg);
void disable2ForUser(int what, IBinder token, String pkg, int userId);
int[] getDisableFlags(IBinder token, int userId);
void setIcon(String slot, String iconPackage, int iconId, int iconLevel, String contentDescription);
+ @UnsupportedAppUsage
void setIconVisibility(String slot, boolean visible);
+ @UnsupportedAppUsage
void removeIcon(String slot);
// TODO(b/117478341): support back button change when IME is showing on a external display.
void setImeWindowStatus(in IBinder token, int vis, int backDisposition,
@@ -87,6 +92,7 @@ interface IStatusBarService
void addTile(in ComponentName tile);
void remTile(in ComponentName tile);
void clickTile(in ComponentName tile);
+ @UnsupportedAppUsage
void handleSystemKey(in int key);
/**
diff --git a/core/java/com/android/internal/widget/ILockSettings.aidl b/core/java/com/android/internal/widget/ILockSettings.aidl
index 1c5816c1578e..3be7c3e35895 100644
--- a/core/java/com/android/internal/widget/ILockSettings.aidl
+++ b/core/java/com/android/internal/widget/ILockSettings.aidl
@@ -30,11 +30,17 @@ import java.util.Map;
/** {@hide} */
interface ILockSettings {
+ @UnsupportedAppUsage
void setBoolean(in String key, in boolean value, in int userId);
+ @UnsupportedAppUsage
void setLong(in String key, in long value, in int userId);
+ @UnsupportedAppUsage
void setString(in String key, in String value, in int userId);
+ @UnsupportedAppUsage
boolean getBoolean(in String key, in boolean defaultValue, in int userId);
+ @UnsupportedAppUsage
long getLong(in String key, in long defaultValue, in int userId);
+ @UnsupportedAppUsage
String getString(in String key, in String defaultValue, in int userId);
void setLockCredential(in byte[] credential, int type, in byte[] savedCredential, int requestedQuality, int userId);
void resetKeyStore(int userId);
@@ -43,7 +49,9 @@ interface ILockSettings {
VerifyCredentialResponse verifyCredential(in byte[] credential, int type, long challenge, int userId);
VerifyCredentialResponse verifyTiedProfileChallenge(in byte[] credential, int type, long challenge, int userId);
boolean checkVoldPassword(int userId);
+ @UnsupportedAppUsage
boolean havePattern(int userId);
+ @UnsupportedAppUsage
boolean havePassword(int userId);
byte[] getHashFactor(in byte[] currentCredential, int userId);
void setSeparateProfileChallengeEnabled(int userId, boolean enabled, in byte[] managedUserPassword);
diff --git a/core/java/com/android/internal/widget/IRemoteViewsFactory.aidl b/core/java/com/android/internal/widget/IRemoteViewsFactory.aidl
index 7317ecf68fe9..d6efca5d36eb 100644
--- a/core/java/com/android/internal/widget/IRemoteViewsFactory.aidl
+++ b/core/java/com/android/internal/widget/IRemoteViewsFactory.aidl
@@ -21,15 +21,23 @@ import android.widget.RemoteViews;
/** {@hide} */
interface IRemoteViewsFactory {
+ @UnsupportedAppUsage
void onDataSetChanged();
oneway void onDataSetChangedAsync();
oneway void onDestroy(in Intent intent);
+ @UnsupportedAppUsage
int getCount();
+ @UnsupportedAppUsage
RemoteViews getViewAt(int position);
+ @UnsupportedAppUsage
RemoteViews getLoadingView();
+ @UnsupportedAppUsage
int getViewTypeCount();
+ @UnsupportedAppUsage
long getItemId(int position);
+ @UnsupportedAppUsage
boolean hasStableIds();
+ @UnsupportedAppUsage
boolean isCreated();
}
diff --git a/core/jni/Android.bp b/core/jni/Android.bp
index c309f276d3ed..cd34d2e1b441 100644
--- a/core/jni/Android.bp
+++ b/core/jni/Android.bp
@@ -165,6 +165,8 @@ cc_library_shared {
"android_media_AudioTrack.cpp",
"android_media_AudioAttributes.cpp",
"android_media_AudioProductStrategies.cpp",
+ "android_media_AudioVolumeGroups.cpp",
+ "android_media_AudioVolumeGroupCallback.cpp",
"android_media_DeviceCallback.cpp",
"android_media_JetPlayer.cpp",
"android_media_MediaMetricsJNI.cpp",
diff --git a/core/jni/AndroidRuntime.cpp b/core/jni/AndroidRuntime.cpp
index 16517bf87afe..da27852a3a35 100644
--- a/core/jni/AndroidRuntime.cpp
+++ b/core/jni/AndroidRuntime.cpp
@@ -110,6 +110,8 @@ extern int register_android_media_AudioSystem(JNIEnv *env);
extern int register_android_media_AudioTrack(JNIEnv *env);
extern int register_android_media_AudioAttributes(JNIEnv *env);
extern int register_android_media_AudioProductStrategies(JNIEnv *env);
+extern int register_android_media_AudioVolumeGroups(JNIEnv *env);
+extern int register_android_media_AudioVolumeGroupChangeHandler(JNIEnv *env);
extern int register_android_media_MicrophoneInfo(JNIEnv *env);
extern int register_android_media_JetPlayer(JNIEnv *env);
extern int register_android_media_ToneGenerator(JNIEnv *env);
@@ -1524,6 +1526,8 @@ static const RegJNIRec gRegJNI[] = {
REG_JNI(register_android_media_AudioTrack),
REG_JNI(register_android_media_AudioAttributes),
REG_JNI(register_android_media_AudioProductStrategies),
+ REG_JNI(register_android_media_AudioVolumeGroups),
+ REG_JNI(register_android_media_AudioVolumeGroupChangeHandler),
REG_JNI(register_android_media_JetPlayer),
REG_JNI(register_android_media_MicrophoneInfo),
REG_JNI(register_android_media_RemoteDisplay),
diff --git a/core/jni/android_media_AudioProductStrategies.cpp b/core/jni/android_media_AudioProductStrategies.cpp
index d7d31e59ad30..822b74a6b990 100644
--- a/core/jni/android_media_AudioProductStrategies.cpp
+++ b/core/jni/android_media_AudioProductStrategies.cpp
@@ -57,7 +57,7 @@ static struct {
static jclass gAudioAttributesGroupClass;
static jmethodID gAudioAttributesGroupCstor;
static struct {
- jfieldID mGroupId;
+ jfieldID mVolumeGroupId;
jfieldID mLegacyStreamType;
jfieldID mAudioAttributes;
} gAudioAttributesGroupsFields;
@@ -207,7 +207,7 @@ android_media_AudioSystem_getProductStrategyFromAudioAttributes(JNIEnv *env, job
}
product_strategy_t psId;
status_t status = AudioSystem::getProductStrategyFromAudioAttributes(
- AudioAttributes(*attributes.get()), psId);
+ AudioAttributes(*attributes.get()), psId);
if (status != NO_ERROR) {
return nativeToJavaStatus(status);
}
@@ -249,8 +249,8 @@ int register_android_media_AudioProductStrategies(JNIEnv *env)
gAudioAttributesGroupClass = MakeGlobalRefOrDie(env, audioAttributesGroupClass);
gAudioAttributesGroupCstor = GetMethodIDOrDie(env, audioAttributesGroupClass, "<init>",
"(II[Landroid/media/AudioAttributes;)V");
- gAudioAttributesGroupsFields.mGroupId = GetFieldIDOrDie(
- env, audioAttributesGroupClass, "mGroupId", "I");
+ gAudioAttributesGroupsFields.mVolumeGroupId = GetFieldIDOrDie(
+ env, audioAttributesGroupClass, "mVolumeGroupId", "I");
gAudioAttributesGroupsFields.mLegacyStreamType = GetFieldIDOrDie(
env, audioAttributesGroupClass, "mLegacyStreamType", "I");
gAudioAttributesGroupsFields.mAudioAttributes = GetFieldIDOrDie(
diff --git a/core/jni/android_media_AudioSystem.cpp b/core/jni/android_media_AudioSystem.cpp
index bd998999ce63..1a90ebfee999 100644
--- a/core/jni/android_media_AudioSystem.cpp
+++ b/core/jni/android_media_AudioSystem.cpp
@@ -573,6 +573,81 @@ android_media_AudioSystem_getStreamVolumeIndex(JNIEnv *env,
}
static jint
+android_media_AudioSystem_setVolumeIndexForAttributes(JNIEnv *env,
+ jobject thiz,
+ jobject jaa,
+ jint index,
+ jint device)
+{
+ // read the AudioAttributes values
+ JNIAudioAttributeHelper::UniqueAaPtr paa = JNIAudioAttributeHelper::makeUnique();
+ jint jStatus = JNIAudioAttributeHelper::nativeFromJava(env, jaa, paa.get());
+ if (jStatus != (jint)AUDIO_JAVA_SUCCESS) {
+ return jStatus;
+ }
+ return (jint) check_AudioSystem_Command(
+ AudioSystem::setVolumeIndexForAttributes(*(paa.get()), index, (audio_devices_t)device));
+}
+
+static jint
+android_media_AudioSystem_getVolumeIndexForAttributes(JNIEnv *env,
+ jobject thiz,
+ jobject jaa,
+ jint device)
+{
+ // read the AudioAttributes values
+ JNIAudioAttributeHelper::UniqueAaPtr paa = JNIAudioAttributeHelper::makeUnique();
+ jint jStatus = JNIAudioAttributeHelper::nativeFromJava(env, jaa, paa.get());
+ if (jStatus != (jint)AUDIO_JAVA_SUCCESS) {
+ return jStatus;
+ }
+ int index;
+ if (AudioSystem::getVolumeIndexForAttributes(*(paa.get()), index, (audio_devices_t)device)
+ != NO_ERROR) {
+ index = -1;
+ }
+ return (jint) index;
+}
+
+static jint
+android_media_AudioSystem_getMinVolumeIndexForAttributes(JNIEnv *env,
+ jobject thiz,
+ jobject jaa)
+{
+ // read the AudioAttributes values
+ JNIAudioAttributeHelper::UniqueAaPtr paa = JNIAudioAttributeHelper::makeUnique();
+ jint jStatus = JNIAudioAttributeHelper::nativeFromJava(env, jaa, paa.get());
+ if (jStatus != (jint)AUDIO_JAVA_SUCCESS) {
+ return jStatus;
+ }
+ int index;
+ if (AudioSystem::getMinVolumeIndexForAttributes(*(paa.get()), index)
+ != NO_ERROR) {
+ index = -1;
+ }
+ return (jint) index;
+}
+
+static jint
+android_media_AudioSystem_getMaxVolumeIndexForAttributes(JNIEnv *env,
+ jobject thiz,
+ jobject jaa)
+{
+ // read the AudioAttributes values
+ JNIAudioAttributeHelper::UniqueAaPtr paa = JNIAudioAttributeHelper::makeUnique();
+ jint jStatus = JNIAudioAttributeHelper::nativeFromJava(env, jaa, paa.get());
+ if (jStatus != (jint)AUDIO_JAVA_SUCCESS) {
+ return jStatus;
+ }
+ int index;
+ if (AudioSystem::getMaxVolumeIndexForAttributes(*(paa.get()), index)
+ != NO_ERROR) {
+ index = -1;
+ }
+ return (jint) index;
+}
+
+static jint
android_media_AudioSystem_setMasterVolume(JNIEnv *env, jobject thiz, jfloat value)
{
return (jint) check_AudioSystem_Command(AudioSystem::setMasterVolume(value));
@@ -2172,6 +2247,10 @@ static const JNINativeMethod gMethods[] = {
{"initStreamVolume", "(III)I", (void *)android_media_AudioSystem_initStreamVolume},
{"setStreamVolumeIndex","(III)I", (void *)android_media_AudioSystem_setStreamVolumeIndex},
{"getStreamVolumeIndex","(II)I", (void *)android_media_AudioSystem_getStreamVolumeIndex},
+ {"setVolumeIndexForAttributes","(Landroid/media/AudioAttributes;II)I", (void *)android_media_AudioSystem_setVolumeIndexForAttributes},
+ {"getVolumeIndexForAttributes","(Landroid/media/AudioAttributes;I)I", (void *)android_media_AudioSystem_getVolumeIndexForAttributes},
+ {"getMinVolumeIndexForAttributes","(Landroid/media/AudioAttributes;)I", (void *)android_media_AudioSystem_getMinVolumeIndexForAttributes},
+ {"getMaxVolumeIndexForAttributes","(Landroid/media/AudioAttributes;)I", (void *)android_media_AudioSystem_getMaxVolumeIndexForAttributes},
{"setMasterVolume", "(F)I", (void *)android_media_AudioSystem_setMasterVolume},
{"getMasterVolume", "()F", (void *)android_media_AudioSystem_getMasterVolume},
{"setMasterMute", "(Z)I", (void *)android_media_AudioSystem_setMasterMute},
diff --git a/core/jni/android_media_AudioVolumeGroupCallback.cpp b/core/jni/android_media_AudioVolumeGroupCallback.cpp
new file mode 100644
index 000000000000..cb4ddbd119d5
--- /dev/null
+++ b/core/jni/android_media_AudioVolumeGroupCallback.cpp
@@ -0,0 +1,175 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+//#define LOG_NDEBUG 0
+
+#define LOG_TAG "AudioVolumeGroupCallback-JNI"
+
+#include <utils/Log.h>
+#include <nativehelper/JNIHelp.h>
+#include "core_jni_helpers.h"
+
+#include "android_media_AudioVolumeGroupCallback.h"
+
+
+// ----------------------------------------------------------------------------
+using namespace android;
+
+static const char* const kAudioVolumeGroupChangeHandlerClassPathName =
+ "android/media/audiopolicy/AudioVolumeGroupChangeHandler";
+
+static struct {
+ jfieldID mJniCallback;
+} gAudioVolumeGroupChangeHandlerFields;
+
+static struct {
+ jmethodID postEventFromNative;
+} gAudioVolumeGroupChangeHandlerMethods;
+
+static Mutex gLock;
+
+JNIAudioVolumeGroupCallback::JNIAudioVolumeGroupCallback(JNIEnv* env,
+ jobject thiz,
+ jobject weak_thiz)
+{
+ jclass clazz = env->GetObjectClass(thiz);
+ if (clazz == NULL) {
+ ALOGE("Can't find class %s", kAudioVolumeGroupChangeHandlerClassPathName);
+ return;
+ }
+ mClass = (jclass)env->NewGlobalRef(clazz);
+
+ // We use a weak reference so the AudioVolumeGroupChangeHandler object can be garbage collected.
+ // The reference is only used as a proxy for callbacks.
+ mObject = env->NewGlobalRef(weak_thiz);
+}
+
+JNIAudioVolumeGroupCallback::~JNIAudioVolumeGroupCallback()
+{
+ // remove global references
+ JNIEnv *env = AndroidRuntime::getJNIEnv();
+ if (env == NULL) {
+ return;
+ }
+ env->DeleteGlobalRef(mObject);
+ env->DeleteGlobalRef(mClass);
+}
+
+void JNIAudioVolumeGroupCallback::onAudioVolumeGroupChanged(volume_group_t group, int flags)
+{
+ JNIEnv *env = AndroidRuntime::getJNIEnv();
+ if (env == NULL) {
+ return;
+ }
+ ALOGV("%s volume group id %d", __FUNCTION__, group);
+ env->CallStaticVoidMethod(mClass,
+ gAudioVolumeGroupChangeHandlerMethods.postEventFromNative,
+ mObject,
+ AUDIOVOLUMEGROUP_EVENT_VOLUME_CHANGED, group, flags, NULL);
+ if (env->ExceptionCheck()) {
+ ALOGW("An exception occurred while notifying an event.");
+ env->ExceptionClear();
+ }
+}
+
+void JNIAudioVolumeGroupCallback::onServiceDied()
+{
+ JNIEnv *env = AndroidRuntime::getJNIEnv();
+ if (env == NULL) {
+ return;
+ }
+ env->CallStaticVoidMethod(mClass,
+ gAudioVolumeGroupChangeHandlerMethods.postEventFromNative,
+ mObject,
+ AUDIOVOLUMEGROUP_EVENT_SERVICE_DIED, 0, 0, NULL);
+ if (env->ExceptionCheck()) {
+ ALOGW("An exception occurred while notifying an event.");
+ env->ExceptionClear();
+ }
+}
+
+static
+sp<JNIAudioVolumeGroupCallback> setJniCallback(JNIEnv* env,
+ jobject thiz,
+ const sp<JNIAudioVolumeGroupCallback>& callback)
+{
+ Mutex::Autolock l(gLock);
+ sp<JNIAudioVolumeGroupCallback> old = (JNIAudioVolumeGroupCallback*)env->GetLongField(
+ thiz, gAudioVolumeGroupChangeHandlerFields.mJniCallback);
+ if (callback.get()) {
+ callback->incStrong((void*)setJniCallback);
+ }
+ if (old != 0) {
+ old->decStrong((void*)setJniCallback);
+ }
+ env->SetLongField(thiz, gAudioVolumeGroupChangeHandlerFields.mJniCallback,
+ (jlong)callback.get());
+ return old;
+}
+
+static void
+android_media_AudioVolumeGroupChangeHandler_eventHandlerSetup(JNIEnv *env,
+ jobject thiz,
+ jobject weak_this)
+{
+ ALOGV("%s", __FUNCTION__);
+ sp<JNIAudioVolumeGroupCallback> callback =
+ new JNIAudioVolumeGroupCallback(env, thiz, weak_this);
+
+ if (AudioSystem::addAudioVolumeGroupCallback(callback) == NO_ERROR) {
+ setJniCallback(env, thiz, callback);
+ }
+}
+
+static void
+android_media_AudioVolumeGroupChangeHandler_eventHandlerFinalize(JNIEnv *env, jobject thiz)
+{
+ ALOGV("%s", __FUNCTION__);
+ sp<JNIAudioVolumeGroupCallback> callback = setJniCallback(env, thiz, 0);
+ if (callback != 0) {
+ AudioSystem::removeAudioVolumeGroupCallback(callback);
+ }
+}
+
+/*
+ * JNI registration.
+ */
+static const JNINativeMethod gMethods[] = {
+ {"native_setup", "(Ljava/lang/Object;)V",
+ (void *)android_media_AudioVolumeGroupChangeHandler_eventHandlerSetup},
+ {"native_finalize", "()V",
+ (void *)android_media_AudioVolumeGroupChangeHandler_eventHandlerFinalize},
+};
+
+int register_android_media_AudioVolumeGroupChangeHandler(JNIEnv *env)
+{
+ jclass audioVolumeGroupChangeHandlerClass =
+ FindClassOrDie(env, kAudioVolumeGroupChangeHandlerClassPathName);
+ gAudioVolumeGroupChangeHandlerMethods.postEventFromNative =
+ GetStaticMethodIDOrDie(env, audioVolumeGroupChangeHandlerClass, "postEventFromNative",
+ "(Ljava/lang/Object;IIILjava/lang/Object;)V");
+
+ gAudioVolumeGroupChangeHandlerFields.mJniCallback =
+ GetFieldIDOrDie(env, audioVolumeGroupChangeHandlerClass, "mJniCallback", "J");
+
+ env->DeleteLocalRef(audioVolumeGroupChangeHandlerClass);
+
+ return RegisterMethodsOrDie(env,
+ kAudioVolumeGroupChangeHandlerClassPathName,
+ gMethods,
+ NELEM(gMethods));
+}
+
diff --git a/core/jni/android_media_AudioVolumeGroupCallback.h b/core/jni/android_media_AudioVolumeGroupCallback.h
new file mode 100644
index 000000000000..de06549621b9
--- /dev/null
+++ b/core/jni/android_media_AudioVolumeGroupCallback.h
@@ -0,0 +1,44 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#pragma once
+
+#include <system/audio.h>
+#include <media/AudioSystem.h>
+
+namespace android {
+
+// keep in sync with AudioManager.AudioVolumeGroupChangeHandler.java
+#define AUDIOVOLUMEGROUP_EVENT_VOLUME_CHANGED 1000
+#define AUDIOVOLUMEGROUP_EVENT_SERVICE_DIED 1001
+
+class JNIAudioVolumeGroupCallback: public AudioSystem::AudioVolumeGroupCallback
+{
+public:
+ JNIAudioVolumeGroupCallback(JNIEnv* env, jobject thiz, jobject weak_thiz);
+ ~JNIAudioVolumeGroupCallback();
+
+ void onAudioVolumeGroupChanged(volume_group_t group, int flags) override;
+ void onServiceDied() override;
+
+private:
+ void sendEvent(int event);
+
+ jclass mClass; /**< Reference to AudioVolumeGroupChangeHandler class. */
+ jobject mObject; /**< Weak ref to AudioVolumeGroupChangeHandler object to call on. */
+};
+
+} // namespace android
diff --git a/core/jni/android_media_AudioVolumeGroups.cpp b/core/jni/android_media_AudioVolumeGroups.cpp
new file mode 100644
index 000000000000..64f0c1e33e1c
--- /dev/null
+++ b/core/jni/android_media_AudioVolumeGroups.cpp
@@ -0,0 +1,183 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+//#define LOG_NDEBUG 0
+
+#define LOG_TAG "AudioVolumeGroups-JNI"
+
+#include <inttypes.h>
+#include <jni.h>
+#include <nativehelper/JNIHelp.h>
+#include "core_jni_helpers.h"
+
+#include <utils/Log.h>
+#include <vector>
+
+#include <media/AudioSystem.h>
+#include <media/AudioPolicy.h>
+
+#include <nativehelper/ScopedUtfChars.h>
+
+#include "android_media_AudioAttributes.h"
+#include "android_media_AudioErrors.h"
+
+// ----------------------------------------------------------------------------
+
+using namespace android;
+
+// ----------------------------------------------------------------------------
+static const char* const kClassPathName = "android/media/audiopolicy/AudioVolumeGroups";
+static const char* const kAudioVolumeGroupClassPathName =
+ "android/media/audiopolicy/AudioVolumeGroup";
+
+static jclass gAudioVolumeGroupClass;
+static jmethodID gAudioVolumeGroupCstor;
+static struct {
+ jfieldID mName;
+ jfieldID mId;
+} gAudioVolumeGroupFields;
+
+static jclass gArrayListClass;
+static jmethodID gArrayListCstor;
+static struct {
+ jmethodID add;
+ jmethodID toArray;
+} gArrayListMethods;
+
+
+static jint convertAudioVolumeGroupsFromNative(
+ JNIEnv *env, jobject *jGroup, const AudioVolumeGroup &group)
+{
+ jint jStatus = (jint)AUDIO_JAVA_SUCCESS;
+ jstring jName = NULL;
+ jint Id = NULL;
+
+ jintArray jLegacyStreamTypes = NULL;
+ jobjectArray jAudioAttributes = NULL;
+ jint numAttributes;
+ jobject jAudioAttribute = NULL;
+
+ jName = env->NewStringUTF(group.getName().c_str());
+ Id = static_cast<jint>(group.getId());
+
+ // Legacy stream types array
+ jLegacyStreamTypes = env->NewIntArray(group.getStreamTypes().size());
+ if (jLegacyStreamTypes == NULL) {
+ jStatus = (jint)AUDIO_JAVA_ERROR;
+ goto exit;
+ }
+ for (size_t streamIndex = 0; streamIndex < group.getStreamTypes().size(); streamIndex++) {
+ jint jStream = group.getStreamTypes()[streamIndex];
+ env->SetIntArrayRegion(jLegacyStreamTypes, streamIndex, 1, &jStream);
+ }
+
+ // Audio Attributes array
+ numAttributes = group.getAudioAttributes().size();
+ jStatus = JNIAudioAttributeHelper::getJavaArray(env, &jAudioAttributes, numAttributes);
+ if (jStatus != (jint)AUDIO_JAVA_SUCCESS) {
+ goto exit;
+ }
+
+ for (size_t j = 0; j < static_cast<size_t>(numAttributes); j++) {
+ auto attributes = group.getAudioAttributes()[j];
+
+ jStatus = JNIAudioAttributeHelper::nativeToJava(env, &jAudioAttribute, attributes);
+ if (jStatus != AUDIO_JAVA_SUCCESS) {
+ goto exit;
+ }
+ env->SetObjectArrayElement(jAudioAttributes, j, jAudioAttribute);
+ }
+
+ *jGroup = env->NewObject(gAudioVolumeGroupClass, gAudioVolumeGroupCstor,
+ jName, Id, jAudioAttributes, jLegacyStreamTypes);
+exit:
+ if (jName != NULL) {
+ env->DeleteLocalRef(jName);
+ }
+ return jStatus;
+}
+
+static jint
+android_media_AudioSystem_listAudioVolumeGroups(JNIEnv *env, jobject clazz, jobject jVolumeGroups)
+{
+ if (env == NULL) {
+ return AUDIO_JAVA_DEAD_OBJECT;
+ }
+ if (jVolumeGroups == NULL) {
+ ALOGE("listAudioVolumeGroups NULL AudioVolumeGroups");
+ return (jint)AUDIO_JAVA_BAD_VALUE;
+ }
+ if (!env->IsInstanceOf(jVolumeGroups, gArrayListClass)) {
+ ALOGE("listAudioVolumeGroups not an arraylist");
+ return (jint)AUDIO_JAVA_BAD_VALUE;
+ }
+
+ status_t status;
+ AudioVolumeGroupVector groups;
+ jint jStatus;
+ jobject jGroup = NULL;
+
+ status = AudioSystem::listAudioVolumeGroups(groups);
+ if (status != NO_ERROR) {
+ ALOGE("AudioSystem::listAudioVolumeGroups error %d", status);
+ return nativeToJavaStatus(status);
+ }
+ for (const auto &group : groups) {
+ jStatus = convertAudioVolumeGroupsFromNative(env, &jGroup, group);
+ if (jStatus != AUDIO_JAVA_SUCCESS) {
+ goto exit;
+ }
+ env->CallBooleanMethod(jVolumeGroups, gArrayListMethods.add, jGroup);
+ }
+exit:
+ if (jGroup != NULL) {
+ env->DeleteLocalRef(jGroup);
+ }
+ return jStatus;
+}
+
+/*
+ * JNI registration.
+ */
+static const JNINativeMethod gMethods[] = {
+ {"native_list_audio_volume_groups", "(Ljava/util/ArrayList;)I",
+ (void *)android_media_AudioSystem_listAudioVolumeGroups},
+};
+
+int register_android_media_AudioVolumeGroups(JNIEnv *env)
+{
+ jclass arrayListClass = FindClassOrDie(env, "java/util/ArrayList");
+ gArrayListClass = MakeGlobalRefOrDie(env, arrayListClass);
+ gArrayListCstor = GetMethodIDOrDie(env, arrayListClass, "<init>", "()V");
+ gArrayListMethods.add = GetMethodIDOrDie(env, arrayListClass, "add", "(Ljava/lang/Object;)Z");
+ gArrayListMethods.toArray = GetMethodIDOrDie(env, arrayListClass,
+ "toArray", "()[Ljava/lang/Object;");
+
+ jclass audioVolumeGroupClass = FindClassOrDie(env, kAudioVolumeGroupClassPathName);
+ gAudioVolumeGroupClass = MakeGlobalRefOrDie(env, audioVolumeGroupClass);
+ gAudioVolumeGroupCstor = GetMethodIDOrDie(
+ env, audioVolumeGroupClass, "<init>",
+ "(Ljava/lang/String;I[Landroid/media/AudioAttributes;[I)V");
+
+ gAudioVolumeGroupFields.mName = GetFieldIDOrDie(
+ env, audioVolumeGroupClass, "mName", "Ljava/lang/String;");
+ gAudioVolumeGroupFields.mId = GetFieldIDOrDie(
+ env, audioVolumeGroupClass, "mId", "I");
+
+ env->DeleteLocalRef(audioVolumeGroupClass);
+
+ return RegisterMethodsOrDie(env, kClassPathName, gMethods, NELEM(gMethods));
+}
diff --git a/core/jni/android_view_InputEventReceiver.cpp b/core/jni/android_view_InputEventReceiver.cpp
index fb6dd9392e82..7975c8675954 100644
--- a/core/jni/android_view_InputEventReceiver.cpp
+++ b/core/jni/android_view_InputEventReceiver.cpp
@@ -23,10 +23,9 @@
#include <nativehelper/JNIHelp.h>
#include <android_runtime/AndroidRuntime.h>
-#include <utils/Log.h>
+#include <log/log.h>
#include <utils/Looper.h>
#include <utils/Vector.h>
-#include <utils/threads.h>
#include <input/InputTransport.h>
#include "android_os_MessageQueue.h"
#include "android_view_InputChannel.h"
diff --git a/core/jni/android_view_InputEventSender.cpp b/core/jni/android_view_InputEventSender.cpp
index aa10a2f98a7e..2542286635e6 100644
--- a/core/jni/android_view_InputEventSender.cpp
+++ b/core/jni/android_view_InputEventSender.cpp
@@ -21,10 +21,8 @@
#include <nativehelper/JNIHelp.h>
#include <android_runtime/AndroidRuntime.h>
-#include <utils/Log.h>
+#include <log/log.h>
#include <utils/Looper.h>
-#include <utils/threads.h>
-#include <utils/KeyedVector.h>
#include <input/InputTransport.h>
#include "android_os_MessageQueue.h"
#include "android_view_InputChannel.h"
@@ -32,6 +30,7 @@
#include "android_view_MotionEvent.h"
#include <nativehelper/ScopedLocalRef.h>
+#include <unordered_map>
#include "core_jni_helpers.h"
@@ -65,7 +64,8 @@ private:
jobject mSenderWeakGlobal;
InputPublisher mInputPublisher;
sp<MessageQueue> mMessageQueue;
- KeyedVector<uint32_t, uint32_t> mPublishedSeqMap;
+ std::unordered_map<uint32_t, uint32_t> mPublishedSeqMap;
+
uint32_t mNextPublishedSeq;
const std::string getInputChannelName() {
@@ -122,7 +122,7 @@ status_t NativeInputEventSender::sendKeyEvent(uint32_t seq, const KeyEvent* even
getInputChannelName().c_str(), status);
return status;
}
- mPublishedSeqMap.add(publishedSeq, seq);
+ mPublishedSeqMap.emplace(publishedSeq, seq);
return OK;
}
@@ -150,7 +150,7 @@ status_t NativeInputEventSender::sendMotionEvent(uint32_t seq, const MotionEvent
return status;
}
}
- mPublishedSeqMap.add(publishedSeq, seq);
+ mPublishedSeqMap.emplace(publishedSeq, seq);
return OK;
}
@@ -199,35 +199,37 @@ status_t NativeInputEventSender::receiveFinishedSignals(JNIEnv* env) {
return status;
}
- ssize_t index = mPublishedSeqMap.indexOfKey(publishedSeq);
- if (index >= 0) {
- uint32_t seq = mPublishedSeqMap.valueAt(index);
- mPublishedSeqMap.removeItemsAt(index);
+ auto it = mPublishedSeqMap.find(publishedSeq);
+ if (it == mPublishedSeqMap.end()) {
+ continue;
+ }
+
+ uint32_t seq = it->second;
+ mPublishedSeqMap.erase(it);
- if (kDebugDispatchCycle) {
- ALOGD("channel '%s' ~ Received finished signal, seq=%u, handled=%s, "
- "pendingEvents=%zu.",
- getInputChannelName().c_str(), seq, handled ? "true" : "false",
- mPublishedSeqMap.size());
- }
+ if (kDebugDispatchCycle) {
+ ALOGD("channel '%s' ~ Received finished signal, seq=%u, handled=%s, "
+ "pendingEvents=%zu.",
+ getInputChannelName().c_str(), seq, handled ? "true" : "false",
+ mPublishedSeqMap.size());
+ }
- if (!skipCallbacks) {
+ if (!skipCallbacks) {
+ if (!senderObj.get()) {
+ senderObj.reset(jniGetReferent(env, mSenderWeakGlobal));
if (!senderObj.get()) {
- senderObj.reset(jniGetReferent(env, mSenderWeakGlobal));
- if (!senderObj.get()) {
- ALOGW("channel '%s' ~ Sender object was finalized "
- "without being disposed.", getInputChannelName().c_str());
- return DEAD_OBJECT;
- }
+ ALOGW("channel '%s' ~ Sender object was finalized "
+ "without being disposed.", getInputChannelName().c_str());
+ return DEAD_OBJECT;
}
+ }
- env->CallVoidMethod(senderObj.get(),
- gInputEventSenderClassInfo.dispatchInputEventFinished,
- jint(seq), jboolean(handled));
- if (env->ExceptionCheck()) {
- ALOGE("Exception dispatching finished signal.");
- skipCallbacks = true;
- }
+ env->CallVoidMethod(senderObj.get(),
+ gInputEventSenderClassInfo.dispatchInputEventFinished,
+ jint(seq), jboolean(handled));
+ if (env->ExceptionCheck()) {
+ ALOGE("Exception dispatching finished signal.");
+ skipCallbacks = true;
}
}
}
diff --git a/core/jni/android_view_Surface.cpp b/core/jni/android_view_Surface.cpp
index 464f24901eb1..a9002945ff91 100644
--- a/core/jni/android_view_Surface.cpp
+++ b/core/jni/android_view_Surface.cpp
@@ -58,8 +58,6 @@
namespace android {
-using ui::Dataspace;
-
static const char* const OutOfResourcesException =
"android/view/Surface$OutOfResourcesException";
@@ -129,135 +127,17 @@ jobject android_view_Surface_createFromIGraphicBufferProducer(JNIEnv* env,
}
int android_view_Surface_mapPublicFormatToHalFormat(PublicFormat f) {
-
- switch(f) {
- case PublicFormat::JPEG:
- case PublicFormat::DEPTH_POINT_CLOUD:
- case PublicFormat::DEPTH_JPEG:
- case PublicFormat::HEIC:
- return HAL_PIXEL_FORMAT_BLOB;
- case PublicFormat::DEPTH16:
- return HAL_PIXEL_FORMAT_Y16;
- case PublicFormat::RAW_SENSOR:
- case PublicFormat::RAW_DEPTH:
- return HAL_PIXEL_FORMAT_RAW16;
- default:
- // Most formats map 1:1
- return static_cast<int>(f);
- }
+ return mapPublicFormatToHalFormat(f);
}
android_dataspace android_view_Surface_mapPublicFormatToHalDataspace(
PublicFormat f) {
- Dataspace dataspace;
- switch(f) {
- case PublicFormat::JPEG:
- dataspace = Dataspace::V0_JFIF;
- break;
- case PublicFormat::DEPTH_POINT_CLOUD:
- case PublicFormat::DEPTH16:
- case PublicFormat::RAW_DEPTH:
- dataspace = Dataspace::DEPTH;
- break;
- case PublicFormat::RAW_SENSOR:
- case PublicFormat::RAW_PRIVATE:
- case PublicFormat::RAW10:
- case PublicFormat::RAW12:
- dataspace = Dataspace::ARBITRARY;
- break;
- case PublicFormat::YUV_420_888:
- case PublicFormat::NV21:
- case PublicFormat::YV12:
- dataspace = Dataspace::V0_JFIF;
- break;
- case PublicFormat::DEPTH_JPEG:
- dataspace = Dataspace::DYNAMIC_DEPTH;
- break;
- case PublicFormat::HEIC:
- dataspace = Dataspace::HEIF;
- break;
- default:
- // Most formats map to UNKNOWN
- dataspace = Dataspace::UNKNOWN;
- break;
- }
- return static_cast<android_dataspace>(dataspace);
+ return mapPublicFormatToHalDataspace(f);
}
PublicFormat android_view_Surface_mapHalFormatDataspaceToPublicFormat(
int format, android_dataspace dataSpace) {
- Dataspace ds = static_cast<Dataspace>(dataSpace);
- switch(format) {
- case HAL_PIXEL_FORMAT_RGBA_8888:
- case HAL_PIXEL_FORMAT_RGBX_8888:
- case HAL_PIXEL_FORMAT_RGBA_FP16:
- case HAL_PIXEL_FORMAT_RGBA_1010102:
- case HAL_PIXEL_FORMAT_RGB_888:
- case HAL_PIXEL_FORMAT_RGB_565:
- case HAL_PIXEL_FORMAT_Y8:
- case HAL_PIXEL_FORMAT_RAW10:
- case HAL_PIXEL_FORMAT_RAW12:
- case HAL_PIXEL_FORMAT_YCbCr_420_888:
- case HAL_PIXEL_FORMAT_YV12:
- // Enums overlap in both name and value
- return static_cast<PublicFormat>(format);
- case HAL_PIXEL_FORMAT_RAW16:
- switch (ds) {
- case Dataspace::DEPTH:
- return PublicFormat::RAW_DEPTH;
- default:
- return PublicFormat::RAW_SENSOR;
- }
- case HAL_PIXEL_FORMAT_RAW_OPAQUE:
- // Name differs, though value is the same
- return PublicFormat::RAW_PRIVATE;
- case HAL_PIXEL_FORMAT_YCbCr_422_SP:
- // Name differs, though the value is the same
- return PublicFormat::NV16;
- case HAL_PIXEL_FORMAT_YCrCb_420_SP:
- // Name differs, though the value is the same
- return PublicFormat::NV21;
- case HAL_PIXEL_FORMAT_YCbCr_422_I:
- // Name differs, though the value is the same
- return PublicFormat::YUY2;
- case HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED:
- // Name differs, though the value is the same
- return PublicFormat::PRIVATE;
- case HAL_PIXEL_FORMAT_Y16:
- // Dataspace-dependent
- switch (ds) {
- case Dataspace::DEPTH:
- return PublicFormat::DEPTH16;
- default:
- // Assume non-depth Y16 is just Y16.
- return PublicFormat::Y16;
- }
- break;
- case HAL_PIXEL_FORMAT_BLOB:
- // Dataspace-dependent
- switch (ds) {
- case Dataspace::DEPTH:
- return PublicFormat::DEPTH_POINT_CLOUD;
- case Dataspace::V0_JFIF:
- return PublicFormat::JPEG;
- case Dataspace::HEIF:
- return PublicFormat::HEIC;
- default:
- if (dataSpace == static_cast<android_dataspace>(HAL_DATASPACE_DYNAMIC_DEPTH)) {
- return PublicFormat::DEPTH_JPEG;
- } else {
- // Assume otherwise-marked blobs are also JPEG
- return PublicFormat::JPEG;
- }
- }
- break;
- case HAL_PIXEL_FORMAT_BGRA_8888:
- // Not defined in public API
- return PublicFormat::UNKNOWN;
-
- default:
- return PublicFormat::UNKNOWN;
- }
+ return mapHalFormatDataspaceToPublicFormat(format, dataSpace);
}
// ----------------------------------------------------------------------------
diff --git a/core/jni/android_view_SurfaceControl.cpp b/core/jni/android_view_SurfaceControl.cpp
index 4c25fd465301..af2bf2d40146 100644
--- a/core/jni/android_view_SurfaceControl.cpp
+++ b/core/jni/android_view_SurfaceControl.cpp
@@ -717,6 +717,29 @@ static jboolean nativeSetAllowedDisplayConfigs(JNIEnv* env, jclass clazz,
return result == NO_ERROR ? JNI_TRUE : JNI_FALSE;
}
+static jintArray nativeGetAllowedDisplayConfigs(JNIEnv* env, jclass clazz, jobject tokenObj) {
+ sp<IBinder> token(ibinderForJavaObject(env, tokenObj));
+ if (token == nullptr) return JNI_FALSE;
+
+ std::vector<int32_t> allowedConfigs;
+ size_t result = SurfaceComposerClient::getAllowedDisplayConfigs(token, &allowedConfigs);
+ if (result != NO_ERROR) {
+ return nullptr;
+ }
+
+ jintArray allowedConfigsArray = env->NewIntArray(allowedConfigs.size());
+ if (allowedConfigsArray == nullptr) {
+ jniThrowException(env, "java/lang/OutOfMemoryError", NULL);
+ return nullptr;
+ }
+ jint* allowedConfigsArrayValues = env->GetIntArrayElements(allowedConfigsArray, 0);
+ for (size_t i = 0; i < allowedConfigs.size(); i++) {
+ allowedConfigsArrayValues[i] = static_cast<jint>(allowedConfigs[i]);
+ }
+ env->ReleaseIntArrayElements(allowedConfigsArray, allowedConfigsArrayValues, 0);
+ return allowedConfigsArray;
+}
+
static jint nativeGetActiveConfig(JNIEnv* env, jclass clazz, jobject tokenObj) {
sp<IBinder> token(ibinderForJavaObject(env, tokenObj));
if (token == NULL) return -1;
@@ -1215,6 +1238,8 @@ static const JNINativeMethod sSurfaceControlMethods[] = {
(void*)nativeSetActiveConfig },
{"nativeSetAllowedDisplayConfigs", "(Landroid/os/IBinder;[I)Z",
(void*)nativeSetAllowedDisplayConfigs },
+ {"nativeGetAllowedDisplayConfigs", "(Landroid/os/IBinder;)[I",
+ (void*)nativeGetAllowedDisplayConfigs },
{"nativeGetDisplayColorModes", "(Landroid/os/IBinder;)[I",
(void*)nativeGetDisplayColorModes},
{"nativeGetDisplayNativePrimaries", "(Landroid/os/IBinder;)Landroid/view/SurfaceControl$DisplayPrimaries;",
diff --git a/core/jni/include/android_runtime/android_view_Surface.h b/core/jni/include/android_runtime/android_view_Surface.h
index 3f7c00c9ff01..04718cd981ff 100644
--- a/core/jni/include/android_runtime/android_view_Surface.h
+++ b/core/jni/include/android_runtime/android_view_Surface.h
@@ -19,6 +19,7 @@
#include <android/native_window.h>
#include <system/graphics.h>
+#include <ui/PublicFormat.h>
#include "jni.h"
@@ -27,41 +28,6 @@ namespace android {
class Surface;
class IGraphicBufferProducer;
-/**
- * Enum mirroring the public API definitions for image and pixel formats.
- * Some of these are hidden in the public API
- *
- * Keep up to date with android.graphics.ImageFormat and
- * android.graphics.PixelFormat
- */
-enum class PublicFormat {
- UNKNOWN = 0x0,
- RGBA_8888 = 0x1,
- RGBX_8888 = 0x2,
- RGB_888 = 0x3,
- RGB_565 = 0x4,
- NV16 = 0x10,
- NV21 = 0x11,
- YUY2 = 0x14,
- RGBA_FP16 = 0x16,
- RAW_SENSOR = 0x20,
- PRIVATE = 0x22,
- YUV_420_888 = 0x23,
- RAW_PRIVATE = 0x24,
- RAW10 = 0x25,
- RAW12 = 0x26,
- RGBA_1010102 = 0x2b,
- JPEG = 0x100,
- DEPTH_POINT_CLOUD = 0x101,
- RAW_DEPTH = 0x1002, // @hide
- YV12 = 0x32315659,
- Y8 = 0x20203859,
- Y16 = 0x20363159, // @hide
- DEPTH16 = 0x44363159,
- DEPTH_JPEG = 0x69656963,
- HEIC = 0x48454946,
-};
-
/* Gets the underlying ANativeWindow for a Surface. */
extern sp<ANativeWindow> android_view_Surface_getNativeWindow(
JNIEnv* env, jobject surfaceObj);
diff --git a/core/proto/android/server/activitymanagerservice.proto b/core/proto/android/server/activitymanagerservice.proto
index 6f9a5649d4ac..79a5dd78ffb3 100644
--- a/core/proto/android/server/activitymanagerservice.proto
+++ b/core/proto/android/server/activitymanagerservice.proto
@@ -132,6 +132,7 @@ message KeyguardControllerProto {
optional bool keyguard_showing = 1;
repeated KeyguardOccludedProto keyguard_occluded_states= 2;
+ optional bool aod_showing = 3;
}
message KeyguardOccludedProto {
diff --git a/core/res/res/anim-ldrtl/cross_profile_apps_thumbnail_enter.xml b/core/res/res/anim-ldrtl/cross_profile_apps_thumbnail_enter.xml
index 6f3dc8c7de0e..5add19bba51b 100644
--- a/core/res/res/anim-ldrtl/cross_profile_apps_thumbnail_enter.xml
+++ b/core/res/res/anim-ldrtl/cross_profile_apps_thumbnail_enter.xml
@@ -18,7 +18,9 @@
-->
<!-- This should be kept in sync with task_open_enter.xml -->
<set xmlns:android="http://schemas.android.com/apk/res/android"
- android:shareInterpolator="false" android:zAdjustment="top">
+ android:hasRoundedCorners="true"
+ android:shareInterpolator="false"
+ android:zAdjustment="top">
<alpha
android:fromAlpha="1"
diff --git a/core/res/res/anim-ldrtl/task_close_enter.xml b/core/res/res/anim-ldrtl/task_close_enter.xml
index 7abada332fb6..e00141a8c155 100644
--- a/core/res/res/anim-ldrtl/task_close_enter.xml
+++ b/core/res/res/anim-ldrtl/task_close_enter.xml
@@ -16,6 +16,7 @@
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:shareInterpolator="false"
android:zAdjustment="top"
+ android:hasRoundedCorners="true"
android:showWallpaper="true">
<alpha
diff --git a/core/res/res/anim-ldrtl/task_close_exit.xml b/core/res/res/anim-ldrtl/task_close_exit.xml
index a017820a4b3e..71a44ae7d2fc 100644
--- a/core/res/res/anim-ldrtl/task_close_exit.xml
+++ b/core/res/res/anim-ldrtl/task_close_exit.xml
@@ -16,6 +16,7 @@
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:shareInterpolator="false"
+ android:hasRoundedCorners="true"
android:showWallpaper="true">
<alpha
diff --git a/core/res/res/anim-ldrtl/task_open_enter.xml b/core/res/res/anim-ldrtl/task_open_enter.xml
index 0433664717eb..7815f7d661d0 100644
--- a/core/res/res/anim-ldrtl/task_open_enter.xml
+++ b/core/res/res/anim-ldrtl/task_open_enter.xml
@@ -18,6 +18,7 @@
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:shareInterpolator="false"
android:zAdjustment="top"
+ android:hasRoundedCorners="true"
android:showWallpaper="true">
<alpha
diff --git a/core/res/res/anim-ldrtl/task_open_enter_cross_profile_apps.xml b/core/res/res/anim-ldrtl/task_open_enter_cross_profile_apps.xml
index 45ca80e00e22..5fccd6df14a5 100644
--- a/core/res/res/anim-ldrtl/task_open_enter_cross_profile_apps.xml
+++ b/core/res/res/anim-ldrtl/task_open_enter_cross_profile_apps.xml
@@ -18,6 +18,7 @@
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:shareInterpolator="false"
android:zAdjustment="top"
+ android:hasRoundedCorners="true"
android:showWallpaper="true">
<alpha
diff --git a/core/res/res/anim-ldrtl/task_open_exit.xml b/core/res/res/anim-ldrtl/task_open_exit.xml
index f50494d81eb5..025e1bdc05c9 100644
--- a/core/res/res/anim-ldrtl/task_open_exit.xml
+++ b/core/res/res/anim-ldrtl/task_open_exit.xml
@@ -16,6 +16,7 @@
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:shareInterpolator="false"
+ android:hasRoundedCorners="true"
android:showWallpaper="true">
<alpha
diff --git a/core/res/res/anim/cross_profile_apps_thumbnail_enter.xml b/core/res/res/anim/cross_profile_apps_thumbnail_enter.xml
index 4c2559f1e47d..2cfeecf4685d 100644
--- a/core/res/res/anim/cross_profile_apps_thumbnail_enter.xml
+++ b/core/res/res/anim/cross_profile_apps_thumbnail_enter.xml
@@ -18,7 +18,9 @@
-->
<!-- This should be kept in sync with task_open_enter.xml -->
<set xmlns:android="http://schemas.android.com/apk/res/android"
- android:shareInterpolator="false" android:zAdjustment="top">
+ android:shareInterpolator="false"
+ android:hasRoundedCorners="true"
+ android:zAdjustment="top">
<alpha
android:fromAlpha="1"
diff --git a/core/res/res/anim/task_close_enter.xml b/core/res/res/anim/task_close_enter.xml
index b059aa9cb28c..487ff5c748d3 100644
--- a/core/res/res/anim/task_close_enter.xml
+++ b/core/res/res/anim/task_close_enter.xml
@@ -18,6 +18,7 @@
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:shareInterpolator="false"
android:zAdjustment="top"
+ android:hasRoundedCorners="true"
android:showWallpaper="true">
<alpha
diff --git a/core/res/res/anim/task_close_exit.xml b/core/res/res/anim/task_close_exit.xml
index c9ade227819b..afc3256cb617 100644
--- a/core/res/res/anim/task_close_exit.xml
+++ b/core/res/res/anim/task_close_exit.xml
@@ -18,6 +18,7 @@
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:shareInterpolator="false"
+ android:hasRoundedCorners="true"
android:showWallpaper="true">
<alpha
diff --git a/core/res/res/anim/task_open_enter.xml b/core/res/res/anim/task_open_enter.xml
index 5c618594364f..0aafc1c0b91c 100644
--- a/core/res/res/anim/task_open_enter.xml
+++ b/core/res/res/anim/task_open_enter.xml
@@ -20,6 +20,7 @@
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:shareInterpolator="false"
android:zAdjustment="top"
+ android:hasRoundedCorners="true"
android:showWallpaper="true">
<alpha
diff --git a/core/res/res/anim/task_open_enter_cross_profile_apps.xml b/core/res/res/anim/task_open_enter_cross_profile_apps.xml
index 644104721463..702f7ba162aa 100644
--- a/core/res/res/anim/task_open_enter_cross_profile_apps.xml
+++ b/core/res/res/anim/task_open_enter_cross_profile_apps.xml
@@ -20,6 +20,7 @@
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:shareInterpolator="false"
android:zAdjustment="top"
+ android:hasRoundedCorners="true"
android:showWallpaper="true">
<alpha
diff --git a/core/res/res/anim/task_open_exit.xml b/core/res/res/anim/task_open_exit.xml
index 9394c577da78..691317d2e6e0 100644
--- a/core/res/res/anim/task_open_exit.xml
+++ b/core/res/res/anim/task_open_exit.xml
@@ -18,6 +18,7 @@
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:shareInterpolator="false"
+ android:hasRoundedCorners="true"
android:showWallpaper="true">
<alpha
diff --git a/core/res/res/values/attrs.xml b/core/res/res/values/attrs.xml
index 088669da7b91..743496fdffb5 100644
--- a/core/res/res/values/attrs.xml
+++ b/core/res/res/values/attrs.xml
@@ -6488,6 +6488,9 @@
<!-- Special option for window animations: show the wallpaper behind when running this
animation. -->
<attr name="showWallpaper" format="boolean" />
+ <!-- Special option for window animations: whether window should have rounded corners.
+ @see ScreenDecorationsUtils#getWindowCornerRadius(Resources) -->
+ <attr name="hasRoundedCorners" format="boolean" />
</declare-styleable>
<declare-styleable name="AnimationSet">
diff --git a/core/res/res/values/attrs_manifest.xml b/core/res/res/values/attrs_manifest.xml
index 1053184bc2fc..6b8e000777d8 100644
--- a/core/res/res/values/attrs_manifest.xml
+++ b/core/res/res/values/attrs_manifest.xml
@@ -1667,6 +1667,9 @@
This flag is turned on by default. <em>This attribute is usable only by system apps.
</em> -->
<attr name="allowClearUserDataOnFailedRestore"/>
+ <!-- If {@code true} the app's non sensitive audio can be capture by other apps.
+ The default value is true. -->
+ <attr name="allowAudioPlaybackCapture" format="boolean" />
</declare-styleable>
<!-- The <code>permission</code> tag declares a security permission that can be
used to control access from other packages to specific components or
diff --git a/core/res/res/values/colors_device_defaults.xml b/core/res/res/values/colors_device_defaults.xml
index 824b4b5977d1..7209103de981 100644
--- a/core/res/res/values/colors_device_defaults.xml
+++ b/core/res/res/values/colors_device_defaults.xml
@@ -26,6 +26,8 @@
<color name="primary_dark_device_default_settings">@color/primary_dark_material_settings</color>
<color name="primary_dark_device_default_settings_light">@color/primary_dark_material_settings_light</color>
+ <color name="navigation_bar_divider_device_default_settings">#1f000000</color>
+
<color name="secondary_device_default_settings">@color/secondary_material_settings</color>
<color name="secondary_device_default_settings_light">@color/secondary_material_settings_light</color>
<color name="tertiary_device_default_settings">@color/tertiary_material_settings</color>
diff --git a/core/res/res/values/config.xml b/core/res/res/values/config.xml
index 910af4c63630..4e174c42fe73 100644
--- a/core/res/res/values/config.xml
+++ b/core/res/res/values/config.xml
@@ -127,7 +127,7 @@
<bool name="config_sendAudioBecomingNoisy">true</bool>
<!-- Whether Hearing Aid profile is supported -->
- <bool name="config_hearing_aid_profile_supported">true</bool>
+ <bool name="config_hearing_aid_profile_supported">false</bool>
<!-- Flag to disable all transition animations -->
<bool name="config_disableTransitionAnimation">false</bool>
@@ -2267,7 +2267,7 @@
<!-- If the sensor that wakes up the lock screen is available or not. -->
<bool name="config_dozeWakeLockScreenSensorAvailable">false</bool>
- <integer name="config_dozeWakeLockScreenDebounce">3000</integer>
+ <integer name="config_dozeWakeLockScreenDebounce">1500</integer>
<!-- Control whether the always on display mode is available. This should only be enabled on
devices where the display has been tuned to be power efficient in DOZE and/or DOZE_SUSPEND
diff --git a/core/res/res/values/public.xml b/core/res/res/values/public.xml
index 5a3c536b0042..61d530027eaa 100644
--- a/core/res/res/values/public.xml
+++ b/core/res/res/values/public.xml
@@ -2941,6 +2941,7 @@
<public name="forceUriPermissions" />
<!-- @hide @SystemApi -->
<public name="allowClearUserDataOnFailedRestore"/>
+ <public name="allowAudioPlaybackCapture"/>
</public-group>
<public-group type="drawable" first-id="0x010800b4">
diff --git a/core/res/res/values/themes_device_defaults.xml b/core/res/res/values/themes_device_defaults.xml
index 194c86c2fb81..9a95ecca5876 100644
--- a/core/res/res/values/themes_device_defaults.xml
+++ b/core/res/res/values/themes_device_defaults.xml
@@ -1468,7 +1468,7 @@ easier.
<item name="colorEdgeEffect">@android:color/black</item>
<!-- Add white nav bar with divider that matches material -->
- <item name="navigationBarDividerColor">#1f000000</item>
+ <item name="navigationBarDividerColor">@color/navigation_bar_divider_device_default_settings</item>
<item name="navigationBarColor">@android:color/white</item>
<item name="windowLightNavigationBar">true</item>
diff --git a/core/tests/coretests/src/android/provider/DeviceConfigTest.java b/core/tests/coretests/src/android/provider/DeviceConfigTest.java
index 5d5754bc41be..de1453ab5a99 100644
--- a/core/tests/coretests/src/android/provider/DeviceConfigTest.java
+++ b/core/tests/coretests/src/android/provider/DeviceConfigTest.java
@@ -59,6 +59,131 @@ public class DeviceConfigTest {
}
@Test
+ public void getString_empty() {
+ final String default_value = "default_value";
+ final String result = DeviceConfig.getString(sNamespace, sKey, default_value);
+ assertThat(result).isEqualTo(default_value);
+ }
+
+ @Test
+ public void getString_nonEmpty() {
+ final String value = "new_value";
+ final String default_value = "default";
+ DeviceConfig.setProperty(sNamespace, sKey, value, false);
+
+ final String result = DeviceConfig.getString(sNamespace, sKey, default_value);
+ assertThat(result).isEqualTo(value);
+ }
+
+ @Test
+ public void getBoolean_empty() {
+ final boolean default_value = true;
+ final boolean result = DeviceConfig.getBoolean(sNamespace, sKey, default_value);
+ assertThat(result).isEqualTo(default_value);
+ }
+
+ @Test
+ public void getBoolean_valid() {
+ final boolean value = true;
+ final boolean default_value = false;
+ DeviceConfig.setProperty(sNamespace, sKey, String.valueOf(value), false);
+
+ final boolean result = DeviceConfig.getBoolean(sNamespace, sKey, default_value);
+ assertThat(result).isEqualTo(value);
+ }
+
+ @Test
+ public void getBoolean_invalid() {
+ final boolean default_value = true;
+ DeviceConfig.setProperty(sNamespace, sKey, "not_a_boolean", false);
+
+ final boolean result = DeviceConfig.getBoolean(sNamespace, sKey, default_value);
+ // Anything non-null other than case insensitive "true" parses to false.
+ assertThat(result).isFalse();
+ }
+
+ @Test
+ public void getInt_empty() {
+ final int default_value = 999;
+ final int result = DeviceConfig.getInt(sNamespace, sKey, default_value);
+ assertThat(result).isEqualTo(default_value);
+ }
+
+ @Test
+ public void getInt_valid() {
+ final int value = 123;
+ final int default_value = 999;
+ DeviceConfig.setProperty(sNamespace, sKey, String.valueOf(value), false);
+
+ final int result = DeviceConfig.getInt(sNamespace, sKey, default_value);
+ assertThat(result).isEqualTo(value);
+ }
+
+ @Test
+ public void getInt_invalid() {
+ final int default_value = 999;
+ DeviceConfig.setProperty(sNamespace, sKey, "not_an_int", false);
+
+ final int result = DeviceConfig.getInt(sNamespace, sKey, default_value);
+ // Failure to parse results in using the default value
+ assertThat(result).isEqualTo(default_value);
+ }
+
+ @Test
+ public void getLong_empty() {
+ final long default_value = 123456;
+ final long result = DeviceConfig.getLong(sNamespace, sKey, default_value);
+ assertThat(result).isEqualTo(default_value);
+ }
+
+ @Test
+ public void getLong_valid() {
+ final long value = 456789;
+ final long default_value = 123456;
+ DeviceConfig.setProperty(sNamespace, sKey, String.valueOf(value), false);
+
+ final long result = DeviceConfig.getLong(sNamespace, sKey, default_value);
+ assertThat(result).isEqualTo(value);
+ }
+
+ @Test
+ public void getLong_invalid() {
+ final long default_value = 123456;
+ DeviceConfig.setProperty(sNamespace, sKey, "not_a_long", false);
+
+ final long result = DeviceConfig.getLong(sNamespace, sKey, default_value);
+ // Failure to parse results in using the default value
+ assertThat(result).isEqualTo(default_value);
+ }
+
+ @Test
+ public void getFloat_empty() {
+ final float default_value = 123.456f;
+ final float result = DeviceConfig.getFloat(sNamespace, sKey, default_value);
+ assertThat(result).isEqualTo(default_value);
+ }
+
+ @Test
+ public void getFloat_valid() {
+ final float value = 456.789f;
+ final float default_value = 123.456f;
+ DeviceConfig.setProperty(sNamespace, sKey, String.valueOf(value), false);
+
+ final float result = DeviceConfig.getFloat(sNamespace, sKey, default_value);
+ assertThat(result).isEqualTo(value);
+ }
+
+ @Test
+ public void getFloat_invalid() {
+ final float default_value = 123.456f;
+ DeviceConfig.setProperty(sNamespace, sKey, "not_a_float", false);
+
+ final float result = DeviceConfig.getFloat(sNamespace, sKey, default_value);
+ // Failure to parse results in using the default value
+ assertThat(result).isEqualTo(default_value);
+ }
+
+ @Test
public void setAndGetProperty_sameNamespace() {
DeviceConfig.setProperty(sNamespace, sKey, sValue, false);
String result = DeviceConfig.getProperty(sNamespace, sKey);
diff --git a/core/tests/coretests/src/android/view/accessibility/AccessibilityCacheTest.java b/core/tests/coretests/src/android/view/accessibility/AccessibilityCacheTest.java
index e3852e1b627e..a88968bfd089 100644
--- a/core/tests/coretests/src/android/view/accessibility/AccessibilityCacheTest.java
+++ b/core/tests/coretests/src/android/view/accessibility/AccessibilityCacheTest.java
@@ -301,6 +301,26 @@ public class AccessibilityCacheTest {
}
@Test
+ public void subTreeChangeEventFromUncachedNode_clearsNodeInCache() {
+ AccessibilityNodeInfo nodeInfo = getNodeWithA11yAndWindowId(CHILD_VIEW_ID, WINDOW_ID_1);
+ long id = nodeInfo.getSourceNodeId();
+ mAccessibilityCache.add(nodeInfo);
+ nodeInfo.recycle();
+
+ AccessibilityEvent event = AccessibilityEvent
+ .obtain(AccessibilityEvent.TYPE_WINDOW_CONTENT_CHANGED);
+ event.setContentChangeTypes(AccessibilityEvent.CONTENT_CHANGE_TYPE_SUBTREE);
+ event.setSource(getMockViewWithA11yAndWindowIds(PARENT_VIEW_ID, WINDOW_ID_1));
+
+ mAccessibilityCache.onAccessibilityEvent(event);
+ AccessibilityNodeInfo shouldBeNull = mAccessibilityCache.getNode(WINDOW_ID_1, id);
+ if (shouldBeNull != null) {
+ shouldBeNull.recycle();
+ }
+ assertNull(shouldBeNull);
+ }
+
+ @Test
public void scrollEvent_clearsNodeAndChild() {
AccessibilityEvent event = AccessibilityEvent
.obtain(AccessibilityEvent.TYPE_VIEW_SCROLLED);
diff --git a/graphics/java/android/graphics/Bitmap.java b/graphics/java/android/graphics/Bitmap.java
index 920fb4cffbca..c064402f8345 100644
--- a/graphics/java/android/graphics/Bitmap.java
+++ b/graphics/java/android/graphics/Bitmap.java
@@ -1845,6 +1845,7 @@ public final class Bitmap implements Parcelable {
* @throws IllegalStateException if the bitmap's config is {@link Config#HARDWARE}
*
*/
+ @NonNull
public Color getColor(int x, int y) {
checkRecycled("Can't call getColor() on a recycled bitmap");
checkHardware("unable to getColor(), "
diff --git a/graphics/java/android/graphics/RenderNode.java b/graphics/java/android/graphics/RenderNode.java
index e98879d0c5bd..42b6acd3b25a 100644
--- a/graphics/java/android/graphics/RenderNode.java
+++ b/graphics/java/android/graphics/RenderNode.java
@@ -27,6 +27,8 @@ import android.view.RenderNodeAnimator;
import android.view.Surface;
import android.view.View;
+import com.android.internal.util.ArrayUtils;
+
import dalvik.annotation.optimization.CriticalNative;
import dalvik.annotation.optimization.FastNative;
@@ -179,6 +181,10 @@ public final class RenderNode {
private final AnimationHost mAnimationHost;
private RecordingCanvas mCurrentRecordingCanvas;
+ // Will be null if not currently registered
+ @Nullable
+ private CompositePositionUpdateListener mCompositePositionUpdateListener;
+
/**
* Creates a new RenderNode that can be used to record batches of
* drawing operations, and store / apply render properties when drawn.
@@ -248,15 +254,70 @@ public final class RenderNode {
}
+ private static final class CompositePositionUpdateListener implements PositionUpdateListener {
+ private final PositionUpdateListener[] mListeners;
+
+ CompositePositionUpdateListener(PositionUpdateListener... listeners) {
+ mListeners = listeners;
+ }
+
+ public CompositePositionUpdateListener with(PositionUpdateListener listener) {
+ return new CompositePositionUpdateListener(
+ ArrayUtils.appendElement(PositionUpdateListener.class, mListeners, listener));
+ }
+
+ public CompositePositionUpdateListener without(PositionUpdateListener listener) {
+ return new CompositePositionUpdateListener(
+ ArrayUtils.removeElement(PositionUpdateListener.class, mListeners, listener));
+ }
+
+ @Override
+ public void positionChanged(long frameNumber, int left, int top, int right, int bottom) {
+ for (PositionUpdateListener pul : mListeners) {
+ pul.positionChanged(frameNumber, left, top, right, bottom);
+ }
+ }
+
+ @Override
+ public void positionLost(long frameNumber) {
+ for (PositionUpdateListener pul : mListeners) {
+ pul.positionLost(frameNumber);
+ }
+ }
+ }
+
/**
- * Enable callbacks for position changes.
+ * Enable callbacks for position changes. Call only from the UI thread or with
+ * external synchronization.
*
* @hide
*/
- public void requestPositionUpdates(PositionUpdateListener listener) {
- nRequestPositionUpdates(mNativeRenderNode, listener);
+ public void addPositionUpdateListener(@NonNull PositionUpdateListener listener) {
+ CompositePositionUpdateListener comp = mCompositePositionUpdateListener;
+ if (comp == null) {
+ comp = new CompositePositionUpdateListener(listener);
+ } else {
+ comp = comp.with(listener);
+ }
+ mCompositePositionUpdateListener = comp;
+ nRequestPositionUpdates(mNativeRenderNode, comp);
}
+ /**
+ * Disable a callback for position changes. Call only from the UI thread or with
+ * external synchronization.
+ *
+ * @param listener Callback to remove
+ * @hide
+ */
+ public void removePositionUpdateListener(@NonNull PositionUpdateListener listener) {
+ CompositePositionUpdateListener comp = mCompositePositionUpdateListener;
+ if (comp != null) {
+ comp = comp.without(listener);
+ mCompositePositionUpdateListener = comp;
+ nRequestPositionUpdates(mNativeRenderNode, comp);
+ }
+ }
/**
* Starts recording a display list for the render node. All
diff --git a/keystore/java/android/security/Credentials.java b/keystore/java/android/security/Credentials.java
index 2ae28f507e0d..08f417662523 100644
--- a/keystore/java/android/security/Credentials.java
+++ b/keystore/java/android/security/Credentials.java
@@ -20,6 +20,7 @@ import com.android.org.bouncycastle.util.io.pem.PemObject;
import com.android.org.bouncycastle.util.io.pem.PemReader;
import com.android.org.bouncycastle.util.io.pem.PemWriter;
+import android.annotation.UnsupportedAppUsage;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
@@ -122,6 +123,7 @@ public class Credentials {
* Convert objects to a PEM format which is used for
* CA_CERTIFICATE and USER_CERTIFICATE entries.
*/
+ @UnsupportedAppUsage
public static byte[] convertToPem(Certificate... objects)
throws IOException, CertificateEncodingException {
ByteArrayOutputStream bao = new ByteArrayOutputStream();
diff --git a/keystore/java/android/security/IKeyChainService.aidl b/keystore/java/android/security/IKeyChainService.aidl
index 0d32075d20d2..b3cdff7eedf7 100644
--- a/keystore/java/android/security/IKeyChainService.aidl
+++ b/keystore/java/android/security/IKeyChainService.aidl
@@ -27,6 +27,7 @@ import android.security.keystore.ParcelableKeyGenParameterSpec;
*/
interface IKeyChainService {
// APIs used by KeyChain
+ @UnsupportedAppUsage
String requestPrivateKey(String alias);
byte[] getCertificate(String alias);
byte[] getCaCertificates(String alias);
diff --git a/libs/androidfw/AssetManager2.cpp b/libs/androidfw/AssetManager2.cpp
index d7b84ff1060d..117d05e837ef 100644
--- a/libs/androidfw/AssetManager2.cpp
+++ b/libs/androidfw/AssetManager2.cpp
@@ -35,6 +35,12 @@
#endif
#endif
+#ifdef __ANDROID__
+#define ANDROID_LOG(x) LOG(x)
+#else
+#define ANDROID_LOG(x) std::stringstream()
+#endif
+
#include "androidfw/ResourceUtils.h"
namespace android {
@@ -380,7 +386,8 @@ ApkAssetsCookie AssetManager2::FindEntry(uint32_t resid, uint16_t density_overri
const uint8_t package_idx = package_ids_[package_id];
if (package_idx == 0xff) {
- LOG(ERROR) << base::StringPrintf("No package ID %02x found for ID 0x%08x.", package_id, resid);
+ ANDROID_LOG(ERROR) << base::StringPrintf("No package ID %02x found for ID 0x%08x.",
+ package_id, resid);
return kInvalidCookie;
}
diff --git a/libs/hwui/renderthread/VulkanManager.cpp b/libs/hwui/renderthread/VulkanManager.cpp
index 3b43f1297597..5af660c8738a 100644
--- a/libs/hwui/renderthread/VulkanManager.cpp
+++ b/libs/hwui/renderthread/VulkanManager.cpp
@@ -254,10 +254,36 @@ void VulkanManager::setupDevice(GrVkExtensions& grExtensions, VkPhysicalDeviceFe
float queuePriorities[1] = { 0.0 };
+ void* queueNextPtr = nullptr;
+
+ VkDeviceQueueGlobalPriorityCreateInfoEXT queuePriorityCreateInfo;
+
+ if (Properties::contextPriority != 0
+ && grExtensions.hasExtension(VK_EXT_GLOBAL_PRIORITY_EXTENSION_NAME, 2)) {
+ memset(&queuePriorityCreateInfo, 0, sizeof(VkDeviceQueueGlobalPriorityCreateInfoEXT));
+ queuePriorityCreateInfo.sType =
+ VK_STRUCTURE_TYPE_DEVICE_QUEUE_GLOBAL_PRIORITY_CREATE_INFO_EXT;
+ queuePriorityCreateInfo.pNext = nullptr;
+ switch (Properties::contextPriority) {
+ case EGL_CONTEXT_PRIORITY_LOW_IMG:
+ queuePriorityCreateInfo.globalPriority = VK_QUEUE_GLOBAL_PRIORITY_LOW_EXT;
+ break;
+ case EGL_CONTEXT_PRIORITY_MEDIUM_IMG:
+ queuePriorityCreateInfo.globalPriority = VK_QUEUE_GLOBAL_PRIORITY_MEDIUM_EXT;
+ break;
+ case EGL_CONTEXT_PRIORITY_HIGH_IMG:
+ queuePriorityCreateInfo.globalPriority = VK_QUEUE_GLOBAL_PRIORITY_HIGH_EXT;
+ break;
+ default:
+ LOG_ALWAYS_FATAL("Unsupported context priority");
+ }
+ queueNextPtr = &queuePriorityCreateInfo;
+ }
+
const VkDeviceQueueCreateInfo queueInfo[2] = {
{
VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO, // sType
- nullptr, // pNext
+ queueNextPtr, // pNext
0, // VkDeviceQueueCreateFlags
mGraphicsQueueIndex, // queueFamilyIndex
1, // queueCount
@@ -265,7 +291,7 @@ void VulkanManager::setupDevice(GrVkExtensions& grExtensions, VkPhysicalDeviceFe
},
{
VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO, // sType
- nullptr, // pNext
+ queueNextPtr, // pNext
0, // VkDeviceQueueCreateFlags
mPresentQueueIndex, // queueFamilyIndex
1, // queueCount
diff --git a/location/java/android/location/IGeocodeProvider.aidl b/location/java/android/location/IGeocodeProvider.aidl
index aaa70c74778a..7eaf7b84c83a 100644
--- a/location/java/android/location/IGeocodeProvider.aidl
+++ b/location/java/android/location/IGeocodeProvider.aidl
@@ -26,9 +26,11 @@ import android.location.GeocoderParams;
*/
interface IGeocodeProvider {
+ @UnsupportedAppUsage
String getFromLocation(double latitude, double longitude, int maxResults,
in GeocoderParams params, out List<Address> addrs);
+ @UnsupportedAppUsage
String getFromLocationName(String locationName,
double lowerLeftLatitude, double lowerLeftLongitude,
double upperRightLatitude, double upperRightLongitude, int maxResults,
diff --git a/location/java/android/location/IGeofenceProvider.aidl b/location/java/android/location/IGeofenceProvider.aidl
index d4ff0dd70bf2..426ebef86b96 100644
--- a/location/java/android/location/IGeofenceProvider.aidl
+++ b/location/java/android/location/IGeofenceProvider.aidl
@@ -24,5 +24,6 @@ import android.hardware.location.IGeofenceHardware;
* {@hide}
*/
oneway interface IGeofenceProvider {
+ @UnsupportedAppUsage
void setGeofenceHardware(in IGeofenceHardware proxy);
}
diff --git a/location/java/android/location/ILocationListener.aidl b/location/java/android/location/ILocationListener.aidl
index 180183e77668..ec1134566b24 100644
--- a/location/java/android/location/ILocationListener.aidl
+++ b/location/java/android/location/ILocationListener.aidl
@@ -25,10 +25,14 @@ import android.os.Bundle;
*/
oneway interface ILocationListener
{
+ @UnsupportedAppUsage
void onLocationChanged(in Location location);
+ @UnsupportedAppUsage
void onProviderEnabled(String provider);
+ @UnsupportedAppUsage
void onProviderDisabled(String provider);
// --- deprecated ---
+ @UnsupportedAppUsage
void onStatusChanged(String provider, int status, in Bundle extras);
}
diff --git a/location/java/android/location/ILocationManager.aidl b/location/java/android/location/ILocationManager.aidl
index 57a0a725fb41..bb75c77f7e64 100644
--- a/location/java/android/location/ILocationManager.aidl
+++ b/location/java/android/location/ILocationManager.aidl
@@ -85,6 +85,7 @@ interface ILocationManager
boolean stopGnssBatch();
boolean injectLocation(in Location location);
+ @UnsupportedAppUsage
List<String> getAllProviders();
List<String> getProviders(in Criteria criteria, boolean enabledOnly);
String getBestProvider(in Criteria criteria, boolean enabledOnly);
diff --git a/location/java/android/location/INetInitiatedListener.aidl b/location/java/android/location/INetInitiatedListener.aidl
index fc64dd67c116..a9e9136d3317 100644
--- a/location/java/android/location/INetInitiatedListener.aidl
+++ b/location/java/android/location/INetInitiatedListener.aidl
@@ -22,5 +22,6 @@ package android.location;
*/
interface INetInitiatedListener
{
+ @UnsupportedAppUsage
boolean sendNiResponse(int notifId, int userResponse);
}
diff --git a/location/java/com/android/internal/location/ILocationProvider.aidl b/location/java/com/android/internal/location/ILocationProvider.aidl
index 71b54fb65ae5..a5716304f0d8 100644
--- a/location/java/com/android/internal/location/ILocationProvider.aidl
+++ b/location/java/com/android/internal/location/ILocationProvider.aidl
@@ -36,6 +36,8 @@ interface ILocationProvider {
oneway void sendExtraCommand(String command, in Bundle extras);
// --- deprecated and will be removed the future ---
+ @UnsupportedAppUsage
int getStatus(out Bundle extras);
+ @UnsupportedAppUsage
long getStatusUpdateTime();
}
diff --git a/location/java/com/android/internal/location/ILocationProviderManager.aidl b/location/java/com/android/internal/location/ILocationProviderManager.aidl
index 79166ae3a9b0..85e18ba5ec4b 100644
--- a/location/java/com/android/internal/location/ILocationProviderManager.aidl
+++ b/location/java/com/android/internal/location/ILocationProviderManager.aidl
@@ -28,9 +28,12 @@ interface ILocationProviderManager {
void onSetAdditionalProviderPackages(in List<String> packageNames);
+ @UnsupportedAppUsage
void onSetEnabled(boolean enabled);
+ @UnsupportedAppUsage
void onSetProperties(in ProviderProperties properties);
+ @UnsupportedAppUsage
void onReportLocation(in Location location);
}
diff --git a/media/java/android/media/AudioManager.java b/media/java/android/media/AudioManager.java
index 3fb2365cb006..15f9b47ede09 100644
--- a/media/java/android/media/AudioManager.java
+++ b/media/java/android/media/AudioManager.java
@@ -37,6 +37,8 @@ import android.content.Intent;
import android.media.audiopolicy.AudioPolicy;
import android.media.audiopolicy.AudioPolicy.AudioPolicyFocusListener;
import android.media.audiopolicy.AudioProductStrategies;
+import android.media.audiopolicy.AudioVolumeGroupChangeHandler;
+import android.media.audiopolicy.AudioVolumeGroups;
import android.media.projection.MediaProjection;
import android.media.session.MediaController;
import android.media.session.MediaSession;
@@ -61,6 +63,7 @@ import android.util.Pair;
import android.view.KeyEvent;
import com.android.internal.annotations.GuardedBy;
+import com.android.internal.util.Preconditions;
import java.io.IOException;
import java.lang.annotation.Retention;
@@ -90,6 +93,8 @@ public class AudioManager {
private static final String TAG = "AudioManager";
private static final boolean DEBUG = false;
private static final AudioPortEventHandler sAudioPortEventHandler = new AudioPortEventHandler();
+ private static final AudioVolumeGroupChangeHandler sAudioAudioVolumeGroupChangedHandler =
+ new AudioVolumeGroupChangeHandler();
/**
* Broadcast intent, a hint for applications that audio is about to become
@@ -1164,6 +1169,93 @@ public class AudioManager {
}
/**
+ * Sets the volume index for a particular {@link AudioAttributes}.
+ * @param attr The {@link AudioAttributes} whose volume index should be set.
+ * @param index The volume index to set. See
+ * {@link #getMaxVolumeIndexForAttributes(AudioAttributes)} for the largest valid value
+ * {@link #getMinVolumeIndexForAttributes(AudioAttributes)} for the lowest valid value.
+ * @param flags One or more flags.
+ * @see #getMaxVolumeIndexForAttributes(AudioAttributes)
+ * @see #getMinVolumeIndexForAttributes(AudioAttributes)
+ * @see #isVolumeFixed()
+ * @hide
+ */
+ @SystemApi
+ @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING)
+ public void setVolumeIndexForAttributes(@NonNull AudioAttributes attr, int index, int flags) {
+ Preconditions.checkNotNull(attr, "attr must not be null");
+ final IAudioService service = getService();
+ try {
+ service.setVolumeIndexForAttributes(attr, index, flags,
+ getContext().getOpPackageName());
+ } catch (RemoteException e) {
+ throw e.rethrowFromSystemServer();
+ }
+ }
+
+ /**
+ * Returns the current volume index for a particular {@link AudioAttributes}.
+ *
+ * @param attr The {@link AudioAttributes} whose volume index is returned.
+ * @return The current volume index for the stream.
+ * @see #getMaxVolumeIndexForAttributes(AudioAttributes)
+ * @see #getMinVolumeIndexForAttributes(AudioAttributes)
+ * @see #setVolumeForAttributes(AudioAttributes, int, int)
+ * @hide
+ */
+ @SystemApi
+ @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING)
+ public int getVolumeIndexForAttributes(@NonNull AudioAttributes attr) {
+ Preconditions.checkNotNull(attr, "attr must not be null");
+ final IAudioService service = getService();
+ try {
+ return service.getVolumeIndexForAttributes(attr);
+ } catch (RemoteException e) {
+ throw e.rethrowFromSystemServer();
+ }
+ }
+
+ /**
+ * Returns the maximum volume index for a particular {@link AudioAttributes}.
+ *
+ * @param attr The {@link AudioAttributes} whose maximum volume index is returned.
+ * @return The maximum valid volume index for the {@link AudioAttributes}.
+ * @see #getVolumeIndexForAttributes(AudioAttributes)
+ * @hide
+ */
+ @SystemApi
+ @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING)
+ public int getMaxVolumeIndexForAttributes(@NonNull AudioAttributes attr) {
+ Preconditions.checkNotNull(attr, "attr must not be null");
+ final IAudioService service = getService();
+ try {
+ return service.getMaxVolumeIndexForAttributes(attr);
+ } catch (RemoteException e) {
+ throw e.rethrowFromSystemServer();
+ }
+ }
+
+ /**
+ * Returns the minimum volume index for a particular {@link AudioAttributes}.
+ *
+ * @param attr The {@link AudioAttributes} whose minimum volume index is returned.
+ * @return The minimum valid volume index for the {@link AudioAttributes}.
+ * @see #getVolumeIndexForAttributes(AudioAttributes)
+ * @hide
+ */
+ @SystemApi
+ @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING)
+ public int getMinVolumeIndexForAttributes(@NonNull AudioAttributes attr) {
+ Preconditions.checkNotNull(attr, "attr must not be null");
+ final IAudioService service = getService();
+ try {
+ return service.getMinVolumeIndexForAttributes(attr);
+ } catch (RemoteException e) {
+ throw e.rethrowFromSystemServer();
+ }
+ }
+
+ /**
* Solo or unsolo a particular stream.
* <p>
* Do not use. This method has been deprecated and is now a no-op.
@@ -5246,6 +5338,65 @@ public class AudioManager {
}
}
+ /**
+ * @hide
+ * Introspection API to retrieve audio volume groups.
+ * When implementing {Car|Oem}AudioManager, use this method to retrieve the collection of
+ * audio volume groups.
+ * @return a (possibly zero-length) array of
+ * {@see android.media.audiopolicy.AudioVolumeGroups} objects.
+ */
+ @SystemApi
+ @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING)
+ public @NonNull AudioVolumeGroups getAudioVolumeGroups() {
+ final IAudioService service = getService();
+ try {
+ return service.listAudioVolumeGroups();
+ } catch (RemoteException e) {
+ throw e.rethrowFromSystemServer();
+ }
+ }
+
+ /**
+ * @hide
+ * Callback registered by client to be notified upon volume group change.
+ */
+ @SystemApi
+ public abstract static class VolumeGroupCallback {
+ /**
+ * Callback method called upon audio volume group change.
+ * @param group the group for which the volume has changed
+ */
+ public void onAudioVolumeGroupChanged(int group, int flags) {}
+ }
+
+ /**
+ * @hide
+ * Register an audio volume group change listener.
+ * @param callback the {@link VolumeGroupCallback} to register
+ */
+ @SystemApi
+ public void registerVolumeGroupCallback(
+ @NonNull Executor executor,
+ @NonNull VolumeGroupCallback callback) {
+ Preconditions.checkNotNull(executor, "executor must not be null");
+ Preconditions.checkNotNull(callback, "volume group change cb must not be null");
+ sAudioAudioVolumeGroupChangedHandler.init();
+ // TODO: make use of executor
+ sAudioAudioVolumeGroupChangedHandler.registerListener(callback);
+ }
+
+ /**
+ * @hide
+ * Unregister an audio volume group change listener.
+ * @param callback the {@link VolumeGroupCallback} to unregister
+ */
+ @SystemApi
+ public void unregisterVolumeGroupCallback(
+ @NonNull VolumeGroupCallback callback) {
+ Preconditions.checkNotNull(callback, "volume group change cb must not be null");
+ sAudioAudioVolumeGroupChangedHandler.unregisterListener(callback);
+ }
//---------------------------------------------------------
// Inner classes
diff --git a/media/java/android/media/AudioPlaybackCaptureConfiguration.java b/media/java/android/media/AudioPlaybackCaptureConfiguration.java
index d714dc7772f9..9a16aea1e052 100644
--- a/media/java/android/media/AudioPlaybackCaptureConfiguration.java
+++ b/media/java/android/media/AudioPlaybackCaptureConfiguration.java
@@ -33,7 +33,7 @@ import com.android.internal.util.Preconditions;
* - played by apps that MUST be in the same user profile as the capturing app
* (eg work profile can not capture user profile apps and vice-versa).
* - played by apps that MUST NOT have in their manifest.xml the application
- * attribute android:allowPlaybackCapture="false"
+ * attribute android:allowAudioPlaybackCapture="false"
* - played by apps that MUST have a targetSdkVersion higher or equal to 29 (Q).
*
* <p>An example for creating a capture configuration for capturing all media playback:
diff --git a/media/java/android/media/AudioPresentation.java b/media/java/android/media/AudioPresentation.java
index fca70747e202..894fbba6c983 100644
--- a/media/java/android/media/AudioPresentation.java
+++ b/media/java/android/media/AudioPresentation.java
@@ -45,6 +45,9 @@ import java.util.Objects;
* accessibility, end point mastering and dialogue enhancement. An audio presentation may also have
* a set of description labels in different languages to help the user to make an informed
* selection.
+ *
+ * Applications that parse media streams and extract presentation information on their own
+ * can create instances of AudioPresentation by using {@link AudioPresentation.Builder} class.
*/
public final class AudioPresentation {
private final int mPresentationId;
@@ -66,7 +69,7 @@ public final class AudioPresentation {
private final boolean mAudioDescriptionAvailable;
private final boolean mSpokenSubtitlesAvailable;
private final boolean mDialogueEnhancementAvailable;
- private final Map<ULocale, String> mLabels;
+ private final Map<ULocale, CharSequence> mLabels;
/**
* No preferred reproduction channel layout.
@@ -131,7 +134,7 @@ public final class AudioPresentation {
boolean audioDescriptionAvailable,
boolean spokenSubtitlesAvailable,
boolean dialogueEnhancementAvailable,
- @NonNull Map<ULocale, String> labels) {
+ @NonNull Map<ULocale, CharSequence> labels) {
mPresentationId = presentationId;
mProgramId = programId;
mLanguage = language;
@@ -139,7 +142,7 @@ public final class AudioPresentation {
mAudioDescriptionAvailable = audioDescriptionAvailable;
mSpokenSubtitlesAvailable = spokenSubtitlesAvailable;
mDialogueEnhancementAvailable = dialogueEnhancementAvailable;
- mLabels = new HashMap<ULocale, String>(labels);
+ mLabels = new HashMap<ULocale, CharSequence>(labels);
}
/**
@@ -164,14 +167,14 @@ public final class AudioPresentation {
* or ISO 639-2/T could be used.
*/
public Map<Locale, String> getLabels() {
- Map<Locale, String> localeLabels = new HashMap<Locale, String>();
- for (Map.Entry<ULocale, String> entry : mLabels.entrySet()) {
- localeLabels.put(entry.getKey().toLocale(), entry.getValue());
+ Map<Locale, String> localeLabels = new HashMap<Locale, String>(mLabels.size());
+ for (Map.Entry<ULocale, CharSequence> entry : mLabels.entrySet()) {
+ localeLabels.put(entry.getKey().toLocale(), entry.getValue().toString());
}
return localeLabels;
}
- private Map<ULocale, String> getULabels() {
+ private Map<ULocale, CharSequence> getULabels() {
return mLabels;
}
@@ -273,7 +276,7 @@ public final class AudioPresentation {
/**
* A builder class for creating {@link AudioPresentation} objects.
*/
- public static class Builder {
+ public static final class Builder {
private final int mPresentationId;
private int mProgramId = UNKNOWN_ID;
private ULocale mLanguage = new ULocale("");
@@ -281,13 +284,13 @@ public final class AudioPresentation {
private boolean mAudioDescriptionAvailable = false;
private boolean mSpokenSubtitlesAvailable = false;
private boolean mDialogueEnhancementAvailable = false;
- private Map<ULocale, String> mLabels = new HashMap<ULocale, String>();
+ private Map<ULocale, CharSequence> mLabels = new HashMap<ULocale, CharSequence>();
/**
* Create a {@link Builder}. Any field that should be included in the
* {@link AudioPresentation} must be added.
*
- * @param presentationId the presentation ID of this audio presentation
+ * @param presentationId The presentation ID of this audio presentation.
*/
public Builder(int presentationId) {
mPresentationId = presentationId;
@@ -295,7 +298,7 @@ public final class AudioPresentation {
/**
* Sets the ProgramId to which this audio presentation refers.
*
- * @param programId
+ * @param programId The program ID to be decoded.
*/
public @NonNull Builder setProgramId(int programId) {
mProgramId = programId;
@@ -304,9 +307,9 @@ public final class AudioPresentation {
/**
* Sets the language information of the audio presentation.
*
- * @param language code
+ * @param language Locale corresponding to ISO 639-1/639-2 language code.
*/
- public @NonNull Builder setLocale(ULocale language) {
+ public @NonNull Builder setLocale(@NonNull ULocale language) {
mLanguage = language;
return this;
}
@@ -339,17 +342,17 @@ public final class AudioPresentation {
/**
* Sets locale / text label pairs describing the presentation.
*
- * @param labels
+ * @param labels Text label indexed by its locale corresponding to the language code.
*/
- public @NonNull Builder setLabels(@NonNull Map<ULocale, String> labels) {
- mLabels = new HashMap<ULocale, String>(labels);
+ public @NonNull Builder setLabels(@NonNull Map<ULocale, CharSequence> labels) {
+ mLabels = new HashMap<ULocale, CharSequence>(labels);
return this;
}
/**
* Indicate whether the presentation contains audio description for the visually impaired.
*
- * @param audioDescriptionAvailable
+ * @param audioDescriptionAvailable Audio description for the visually impaired.
*/
public @NonNull Builder setHasAudioDescription(boolean audioDescriptionAvailable) {
mAudioDescriptionAvailable = audioDescriptionAvailable;
@@ -359,7 +362,7 @@ public final class AudioPresentation {
/**
* Indicate whether the presentation contains spoken subtitles for the visually impaired.
*
- * @param spokenSubtitlesAvailable
+ * @param spokenSubtitlesAvailable Spoken subtitles for the visually impaired.
*/
public @NonNull Builder setHasSpokenSubtitles(boolean spokenSubtitlesAvailable) {
mSpokenSubtitlesAvailable = spokenSubtitlesAvailable;
@@ -369,7 +372,7 @@ public final class AudioPresentation {
/**
* Indicate whether the presentation supports dialogue enhancement.
*
- * @param dialogueEnhancementAvailable
+ * @param dialogueEnhancementAvailable Dialogue enhancement.
*/
public @NonNull Builder setHasDialogueEnhancement(boolean dialogueEnhancementAvailable) {
mDialogueEnhancementAvailable = dialogueEnhancementAvailable;
diff --git a/media/java/android/media/AudioRecord.java b/media/java/android/media/AudioRecord.java
index ec1a854a66d5..3d5120f86db3 100644
--- a/media/java/android/media/AudioRecord.java
+++ b/media/java/android/media/AudioRecord.java
@@ -653,7 +653,16 @@ public class AudioRecord implements AudioRouting, MicrophoneDirection,
AudioPolicy audioPolicy = new AudioPolicy.Builder(/*context=*/ null)
.setMediaProjection(projection)
.addMix(audioMix).build();
+
+ int error = AudioManager.registerAudioPolicyStatic(audioPolicy);
+ if (error != 0) {
+ throw new UnsupportedOperationException("Error: could not register audio policy");
+ }
+
AudioRecord record = audioPolicy.createAudioRecordSink(audioMix);
+ if (record == null) {
+ throw new UnsupportedOperationException("Cannot create AudioRecord");
+ }
record.unregisterAudioPolicyOnRelease(audioPolicy);
return record;
}
diff --git a/media/java/android/media/AudioSystem.java b/media/java/android/media/AudioSystem.java
index b2f970a99207..a976d707f5cb 100644
--- a/media/java/android/media/AudioSystem.java
+++ b/media/java/android/media/AudioSystem.java
@@ -920,6 +920,41 @@ public class AudioSystem
@UnsupportedAppUsage
private static native int setStreamVolumeIndex(int stream, int index, int device);
public static native int getStreamVolumeIndex(int stream, int device);
+ /**
+ * @hide
+ * set a volume for the given {@link AudioAttributes} and for all other stream that belong to
+ * the same volume group.
+ * @param attributes the {@link AudioAttributes} to be considered
+ * @param index to be applied
+ * @param device the volume device to be considered
+ * @return command completion status.
+ */
+ public static native int setVolumeIndexForAttributes(@NonNull AudioAttributes attributes,
+ int index, int device);
+ /**
+ * @hide
+ * get the volume index for the given {@link AudioAttributes}.
+ * @param attributes the {@link AudioAttributes} to be considered
+ * @param device the volume device to be considered
+ * @return volume index for the given {@link AudioAttributes} and volume device.
+ */
+ public static native int getVolumeIndexForAttributes(@NonNull AudioAttributes attributes,
+ int device);
+ /**
+ * @hide
+ * get the minimum volume index for the given {@link AudioAttributes}.
+ * @param attributes the {@link AudioAttributes} to be considered
+ * @return minimum volume index for the given {@link AudioAttributes}.
+ */
+ public static native int getMinVolumeIndexForAttributes(@NonNull AudioAttributes attributes);
+ /**
+ * @hide
+ * get the maximum volume index for the given {@link AudioAttributes}.
+ * @param attributes the {@link AudioAttributes} to be considered
+ * @return maximum volume index for the given {@link AudioAttributes}.
+ */
+ public static native int getMaxVolumeIndexForAttributes(@NonNull AudioAttributes attributes);
+
public static native int setMasterVolume(float value);
public static native float getMasterVolume();
@UnsupportedAppUsage
diff --git a/media/java/android/media/IAudioFocusDispatcher.aidl b/media/java/android/media/IAudioFocusDispatcher.aidl
index 3b33c5b7a46a..e3512fa58a7d 100644
--- a/media/java/android/media/IAudioFocusDispatcher.aidl
+++ b/media/java/android/media/IAudioFocusDispatcher.aidl
@@ -23,6 +23,7 @@ package android.media;
*/
oneway interface IAudioFocusDispatcher {
+ @UnsupportedAppUsage
void dispatchAudioFocusChange(int focusChange, String clientId);
void dispatchFocusResultFromExtPolicy(int requestResult, String clientId);
diff --git a/media/java/android/media/IAudioService.aidl b/media/java/android/media/IAudioService.aidl
index abdc3c9c834b..1b82fcc48bf8 100644
--- a/media/java/android/media/IAudioService.aidl
+++ b/media/java/android/media/IAudioService.aidl
@@ -34,6 +34,7 @@ import android.media.PlayerBase;
import android.media.VolumePolicy;
import android.media.audiopolicy.AudioPolicyConfig;
import android.media.audiopolicy.AudioProductStrategies;
+import android.media.audiopolicy.AudioVolumeGroups;
import android.media.audiopolicy.IAudioPolicyCallback;
import android.media.projection.IMediaProjection;
@@ -65,6 +66,7 @@ interface IAudioService {
void adjustStreamVolume(int streamType, int direction, int flags, String callingPackage);
+ @UnsupportedAppUsage
void setStreamVolume(int streamType, int index, int flags, String callingPackage);
boolean isStreamMute(int streamType);
@@ -75,12 +77,24 @@ interface IAudioService {
void setMasterMute(boolean mute, int flags, String callingPackage, int userId);
+ @UnsupportedAppUsage
int getStreamVolume(int streamType);
int getStreamMinVolume(int streamType);
+ @UnsupportedAppUsage
int getStreamMaxVolume(int streamType);
+ AudioVolumeGroups listAudioVolumeGroups();
+
+ void setVolumeIndexForAttributes(in AudioAttributes aa, int index, int flags, String callingPackage);
+
+ int getVolumeIndexForAttributes(in AudioAttributes aa);
+
+ int getMaxVolumeIndexForAttributes(in AudioAttributes aa);
+
+ int getMinVolumeIndexForAttributes(in AudioAttributes aa);
+
int getLastAudibleStreamVolume(int streamType);
AudioProductStrategies getAudioProductStrategies();
@@ -160,6 +174,7 @@ interface IAudioService {
int handleBluetoothA2dpActiveDeviceChange(in BluetoothDevice device,
int state, int profile, boolean suppressNoisyIntent, int a2dpVolume);
+ @UnsupportedAppUsage
AudioRoutesInfo startWatchingRoutes(in IAudioRoutesObserver observer);
boolean isCameraSoundForced();
diff --git a/media/java/android/media/IMediaScannerService.aidl b/media/java/android/media/IMediaScannerService.aidl
index c5316461ef1f..24b5595510f6 100644
--- a/media/java/android/media/IMediaScannerService.aidl
+++ b/media/java/android/media/IMediaScannerService.aidl
@@ -31,6 +31,7 @@ interface IMediaScannerService
* @param listener an optional IMediaScannerListener.
* If specified, the caller will be notified when scanning is complete via the listener.
*/
+ @UnsupportedAppUsage
void requestScanFile(String path, String mimeType, in IMediaScannerListener listener);
/**
@@ -40,5 +41,6 @@ interface IMediaScannerService
* @param mimeType an optional mimeType for the file.
* If mimeType is null, then the mimeType will be inferred from the file extension.
*/
+ @UnsupportedAppUsage
void scanFile(String path, String mimeType);
}
diff --git a/media/java/android/media/IRemoteDisplayCallback.aidl b/media/java/android/media/IRemoteDisplayCallback.aidl
index 19cf070aa08e..584417d65121 100644
--- a/media/java/android/media/IRemoteDisplayCallback.aidl
+++ b/media/java/android/media/IRemoteDisplayCallback.aidl
@@ -22,5 +22,6 @@ import android.media.RemoteDisplayState;
* {@hide}
*/
oneway interface IRemoteDisplayCallback {
+ @UnsupportedAppUsage
void onStateChanged(in RemoteDisplayState state);
}
diff --git a/media/java/android/media/MediaHTTPConnection.java b/media/java/android/media/MediaHTTPConnection.java
index 5f324f7f97ed..d72476269e18 100644
--- a/media/java/android/media/MediaHTTPConnection.java
+++ b/media/java/android/media/MediaHTTPConnection.java
@@ -37,7 +37,6 @@ import java.net.URL;
import java.net.UnknownServiceException;
import java.util.HashMap;
import java.util.Map;
-import java.util.concurrent.atomic.AtomicBoolean;
/** @hide */
public class MediaHTTPConnection extends IMediaHTTPConnection.Stub {
@@ -67,7 +66,6 @@ public class MediaHTTPConnection extends IMediaHTTPConnection.Stub {
// from com.squareup.okhttp.internal.http
private final static int HTTP_TEMP_REDIRECT = 307;
private final static int MAX_REDIRECTS = 20;
- private AtomicBoolean mIsConnected = new AtomicBoolean(false);
@UnsupportedAppUsage
public MediaHTTPConnection() {
@@ -91,7 +89,6 @@ public class MediaHTTPConnection extends IMediaHTTPConnection.Stub {
mAllowCrossDomainRedirect = true;
mURL = new URL(uri);
mHeaders = convertHeaderStringToMap(headers);
- mIsConnected.set(true);
} catch (MalformedURLException e) {
return null;
}
@@ -142,14 +139,7 @@ public class MediaHTTPConnection extends IMediaHTTPConnection.Stub {
@Override
@UnsupportedAppUsage
public void disconnect() {
- if (mIsConnected.getAndSet(false)) {
- (new Thread() {
- @Override
- public void run() {
- teardownConnection();
- }
- }).start();
- }
+ teardownConnection();
mHeaders = null;
mURL = null;
}
@@ -334,14 +324,7 @@ public class MediaHTTPConnection extends IMediaHTTPConnection.Stub {
@Override
@UnsupportedAppUsage
public int readAt(long offset, int size) {
- if (!mIsConnected.get()) {
- return -1;
- }
- int result = native_readAt(offset, size);
- if (!mIsConnected.get()) {
- return -1;
- }
- return result;
+ return native_readAt(offset, size);
}
private int readAt(long offset, byte[] data, int size) {
diff --git a/media/java/android/media/audiopolicy/AudioProductStrategies.java b/media/java/android/media/audiopolicy/AudioProductStrategies.java
index 6a2375fe153d..d5938853569c 100644
--- a/media/java/android/media/audiopolicy/AudioProductStrategies.java
+++ b/media/java/android/media/audiopolicy/AudioProductStrategies.java
@@ -177,7 +177,50 @@ public final class AudioProductStrategies implements Iterable<AudioProductStrate
@Nullable
public AudioProductStrategy getProductStrategyForAudioAttributes(@NonNull AudioAttributes aa) {
Preconditions.checkNotNull(aa, "attributes must not be null");
- return getById(native_get_product_strategies_from_audio_attributes(aa));
+ int productStrategyId = native_get_product_strategies_from_audio_attributes(aa);
+ if (productStrategyId < 0) {
+ Log.w(TAG, "no strategy found for Attributes " + aa.toString());
+ return null;
+ }
+ return getById(productStrategyId);
+ }
+
+ /**
+ * @hide
+ * @param attributes the {@link AudioAttributes} to be considered
+ * @return volume group associated to the given {@link AudioAttributes}.
+ * If no group supports the given {@link AudioAttributes}, it returns the volume group
+ * for the default attributes.
+ * If no group supports the default attributes, it returns {@link #DEFAULT_VOLUME_GROUP}
+ */
+ @SystemApi
+ public int getVolumeGroupIdForAttributes(@NonNull AudioAttributes attributes) {
+ Preconditions.checkNotNull(attributes, "attributes must not be null");
+ int volumeGroupId = getVolumeGroupIdForAttributesInt(attributes);
+ if (volumeGroupId != AudioVolumeGroups.DEFAULT_VOLUME_GROUP) {
+ return volumeGroupId;
+ }
+ // The default volume group is the one hosted by default product strategy, i.e.
+ // supporting Default Attributes
+ return getVolumeGroupIdForAttributesInt(AudioProductStrategy.sDefaultAttributes);
+ }
+
+ /**
+ * @hide
+ * @param streamType to be considered
+ * @return volume group associated to the given stream type.
+ */
+ @SystemApi
+ public int getVolumeGroupIdForLegacyStreamType(int streamType) {
+ for (final AudioProductStrategy productStrategy : this) {
+ int volumeGroupId = productStrategy.getVolumeGroupIdForLegacyStreamType(streamType);
+ if (volumeGroupId != AudioVolumeGroups.DEFAULT_VOLUME_GROUP) {
+ return volumeGroupId;
+ }
+ }
+ // The default volume group is the one hosted by default product strategy, i.e.
+ // supporting Default Attributes
+ return getVolumeGroupIdForAttributesInt(AudioProductStrategy.sDefaultAttributes);
}
@Override
@@ -193,6 +236,21 @@ public final class AudioProductStrategies implements Iterable<AudioProductStrate
}
}
+ /**
+ * @param attributes to be considered
+ * @return volume group associated to the given {@link AudioAttributes}.
+ */
+ private int getVolumeGroupIdForAttributesInt(@NonNull AudioAttributes attributes) {
+ Preconditions.checkNotNull(attributes, "attributes must not be null");
+ for (final AudioProductStrategy productStrategy : this) {
+ int volumeGroupId = productStrategy.getVolumeGroupIdForAudioAttributes(attributes);
+ if (volumeGroupId != AudioVolumeGroups.DEFAULT_VOLUME_GROUP) {
+ return volumeGroupId;
+ }
+ }
+ return AudioVolumeGroups.DEFAULT_VOLUME_GROUP;
+ }
+
public static final Parcelable.Creator<AudioProductStrategies> CREATOR =
new Parcelable.Creator<AudioProductStrategies>() {
@Override
diff --git a/media/java/android/media/audiopolicy/AudioProductStrategy.java b/media/java/android/media/audiopolicy/AudioProductStrategy.java
index af6e8bfdbd83..169484b79bd4 100644
--- a/media/java/android/media/audiopolicy/AudioProductStrategy.java
+++ b/media/java/android/media/audiopolicy/AudioProductStrategy.java
@@ -157,32 +157,32 @@ public final class AudioProductStrategy implements Parcelable {
/**
* @hide
* @param streamType legacy stream type used for volume operation only
- * @return the {@link AudioAttributes} relevant for the given streamType.
- * If none is found, it builds the default attributes.
+ * @return the volume group id relevant for the given streamType.
+ * If none is found, {@link AudioVolumeGroups#DEFAULT_VOLUME_GROUP} is returned.
*/
- public int getGroupIdForLegacyStreamType(int streamType) {
+ public int getVolumeGroupIdForLegacyStreamType(int streamType) {
for (final AudioAttributesGroup aag : mAudioAttributesGroups) {
if (aag.supportsStreamType(streamType)) {
- return aag.getGroupId();
+ return aag.getVolumeGroupId();
}
}
- return DEFAULT_GROUP;
+ return AudioVolumeGroups.DEFAULT_VOLUME_GROUP;
}
/**
* @hide
* @param aa the {@link AudioAttributes} to be considered
- * @return the group id associated with the given audio attributes if found,
- * default value otherwise.
+ * @return the volume group id associated with the given audio attributes if found,
+ * {@link AudioVolumeGroups#DEFAULT_VOLUME_GROUP} otherwise.
*/
- public int getGroupIdForAudioAttributes(@NonNull AudioAttributes aa) {
+ public int getVolumeGroupIdForAudioAttributes(@NonNull AudioAttributes aa) {
Preconditions.checkNotNull(aa, "AudioAttributes must not be null");
for (final AudioAttributesGroup aag : mAudioAttributesGroups) {
if (aag.supportsAttributes(aa)) {
- return aag.getGroupId();
+ return aag.getVolumeGroupId();
}
}
- return DEFAULT_GROUP;
+ return AudioVolumeGroups.DEFAULT_VOLUME_GROUP;
}
@Override
@@ -266,15 +266,14 @@ public final class AudioProductStrategy implements Parcelable {
&& ((refFormattedTags.length() == 0) || refFormattedTags.equals(cliFormattedTags));
}
-
private static final class AudioAttributesGroup implements Parcelable {
- private int mGroupId;
+ private int mVolumeGroupId;
private int mLegacyStreamType;
private final AudioAttributes[] mAudioAttributes;
- AudioAttributesGroup(int groupId, int streamType,
+ AudioAttributesGroup(int volumeGroupId, int streamType,
@NonNull AudioAttributes[] audioAttributes) {
- mGroupId = groupId;
+ mVolumeGroupId = volumeGroupId;
mLegacyStreamType = streamType;
mAudioAttributes = audioAttributes;
}
@@ -286,7 +285,7 @@ public final class AudioProductStrategy implements Parcelable {
AudioAttributesGroup thatAag = (AudioAttributesGroup) o;
- return mGroupId == thatAag.mGroupId
+ return mVolumeGroupId == thatAag.mVolumeGroupId
&& mLegacyStreamType == thatAag.mLegacyStreamType
&& mAudioAttributes.equals(thatAag.mAudioAttributes);
}
@@ -295,8 +294,8 @@ public final class AudioProductStrategy implements Parcelable {
return mLegacyStreamType;
}
- public int getGroupId() {
- return mGroupId;
+ public int getVolumeGroupId() {
+ return mVolumeGroupId;
}
public @NonNull AudioAttributes getAudioAttributes() {
@@ -331,7 +330,7 @@ public final class AudioProductStrategy implements Parcelable {
@Override
public void writeToParcel(@NonNull Parcel dest, int flags) {
- dest.writeInt(mGroupId);
+ dest.writeInt(mVolumeGroupId);
dest.writeInt(mLegacyStreamType);
dest.writeInt(mAudioAttributes.length);
for (AudioAttributes attributes : mAudioAttributes) {
@@ -343,14 +342,14 @@ public final class AudioProductStrategy implements Parcelable {
new Parcelable.Creator<AudioAttributesGroup>() {
@Override
public AudioAttributesGroup createFromParcel(@NonNull Parcel in) {
- int groupId = in.readInt();
+ int volumeGroupId = in.readInt();
int streamType = in.readInt();
int nbAttributes = in.readInt();
AudioAttributes[] aa = new AudioAttributes[nbAttributes];
for (int index = 0; index < nbAttributes; index++) {
aa[index] = AudioAttributes.CREATOR.createFromParcel(in);
}
- return new AudioAttributesGroup(groupId, streamType, aa);
+ return new AudioAttributesGroup(volumeGroupId, streamType, aa);
}
@Override
@@ -365,8 +364,8 @@ public final class AudioProductStrategy implements Parcelable {
StringBuilder s = new StringBuilder();
s.append("\n Legacy Stream Type: ");
s.append(Integer.toString(mLegacyStreamType));
- s.append(" Group Id: ");
- s.append(Integer.toString(mGroupId));
+ s.append(" Volume Group Id: ");
+ s.append(Integer.toString(mVolumeGroupId));
for (AudioAttributes attribute : mAudioAttributes) {
s.append("\n -");
diff --git a/media/java/android/media/audiopolicy/AudioVolumeGroup.aidl b/media/java/android/media/audiopolicy/AudioVolumeGroup.aidl
new file mode 100644
index 000000000000..caf1e0db1ad7
--- /dev/null
+++ b/media/java/android/media/audiopolicy/AudioVolumeGroup.aidl
@@ -0,0 +1,18 @@
+/* Copyright 2018, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+
+package android.media.audiopolicy;
+
+parcelable AudioVolumeGroup;
diff --git a/media/java/android/media/audiopolicy/AudioVolumeGroup.java b/media/java/android/media/audiopolicy/AudioVolumeGroup.java
new file mode 100644
index 000000000000..0b4ba937ad29
--- /dev/null
+++ b/media/java/android/media/audiopolicy/AudioVolumeGroup.java
@@ -0,0 +1,171 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.media.audiopolicy;
+
+import android.annotation.NonNull;
+import android.annotation.SystemApi;
+import android.media.AudioAttributes;
+import android.os.Parcel;
+import android.os.Parcelable;
+
+import com.android.internal.util.Preconditions;
+
+import java.util.Arrays;
+import java.util.List;
+
+/**
+ * A class to create the association between different playback attributes
+ * (e.g. media, mapping direction) to a single volume control.
+ * @hide
+ */
+@SystemApi
+public final class AudioVolumeGroup implements Parcelable {
+ /**
+ * Unique identifier of a volume group.
+ */
+ private int mId;
+ /**
+ * human-readable name of this volume group.
+ */
+ private final String mName;
+
+ private final AudioAttributes[] mAudioAttributes;
+ private int[] mLegacyStreamTypes;
+
+ /**
+ * @param name of the volume group
+ * @param id of the volume group
+ * @param followers {@link AudioProductStrategies} strategy following this volume group
+ */
+ AudioVolumeGroup(@NonNull String name, int id,
+ @NonNull AudioAttributes[] audioAttributes,
+ @NonNull int[] legacyStreamTypes) {
+ Preconditions.checkNotNull(name, "name must not be null");
+ Preconditions.checkNotNull(audioAttributes, "audioAttributes must not be null");
+ Preconditions.checkNotNull(legacyStreamTypes, "legacyStreamTypes must not be null");
+ mName = name;
+ mId = id;
+ mAudioAttributes = audioAttributes;
+ mLegacyStreamTypes = legacyStreamTypes;
+ }
+
+ @Override
+ public boolean equals(@NonNull Object o) {
+ if (this == o) return true;
+ if (o == null || getClass() != o.getClass()) return false;
+
+ AudioVolumeGroup thatAvg = (AudioVolumeGroup) o;
+
+ return mName == thatAvg.mName && mId == thatAvg.mId
+ && mAudioAttributes.equals(thatAvg.mAudioAttributes);
+ }
+
+ /**
+ * @return List of {@link AudioAttributes} involved in this {@link AudioVolumeGroup}.
+ */
+ public List<AudioAttributes> getAudioAttributes() {
+ return Arrays.asList(mAudioAttributes);
+ }
+
+ /**
+ * @return the stream types involved in this {@link AudioVolumeGroup}.
+ */
+ public @NonNull int[] getLegacyStreamTypes() {
+ return mLegacyStreamTypes;
+ }
+
+ /**
+ * @return human-readable name of this volume group.
+ */
+ public @NonNull String name() {
+ return mName;
+ }
+
+ /**
+ * @return the volume group unique identifier id.
+ */
+ public int getId() {
+ return mId;
+ }
+
+ @Override
+ public int describeContents() {
+ return 0;
+ }
+
+ @Override
+ public void writeToParcel(@NonNull Parcel dest, int flags) {
+ dest.writeString(mName);
+ dest.writeInt(mId);
+ dest.writeInt(mAudioAttributes.length);
+ for (AudioAttributes attributes : mAudioAttributes) {
+ attributes.writeToParcel(dest, flags | AudioAttributes.FLATTEN_TAGS/*flags*/);
+ }
+ dest.writeInt(mLegacyStreamTypes.length);
+ for (int streamType : mLegacyStreamTypes) {
+ dest.writeInt(streamType);
+ }
+ }
+
+ public static final Parcelable.Creator<AudioVolumeGroup> CREATOR =
+ new Parcelable.Creator<AudioVolumeGroup>() {
+ @Override
+ public @NonNull AudioVolumeGroup createFromParcel(@NonNull Parcel in) {
+ Preconditions.checkNotNull(in, "in Parcel must not be null");
+ String name = in.readString();
+ int id = in.readInt();
+ int nbAttributes = in.readInt();
+ AudioAttributes[] audioAttributes = new AudioAttributes[nbAttributes];
+ for (int index = 0; index < nbAttributes; index++) {
+ audioAttributes[index] = AudioAttributes.CREATOR.createFromParcel(in);
+ }
+ int nbStreamTypes = in.readInt();
+ int[] streamTypes = new int[nbStreamTypes];
+ for (int index = 0; index < nbStreamTypes; index++) {
+ streamTypes[index] = in.readInt();
+ }
+ return new AudioVolumeGroup(name, id, audioAttributes, streamTypes);
+ }
+
+ @Override
+ public @NonNull AudioVolumeGroup[] newArray(int size) {
+ return new AudioVolumeGroup[size];
+ }
+ };
+
+ @Override
+ public @NonNull String toString() {
+ StringBuilder s = new StringBuilder();
+ s.append("\n Name: ");
+ s.append(mName);
+ s.append(" Id: ");
+ s.append(Integer.toString(mId));
+
+ s.append("\n Supported Audio Attributes:");
+ for (AudioAttributes attribute : mAudioAttributes) {
+ s.append("\n -");
+ s.append(attribute.toString());
+ }
+ s.append("\n Supported Legacy Stream Types: { ");
+ for (int legacyStreamType : mLegacyStreamTypes) {
+ s.append(Integer.toString(legacyStreamType));
+ s.append(" ");
+ }
+ s.append("}");
+ return s.toString();
+ }
+}
diff --git a/media/java/android/media/audiopolicy/AudioVolumeGroupChangeHandler.java b/media/java/android/media/audiopolicy/AudioVolumeGroupChangeHandler.java
new file mode 100644
index 000000000000..074188e01000
--- /dev/null
+++ b/media/java/android/media/audiopolicy/AudioVolumeGroupChangeHandler.java
@@ -0,0 +1,167 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.media.audiopolicy;
+
+import android.annotation.NonNull;
+import android.media.AudioManager;
+import android.os.Handler;
+import android.os.HandlerThread;
+import android.os.Message;
+
+import com.android.internal.util.Preconditions;
+
+import java.lang.ref.WeakReference;
+import java.util.ArrayList;
+
+/**
+ * The AudioVolumeGroupChangeHandler handles AudioManager.OnAudioVolumeGroupChangedListener
+ * callbacks posted from JNI
+ *
+ * TODO: Make use of Executor of callbacks.
+ * @hide
+ */
+public class AudioVolumeGroupChangeHandler {
+ private Handler mHandler;
+ private HandlerThread mHandlerThread;
+ private final ArrayList<AudioManager.VolumeGroupCallback> mListeners =
+ new ArrayList<AudioManager.VolumeGroupCallback>();
+
+ private static final String TAG = "AudioVolumeGroupChangeHandler";
+
+ private static final int AUDIOVOLUMEGROUP_EVENT_VOLUME_CHANGED = 1000;
+ private static final int AUDIOVOLUMEGROUP_EVENT_NEW_LISTENER = 4;
+
+ /**
+ * Accessed by native methods: JNI Callback context.
+ */
+ @SuppressWarnings("unused")
+ private long mJniCallback;
+
+ /**
+ * Initialization
+ */
+ public void init() {
+ synchronized (this) {
+ if (mHandler != null) {
+ return;
+ }
+ // create a new thread for our new event handler
+ mHandlerThread = new HandlerThread(TAG);
+ mHandlerThread.start();
+
+ if (mHandlerThread.getLooper() == null) {
+ mHandler = null;
+ return;
+ }
+ mHandler = new Handler(mHandlerThread.getLooper()) {
+ @Override
+ public void handleMessage(Message msg) {
+ ArrayList<AudioManager.VolumeGroupCallback> listeners;
+ synchronized (this) {
+ if (msg.what == AUDIOVOLUMEGROUP_EVENT_NEW_LISTENER) {
+ listeners =
+ new ArrayList<AudioManager.VolumeGroupCallback>();
+ if (mListeners.contains(msg.obj)) {
+ listeners.add(
+ (AudioManager.VolumeGroupCallback) msg.obj);
+ }
+ } else {
+ listeners = mListeners;
+ }
+ }
+ if (listeners.isEmpty()) {
+ return;
+ }
+
+ switch (msg.what) {
+ case AUDIOVOLUMEGROUP_EVENT_VOLUME_CHANGED:
+ for (int i = 0; i < listeners.size(); i++) {
+ listeners.get(i).onAudioVolumeGroupChanged((int) msg.arg1,
+ (int) msg.arg2);
+ }
+ break;
+
+ default:
+ break;
+ }
+ }
+ };
+ native_setup(new WeakReference<AudioVolumeGroupChangeHandler>(this));
+ }
+ }
+
+ private native void native_setup(Object moduleThis);
+
+ @Override
+ protected void finalize() {
+ native_finalize();
+ if (mHandlerThread.isAlive()) {
+ mHandlerThread.quit();
+ }
+ }
+ private native void native_finalize();
+
+ /**
+ * @param cb the {@link AudioManager.VolumeGroupCallback} to register
+ */
+ public void registerListener(@NonNull AudioManager.VolumeGroupCallback cb) {
+ Preconditions.checkNotNull(cb, "volume group callback shall not be null");
+ synchronized (this) {
+ mListeners.add(cb);
+ }
+ if (mHandler != null) {
+ Message m = mHandler.obtainMessage(
+ AUDIOVOLUMEGROUP_EVENT_NEW_LISTENER, 0, 0, cb);
+ mHandler.sendMessage(m);
+ }
+ }
+
+ /**
+ * @param cb the {@link AudioManager.VolumeGroupCallback} to unregister
+ */
+ public void unregisterListener(@NonNull AudioManager.VolumeGroupCallback cb) {
+ Preconditions.checkNotNull(cb, "volume group callback shall not be null");
+ synchronized (this) {
+ mListeners.remove(cb);
+ }
+ }
+
+ Handler handler() {
+ return mHandler;
+ }
+
+ @SuppressWarnings("unused")
+ private static void postEventFromNative(Object moduleRef,
+ int what, int arg1, int arg2, Object obj) {
+ AudioVolumeGroupChangeHandler eventHandler =
+ (AudioVolumeGroupChangeHandler) ((WeakReference) moduleRef).get();
+ if (eventHandler == null) {
+ return;
+ }
+
+ if (eventHandler != null) {
+ Handler handler = eventHandler.handler();
+ if (handler != null) {
+ Message m = handler.obtainMessage(what, arg1, arg2, obj);
+ if (what != AUDIOVOLUMEGROUP_EVENT_NEW_LISTENER) {
+ handler.removeMessages(what);
+ }
+ handler.sendMessage(m);
+ }
+ }
+ }
+}
diff --git a/media/java/android/media/audiopolicy/AudioVolumeGroups.aidl b/media/java/android/media/audiopolicy/AudioVolumeGroups.aidl
new file mode 100644
index 000000000000..918cac39f19a
--- /dev/null
+++ b/media/java/android/media/audiopolicy/AudioVolumeGroups.aidl
@@ -0,0 +1,18 @@
+/* Copyright 2018, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+
+package android.media.audiopolicy;
+
+parcelable AudioVolumeGroups;
diff --git a/media/java/android/media/audiopolicy/AudioVolumeGroups.java b/media/java/android/media/audiopolicy/AudioVolumeGroups.java
new file mode 100644
index 000000000000..301bec7a10c4
--- /dev/null
+++ b/media/java/android/media/audiopolicy/AudioVolumeGroups.java
@@ -0,0 +1,135 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.media.audiopolicy;
+
+import android.annotation.NonNull;
+import android.annotation.Nullable;
+import android.annotation.SystemApi;
+import android.media.AudioSystem;
+import android.os.Parcel;
+import android.os.Parcelable;
+import android.util.Log;
+
+import com.android.internal.util.Preconditions;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+
+/**
+ * @hide
+ * A class to encapsulate a collection of {@link AudioVolumeGroup}.
+ */
+@SystemApi
+public final class AudioVolumeGroups implements Iterable<AudioVolumeGroup>, Parcelable {
+
+ private final ArrayList<AudioVolumeGroup> mAudioVolumeGroupList;
+
+ private static final String TAG = "AudioVolumeGroups";
+
+ /**
+ * Volume group value to use when introspection API fails.
+ */
+ public static final int DEFAULT_VOLUME_GROUP = -1;
+
+ public AudioVolumeGroups() {
+ ArrayList<AudioVolumeGroup> avgList = new ArrayList<AudioVolumeGroup>();
+ int status = native_list_audio_volume_groups(avgList);
+ if (status != AudioSystem.SUCCESS) {
+ Log.w(TAG, ": listAudioVolumeGroups failed");
+ }
+ mAudioVolumeGroupList = avgList;
+ }
+
+ private AudioVolumeGroups(@NonNull ArrayList<AudioVolumeGroup> audioVolumeGroupList) {
+ Preconditions.checkNotNull(audioVolumeGroupList, "audioVolumeGroupList must not be null");
+ mAudioVolumeGroupList = audioVolumeGroupList;
+ }
+
+ /**
+ * @return number of {@link AudioProductStrategy} objects
+ */
+ public int size() {
+ return mAudioVolumeGroupList.size();
+ }
+
+ /**
+ * Returns an {@link Iterator}
+ */
+ @Override
+ public Iterator<AudioVolumeGroup> iterator() {
+ return mAudioVolumeGroupList.iterator();
+ }
+
+ @Override
+ public boolean equals(@NonNull Object o) {
+ if (this == o) return true;
+ if (o == null || getClass() != o.getClass()) return false;
+
+ AudioVolumeGroups that = (AudioVolumeGroups) o;
+
+ return mAudioVolumeGroupList.equals(that.mAudioVolumeGroupList);
+ }
+
+ /**
+ * @return the matching {@link AudioVolumeGroup} objects with the given id,
+ * null object if not found.
+ */
+ public @Nullable AudioVolumeGroup getById(int volumeGroupId) {
+ for (final AudioVolumeGroup avg : this) {
+ if (avg.getId() == volumeGroupId) {
+ return avg;
+ }
+ }
+ Log.e(TAG, ": invalid volume group id: " + volumeGroupId + " requested");
+ return null;
+ }
+
+ @Override
+ public int describeContents() {
+ return 0;
+ }
+
+ @Override
+ public void writeToParcel(@NonNull Parcel dest, int flags) {
+ dest.writeInt(size());
+ for (final AudioVolumeGroup volumeGroup : this) {
+ volumeGroup.writeToParcel(dest, flags);
+ }
+ }
+
+ private static native int native_list_audio_volume_groups(
+ ArrayList<AudioVolumeGroup> groups);
+
+ public static final Parcelable.Creator<AudioVolumeGroups> CREATOR =
+ new Parcelable.Creator<AudioVolumeGroups>() {
+ @Override
+ public @NonNull AudioVolumeGroups createFromParcel(@NonNull Parcel in) {
+ Preconditions.checkNotNull(in, "in Parcel must not be null");
+ ArrayList<AudioVolumeGroup> avgList = new ArrayList<AudioVolumeGroup>();
+ int size = in.readInt();
+ for (int index = 0; index < size; index++) {
+ avgList.add(AudioVolumeGroup.CREATOR.createFromParcel(in));
+ }
+ return new AudioVolumeGroups(avgList);
+ }
+
+ @Override
+ public @NonNull AudioVolumeGroups[] newArray(int size) {
+ return new AudioVolumeGroups[size];
+ }
+ };
+}
diff --git a/media/java/android/media/projection/IMediaProjectionManager.aidl b/media/java/android/media/projection/IMediaProjectionManager.aidl
index 7e10c51fc5cd..d190fcec6c8c 100644
--- a/media/java/android/media/projection/IMediaProjectionManager.aidl
+++ b/media/java/android/media/projection/IMediaProjectionManager.aidl
@@ -24,6 +24,7 @@ import android.os.IBinder;
/** {@hide} */
interface IMediaProjectionManager {
+ @UnsupportedAppUsage
boolean hasProjectionPermission(int uid, String packageName);
IMediaProjection createProjection(int uid, String packageName, int type,
boolean permanentGrant);
diff --git a/media/java/android/media/projection/MediaProjection.java b/media/java/android/media/projection/MediaProjection.java
index f9c5b8d729c7..632cfb0f1e30 100644
--- a/media/java/android/media/projection/MediaProjection.java
+++ b/media/java/android/media/projection/MediaProjection.java
@@ -21,7 +21,6 @@ import android.annotation.Nullable;
import android.content.Context;
import android.hardware.display.DisplayManager;
import android.hardware.display.VirtualDisplay;
-import android.media.AudioRecord;
import android.media.projection.IMediaProjection;
import android.media.projection.IMediaProjectionCallback;
import android.os.Handler;
@@ -140,16 +139,6 @@ public final class MediaProjection {
}
/**
- * Creates an AudioRecord to capture audio played back by the system.
- * @hide
- */
- public AudioRecord createAudioRecord(
- int sampleRateInHz, int channelConfig,
- int audioFormat, int bufferSizeInBytes) {
- return null;
- }
-
- /**
* Stops projection.
*/
public void stop() {
diff --git a/media/java/android/media/tv/ITvRemoteServiceInput.aidl b/media/java/android/media/tv/ITvRemoteServiceInput.aidl
index df39299c0f93..a0b6c9bfc8d8 100644
--- a/media/java/android/media/tv/ITvRemoteServiceInput.aidl
+++ b/media/java/android/media/tv/ITvRemoteServiceInput.aidl
@@ -21,13 +21,22 @@ package android.media.tv;
*/
oneway interface ITvRemoteServiceInput {
// InputBridge related
+ @UnsupportedAppUsage
void openInputBridge(IBinder token, String name, int width, int height, int maxPointers);
+ @UnsupportedAppUsage
void closeInputBridge(IBinder token);
+ @UnsupportedAppUsage
void clearInputBridge(IBinder token);
+ @UnsupportedAppUsage
void sendTimestamp(IBinder token, long timestamp);
+ @UnsupportedAppUsage
void sendKeyDown(IBinder token, int keyCode);
+ @UnsupportedAppUsage
void sendKeyUp(IBinder token, int keyCode);
+ @UnsupportedAppUsage
void sendPointerDown(IBinder token, int pointerId, int x, int y);
+ @UnsupportedAppUsage
void sendPointerUp(IBinder token, int pointerId);
+ @UnsupportedAppUsage
void sendPointerSync(IBinder token);
} \ No newline at end of file
diff --git a/media/jni/android_media_ImageWriter.cpp b/media/jni/android_media_ImageWriter.cpp
index 031e373241cb..cfcba76d3af2 100644
--- a/media/jni/android_media_ImageWriter.cpp
+++ b/media/jni/android_media_ImageWriter.cpp
@@ -18,8 +18,11 @@
#define LOG_TAG "ImageWriter_JNI"
#include "android_media_Utils.h"
+#include <utils/Condition.h>
#include <utils/Log.h>
+#include <utils/Mutex.h>
#include <utils/String8.h>
+#include <utils/Thread.h>
#include <gui/IProducerListener.h>
#include <gui/Surface.h>
@@ -34,6 +37,8 @@
#include <inttypes.h>
#include <android/hardware_buffer_jni.h>
+#include <deque>
+
#define IMAGE_BUFFER_JNI_ID "mNativeBuffer"
#define IMAGE_FORMAT_UNKNOWN 0 // This is the same value as ImageFormat#UNKNOWN.
// ----------------------------------------------------------------------------
@@ -90,14 +95,124 @@ private:
int mFormat;
int mWidth;
int mHeight;
+
+ // Class for a shared thread used to detach buffers from buffer queues
+ // to discard buffers after consumers are done using them.
+ // This is needed because detaching buffers in onBufferReleased callback
+ // can lead to deadlock when consumer/producer are on the same process.
+ class BufferDetacher {
+ public:
+ // Called by JNIImageWriterContext ctor. Will start the thread for first ref.
+ void addRef();
+ // Called by JNIImageWriterContext dtor. Will stop the thread after ref goes to 0.
+ void removeRef();
+ // Called by onBufferReleased to signal this thread to detach a buffer
+ void detach(wp<Surface>);
+
+ private:
+
+ class DetachThread : public Thread {
+ public:
+ DetachThread() : Thread(/*canCallJava*/false) {};
+
+ void detach(wp<Surface>);
+
+ virtual void requestExit() override;
+
+ private:
+ virtual bool threadLoop() override;
+
+ Mutex mLock;
+ Condition mCondition;
+ std::deque<wp<Surface>> mQueue;
+
+ static const nsecs_t kWaitDuration = 20000000; // 20 ms
+ };
+ sp<DetachThread> mThread;
+
+ Mutex mLock;
+ int mRefCount = 0;
+ };
+
+ static BufferDetacher sBufferDetacher;
};
+JNIImageWriterContext::BufferDetacher JNIImageWriterContext::sBufferDetacher;
+
+void JNIImageWriterContext::BufferDetacher::addRef() {
+ Mutex::Autolock l(mLock);
+ mRefCount++;
+ if (mRefCount == 1) {
+ mThread = new DetachThread();
+ mThread->run("BufDtchThrd");
+ }
+}
+
+void JNIImageWriterContext::BufferDetacher::removeRef() {
+ Mutex::Autolock l(mLock);
+ mRefCount--;
+ if (mRefCount == 0) {
+ mThread->requestExit();
+ mThread->join();
+ mThread.clear();
+ }
+}
+
+void JNIImageWriterContext::BufferDetacher::detach(wp<Surface> bq) {
+ Mutex::Autolock l(mLock);
+ if (mThread == nullptr) {
+ ALOGE("%s: buffer detach thread is gone!", __FUNCTION__);
+ return;
+ }
+ mThread->detach(bq);
+}
+
+void JNIImageWriterContext::BufferDetacher::DetachThread::detach(wp<Surface> bq) {
+ Mutex::Autolock l(mLock);
+ mQueue.push_back(bq);
+ mCondition.signal();
+}
+
+void JNIImageWriterContext::BufferDetacher::DetachThread::requestExit() {
+ Thread::requestExit();
+ {
+ Mutex::Autolock l(mLock);
+ mQueue.clear();
+ }
+ mCondition.signal();
+}
+
+bool JNIImageWriterContext::BufferDetacher::DetachThread::threadLoop() {
+ Mutex::Autolock l(mLock);
+ mCondition.waitRelative(mLock, kWaitDuration);
+
+ while (!mQueue.empty()) {
+ if (exitPending()) {
+ return false;
+ }
+
+ wp<Surface> wbq = mQueue.front();
+ mQueue.pop_front();
+ sp<Surface> bq = wbq.promote();
+ if (bq != nullptr) {
+ sp<Fence> fence;
+ sp<GraphicBuffer> buffer;
+ ALOGV("%s: One buffer is detached", __FUNCTION__);
+ mLock.unlock();
+ bq->detachNextBuffer(&buffer, &fence);
+ mLock.lock();
+ }
+ }
+ return !exitPending();
+}
+
JNIImageWriterContext::JNIImageWriterContext(JNIEnv* env, jobject weakThiz, jclass clazz) :
- mWeakThiz(env->NewGlobalRef(weakThiz)),
- mClazz((jclass)env->NewGlobalRef(clazz)),
- mFormat(0),
- mWidth(-1),
- mHeight(-1) {
+ mWeakThiz(env->NewGlobalRef(weakThiz)),
+ mClazz((jclass)env->NewGlobalRef(clazz)),
+ mFormat(0),
+ mWidth(-1),
+ mHeight(-1) {
+ sBufferDetacher.addRef();
}
JNIImageWriterContext::~JNIImageWriterContext() {
@@ -115,6 +230,7 @@ JNIImageWriterContext::~JNIImageWriterContext() {
}
mProducer.clear();
+ sBufferDetacher.removeRef();
}
JNIEnv* JNIImageWriterContext::getJNIEnv(bool* needsDetach) {
@@ -153,10 +269,7 @@ void JNIImageWriterContext::onBufferReleased() {
// need let this callback give a BufferItem, then only detach if it was attached to this
// Writer. Do the detach unconditionally for opaque format now. see b/19977520
if (mFormat == HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED) {
- sp<Fence> fence;
- sp<GraphicBuffer> buffer;
- ALOGV("%s: One buffer is detached", __FUNCTION__);
- mProducer->detachNextBuffer(&buffer, &fence);
+ sBufferDetacher.detach(mProducer);
}
env->CallStaticVoidMethod(mClazz, gImageWriterClassInfo.postEventFromNative, mWeakThiz);
diff --git a/packages/CaptivePortalLogin/AndroidManifest.xml b/packages/CaptivePortalLogin/AndroidManifest.xml
index 0894ee576a2d..2a4323851068 100644
--- a/packages/CaptivePortalLogin/AndroidManifest.xml
+++ b/packages/CaptivePortalLogin/AndroidManifest.xml
@@ -17,7 +17,9 @@
*/
-->
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
- package="com.android.captiveportallogin" >
+ package="com.android.captiveportallogin"
+ android:versionCode="10"
+ android:versionName="Q-initial">
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
diff --git a/packages/CarSystemUI/res/drawable/car_ic_selection_bg.xml b/packages/CarSystemUI/res/drawable/car_ic_selection_bg.xml
index 781beaf96264..12993f5b8b7c 100644
--- a/packages/CarSystemUI/res/drawable/car_ic_selection_bg.xml
+++ b/packages/CarSystemUI/res/drawable/car_ic_selection_bg.xml
@@ -20,7 +20,7 @@
android:viewportHeight="70.0"
android:viewportWidth="70.0">
<path
- android:fillColor="@color/car_accent"
+ android:fillColor="?android:attr/colorAccent"
android:fillType="evenOdd"
android:pathData="M4,0L66,0A4,4 0,0 1,70 4L70,66A4,4 0,0 1,66 70L4,70A4,4 0,0 1,0 66L0,4A4,4 0,0 1,4 0z"
android:strokeColor="#00000000"
diff --git a/packages/CarSystemUI/src/com/android/systemui/statusbar/car/CarStatusBar.java b/packages/CarSystemUI/src/com/android/systemui/statusbar/car/CarStatusBar.java
index 369bb9fdd9dd..bd0e0b846abf 100644
--- a/packages/CarSystemUI/src/com/android/systemui/statusbar/car/CarStatusBar.java
+++ b/packages/CarSystemUI/src/com/android/systemui/statusbar/car/CarStatusBar.java
@@ -92,6 +92,10 @@ public class CarStatusBar extends StatusBar implements
@Override
public void start() {
+ // get the provisioned state before calling the parent class since it's that flow that
+ // builds the nav bar
+ mDeviceProvisionedController = Dependency.get(DeviceProvisionedController.class);
+ mDeviceIsProvisioned = mDeviceProvisionedController.isDeviceProvisioned();
super.start();
mTaskStackListener = new TaskStackListenerImpl();
mActivityManagerWrapper = ActivityManagerWrapper.getInstance();
@@ -105,8 +109,6 @@ public class CarStatusBar extends StatusBar implements
mHvacController.connectToCarService();
CarSystemUIFactory factory = SystemUIFactory.getInstance();
- mDeviceProvisionedController = Dependency.get(DeviceProvisionedController.class);
- mDeviceIsProvisioned = mDeviceProvisionedController.isDeviceProvisioned();
if (!mDeviceIsProvisioned) {
mDeviceProvisionedController.addCallback(
new DeviceProvisionedController.DeviceProvisionedListener() {
diff --git a/packages/NetworkStack/AndroidManifest.xml b/packages/NetworkStack/AndroidManifest.xml
index 52c209e5f247..90521de6a453 100644
--- a/packages/NetworkStack/AndroidManifest.xml
+++ b/packages/NetworkStack/AndroidManifest.xml
@@ -18,7 +18,9 @@
-->
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.android.networkstack"
- android:sharedUserId="android.uid.networkstack">
+ android:sharedUserId="android.uid.networkstack"
+ android:versionCode="10"
+ android:versionName="Q-initial">
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
diff --git a/packages/NetworkStackPermissionStub/AndroidManifest.xml b/packages/NetworkStackPermissionStub/AndroidManifest.xml
index a8742d7ab34f..ba8a178eaea4 100644
--- a/packages/NetworkStackPermissionStub/AndroidManifest.xml
+++ b/packages/NetworkStackPermissionStub/AndroidManifest.xml
@@ -18,7 +18,9 @@
-->
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.android.networkstack.permissionstub"
- android:sharedUserId="android.uid.networkstack">
+ android:sharedUserId="android.uid.networkstack"
+ android:versionCode="10"
+ android:versionName="Q-initial">
<!--
This package only exists to define the below permissions, and enforce that they are only
granted to apps sharing the same signature.
diff --git a/packages/SettingsLib/src/com/android/settingslib/graph/ThemedBatteryDrawable.kt b/packages/SettingsLib/src/com/android/settingslib/graph/ThemedBatteryDrawable.kt
index 337106bb5f1b..911cfcd115f4 100644
--- a/packages/SettingsLib/src/com/android/settingslib/graph/ThemedBatteryDrawable.kt
+++ b/packages/SettingsLib/src/com/android/settingslib/graph/ThemedBatteryDrawable.kt
@@ -87,7 +87,8 @@ open class ThemedBatteryDrawable(private val context: Context, frameColor: Int)
invalidateSelf()
}
- open var criticalLevel: Int = 0
+ open var criticalLevel: Int = context.resources.getInteger(
+ com.android.internal.R.integer.config_criticalBatteryWarningLevel)
var charging = false
set(value) {
@@ -101,46 +102,40 @@ open class ThemedBatteryDrawable(private val context: Context, frameColor: Int)
postInvalidate()
}
- private val fillColorStrokePaint: Paint by lazy {
- val p = Paint(Paint.ANTI_ALIAS_FLAG)
+ private val fillColorStrokePaint = Paint(Paint.ANTI_ALIAS_FLAG).also { p ->
p.color = frameColor
p.isDither = true
p.strokeWidth = 5f
p.style = Paint.Style.STROKE
p.blendMode = BlendMode.SRC
p.strokeMiter = 5f
- p
+ p.strokeJoin = Paint.Join.ROUND
}
- private val fillColorStrokeProtection: Paint by lazy {
- val p = Paint(Paint.ANTI_ALIAS_FLAG)
+ private val fillColorStrokeProtection = Paint(Paint.ANTI_ALIAS_FLAG).also { p ->
p.isDither = true
p.strokeWidth = 5f
p.style = Paint.Style.STROKE
p.blendMode = BlendMode.CLEAR
p.strokeMiter = 5f
- p
+ p.strokeJoin = Paint.Join.ROUND
}
- private val fillPaint: Paint by lazy {
- val p = Paint(Paint.ANTI_ALIAS_FLAG)
+ private val fillPaint = Paint(Paint.ANTI_ALIAS_FLAG).also { p ->
p.color = frameColor
p.alpha = 255
p.isDither = true
p.strokeWidth = 0f
p.style = Paint.Style.FILL_AND_STROKE
- p
}
// Only used if dualTone is set to true
- private val dualToneBackgroundFill: Paint by lazy {
- val p = Paint(Paint.ANTI_ALIAS_FLAG)
+ private val dualToneBackgroundFill = Paint(Paint.ANTI_ALIAS_FLAG).also { p ->
p.color = frameColor
p.alpha = 255
p.isDither = true
p.strokeWidth = 0f
p.style = Paint.Style.FILL_AND_STROKE
- p
}
init {
@@ -165,9 +160,6 @@ open class ThemedBatteryDrawable(private val context: Context, frameColor: Int)
levels.recycle()
colors.recycle()
- criticalLevel = context.resources.getInteger(
- com.android.internal.R.integer.config_criticalBatteryWarningLevel)
-
loadPaths()
}
@@ -254,7 +246,7 @@ open class ThemedBatteryDrawable(private val context: Context, frameColor: Int)
private fun batteryColorForLevel(level: Int): Int {
return when {
- charging || powerSaveEnabled -> fillPaint.color
+ charging || powerSaveEnabled -> fillColor
else -> getColorForLevel(level)
}
}
@@ -347,6 +339,9 @@ open class ThemedBatteryDrawable(private val context: Context, frameColor: Int)
backgroundColor = bgColor
dualToneBackgroundFill.color = bgColor
+ // Also update the level color, since fillColor may have changed
+ levelColor = batteryColorForLevel(level)
+
invalidateSelf()
}
@@ -360,7 +355,7 @@ open class ThemedBatteryDrawable(private val context: Context, frameColor: Int)
if (b.isEmpty) {
scaleMatrix.setScale(1f, 1f)
} else {
- scaleMatrix.setScale((b.right / Companion.WIDTH), (b.bottom / Companion.HEIGHT))
+ scaleMatrix.setScale((b.right / WIDTH), (b.bottom / HEIGHT))
}
perimeterPath.transform(scaleMatrix, scaledPerimeter)
@@ -368,6 +363,14 @@ open class ThemedBatteryDrawable(private val context: Context, frameColor: Int)
scaledFill.computeBounds(fillRect, true)
boltPath.transform(scaleMatrix, scaledBolt)
plusPath.transform(scaleMatrix, scaledPlus)
+
+ // It is expected that this view only ever scale by the same factor in each dimension, so
+ // just pick one to scale the strokeWidths
+ val scaledStrokeWidth =
+ Math.max(b.right / WIDTH * PROTECTION_STROKE_WIDTH, PROTECTION_MIN_STROKE_WIDTH)
+
+ fillColorStrokePaint.strokeWidth = scaledStrokeWidth
+ fillColorStrokeProtection.strokeWidth = scaledStrokeWidth
}
private fun loadPaths() {
@@ -400,5 +403,10 @@ open class ThemedBatteryDrawable(private val context: Context, frameColor: Int)
private const val WIDTH = 12f
private const val HEIGHT = 20f
private const val CRITICAL_LEVEL = 15
+ // On a 12x20 grid, how wide to make the fill protection stroke.
+ // Scales when our size changes
+ private const val PROTECTION_STROKE_WIDTH = 1.4f
+ // Arbitrarily chosen for visibility at small sizes
+ private const val PROTECTION_MIN_STROKE_WIDTH = 5f
}
}
diff --git a/packages/SettingsProvider/res/values/defaults.xml b/packages/SettingsProvider/res/values/defaults.xml
index 26ea6ab2e8be..65e0c0fbc991 100644
--- a/packages/SettingsProvider/res/values/defaults.xml
+++ b/packages/SettingsProvider/res/values/defaults.xml
@@ -40,8 +40,8 @@
<bool name="def_wifi_display_on">false</bool>
<bool name="def_install_non_market_apps">false</bool>
<bool name="def_package_verifier_enable">true</bool>
- <!-- Comma-separated list of location providers -->
- <string name="def_location_providers_allowed" translatable="false">gps,network</string>
+ <!-- 0 == off, 3 == on -->
+ <integer name="def_location_mode">3</integer>
<bool name="assisted_gps_enabled">true</bool>
<bool name="def_netstats_enabled">true</bool>
<bool name="def_usb_mass_storage_enabled">true</bool>
diff --git a/packages/SettingsProvider/src/com/android/providers/settings/DatabaseHelper.java b/packages/SettingsProvider/src/com/android/providers/settings/DatabaseHelper.java
index 0ee16a9e9ed2..5e2b7c86ee93 100644
--- a/packages/SettingsProvider/src/com/android/providers/settings/DatabaseHelper.java
+++ b/packages/SettingsProvider/src/com/android/providers/settings/DatabaseHelper.java
@@ -2340,9 +2340,6 @@ class DatabaseHelper extends SQLiteOpenHelper {
stmt = db.compileStatement("INSERT OR IGNORE INTO secure(name,value)"
+ " VALUES(?,?);");
- loadStringSetting(stmt, Settings.Secure.LOCATION_PROVIDERS_ALLOWED,
- R.string.def_location_providers_allowed);
-
// Don't do this. The SystemServer will initialize ADB_ENABLED from a
// persistent system property instead.
//loadSetting(stmt, Settings.Secure.ADB_ENABLED, 0);
diff --git a/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java b/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java
index ceafbfa4da15..d6c33a3b077c 100644
--- a/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java
+++ b/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java
@@ -969,6 +969,11 @@ public class SettingsProvider extends ContentProvider {
try {
synchronized (mLock) {
Setting setting = getSecureSetting(
+ Settings.Secure.LOCATION_MODE, userId);
+ updateSecureSetting(Settings.Secure.LOCATION_MODE,
+ setting != null ? setting.getValue() : null, null,
+ true, userId, true);
+ setting = getSecureSetting(
Settings.Secure.LOCATION_PROVIDERS_ALLOWED, userId);
updateSecureSetting(Settings.Secure.LOCATION_PROVIDERS_ALLOWED,
setting != null ? setting.getValue() : null, null,
@@ -4229,23 +4234,18 @@ public class SettingsProvider extends ContentProvider {
final Setting locationProvidersAllowed = secureSettings.getSettingLocked(
Secure.LOCATION_PROVIDERS_ALLOWED);
- String defLocationMode = Integer.toString(
- !TextUtils.isEmpty(locationProvidersAllowed.getValue())
- ? Secure.LOCATION_MODE_ON
- : Secure.LOCATION_MODE_OFF);
- secureSettings.insertSettingLocked(
- Secure.LOCATION_MODE, defLocationMode,
- null, true, SettingsState.SYSTEM_PACKAGE_NAME);
-
- // also reset LOCATION_PROVIDERS_ALLOWED back to the default value - this
- // setting is now only for debug/test purposes, and will likely be removed
- // in a later release. LocationManagerService is responsible for adjusting
- // these settings to the proper state.
-
- String defLocationProvidersAllowed = getContext().getResources().getString(
- R.string.def_location_providers_allowed);
+ final int defLocationMode;
+ if (locationProvidersAllowed.isNull()) {
+ defLocationMode = getContext().getResources().getInteger(
+ R.integer.def_location_mode);
+ } else {
+ defLocationMode =
+ !TextUtils.isEmpty(locationProvidersAllowed.getValue())
+ ? Secure.LOCATION_MODE_ON
+ : Secure.LOCATION_MODE_OFF;
+ }
secureSettings.insertSettingLocked(
- Secure.LOCATION_PROVIDERS_ALLOWED, defLocationProvidersAllowed,
+ Secure.LOCATION_MODE, Integer.toString(defLocationMode),
null, true, SettingsState.SYSTEM_PACKAGE_NAME);
}
diff --git a/packages/SystemUI/plugin/src/com/android/systemui/plugins/ClockPlugin.java b/packages/SystemUI/plugin/src/com/android/systemui/plugins/ClockPlugin.java
index 38bf77d5eb0e..7b7657a3d646 100644
--- a/packages/SystemUI/plugin/src/com/android/systemui/plugins/ClockPlugin.java
+++ b/packages/SystemUI/plugin/src/com/android/systemui/plugins/ClockPlugin.java
@@ -13,6 +13,7 @@
*/
package com.android.systemui.plugins;
+import android.graphics.Bitmap;
import android.graphics.Paint.Style;
import android.view.View;
@@ -21,13 +22,30 @@ import com.android.systemui.plugins.annotations.ProvidesInterface;
import java.util.TimeZone;
/**
- * This plugin is used to replace main clock in keyguard.
+ * Plugin used to replace main clock in keyguard.
*/
@ProvidesInterface(action = ClockPlugin.ACTION, version = ClockPlugin.VERSION)
public interface ClockPlugin extends Plugin {
String ACTION = "com.android.systemui.action.PLUGIN_CLOCK";
- int VERSION = 1;
+ int VERSION = 2;
+
+ /**
+ * Get the name of the clock face.
+ *
+ * This name should not be translated.
+ */
+ String getName();
+
+ /**
+ * Get the title of the clock face to be shown in the picker app.
+ */
+ String getTitle();
+
+ /**
+ * Get thumbnail of clock face to be shown in the picker app.
+ */
+ Bitmap getThumbnail();
/**
* Get clock view.
@@ -62,18 +80,22 @@ public interface ClockPlugin extends Plugin {
default void setColorPalette(boolean supportsDarkText, int[] colors) {}
/**
- * Notifies that time tick alarm from doze service fired.
- */
- default void dozeTimeTick() {}
-
- /**
* Set the amount (ratio) that the device has transitioned to doze.
* @param darkAmount Amount of transition to doze: 1f for doze and 0f for awake.
*/
default void setDarkAmount(float darkAmount) {}
/**
+ * Notifies that time tick alarm from doze service fired.
+ *
+ * Implement this method instead of registering a broadcast listener for TIME_TICK.
+ */
+ default void onTimeTick() {}
+
+ /**
* Notifies that the time zone has changed.
+ *
+ * Implement this method instead of registering a broadcast listener for TIME_ZONE_CHANGED.
*/
default void onTimeZoneChanged(TimeZone timeZone) {}
diff --git a/packages/SystemUI/res-keyguard/drawable/bubble_hour_hand.xml b/packages/SystemUI/res-keyguard/drawable/bubble_hour_hand.xml
index d3c3a518f6ac..a2404b0834e9 100644
--- a/packages/SystemUI/res-keyguard/drawable/bubble_hour_hand.xml
+++ b/packages/SystemUI/res-keyguard/drawable/bubble_hour_hand.xml
@@ -1,9 +1,9 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
- android:height="200dp"
- android:width="200dp"
- android:viewportHeight="100"
- android:viewportWidth="100">
+ android:height="350dp"
+ android:width="350dp"
+ android:viewportHeight="254.66145"
+ android:viewportWidth="254.66145">
<path
android:fillColor="#000000"
- android:pathData="M50.082,14.199m-13.985,0a13.985,13.985 0,1 1,27.97 0a13.985,13.985 0,1 1,-27.97 0"/>
+ android:pathData="M127.331,40.481m-10.914,0a10.914,10.914 0,1 1,21.828 0a10.914,10.914 0,1 1,-21.828 0"/>
</vector>
diff --git a/packages/SystemUI/res-keyguard/drawable/bubble_minute_hand.xml b/packages/SystemUI/res-keyguard/drawable/bubble_minute_hand.xml
index a4417fb65da4..be10b5d12af7 100644
--- a/packages/SystemUI/res-keyguard/drawable/bubble_minute_hand.xml
+++ b/packages/SystemUI/res-keyguard/drawable/bubble_minute_hand.xml
@@ -1,9 +1,11 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
- android:height="200dp"
- android:width="200dp"
- android:viewportHeight="100"
- android:viewportWidth="100" >
+ android:height="350dp"
+ android:width="350dp"
+ android:viewportHeight="254.66145"
+ android:viewportWidth="254.66145" >
<path
- android:fillColor="#000000"
- android:pathData="M50.082,0.025L50.082,0.025A13.985,15.63 0,0 1,64.067 15.656L64.067,49.029A13.985,15.63 0,0 1,50.082 64.659L50.082,64.659A13.985,15.63 0,0 1,36.097 49.029L36.097,15.656A13.985,15.63 0,0 1,50.082 0.025z"/>
+ android:strokeColor="#000000"
+ android:strokeWidth="5"
+ android:pathData="M125.923,29.692L128.739,29.692A27.108,30.579 0,0 1,155.847 60.271L155.847,125.268A27.108,30.579 0,0 1,128.739 155.847L125.923,155.847A27.108,30.579 0,0 1,98.815 125.268L98.815,60.271A27.108,30.579 0,0 1,125.923 29.692z"/>
</vector>
+
diff --git a/packages/SystemUI/res-keyguard/layout/bubble_clock.xml b/packages/SystemUI/res-keyguard/layout/bubble_clock.xml
index c8dc8e43893c..0bc13199d71e 100644
--- a/packages/SystemUI/res-keyguard/layout/bubble_clock.xml
+++ b/packages/SystemUI/res-keyguard/layout/bubble_clock.xml
@@ -42,15 +42,15 @@
>
<ImageView
android:id="@+id/minute_hand"
- android:layout_width="300dp"
- android:layout_height="300dp"
+ android:layout_width="350dp"
+ android:layout_height="350dp"
android:src="@drawable/bubble_minute_hand"
android:tint="@color/bubbleMinuteHandColor"
/>
<ImageView
android:id="@+id/hour_hand"
- android:layout_width="300dp"
- android:layout_height="300dp"
+ android:layout_width="350dp"
+ android:layout_height="350dp"
android:src="@drawable/bubble_hour_hand"
android:tint="@color/bubbleHourHandColor"
/>
diff --git a/packages/SystemUI/res-keyguard/layout/default_clock_preview.xml b/packages/SystemUI/res-keyguard/layout/default_clock_preview.xml
new file mode 100644
index 000000000000..3e6dd13e4b9f
--- /dev/null
+++ b/packages/SystemUI/res-keyguard/layout/default_clock_preview.xml
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="utf-8"?>
+<RelativeLayout
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ >
+ <TextClock
+ android:id="@+id/time"
+ style="@style/widget_big"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_above="@id/date"
+ android:letterSpacing="0.03"
+ android:gravity="center_horizontal"
+ android:format12Hour="@string/keyguard_widget_12_hours_format"
+ android:format24Hour="@string/keyguard_widget_24_hours_format"
+ />
+
+ <TextClock
+ android:id="@+id/date"
+ style="@stype/widget_big"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_centerInParent="true"
+ android:letterSpacing="0.03"
+ android:gravity="center_horizontal"
+ android:format12Hour="EEE, MMM d"
+ android:format24Hour="EEE, MMM d"
+ />
+</RelativeLayout>
diff --git a/packages/SystemUI/res/layout/notification_info.xml b/packages/SystemUI/res/layout/notification_info.xml
index 91353d7fb8ba..863c1ccd7eaf 100644
--- a/packages/SystemUI/res/layout/notification_info.xml
+++ b/packages/SystemUI/res/layout/notification_info.xml
@@ -178,6 +178,7 @@ asked for it -->
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerVertical="true"
+ android:maxWidth="100dp"
style="@style/TextAppearance.NotificationInfo.Button"/>
<LinearLayout
@@ -186,6 +187,7 @@ asked for it -->
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:layout_alignParentEnd="true"
+ android:maxWidth="200dp"
android:orientation="horizontal">
<TextView
android:id="@+id/deliver_silently"
@@ -195,6 +197,7 @@ asked for it -->
android:layout_centerVertical="true"
android:layout_marginStart="@dimen/notification_guts_button_horizontal_spacing"
android:paddingRight="24dp"
+ android:maxWidth="125dp"
style="@style/TextAppearance.NotificationInfo.Button"/>
<TextView
android:id="@+id/block"
@@ -203,6 +206,7 @@ asked for it -->
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerVertical="true"
+ android:maxWidth="75dp"
android:layout_marginStart="@dimen/notification_guts_button_horizontal_spacing"
style="@style/TextAppearance.NotificationInfo.Button"/>
<TextView
@@ -212,6 +216,7 @@ asked for it -->
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerVertical="true"
+ android:maxWidth="75dp"
android:layout_marginStart="@dimen/notification_guts_button_horizontal_spacing"
style="@style/TextAppearance.NotificationInfo.Button"/>
</LinearLayout>
diff --git a/packages/SystemUI/res/values/strings.xml b/packages/SystemUI/res/values/strings.xml
index 4905e572af1d..d53c78543b65 100644
--- a/packages/SystemUI/res/values/strings.xml
+++ b/packages/SystemUI/res/values/strings.xml
@@ -1579,7 +1579,7 @@
<string name="inline_blocking_helper">You usually dismiss these notifications.
\nKeep showing them?</string>
- <!-- Notification Inline controls: button to dismiss the blocking helper [CHAR_LIMIT=25] -->
+ <!-- Notification Inline controls: button to dismiss the blocking helper [CHAR_LIMIT=20] -->
<string name="inline_done_button">Done</string>
<!-- Notification Inline controls: continue receiving notifications prompt, channel level -->
@@ -1588,7 +1588,7 @@
<!-- Notification inline controls: block notifications button [CHAR_LIMIT=25] -->
<string name="inline_stop_button">Stop notifications</string>
- <!-- Notification inline controls: button to deliver notifications silently from this channel [CHAR_LIMIT=35] -->
+ <!-- Notification inline controls: button to deliver notifications silently from this channel [CHAR_LIMIT=30] -->
<string name="inline_deliver_silently_button">Deliver Silently</string>
<!-- Notification inline controls: button to block notifications from this channel [CHAR_LIMIT=20] -->
diff --git a/packages/SystemUI/shared/src/com/android/systemui/shared/system/TaskStackChangeListener.java b/packages/SystemUI/shared/src/com/android/systemui/shared/system/TaskStackChangeListener.java
index 3d2f61ea027f..c54a4699964d 100644
--- a/packages/SystemUI/shared/src/com/android/systemui/shared/system/TaskStackChangeListener.java
+++ b/packages/SystemUI/shared/src/com/android/systemui/shared/system/TaskStackChangeListener.java
@@ -48,6 +48,21 @@ public abstract class TaskStackChangeListener {
onActivityLaunchOnSecondaryDisplayFailed();
}
+ /**
+ * @see #onActivityLaunchOnSecondaryDisplayRerouted(RunningTaskInfo taskInfo)
+ */
+ public void onActivityLaunchOnSecondaryDisplayRerouted() { }
+
+ /**
+ * Called when an activity was requested to be launched on a secondary display but was rerouted
+ * to default display.
+ *
+ * @param taskInfo info about the Activity's task
+ */
+ public void onActivityLaunchOnSecondaryDisplayRerouted(RunningTaskInfo taskInfo) {
+ onActivityLaunchOnSecondaryDisplayRerouted();
+ }
+
public void onTaskProfileLocked(int taskId, int userId) { }
public void onTaskCreated(int taskId, ComponentName componentName) { }
public void onTaskRemoved(int taskId) { }
diff --git a/packages/SystemUI/shared/src/com/android/systemui/shared/system/TaskStackChangeListeners.java b/packages/SystemUI/shared/src/com/android/systemui/shared/system/TaskStackChangeListeners.java
index a9ac42f5be1e..7e4ab854adcf 100644
--- a/packages/SystemUI/shared/src/com/android/systemui/shared/system/TaskStackChangeListeners.java
+++ b/packages/SystemUI/shared/src/com/android/systemui/shared/system/TaskStackChangeListeners.java
@@ -141,6 +141,13 @@ public class TaskStackChangeListeners extends TaskStackListener {
}
@Override
+ public void onActivityLaunchOnSecondaryDisplayRerouted(RunningTaskInfo taskInfo,
+ int requestedDisplayId) throws RemoteException {
+ mHandler.obtainMessage(H.ON_ACTIVITY_LAUNCH_ON_SECONDARY_DISPLAY_REROUTED,
+ requestedDisplayId, 0 /* unused */, taskInfo).sendToTarget();
+ }
+
+ @Override
public void onTaskProfileLocked(int taskId, int userId) throws RemoteException {
mHandler.obtainMessage(H.ON_TASK_PROFILE_LOCKED, taskId, userId).sendToTarget();
}
@@ -189,6 +196,7 @@ public class TaskStackChangeListeners extends TaskStackListener {
private static final int ON_TASK_REMOVED = 13;
private static final int ON_TASK_MOVED_TO_FRONT = 14;
private static final int ON_ACTIVITY_REQUESTED_ORIENTATION_CHANGE = 15;
+ private static final int ON_ACTIVITY_LAUNCH_ON_SECONDARY_DISPLAY_REROUTED = 16;
public H(Looper looper) {
@@ -270,6 +278,14 @@ public class TaskStackChangeListeners extends TaskStackListener {
}
break;
}
+ case ON_ACTIVITY_LAUNCH_ON_SECONDARY_DISPLAY_REROUTED: {
+ final RunningTaskInfo info = (RunningTaskInfo) msg.obj;
+ for (int i = mTaskStackListeners.size() - 1; i >= 0; i--) {
+ mTaskStackListeners.get(i)
+ .onActivityLaunchOnSecondaryDisplayRerouted(info);
+ }
+ break;
+ }
case ON_TASK_PROFILE_LOCKED: {
for (int i = mTaskStackListeners.size() - 1; i >= 0; i--) {
mTaskStackListeners.get(i).onTaskProfileLocked(msg.arg1, msg.arg2);
diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardClockSwitch.java b/packages/SystemUI/src/com/android/keyguard/KeyguardClockSwitch.java
index 8de84bf4e2af..563b0077c7f4 100644
--- a/packages/SystemUI/src/com/android/keyguard/KeyguardClockSwitch.java
+++ b/packages/SystemUI/src/com/android/keyguard/KeyguardClockSwitch.java
@@ -279,7 +279,7 @@ public class KeyguardClockSwitch extends RelativeLayout {
*/
public void dozeTimeTick() {
if (mClockPlugin != null) {
- mClockPlugin.dozeTimeTick();
+ mClockPlugin.onTimeTick();
}
}
diff --git a/packages/SystemUI/src/com/android/keyguard/clock/BubbleClockController.java b/packages/SystemUI/src/com/android/keyguard/clock/BubbleClockController.java
index 3114708de038..870ac8778f76 100644
--- a/packages/SystemUI/src/com/android/keyguard/clock/BubbleClockController.java
+++ b/packages/SystemUI/src/com/android/keyguard/clock/BubbleClockController.java
@@ -15,6 +15,9 @@
*/
package com.android.keyguard.clock;
+import android.content.res.Resources;
+import android.graphics.Bitmap;
+import android.graphics.BitmapFactory;
import android.graphics.Paint.Style;
import android.view.LayoutInflater;
import android.view.View;
@@ -31,6 +34,16 @@ import java.util.TimeZone;
public class BubbleClockController implements ClockPlugin {
/**
+ * Resources used to get title and thumbnail.
+ */
+ private final Resources mResources;
+
+ /**
+ * LayoutInflater used to inflate custom clock views.
+ */
+ private final LayoutInflater mLayoutInflater;
+
+ /**
* Custom clock shown on AOD screen and behind stack scroller on lock.
*/
private View mView;
@@ -48,25 +61,22 @@ public class BubbleClockController implements ClockPlugin {
*/
private CrossFadeDarkController mDarkController;
- private BubbleClockController() { }
-
/**
* Create a BubbleClockController instance.
*
* @param layoutInflater Inflater used to inflate custom clock views.
*/
- public static BubbleClockController build(LayoutInflater layoutInflater) {
- BubbleClockController controller = new BubbleClockController();
- controller.createViews(layoutInflater);
- return controller;
+ public BubbleClockController(Resources res, LayoutInflater inflater) {
+ mResources = res;
+ mLayoutInflater = inflater;
}
- private void createViews(LayoutInflater layoutInflater) {
- mView = layoutInflater.inflate(R.layout.bubble_clock, null);
+ private void createViews() {
+ mView = mLayoutInflater.inflate(R.layout.bubble_clock, null);
mDigitalClock = (TextClock) mView.findViewById(R.id.digital_clock);
mAnalogClock = (ImageClock) mView.findViewById(R.id.analog_clock);
- mLockClockContainer = layoutInflater.inflate(R.layout.digital_clock, null);
+ mLockClockContainer = mLayoutInflater.inflate(R.layout.digital_clock, null);
mLockClock = (TextClock) mLockClockContainer.findViewById(R.id.lock_screen_clock);
mLockClock.setVisibility(View.GONE);
@@ -74,12 +84,33 @@ public class BubbleClockController implements ClockPlugin {
}
@Override
+ public String getName() {
+ return "bubble";
+ }
+
+ @Override
+ public String getTitle() {
+ return mResources.getString(R.string.clock_title_bubble);
+ }
+
+ @Override
+ public Bitmap getThumbnail() {
+ return BitmapFactory.decodeResource(mResources, R.drawable.bubble_thumbnail);
+ }
+
+ @Override
public View getView() {
+ if (mLockClockContainer == null) {
+ createViews();
+ }
return mLockClockContainer;
}
@Override
public View getBigClockView() {
+ if (mView == null) {
+ createViews();
+ }
return mView;
}
@@ -103,13 +134,13 @@ public class BubbleClockController implements ClockPlugin {
}
@Override
- public void dozeTimeTick() {
- mAnalogClock.onTimeChanged();
+ public void setDarkAmount(float darkAmount) {
+ mDarkController.setDarkAmount(darkAmount);
}
@Override
- public void setDarkAmount(float darkAmount) {
- mDarkController.setDarkAmount(darkAmount);
+ public void onTimeTick() {
+ mAnalogClock.onTimeChanged();
}
@Override
diff --git a/packages/SystemUI/src/com/android/keyguard/clock/ClockManager.java b/packages/SystemUI/src/com/android/keyguard/clock/ClockManager.java
index 3827e445c136..294c725af481 100644
--- a/packages/SystemUI/src/com/android/keyguard/clock/ClockManager.java
+++ b/packages/SystemUI/src/com/android/keyguard/clock/ClockManager.java
@@ -23,7 +23,6 @@ import android.content.res.Resources;
import android.database.ContentObserver;
import android.graphics.Bitmap;
import android.graphics.Bitmap.Config;
-import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.os.Handler;
@@ -31,6 +30,7 @@ import android.os.Looper;
import android.provider.Settings;
import android.util.ArrayMap;
import android.util.DisplayMetrics;
+import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.MeasureSpec;
@@ -39,17 +39,19 @@ import android.view.ViewGroup;
import androidx.annotation.VisibleForTesting;
import com.android.internal.colorextraction.ColorExtractor;
-import com.android.keyguard.R;
import com.android.systemui.colorextraction.SysuiColorExtractor;
import com.android.systemui.dock.DockManager;
import com.android.systemui.dock.DockManager.DockEventListener;
import com.android.systemui.plugins.ClockPlugin;
+import com.android.systemui.plugins.PluginListener;
+import com.android.systemui.shared.plugins.PluginManager;
import com.android.systemui.util.InjectionInflationController;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
-import java.util.function.Supplier;
+import java.util.concurrent.Callable;
+import java.util.concurrent.FutureTask;
import javax.inject.Inject;
import javax.inject.Singleton;
@@ -60,26 +62,49 @@ import javax.inject.Singleton;
@Singleton
public final class ClockManager {
+ private static final String TAG = "ClockOptsProvider";
+ private static final String DEFAULT_CLOCK_ID = "default";
+
private final List<ClockInfo> mClockInfos = new ArrayList<>();
/**
* Map from expected value stored in settings to supplier of custom clock face.
*/
- private final Map<String, Supplier<ClockPlugin>> mClocks = new ArrayMap<>();
+ private final Map<String, ClockPlugin> mClocks = new ArrayMap<>();
@Nullable private ClockPlugin mCurrentClock;
private final ContentResolver mContentResolver;
private final SettingsWrapper mSettingsWrapper;
+ private final Handler mMainHandler = new Handler(Looper.getMainLooper());
+
/**
* Observe settings changes to know when to switch the clock face.
*/
private final ContentObserver mContentObserver =
- new ContentObserver(new Handler(Looper.getMainLooper())) {
+ new ContentObserver(mMainHandler) {
@Override
public void onChange(boolean selfChange) {
super.onChange(selfChange);
reload();
}
};
+
+ private final PluginListener<ClockPlugin> mClockPluginListener =
+ new PluginListener<ClockPlugin>() {
+ @Override
+ public void onPluginConnected(ClockPlugin plugin, Context pluginContext) {
+ addClockPlugin(plugin);
+ reload();
+ }
+
+ @Override
+ public void onPluginDisconnected(ClockPlugin plugin) {
+ removeClockPlugin(plugin);
+ reload();
+ }
+ };
+
+ private final PluginManager mPluginManager;
+
/**
* Observe changes to dock state to know when to switch the clock face.
*/
@@ -107,56 +132,29 @@ public final class ClockManager {
@Inject
public ClockManager(Context context, InjectionInflationController injectionInflater,
- @Nullable DockManager dockManager, SysuiColorExtractor colorExtractor) {
- this(context, injectionInflater, dockManager, colorExtractor, context.getContentResolver(),
- new SettingsWrapper(context.getContentResolver()));
+ PluginManager pluginManager, @Nullable DockManager dockManager,
+ SysuiColorExtractor colorExtractor) {
+ this(context, injectionInflater, pluginManager, dockManager, colorExtractor,
+ context.getContentResolver(), new SettingsWrapper(context.getContentResolver()));
}
ClockManager(Context context, InjectionInflationController injectionInflater,
- @Nullable DockManager dockManager, SysuiColorExtractor colorExtractor,
- ContentResolver contentResolver, SettingsWrapper settingsWrapper) {
+ PluginManager pluginManager, @Nullable DockManager dockManager,
+ SysuiColorExtractor colorExtractor, ContentResolver contentResolver,
+ SettingsWrapper settingsWrapper) {
+ mPluginManager = pluginManager;
mDockManager = dockManager;
mColorExtractor = colorExtractor;
mContentResolver = contentResolver;
mSettingsWrapper = settingsWrapper;
Resources res = context.getResources();
- mClockInfos.add(ClockInfo.builder()
- .setName("default")
- .setTitle(res.getString(R.string.clock_title_default))
- .setId("default")
- .setThumbnail(() -> BitmapFactory.decodeResource(res, R.drawable.default_thumbnail))
- .setPreview(() -> BitmapFactory.decodeResource(res, R.drawable.default_preview))
- .build());
- mClockInfos.add(ClockInfo.builder()
- .setName("bubble")
- .setTitle(res.getString(R.string.clock_title_bubble))
- .setId(BubbleClockController.class.getName())
- .setThumbnail(() -> BitmapFactory.decodeResource(res, R.drawable.bubble_thumbnail))
- .setPreview(() -> getClockPreview(BubbleClockController.class.getName()))
- .build());
- mClockInfos.add(ClockInfo.builder()
- .setName("stretch")
- .setTitle(res.getString(R.string.clock_title_stretch))
- .setId(StretchAnalogClockController.class.getName())
- .setThumbnail(() -> BitmapFactory.decodeResource(res, R.drawable.stretch_thumbnail))
- .setPreview(() -> getClockPreview(StretchAnalogClockController.class.getName()))
- .build());
- mClockInfos.add(ClockInfo.builder()
- .setName("type")
- .setTitle(res.getString(R.string.clock_title_type))
- .setId(TypeClockController.class.getName())
- .setThumbnail(() -> BitmapFactory.decodeResource(res, R.drawable.type_thumbnail))
- .setPreview(() -> getClockPreview(TypeClockController.class.getName()))
- .build());
-
LayoutInflater layoutInflater = injectionInflater.injectable(LayoutInflater.from(context));
- mClocks.put(BubbleClockController.class.getName(),
- () -> BubbleClockController.build(layoutInflater));
- mClocks.put(StretchAnalogClockController.class.getName(),
- () -> StretchAnalogClockController.build(layoutInflater));
- mClocks.put(TypeClockController.class.getName(),
- () -> TypeClockController.build(layoutInflater));
+
+ addClockPlugin(new DefaultClockController(res, layoutInflater));
+ addClockPlugin(new BubbleClockController(res, layoutInflater));
+ addClockPlugin(new StretchAnalogClockController(res, layoutInflater));
+ addClockPlugin(new TypeClockController(res, layoutInflater));
// Store the size of the display for generation of clock preview.
DisplayMetrics dm = res.getDisplayMetrics();
@@ -211,6 +209,29 @@ public final class ClockManager {
return mContentObserver;
}
+ private void addClockPlugin(ClockPlugin plugin) {
+ final String id = plugin.getClass().getName();
+ mClocks.put(plugin.getClass().getName(), plugin);
+ mClockInfos.add(ClockInfo.builder()
+ .setName(plugin.getName())
+ .setTitle(plugin.getTitle())
+ .setId(id)
+ .setThumbnail(() -> plugin.getThumbnail())
+ .setPreview(() -> getClockPreview(id))
+ .build());
+ }
+
+ private void removeClockPlugin(ClockPlugin plugin) {
+ final String id = plugin.getClass().getName();
+ mClocks.remove(id);
+ for (int i = 0; i < mClockInfos.size(); i++) {
+ if (id.equals(mClockInfos.get(i).getId())) {
+ mClockInfos.remove(i);
+ break;
+ }
+ }
+ }
+
/**
* Generate a realistic preview of a clock face.
* @param clockId ID of clock to use for preview, should be obtained from {@link getClockInfos}.
@@ -218,38 +239,54 @@ public final class ClockManager {
*/
@Nullable
private Bitmap getClockPreview(String clockId) {
- Supplier<ClockPlugin> supplier = mClocks.get(clockId);
- if (supplier == null) {
- return null;
+ FutureTask<Bitmap> task = new FutureTask<>(new Callable<Bitmap>() {
+ @Override
+ public Bitmap call() {
+ Bitmap bitmap = Bitmap.createBitmap(mWidth, mHeight, Config.ARGB_8888);
+ ClockPlugin plugin = mClocks.get(clockId);
+ if (plugin == null) {
+ return null;
+ }
+
+ // Use the big clock view for the preview
+ View clockView = plugin.getBigClockView();
+ if (clockView == null) {
+ return null;
+ }
+
+ // Initialize state of plugin before generating preview.
+ plugin.setDarkAmount(1f);
+ plugin.setTextColor(Color.WHITE);
+
+ ColorExtractor.GradientColors colors = mColorExtractor.getColors(
+ WallpaperManager.FLAG_LOCK, true);
+ plugin.setColorPalette(colors.supportsDarkText(), colors.getColorPalette());
+ plugin.onTimeTick();
+
+ // Draw clock view hierarchy to canvas.
+ Canvas canvas = new Canvas(bitmap);
+ canvas.drawColor(Color.BLACK);
+ dispatchVisibilityAggregated(clockView, true);
+ clockView.measure(MeasureSpec.makeMeasureSpec(mWidth, MeasureSpec.EXACTLY),
+ MeasureSpec.makeMeasureSpec(mHeight, MeasureSpec.EXACTLY));
+ clockView.layout(0, 0, mWidth, mHeight);
+ clockView.draw(canvas);
+ return bitmap;
+ }
+ });
+
+ if (Looper.myLooper() == Looper.getMainLooper()) {
+ task.run();
+ } else {
+ mMainHandler.post(task);
}
- ClockPlugin plugin = supplier.get();
- // Use the big clock view for the preview
- View clockView = plugin.getBigClockView();
- if (clockView == null) {
+ try {
+ return task.get();
+ } catch (Exception e) {
+ Log.e(TAG, "Error completing task", e);
return null;
}
-
- // Initialize state of plugin before generating preview.
- plugin.setDarkAmount(1f);
- plugin.setTextColor(Color.WHITE);
-
- ColorExtractor.GradientColors colors = mColorExtractor.getColors(WallpaperManager.FLAG_LOCK,
- true);
- plugin.setColorPalette(colors.supportsDarkText(), colors.getColorPalette());
- plugin.dozeTimeTick();
-
- // Draw clock view hierarchy to canvas.
- Bitmap bitmap = Bitmap.createBitmap(mWidth, mHeight, Config.ARGB_8888);
- Canvas canvas = new Canvas(bitmap);
- dispatchVisibilityAggregated(clockView, true);
- clockView.measure(MeasureSpec.makeMeasureSpec(mWidth, MeasureSpec.EXACTLY),
- MeasureSpec.makeMeasureSpec(mHeight, MeasureSpec.EXACTLY));
- clockView.layout(0, 0, mWidth, mHeight);
- canvas.drawColor(Color.BLACK);
- clockView.draw(canvas);
-
- return bitmap;
}
private void dispatchVisibilityAggregated(View view, boolean isVisible) {
@@ -279,6 +316,7 @@ public final class ClockManager {
}
private void register() {
+ mPluginManager.addPluginListener(mClockPluginListener, ClockPlugin.class, true);
mContentResolver.registerContentObserver(
Settings.Secure.getUriFor(Settings.Secure.LOCK_SCREEN_CUSTOM_CLOCK_FACE),
false, mContentObserver);
@@ -291,6 +329,7 @@ public final class ClockManager {
}
private void unregister() {
+ mPluginManager.removePluginListener(mClockPluginListener);
mContentResolver.unregisterContentObserver(mContentObserver);
if (mDockManager != null) {
mDockManager.removeListener(mDockEventListener);
@@ -299,7 +338,11 @@ public final class ClockManager {
private void reload() {
mCurrentClock = getClockPlugin();
- notifyClockChanged(mCurrentClock);
+ if (mCurrentClock instanceof DefaultClockController) {
+ notifyClockChanged(null);
+ } else {
+ notifyClockChanged(mCurrentClock);
+ }
}
private ClockPlugin getClockPlugin() {
@@ -307,21 +350,15 @@ public final class ClockManager {
if (mIsDocked) {
final String name = mSettingsWrapper.getDockedClockFace();
if (name != null) {
- Supplier<ClockPlugin> supplier = mClocks.get(name);
- if (supplier != null) {
- plugin = supplier.get();
- if (plugin != null) {
- return plugin;
- }
+ plugin = mClocks.get(name);
+ if (plugin != null) {
+ return plugin;
}
}
}
final String name = mSettingsWrapper.getLockScreenCustomClockFace();
if (name != null) {
- Supplier<ClockPlugin> supplier = mClocks.get(name);
- if (supplier != null) {
- plugin = supplier.get();
- }
+ plugin = mClocks.get(name);
}
return plugin;
}
diff --git a/packages/SystemUI/src/com/android/keyguard/clock/DefaultClockController.java b/packages/SystemUI/src/com/android/keyguard/clock/DefaultClockController.java
new file mode 100644
index 000000000000..8a6a4cd95991
--- /dev/null
+++ b/packages/SystemUI/src/com/android/keyguard/clock/DefaultClockController.java
@@ -0,0 +1,131 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.keyguard.clock;
+
+import android.content.res.Resources;
+import android.graphics.Bitmap;
+import android.graphics.BitmapFactory;
+import android.graphics.Paint.Style;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.widget.TextView;
+
+import com.android.keyguard.R;
+import com.android.systemui.plugins.ClockPlugin;
+
+import java.util.TimeZone;
+
+/**
+ * Plugin for the default clock face used only to provide a preview.
+ */
+public class DefaultClockController implements ClockPlugin {
+
+ /**
+ * Resources used to get title and thumbnail.
+ */
+ private final Resources mResources;
+
+ /**
+ * LayoutInflater used to inflate custom clock views.
+ */
+ private final LayoutInflater mLayoutInflater;
+
+ /**
+ * Root view of preview.
+ */
+ private View mView;
+
+ /**
+ * Text clock in preview view hierarchy.
+ */
+ private TextView mTextTime;
+
+ /**
+ * Date showing below time in preview view hierarchy.
+ */
+ private TextView mTextDate;
+
+ /**
+ * Create a DefaultClockController instance.
+ *
+ * @param inflater Inflater used to inflate custom clock views.
+ */
+ public DefaultClockController(Resources res, LayoutInflater inflater) {
+ mResources = res;
+ mLayoutInflater = inflater;
+ }
+
+ private void createViews() {
+ mView = mLayoutInflater.inflate(R.layout.default_clock_preview, null);
+ mTextTime = mView.findViewById(R.id.time);
+ mTextDate = mView.findViewById(R.id.date);
+ }
+
+ @Override
+ public String getName() {
+ return "default";
+ }
+
+ @Override
+ public String getTitle() {
+ return mResources.getString(R.string.clock_title_default);
+ }
+
+ @Override
+ public Bitmap getThumbnail() {
+ return BitmapFactory.decodeResource(mResources, R.drawable.default_thumbnail);
+ }
+
+ @Override
+ public View getView() {
+ return null;
+ }
+
+ @Override
+ public View getBigClockView() {
+ if (mView == null) {
+ createViews();
+ }
+ return mView;
+ }
+
+ @Override
+ public void setStyle(Style style) {}
+
+ @Override
+ public void setTextColor(int color) {
+ mTextTime.setTextColor(color);
+ mTextDate.setTextColor(color);
+ }
+
+ @Override
+ public void setColorPalette(boolean supportsDarkText, int[] colorPalette) {}
+
+ @Override
+ public void onTimeTick() {
+ }
+
+ @Override
+ public void setDarkAmount(float darkAmount) {}
+
+ @Override
+ public void onTimeZoneChanged(TimeZone timeZone) {}
+
+ @Override
+ public boolean shouldShowStatusArea() {
+ return true;
+ }
+}
diff --git a/packages/SystemUI/src/com/android/keyguard/clock/StretchAnalogClockController.java b/packages/SystemUI/src/com/android/keyguard/clock/StretchAnalogClockController.java
index c4651149521c..7401819fde4d 100644
--- a/packages/SystemUI/src/com/android/keyguard/clock/StretchAnalogClockController.java
+++ b/packages/SystemUI/src/com/android/keyguard/clock/StretchAnalogClockController.java
@@ -15,6 +15,9 @@
*/
package com.android.keyguard.clock;
+import android.content.res.Resources;
+import android.graphics.Bitmap;
+import android.graphics.BitmapFactory;
import android.graphics.Paint.Style;
import android.view.LayoutInflater;
import android.view.View;
@@ -31,6 +34,16 @@ import java.util.TimeZone;
public class StretchAnalogClockController implements ClockPlugin {
/**
+ * Resources used to get title and thumbnail.
+ */
+ private final Resources mResources;
+
+ /**
+ * LayoutInflater used to inflate custom clock views.
+ */
+ private final LayoutInflater mLayoutInflater;
+
+ /**
* Custom clock shown on AOD screen and behind stack scroller on lock.
*/
private View mBigClockView;
@@ -48,25 +61,22 @@ public class StretchAnalogClockController implements ClockPlugin {
*/
private CrossFadeDarkController mDarkController;
- private StretchAnalogClockController() { }
-
/**
* Create a BubbleClockController instance.
*
* @param layoutInflater Inflater used to inflate custom clock views.
*/
- public static StretchAnalogClockController build(LayoutInflater layoutInflater) {
- StretchAnalogClockController controller = new StretchAnalogClockController();
- controller.createViews(layoutInflater);
- return controller;
+ public StretchAnalogClockController(Resources res, LayoutInflater inflater) {
+ mResources = res;
+ mLayoutInflater = inflater;
}
- private void createViews(LayoutInflater layoutInflater) {
- mBigClockView = layoutInflater.inflate(R.layout.stretchanalog_clock, null);
+ private void createViews() {
+ mBigClockView = mLayoutInflater.inflate(R.layout.stretchanalog_clock, null);
mAnalogClock = mBigClockView.findViewById(R.id.analog_clock);
mDigitalClock = mBigClockView.findViewById(R.id.digital_clock);
- mView = layoutInflater.inflate(R.layout.digital_clock, null);
+ mView = mLayoutInflater.inflate(R.layout.digital_clock, null);
mLockClock = mView.findViewById(R.id.lock_screen_clock);
mLockClock.setVisibility(View.GONE);
@@ -74,12 +84,33 @@ public class StretchAnalogClockController implements ClockPlugin {
}
@Override
+ public String getName() {
+ return "stretch";
+ }
+
+ @Override
+ public String getTitle() {
+ return mResources.getString(R.string.clock_title_stretch);
+ }
+
+ @Override
+ public Bitmap getThumbnail() {
+ return BitmapFactory.decodeResource(mResources, R.drawable.stretch_thumbnail);
+ }
+
+ @Override
public View getView() {
+ if (mView == null) {
+ createViews();
+ }
return mView;
}
@Override
public View getBigClockView() {
+ if (mBigClockView == null) {
+ createViews();
+ }
return mBigClockView;
}
@@ -103,7 +134,7 @@ public class StretchAnalogClockController implements ClockPlugin {
}
@Override
- public void dozeTimeTick() {
+ public void onTimeTick() {
mAnalogClock.onTimeChanged();
}
diff --git a/packages/SystemUI/src/com/android/keyguard/clock/TypeClockController.java b/packages/SystemUI/src/com/android/keyguard/clock/TypeClockController.java
index 2ea39c40bee2..69f86c7886d3 100644
--- a/packages/SystemUI/src/com/android/keyguard/clock/TypeClockController.java
+++ b/packages/SystemUI/src/com/android/keyguard/clock/TypeClockController.java
@@ -15,6 +15,9 @@
*/
package com.android.keyguard.clock;
+import android.content.res.Resources;
+import android.graphics.Bitmap;
+import android.graphics.BitmapFactory;
import android.graphics.Paint.Style;
import android.view.LayoutInflater;
import android.view.View;
@@ -30,6 +33,16 @@ import java.util.TimeZone;
public class TypeClockController implements ClockPlugin {
/**
+ * Resources used to get title and thumbnail.
+ */
+ private final Resources mResources;
+
+ /**
+ * LayoutInflater used to inflate custom clock views.
+ */
+ private final LayoutInflater mLayoutInflater;
+
+ /**
* Custom clock shown on AOD screen and behind stack scroller on lock.
*/
private View mView;
@@ -45,36 +58,54 @@ public class TypeClockController implements ClockPlugin {
*/
private CrossFadeDarkController mDarkController;
- private TypeClockController() {}
-
/**
* Create a TypeClockController instance.
*
* @param inflater Inflater used to inflate custom clock views.
*/
- public static TypeClockController build(LayoutInflater inflater) {
- TypeClockController controller = new TypeClockController();
- controller.createViews(inflater);
- return controller;
+ TypeClockController(Resources res, LayoutInflater inflater) {
+ mResources = res;
+ mLayoutInflater = inflater;
}
- private void createViews(LayoutInflater inflater) {
- mView = inflater.inflate(R.layout.type_clock, null);
+ private void createViews() {
+ mView = mLayoutInflater.inflate(R.layout.type_clock, null);
mTypeClock = mView.findViewById(R.id.type_clock);
// For now, this view is used to hide the default digital clock.
// Need better transition to lock screen.
- mLockClockContainer = inflater.inflate(R.layout.digital_clock, null);
+ mLockClockContainer = mLayoutInflater.inflate(R.layout.digital_clock, null);
mLockClockContainer.setVisibility(View.GONE);
}
@Override
+ public String getName() {
+ return "type";
+ }
+
+ @Override
+ public String getTitle() {
+ return mResources.getString(R.string.clock_title_type);
+ }
+
+ @Override
+ public Bitmap getThumbnail() {
+ return BitmapFactory.decodeResource(mResources, R.drawable.type_thumbnail);
+ }
+
+ @Override
public View getView() {
+ if (mLockClockContainer == null) {
+ createViews();
+ }
return mLockClockContainer;
}
@Override
public View getBigClockView() {
+ if (mView == null) {
+ createViews();
+ }
return mView;
}
@@ -96,7 +127,7 @@ public class TypeClockController implements ClockPlugin {
}
@Override
- public void dozeTimeTick() {
+ public void onTimeTick() {
mTypeClock.onTimeChanged();
}
diff --git a/packages/SystemUI/src/com/android/systemui/HardwareUiLayout.java b/packages/SystemUI/src/com/android/systemui/HardwareUiLayout.java
index 2a1d066d356e..f5451e952dd9 100644
--- a/packages/SystemUI/src/com/android/systemui/HardwareUiLayout.java
+++ b/packages/SystemUI/src/com/android/systemui/HardwareUiLayout.java
@@ -63,6 +63,9 @@ public class HardwareUiLayout extends MultiListLayout implements Tunable {
public HardwareUiLayout(Context context, AttributeSet attrs) {
super(context, attrs);
+ // Manually re-initialize mRotation to portrait-mode, since this view must always
+ // be constructed in portrait mode and rotated into the correct initial position.
+ mRotation = ROTATION_NONE;
updateSettings();
}
@@ -172,6 +175,10 @@ public class HardwareUiLayout extends MultiListLayout implements Tunable {
mSeparatedView.setBackground(mSeparatedViewBackground);
updateEdgeMargin(mEdgeBleed ? 0 : getEdgePadding());
mOldHeight = mList.getMeasuredHeight();
+
+ // Must be called to initialize view rotation correctly.
+ // Requires LayoutParams, hence why this isn't called during the constructor.
+ updateRotation();
} else {
return;
}
@@ -189,7 +196,18 @@ public class HardwareUiLayout extends MultiListLayout implements Tunable {
mSwapOrientation = swapOrientation;
}
- @Override
+ private void updateRotation() {
+ int rotation = RotationUtils.getRotation(getContext());
+ if (rotation != mRotation) {
+ rotate(mRotation, rotation);
+ mRotation = rotation;
+ }
+ }
+
+ /**
+ * Requires LayoutParams to be set to work correctly, and therefore must be run after after
+ * the HardwareUILayout has been added to the view hierarchy.
+ */
protected void rotate(int from, int to) {
super.rotate(from, to);
if (from != ROTATION_NONE && to != ROTATION_NONE) {
@@ -522,4 +540,4 @@ public class HardwareUiLayout extends MultiListLayout implements Tunable {
inoutInfo.contentInsets.set(mList.getLeft(), mList.getTop(),
0, getBottom() - mList.getBottom());
};
-}
+} \ No newline at end of file
diff --git a/packages/SystemUI/src/com/android/systemui/bubbles/BubbleTouchHandler.java b/packages/SystemUI/src/com/android/systemui/bubbles/BubbleTouchHandler.java
index 165eb1dda077..c8eebac4da3e 100644
--- a/packages/SystemUI/src/com/android/systemui/bubbles/BubbleTouchHandler.java
+++ b/packages/SystemUI/src/com/android/systemui/bubbles/BubbleTouchHandler.java
@@ -81,8 +81,7 @@ class BubbleTouchHandler implements View.OnTouchListener {
// anything, collapse the stack.
if (action == MotionEvent.ACTION_OUTSIDE || mTouchedView == null) {
mStack.collapseStack();
- cleanUpDismissTarget();
- mTouchedView = null;
+ resetForNextGesture();
return false;
}
@@ -135,8 +134,7 @@ class BubbleTouchHandler implements View.OnTouchListener {
break;
case MotionEvent.ACTION_CANCEL:
- mTouchedView = null;
- cleanUpDismissTarget();
+ resetForNextGesture();
break;
case MotionEvent.ACTION_UP:
@@ -144,7 +142,7 @@ class BubbleTouchHandler implements View.OnTouchListener {
if (mInDismissTarget && isStack) {
mController.dismissStack();
} else if (mMovedEnough) {
- mVelocityTracker.computeCurrentVelocity(1000);
+ mVelocityTracker.computeCurrentVelocity(/* maxVelocity */ 1000);
final float velX = mVelocityTracker.getXVelocity();
final float velY = mVelocityTracker.getYVelocity();
if (isStack) {
@@ -157,7 +155,7 @@ class BubbleTouchHandler implements View.OnTouchListener {
mController.removeBubble(((BubbleView) mTouchedView).getKey());
}
}
- } else if (mTouchedView.equals(mStack.getExpandedBubbleView())) {
+ } else if (mTouchedView == mStack.getExpandedBubbleView()) {
mStack.collapseStack();
} else if (isStack) {
if (mStack.isExpanded()) {
@@ -169,17 +167,25 @@ class BubbleTouchHandler implements View.OnTouchListener {
mStack.setExpandedBubble(((BubbleView) mTouchedView).getKey());
}
- cleanUpDismissTarget();
- mVelocityTracker.recycle();
- mVelocityTracker = null;
- mTouchedView = null;
- mMovedEnough = false;
+ resetForNextGesture();
break;
}
return true;
}
+ /** Clears all touch-related state. */
+ private void resetForNextGesture() {
+ cleanUpDismissTarget();
+ if (mVelocityTracker != null) {
+ mVelocityTracker.recycle();
+ mVelocityTracker = null;
+ }
+ mTouchedView = null;
+ mMovedEnough = false;
+ mInDismissTarget = false;
+ }
+
/**
* Removes the dismiss target and cancels any pending callbacks to show it.
*/
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationMediaManager.java b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationMediaManager.java
index 490317b188c2..fa223670208b 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationMediaManager.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationMediaManager.java
@@ -38,10 +38,12 @@ import android.media.session.PlaybackState;
import android.os.Handler;
import android.os.Trace;
import android.os.UserHandle;
+import android.provider.DeviceConfig;
import android.util.Log;
import android.view.View;
import android.widget.ImageView;
+import com.android.internal.config.sysui.SystemUiDeviceConfigFlags;
import com.android.internal.statusbar.NotificationVisibility;
import com.android.systemui.Dependency;
import com.android.systemui.Dumpable;
@@ -115,6 +117,20 @@ public class NotificationMediaManager implements Dumpable {
private ImageView mBackdropFront;
private ImageView mBackdropBack;
+ private boolean mShowCompactMediaSeekbar;
+ private final DeviceConfig.OnPropertyChangedListener mPropertyChangedListener =
+ new DeviceConfig.OnPropertyChangedListener() {
+ @Override
+ public void onPropertyChanged(String namespace, String name, String value) {
+ if (SystemUiDeviceConfigFlags.COMPACT_MEDIA_SEEKBAR_ENABLED.equals(name)) {
+ if (DEBUG_MEDIA) {
+ Log.v(TAG, "DEBUG_MEDIA: compact media seekbar flag updated: " + value);
+ }
+ mShowCompactMediaSeekbar = "true".equals(value);
+ }
+ }
+ };
+
private final MediaController.Callback mMediaListener = new MediaController.Callback() {
@Override
public void onPlaybackStateChanged(PlaybackState state) {
@@ -168,6 +184,14 @@ public class NotificationMediaManager implements Dumpable {
onNotificationRemoved(entry.key);
}
});
+
+ mShowCompactMediaSeekbar = "true".equals(
+ DeviceConfig.getProperty(DeviceConfig.NAMESPACE_SYSTEMUI,
+ SystemUiDeviceConfigFlags.COMPACT_MEDIA_SEEKBAR_ENABLED));
+
+ DeviceConfig.addOnPropertyChangedListener(DeviceConfig.NAMESPACE_SYSTEMUI,
+ mContext.getMainExecutor(),
+ mPropertyChangedListener);
}
public void setUpWithPresenter(NotificationPresenter presenter) {
@@ -189,6 +213,10 @@ public class NotificationMediaManager implements Dumpable {
return mMediaMetadata;
}
+ public boolean getShowCompactMediaSeekbar() {
+ return mShowCompactMediaSeekbar;
+ }
+
public Icon getMediaIcon() {
if (mMediaNotificationKey == null) {
return null;
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ExpandableNotificationRow.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ExpandableNotificationRow.java
index 2b643d0a2fea..0fbc55bc08bf 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ExpandableNotificationRow.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ExpandableNotificationRow.java
@@ -81,6 +81,7 @@ import com.android.systemui.plugins.PluginListener;
import com.android.systemui.plugins.statusbar.NotificationMenuRowPlugin;
import com.android.systemui.plugins.statusbar.NotificationMenuRowPlugin.MenuItem;
import com.android.systemui.shared.plugins.PluginManager;
+import com.android.systemui.statusbar.NotificationMediaManager;
import com.android.systemui.statusbar.RemoteInputController;
import com.android.systemui.statusbar.StatusBarIconView;
import com.android.systemui.statusbar.notification.AboveShelfChangedListener;
@@ -90,7 +91,6 @@ import com.android.systemui.statusbar.notification.VisualStabilityManager;
import com.android.systemui.statusbar.notification.collection.NotificationEntry;
import com.android.systemui.statusbar.notification.logging.NotificationCounters;
import com.android.systemui.statusbar.notification.row.NotificationContentInflater.InflationFlag;
-import com.android.systemui.statusbar.notification.row.wrapper.NotificationMediaTemplateViewWrapper;
import com.android.systemui.statusbar.notification.row.wrapper.NotificationViewWrapper;
import com.android.systemui.statusbar.notification.stack.AmbientState;
import com.android.systemui.statusbar.notification.stack.AnimationProperties;
@@ -331,6 +331,7 @@ public class ExpandableNotificationRow extends ActivatableNotificationView
private boolean mWasChildInGroupWhenRemoved;
private int mNotificationColorAmbient;
private NotificationInlineImageResolver mImageResolver;
+ private NotificationMediaManager mMediaManager;
private SystemNotificationAsyncTask mSystemNotificationAsyncTask =
new SystemNotificationAsyncTask();
@@ -658,10 +659,11 @@ public class ExpandableNotificationRow extends ActivatableNotificationView
View expandedView = layout.getExpandedChild();
boolean isMediaLayout = expandedView != null
&& expandedView.findViewById(com.android.internal.R.id.media_actions) != null;
+ boolean showCompactMediaSeekbar = mMediaManager.getShowCompactMediaSeekbar();
if (customView && beforeP && !mIsSummaryWithChildren) {
minHeight = beforeN ? mNotificationMinHeightBeforeN : mNotificationMinHeightBeforeP;
- } else if (isMediaLayout && !NotificationMediaTemplateViewWrapper.HIDE_COMPACT_SCRUBBER) {
+ } else if (isMediaLayout && showCompactMediaSeekbar) {
minHeight = mNotificationMinHeightMedia;
} else if (mUseIncreasedCollapsedHeight && layout == mPrivateLayout) {
minHeight = mNotificationMinHeightLarge;
@@ -1635,6 +1637,7 @@ public class ExpandableNotificationRow extends ActivatableNotificationView
mMenuRow = new NotificationMenuRow(mContext);
mImageResolver = new NotificationInlineImageResolver(context,
new NotificationInlineImageCache());
+ mMediaManager = Dependency.get(NotificationMediaManager.class);
initDimens();
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationContentInflater.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationContentInflater.java
index b65c4a5f71d8..b4dd1144e761 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationContentInflater.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationContentInflater.java
@@ -34,12 +34,17 @@ import android.widget.RemoteViews;
import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.widget.ImageMessageConsumer;
+import com.android.systemui.Dependency;
import com.android.systemui.statusbar.InflationTask;
+import com.android.systemui.statusbar.SmartReplyController;
import com.android.systemui.statusbar.notification.InflationException;
import com.android.systemui.statusbar.notification.MediaNotificationProcessor;
import com.android.systemui.statusbar.notification.collection.NotificationEntry;
import com.android.systemui.statusbar.notification.row.wrapper.NotificationViewWrapper;
import com.android.systemui.statusbar.phone.StatusBar;
+import com.android.systemui.statusbar.policy.HeadsUpManager;
+import com.android.systemui.statusbar.policy.InflatedSmartReplies;
+import com.android.systemui.statusbar.policy.SmartReplyConstants;
import com.android.systemui.util.Assert;
import java.lang.annotation.Retention;
@@ -278,6 +283,8 @@ public class NotificationContentInflater {
InflationProgress result = createRemoteViews(reInflateFlags, builder, mIsLowPriority,
mIsChildInGroup, mUsesIncreasedHeight, mUsesIncreasedHeadsUpHeight,
mRedactAmbient, packageContext);
+ result = inflateSmartReplyViews(result, reInflateFlags, mRow.getEntry(),
+ mRow.getContext(), mRow.getHeadsUpManager());
apply(
inflateSynchronously,
result,
@@ -306,6 +313,7 @@ public class NotificationContentInflater {
if (mRow.getPrivateLayout().isContentViewInactive(VISIBLE_TYPE_HEADSUP)) {
mRow.getPrivateLayout().setHeadsUpChild(null);
mCachedContentViews.remove(FLAG_CONTENT_VIEW_HEADS_UP);
+ mRow.getPrivateLayout().setHeadsUpInflatedSmartReplies(null);
}
break;
case FLAG_CONTENT_VIEW_AMBIENT:
@@ -336,12 +344,33 @@ public class NotificationContentInflater {
}
}
+ private static InflationProgress inflateSmartReplyViews(InflationProgress result,
+ @InflationFlag int reInflateFlags, NotificationEntry entry, Context context,
+ HeadsUpManager headsUpManager) {
+ SmartReplyConstants smartReplyConstants = Dependency.get(SmartReplyConstants.class);
+ SmartReplyController smartReplyController = Dependency.get(SmartReplyController.class);
+ if ((reInflateFlags & FLAG_CONTENT_VIEW_EXPANDED) != 0 && result.newExpandedView != null) {
+ result.expandedInflatedSmartReplies =
+ InflatedSmartReplies.inflate(
+ context, entry, smartReplyConstants, smartReplyController,
+ headsUpManager);
+ }
+ if ((reInflateFlags & FLAG_CONTENT_VIEW_HEADS_UP) != 0 && result.newHeadsUpView != null) {
+ result.headsUpInflatedSmartReplies =
+ InflatedSmartReplies.inflate(
+ context, entry, smartReplyConstants, smartReplyController,
+ headsUpManager);
+ }
+ return result;
+ }
+
private static InflationProgress createRemoteViews(@InflationFlag int reInflateFlags,
Notification.Builder builder, boolean isLowPriority, boolean isChildInGroup,
boolean usesIncreasedHeight, boolean usesIncreasedHeadsUpHeight, boolean redactAmbient,
Context packageContext) {
InflationProgress result = new InflationProgress();
isLowPriority = isLowPriority && !isChildInGroup;
+
if ((reInflateFlags & FLAG_CONTENT_VIEW_CONTRACTED) != 0) {
result.newContentView = createContentView(builder, isLowPriority, usesIncreasedHeight);
}
@@ -661,6 +690,12 @@ public class NotificationContentInflater {
} else if (result.newExpandedView == null) {
privateLayout.setExpandedChild(null);
}
+ if (result.newExpandedView != null) {
+ privateLayout.setExpandedInflatedSmartReplies(
+ result.expandedInflatedSmartReplies);
+ } else {
+ privateLayout.setExpandedInflatedSmartReplies(null);
+ }
cachedContentViews.put(FLAG_CONTENT_VIEW_EXPANDED, result.newExpandedView);
row.setExpandable(result.newExpandedView != null);
}
@@ -671,6 +706,12 @@ public class NotificationContentInflater {
} else if (result.newHeadsUpView == null) {
privateLayout.setHeadsUpChild(null);
}
+ if (result.newHeadsUpView != null) {
+ privateLayout.setHeadsUpInflatedSmartReplies(
+ result.headsUpInflatedSmartReplies);
+ } else {
+ privateLayout.setHeadsUpInflatedSmartReplies(null);
+ }
cachedContentViews.put(FLAG_CONTENT_VIEW_HEADS_UP, result.newHeadsUpView);
}
@@ -846,9 +887,12 @@ public class NotificationContentInflater {
packageContext);
processor.processNotification(notification, recoveredBuilder);
}
- return createRemoteViews(mReInflateFlags, recoveredBuilder, mIsLowPriority,
+ InflationProgress inflationProgress = createRemoteViews(mReInflateFlags,
+ recoveredBuilder, mIsLowPriority,
mIsChildInGroup, mUsesIncreasedHeight, mUsesIncreasedHeadsUpHeight,
mRedactAmbient, packageContext);
+ return inflateSmartReplyViews(inflationProgress, mReInflateFlags, mRow.getEntry(),
+ mRow.getContext(), mRow.getHeadsUpManager());
} catch (Exception e) {
mError = e;
return null;
@@ -927,6 +971,9 @@ public class NotificationContentInflater {
private View inflatedPublicView;
private CharSequence headsUpStatusBarText;
private CharSequence headsUpStatusBarTextPublic;
+
+ private InflatedSmartReplies expandedInflatedSmartReplies;
+ private InflatedSmartReplies headsUpInflatedSmartReplies;
}
@VisibleForTesting
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationContentView.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationContentView.java
index 1dc48d4b18b9..646617c72128 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationContentView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationContentView.java
@@ -19,7 +19,6 @@ package com.android.systemui.statusbar.notification.row;
import android.annotation.Nullable;
import android.app.Notification;
import android.app.PendingIntent;
-import android.app.RemoteInput;
import android.content.Context;
import android.graphics.Rect;
import android.os.Build;
@@ -28,7 +27,6 @@ import android.util.ArrayMap;
import android.util.ArraySet;
import android.util.AttributeSet;
import android.util.Log;
-import android.util.Pair;
import android.view.MotionEvent;
import android.view.NotificationHeaderView;
import android.view.View;
@@ -39,7 +37,6 @@ import android.widget.ImageView;
import android.widget.LinearLayout;
import com.android.internal.annotations.VisibleForTesting;
-import com.android.internal.util.ArrayUtils;
import com.android.internal.util.ContrastColorUtil;
import com.android.systemui.Dependency;
import com.android.systemui.R;
@@ -52,13 +49,14 @@ import com.android.systemui.statusbar.notification.collection.NotificationEntry;
import com.android.systemui.statusbar.notification.row.wrapper.NotificationCustomViewWrapper;
import com.android.systemui.statusbar.notification.row.wrapper.NotificationViewWrapper;
import com.android.systemui.statusbar.phone.NotificationGroupManager;
+import com.android.systemui.statusbar.policy.InflatedSmartReplies;
+import com.android.systemui.statusbar.policy.InflatedSmartReplies.SmartRepliesAndActions;
import com.android.systemui.statusbar.policy.RemoteInputView;
import com.android.systemui.statusbar.policy.SmartReplyConstants;
import com.android.systemui.statusbar.policy.SmartReplyView;
import java.io.FileDescriptor;
import java.io.PrintWriter;
-import java.util.List;
/**
* A frame layout containing the actual payload of the notification, including the contracted,
@@ -95,6 +93,8 @@ public class NotificationContentView extends FrameLayout {
private SmartReplyView mExpandedSmartReplyView;
private SmartReplyView mHeadsUpSmartReplyView;
private SmartReplyController mSmartReplyController;
+ private InflatedSmartReplies mExpandedInflatedSmartReplies;
+ private InflatedSmartReplies mHeadsUpInflatedSmartReplies;
private NotificationViewWrapper mContractedWrapper;
private NotificationViewWrapper mExpandedWrapper;
@@ -1318,8 +1318,22 @@ public class NotificationContentView extends FrameLayout {
return;
}
- SmartRepliesAndActions smartRepliesAndActions =
- chooseSmartRepliesAndActions(mSmartReplyConstants, entry);
+ applyRemoteInput(entry, InflatedSmartReplies.hasFreeformRemoteInput(entry));
+
+ if (mExpandedInflatedSmartReplies == null && mHeadsUpInflatedSmartReplies == null) {
+ if (DEBUG) {
+ Log.d(TAG, "Both expanded, and heads-up InflatedSmartReplies are null, "
+ + "don't add smart replies.");
+ }
+ return;
+ }
+ // The inflated smart-reply objects for the expanded view and the heads-up view both contain
+ // the same SmartRepliesAndActions to avoid discrepancies between the two views. We here
+ // reuse that object for our local SmartRepliesAndActions to avoid discrepancies between
+ // this class and the InflatedSmartReplies classes.
+ SmartRepliesAndActions smartRepliesAndActions = mExpandedInflatedSmartReplies != null
+ ? mExpandedInflatedSmartReplies.getSmartRepliesAndActions()
+ : mHeadsUpInflatedSmartReplies.getSmartRepliesAndActions();
if (DEBUG) {
Log.d(TAG, String.format("Adding suggestions for %s, %d actions, and %d replies.",
entry.notification.getKey(),
@@ -1328,86 +1342,9 @@ public class NotificationContentView extends FrameLayout {
smartRepliesAndActions.smartReplies == null ? 0 :
smartRepliesAndActions.smartReplies.choices.length));
}
-
- applyRemoteInput(entry, smartRepliesAndActions.hasFreeformRemoteInput);
applySmartReplyView(smartRepliesAndActions, entry);
}
- /**
- * Chose what smart replies and smart actions to display. App generated suggestions take
- * precedence. So if the app provides any smart replies, we don't show any
- * replies or actions generated by the NotificationAssistantService (NAS), and if the app
- * provides any smart actions we also don't show any NAS-generated replies or actions.
- */
- @VisibleForTesting
- static SmartRepliesAndActions chooseSmartRepliesAndActions(
- SmartReplyConstants smartReplyConstants,
- final NotificationEntry entry) {
- Notification notification = entry.notification.getNotification();
- Pair<RemoteInput, Notification.Action> remoteInputActionPair =
- notification.findRemoteInputActionPair(false /* freeform */);
- Pair<RemoteInput, Notification.Action> freeformRemoteInputActionPair =
- notification.findRemoteInputActionPair(true /* freeform */);
-
- if (!smartReplyConstants.isEnabled()) {
- if (DEBUG) {
- Log.d(TAG, "Smart suggestions not enabled, not adding suggestions for "
- + entry.notification.getKey());
- }
- return new SmartRepliesAndActions(null, null, freeformRemoteInputActionPair != null);
- }
- // Only use smart replies from the app if they target P or above. We have this check because
- // the smart reply API has been used for other things (Wearables) in the past. The API to
- // add smart actions is new in Q so it doesn't require a target-sdk check.
- boolean enableAppGeneratedSmartReplies = (!smartReplyConstants.requiresTargetingP()
- || entry.targetSdk >= Build.VERSION_CODES.P);
-
- boolean appGeneratedSmartRepliesExist =
- enableAppGeneratedSmartReplies
- && remoteInputActionPair != null
- && !ArrayUtils.isEmpty(remoteInputActionPair.first.getChoices())
- && remoteInputActionPair.second.actionIntent != null;
-
- List<Notification.Action> appGeneratedSmartActions = notification.getContextualActions();
- boolean appGeneratedSmartActionsExist = !appGeneratedSmartActions.isEmpty();
-
- SmartReplyView.SmartReplies smartReplies = null;
- SmartReplyView.SmartActions smartActions = null;
- if (appGeneratedSmartRepliesExist) {
- smartReplies = new SmartReplyView.SmartReplies(
- remoteInputActionPair.first.getChoices(),
- remoteInputActionPair.first,
- remoteInputActionPair.second.actionIntent,
- false /* fromAssistant */);
- }
- if (appGeneratedSmartActionsExist) {
- smartActions = new SmartReplyView.SmartActions(appGeneratedSmartActions,
- false /* fromAssistant */);
- }
- // Apps didn't provide any smart replies / actions, use those from NAS (if any).
- if (!appGeneratedSmartRepliesExist && !appGeneratedSmartActionsExist) {
- boolean useGeneratedReplies = !ArrayUtils.isEmpty(entry.systemGeneratedSmartReplies)
- && freeformRemoteInputActionPair != null
- && freeformRemoteInputActionPair.second.getAllowGeneratedReplies()
- && freeformRemoteInputActionPair.second.actionIntent != null;
- if (useGeneratedReplies) {
- smartReplies = new SmartReplyView.SmartReplies(
- entry.systemGeneratedSmartReplies,
- freeformRemoteInputActionPair.first,
- freeformRemoteInputActionPair.second.actionIntent,
- true /* fromAssistant */);
- }
- boolean useSmartActions = !ArrayUtils.isEmpty(entry.systemGeneratedSmartActions)
- && notification.getAllowSystemGeneratedContextualActions();
- if (useSmartActions) {
- smartActions = new SmartReplyView.SmartActions(
- entry.systemGeneratedSmartActions, true /* fromAssistant */);
- }
- }
- return new SmartRepliesAndActions(
- smartReplies, smartActions, freeformRemoteInputActionPair != null);
- }
-
private void applyRemoteInput(NotificationEntry entry, boolean hasFreeformRemoteInput) {
View bigContentView = mExpandedChild;
if (bigContentView != null) {
@@ -1507,11 +1444,12 @@ public class NotificationContentView extends FrameLayout {
return null;
}
- private void applySmartReplyView(SmartRepliesAndActions smartRepliesAndActions,
+ private void applySmartReplyView(
+ SmartRepliesAndActions smartRepliesAndActions,
NotificationEntry entry) {
if (mExpandedChild != null) {
- mExpandedSmartReplyView =
- applySmartReplyView(mExpandedChild, smartRepliesAndActions, entry);
+ mExpandedSmartReplyView = applySmartReplyView(mExpandedChild, smartRepliesAndActions,
+ entry, mExpandedInflatedSmartReplies);
if (mExpandedSmartReplyView != null) {
if (smartRepliesAndActions.smartReplies != null
|| smartRepliesAndActions.smartActions != null) {
@@ -1533,65 +1471,79 @@ public class NotificationContentView extends FrameLayout {
}
}
if (mHeadsUpChild != null && mSmartReplyConstants.getShowInHeadsUp()) {
- mHeadsUpSmartReplyView =
- applySmartReplyView(mHeadsUpChild, smartRepliesAndActions, entry);
+ mHeadsUpSmartReplyView = applySmartReplyView(mHeadsUpChild, smartRepliesAndActions,
+ entry, mHeadsUpInflatedSmartReplies);
}
}
+ @Nullable
private SmartReplyView applySmartReplyView(View view,
- SmartRepliesAndActions smartRepliesAndActions, NotificationEntry entry) {
+ SmartRepliesAndActions smartRepliesAndActions,
+ NotificationEntry entry, InflatedSmartReplies inflatedSmartReplyView) {
View smartReplyContainerCandidate = view.findViewById(
com.android.internal.R.id.smart_reply_container);
if (!(smartReplyContainerCandidate instanceof LinearLayout)) {
return null;
}
+
LinearLayout smartReplyContainer = (LinearLayout) smartReplyContainerCandidate;
- // If there are no smart replies and no smart actions - early out.
- if (smartRepliesAndActions.smartReplies == null
- && smartRepliesAndActions.smartActions == null) {
- smartReplyContainer.setVisibility(View.GONE);
- return null;
- }
- // If we are showing the spinner we don't want to add the buttons.
- boolean showingSpinner = entry.notification.getNotification()
- .extras.getBoolean(Notification.EXTRA_SHOW_REMOTE_INPUT_SPINNER, false);
- if (showingSpinner) {
- smartReplyContainer.setVisibility(View.GONE);
- return null;
- }
- // If we are keeping the notification around while sending we don't want to add the buttons.
- boolean hideSmartReplies = entry.notification.getNotification()
- .extras.getBoolean(Notification.EXTRA_HIDE_SMART_REPLIES, false);
- if (hideSmartReplies) {
+ if (!InflatedSmartReplies.shouldShowSmartReplyView(entry, smartRepliesAndActions)) {
smartReplyContainer.setVisibility(View.GONE);
return null;
}
+
SmartReplyView smartReplyView = null;
- if (smartReplyContainer.getChildCount() == 0) {
- smartReplyView = SmartReplyView.inflate(mContext, smartReplyContainer);
+ if (smartReplyContainer.getChildCount() == 1
+ && smartReplyContainer.getChildAt(0) instanceof SmartReplyView) {
+ // If we already have a SmartReplyView - replace it with the newly inflated one. The
+ // newly inflated one is connected to the new inflated smart reply/action buttons.
+ smartReplyContainer.removeAllViews();
+ }
+ if (smartReplyContainer.getChildCount() == 0
+ && inflatedSmartReplyView != null
+ && inflatedSmartReplyView.getSmartReplyView() != null) {
+ smartReplyView = inflatedSmartReplyView.getSmartReplyView();
smartReplyContainer.addView(smartReplyView);
- } else if (smartReplyContainer.getChildCount() == 1) {
- View child = smartReplyContainer.getChildAt(0);
- if (child instanceof SmartReplyView) {
- smartReplyView = (SmartReplyView) child;
- }
}
if (smartReplyView != null) {
smartReplyView.resetSmartSuggestions(smartReplyContainer);
- if (smartRepliesAndActions.smartReplies != null) {
- smartReplyView.addRepliesFromRemoteInput(
- smartRepliesAndActions.smartReplies, mSmartReplyController, entry);
- }
- if (smartRepliesAndActions.smartActions != null) {
- smartReplyView.addSmartActions(
- smartRepliesAndActions.smartActions, mSmartReplyController, entry,
- mContainingNotification.getHeadsUpManager());
- }
+ smartReplyView.addPreInflatedButtons(
+ inflatedSmartReplyView.getSmartSuggestionButtons());
smartReplyContainer.setVisibility(View.VISIBLE);
}
return smartReplyView;
}
+ /**
+ * Set pre-inflated views necessary to display smart replies and actions in the expanded
+ * notification state.
+ *
+ * @param inflatedSmartReplies the pre-inflated state to add to this view. If null the existing
+ * {@link SmartReplyView} related to the expanded notification state is cleared.
+ */
+ public void setExpandedInflatedSmartReplies(
+ @Nullable InflatedSmartReplies inflatedSmartReplies) {
+ mExpandedInflatedSmartReplies = inflatedSmartReplies;
+ if (inflatedSmartReplies == null) {
+ mExpandedSmartReplyView = null;
+ }
+ }
+
+ /**
+ * Set pre-inflated views necessary to display smart replies and actions in the heads-up
+ * notification state.
+ *
+ * @param inflatedSmartReplies the pre-inflated state to add to this view. If null the existing
+ * {@link SmartReplyView} related to the heads-up notification state is cleared.
+ */
+ public void setHeadsUpInflatedSmartReplies(
+ @Nullable InflatedSmartReplies inflatedSmartReplies) {
+ mHeadsUpInflatedSmartReplies = inflatedSmartReplies;
+ if (inflatedSmartReplies == null) {
+ mHeadsUpSmartReplyView = null;
+ }
+ }
+
public void closeRemoteInput() {
if (mHeadsUpRemoteInput != null) {
mHeadsUpRemoteInput.close();
@@ -2005,22 +1957,4 @@ public class NotificationContentView extends FrameLayout {
}
pw.println();
}
-
- @VisibleForTesting
- static class SmartRepliesAndActions {
- @Nullable
- public final SmartReplyView.SmartReplies smartReplies;
- @Nullable
- public final SmartReplyView.SmartActions smartActions;
- public final boolean hasFreeformRemoteInput;
-
- SmartRepliesAndActions(
- @Nullable SmartReplyView.SmartReplies smartReplies,
- @Nullable SmartReplyView.SmartActions smartActions,
- boolean hasFreeformRemoteInput) {
- this.smartReplies = smartReplies;
- this.smartActions = smartActions;
- this.hasFreeformRemoteInput = hasFreeformRemoteInput;
- }
- }
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/wrapper/NotificationMediaTemplateViewWrapper.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/wrapper/NotificationMediaTemplateViewWrapper.java
index ddda3e50fc2c..99f5874448b5 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/wrapper/NotificationMediaTemplateViewWrapper.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/wrapper/NotificationMediaTemplateViewWrapper.java
@@ -36,6 +36,7 @@ import android.widget.TextView;
import com.android.internal.R;
import com.android.systemui.Dependency;
+import com.android.systemui.statusbar.NotificationMediaManager;
import com.android.systemui.statusbar.TransformableView;
import com.android.systemui.statusbar.notification.row.ExpandableNotificationRow;
@@ -58,12 +59,10 @@ public class NotificationMediaTemplateViewWrapper extends NotificationTemplateVi
private TextView mSeekBarTotalTime;
private long mDuration = 0;
private MediaController mMediaController;
+ private NotificationMediaManager mMediaManager;
private View mSeekBarView;
private Context mContext;
- // TODO: implement as phenotype flag
- public static final boolean HIDE_COMPACT_SCRUBBER = true;
-
private SeekBar.OnSeekBarChangeListener mSeekListener = new SeekBar.OnSeekBarChangeListener() {
@Override
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
@@ -102,6 +101,7 @@ public class NotificationMediaTemplateViewWrapper extends NotificationTemplateVi
ExpandableNotificationRow row) {
super(ctx, view, row);
mContext = ctx;
+ mMediaManager = Dependency.get(NotificationMediaManager.class);
}
private void resolveViews() {
@@ -110,7 +110,8 @@ public class NotificationMediaTemplateViewWrapper extends NotificationTemplateVi
final MediaSession.Token token = mRow.getEntry().notification.getNotification().extras
.getParcelable(Notification.EXTRA_MEDIA_SESSION);
- if (token == null || (COMPACT_MEDIA_TAG.equals(mView.getTag()) && HIDE_COMPACT_SCRUBBER)) {
+ boolean showCompactSeekbar = mMediaManager.getShowCompactMediaSeekbar();
+ if (token == null || (COMPACT_MEDIA_TAG.equals(mView.getTag()) && !showCompactSeekbar)) {
if (mSeekBarView != null) {
mSeekBarView.setVisibility(View.GONE);
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarIconControllerImpl.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarIconControllerImpl.java
index f846036248d4..e0b1846fa7d0 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarIconControllerImpl.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarIconControllerImpl.java
@@ -42,6 +42,7 @@ import com.android.systemui.tuner.TunerService.Tunable;
import java.io.FileDescriptor;
import java.io.PrintWriter;
import java.util.ArrayList;
+import java.util.Collections;
import java.util.List;
import javax.inject.Inject;
@@ -122,7 +123,7 @@ public class StatusBarIconControllerImpl extends StatusBarIconList implements Tu
// Remove all the icons.
for (int i = currentSlots.size() - 1; i >= 0; i--) {
Slot s = currentSlots.get(i);
- slotsToReAdd.put(s, s.getHolderListInViewOrder());
+ slotsToReAdd.put(s, s.getHolderList());
removeAllIconsForSlot(s.getName());
}
@@ -200,6 +201,10 @@ public class StatusBarIconControllerImpl extends StatusBarIconList implements Tu
Slot mobileSlot = getSlot(slot);
int slotIndex = getSlotIndex(slot);
+ // Reverse the sort order to show icons with left to right([Slot1][Slot2]..).
+ // StatusBarIconList has UI design that first items go to the right of second items.
+ Collections.reverse(iconStates);
+
for (MobileIconState state : iconStates) {
StatusBarIconHolder holder = mobileSlot.getHolderForTag(state.subId);
if (holder == null) {
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarIconList.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarIconList.java
index 2e4161787267..c876c3228eb8 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarIconList.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarIconList.java
@@ -250,6 +250,25 @@ public class StatusBarIconList {
return holders;
}
+ /**
+ * Build a list of the {@link StatusBarIconHolder}s in the same order.
+ * This provides a safe list that can be iterated and inserted into its group.
+ *
+ * @return all holders contained here
+ */
+ public List<StatusBarIconHolder> getHolderList() {
+ ArrayList<StatusBarIconHolder> holders = new ArrayList<>();
+ if (mHolder != null) {
+ holders.add(mHolder);
+ }
+
+ if (mSubSlots != null) {
+ holders.addAll(mSubSlots);
+ }
+
+ return holders;
+ }
+
@Override
public String toString() {
return String.format("(%s) %s", mName, subSlotsString());
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/InflatedSmartReplies.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/InflatedSmartReplies.java
new file mode 100644
index 000000000000..d8ea1f6eef5f
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/InflatedSmartReplies.java
@@ -0,0 +1,225 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.systemui.statusbar.policy;
+
+import android.annotation.NonNull;
+import android.annotation.Nullable;
+import android.app.Notification;
+import android.app.RemoteInput;
+import android.content.Context;
+import android.os.Build;
+import android.util.Log;
+import android.util.Pair;
+import android.widget.Button;
+
+import com.android.internal.util.ArrayUtils;
+import com.android.systemui.statusbar.SmartReplyController;
+import com.android.systemui.statusbar.notification.collection.NotificationEntry;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Holder for inflated smart replies and actions. These objects should be inflated on a background
+ * thread, to later be accessed and modified on the (performance critical) UI thread.
+ */
+public class InflatedSmartReplies {
+ private static final String TAG = "InflatedSmartReplies";
+ private static final boolean DEBUG = Log.isLoggable(TAG, Log.DEBUG);
+ @Nullable private final SmartReplyView mSmartReplyView;
+ @Nullable private final List<Button> mSmartSuggestionButtons;
+ @NonNull private final SmartRepliesAndActions mSmartRepliesAndActions;
+
+ private InflatedSmartReplies(
+ @Nullable SmartReplyView smartReplyView,
+ @Nullable List<Button> smartSuggestionButtons,
+ @NonNull SmartRepliesAndActions smartRepliesAndActions) {
+ mSmartReplyView = smartReplyView;
+ mSmartSuggestionButtons = smartSuggestionButtons;
+ mSmartRepliesAndActions = smartRepliesAndActions;
+ }
+
+ @Nullable public SmartReplyView getSmartReplyView() {
+ return mSmartReplyView;
+ }
+
+ @Nullable public List<Button> getSmartSuggestionButtons() {
+ return mSmartSuggestionButtons;
+ }
+
+ @NonNull public SmartRepliesAndActions getSmartRepliesAndActions() {
+ return mSmartRepliesAndActions;
+ }
+
+ /**
+ * Inflate a SmartReplyView and its smart suggestions.
+ */
+ public static InflatedSmartReplies inflate(
+ Context context,
+ NotificationEntry entry,
+ SmartReplyConstants smartReplyConstants,
+ SmartReplyController smartReplyController,
+ HeadsUpManager headsUpManager) {
+ SmartRepliesAndActions smartRepliesAndActions =
+ chooseSmartRepliesAndActions(smartReplyConstants, entry);
+ if (!shouldShowSmartReplyView(entry, smartRepliesAndActions)) {
+ return new InflatedSmartReplies(null /* smartReplyView */,
+ null /* smartSuggestionButtons */, smartRepliesAndActions);
+ }
+
+ SmartReplyView smartReplyView = SmartReplyView.inflate(context);
+
+ List<Button> suggestionButtons = new ArrayList<>();
+ if (smartRepliesAndActions.smartReplies != null) {
+ suggestionButtons.addAll(smartReplyView.inflateRepliesFromRemoteInput(
+ smartRepliesAndActions.smartReplies, smartReplyController, entry));
+ }
+ if (smartRepliesAndActions.smartActions != null) {
+ suggestionButtons.addAll(
+ smartReplyView.inflateSmartActions(smartRepliesAndActions.smartActions,
+ smartReplyController, entry, headsUpManager));
+ }
+
+ return new InflatedSmartReplies(smartReplyView, suggestionButtons,
+ smartRepliesAndActions);
+ }
+
+ /**
+ * Returns whether we should show the smart reply view and its smart suggestions.
+ */
+ public static boolean shouldShowSmartReplyView(
+ NotificationEntry entry,
+ SmartRepliesAndActions smartRepliesAndActions) {
+ if (smartRepliesAndActions.smartReplies == null
+ && smartRepliesAndActions.smartActions == null) {
+ // There are no smart replies and no smart actions.
+ return false;
+ }
+ // If we are showing the spinner we don't want to add the buttons.
+ boolean showingSpinner = entry.notification.getNotification()
+ .extras.getBoolean(Notification.EXTRA_SHOW_REMOTE_INPUT_SPINNER, false);
+ if (showingSpinner) {
+ return false;
+ }
+ // If we are keeping the notification around while sending we don't want to add the buttons.
+ boolean hideSmartReplies = entry.notification.getNotification()
+ .extras.getBoolean(Notification.EXTRA_HIDE_SMART_REPLIES, false);
+ if (hideSmartReplies) {
+ return false;
+ }
+ return true;
+ }
+
+ /**
+ * Chose what smart replies and smart actions to display. App generated suggestions take
+ * precedence. So if the app provides any smart replies, we don't show any
+ * replies or actions generated by the NotificationAssistantService (NAS), and if the app
+ * provides any smart actions we also don't show any NAS-generated replies or actions.
+ */
+ @NonNull
+ public static SmartRepliesAndActions chooseSmartRepliesAndActions(
+ SmartReplyConstants smartReplyConstants,
+ final NotificationEntry entry) {
+ Notification notification = entry.notification.getNotification();
+ Pair<RemoteInput, Notification.Action> remoteInputActionPair =
+ notification.findRemoteInputActionPair(false /* freeform */);
+ Pair<RemoteInput, Notification.Action> freeformRemoteInputActionPair =
+ notification.findRemoteInputActionPair(true /* freeform */);
+
+ if (!smartReplyConstants.isEnabled()) {
+ if (DEBUG) {
+ Log.d(TAG, "Smart suggestions not enabled, not adding suggestions for "
+ + entry.notification.getKey());
+ }
+ return new SmartRepliesAndActions(null, null);
+ }
+ // Only use smart replies from the app if they target P or above. We have this check because
+ // the smart reply API has been used for other things (Wearables) in the past. The API to
+ // add smart actions is new in Q so it doesn't require a target-sdk check.
+ boolean enableAppGeneratedSmartReplies = (!smartReplyConstants.requiresTargetingP()
+ || entry.targetSdk >= Build.VERSION_CODES.P);
+
+ boolean appGeneratedSmartRepliesExist =
+ enableAppGeneratedSmartReplies
+ && remoteInputActionPair != null
+ && !ArrayUtils.isEmpty(remoteInputActionPair.first.getChoices())
+ && remoteInputActionPair.second.actionIntent != null;
+
+ List<Notification.Action> appGeneratedSmartActions = notification.getContextualActions();
+ boolean appGeneratedSmartActionsExist = !appGeneratedSmartActions.isEmpty();
+
+ SmartReplyView.SmartReplies smartReplies = null;
+ SmartReplyView.SmartActions smartActions = null;
+ if (appGeneratedSmartRepliesExist) {
+ smartReplies = new SmartReplyView.SmartReplies(
+ remoteInputActionPair.first.getChoices(),
+ remoteInputActionPair.first,
+ remoteInputActionPair.second.actionIntent,
+ false /* fromAssistant */);
+ }
+ if (appGeneratedSmartActionsExist) {
+ smartActions = new SmartReplyView.SmartActions(appGeneratedSmartActions,
+ false /* fromAssistant */);
+ }
+ // Apps didn't provide any smart replies / actions, use those from NAS (if any).
+ if (!appGeneratedSmartRepliesExist && !appGeneratedSmartActionsExist) {
+ boolean useGeneratedReplies = !ArrayUtils.isEmpty(entry.systemGeneratedSmartReplies)
+ && freeformRemoteInputActionPair != null
+ && freeformRemoteInputActionPair.second.getAllowGeneratedReplies()
+ && freeformRemoteInputActionPair.second.actionIntent != null;
+ if (useGeneratedReplies) {
+ smartReplies = new SmartReplyView.SmartReplies(
+ entry.systemGeneratedSmartReplies,
+ freeformRemoteInputActionPair.first,
+ freeformRemoteInputActionPair.second.actionIntent,
+ true /* fromAssistant */);
+ }
+ boolean useSmartActions = !ArrayUtils.isEmpty(entry.systemGeneratedSmartActions)
+ && notification.getAllowSystemGeneratedContextualActions();
+ if (useSmartActions) {
+ smartActions = new SmartReplyView.SmartActions(
+ entry.systemGeneratedSmartActions, true /* fromAssistant */);
+ }
+ }
+ return new SmartRepliesAndActions(smartReplies, smartActions);
+ }
+
+ /**
+ * Returns whether the {@link Notification} represented by entry has a free-form remote input.
+ * Such an input can be used e.g. to implement smart reply buttons - by passing the replies
+ * through the remote input.
+ */
+ public static boolean hasFreeformRemoteInput(NotificationEntry entry) {
+ Notification notification = entry.notification.getNotification();
+ return null != notification.findRemoteInputActionPair(true /* freeform */);
+ }
+
+ /**
+ * A storage for smart replies and smart action.
+ */
+ public static class SmartRepliesAndActions {
+ @Nullable public final SmartReplyView.SmartReplies smartReplies;
+ @Nullable public final SmartReplyView.SmartActions smartActions;
+
+ SmartRepliesAndActions(
+ @Nullable SmartReplyView.SmartReplies smartReplies,
+ @Nullable SmartReplyView.SmartActions smartActions) {
+ this.smartReplies = smartReplies;
+ this.smartActions = smartActions;
+ }
+ }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/SmartReplyView.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/SmartReplyView.java
index 45d215ef309c..ed5487f74356 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/SmartReplyView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/SmartReplyView.java
@@ -196,66 +196,81 @@ public class SmartReplyView extends ViewGroup {
}
/**
+ * Add buttons to the {@link SmartReplyView} - these buttons must have been preinflated using
+ * one of the methods in this class.
+ */
+ public void addPreInflatedButtons(List<Button> smartSuggestionButtons) {
+ for (Button button : smartSuggestionButtons) {
+ addView(button);
+ }
+ reallocateCandidateButtonQueueForSqueezing();
+ }
+
+ /**
* Add smart replies to this view, using the provided {@link RemoteInput} and
* {@link PendingIntent} to respond when the user taps a smart reply. Only the replies that fit
* into the notification are shown.
*/
- public void addRepliesFromRemoteInput(
- SmartReplies smartReplies,
+ public List<Button> inflateRepliesFromRemoteInput(
+ @NonNull SmartReplies smartReplies,
SmartReplyController smartReplyController, NotificationEntry entry) {
+ List<Button> buttons = new ArrayList<>();
+
if (smartReplies.remoteInput != null && smartReplies.pendingIntent != null) {
if (smartReplies.choices != null) {
for (int i = 0; i < smartReplies.choices.length; ++i) {
- Button replyButton = inflateReplyButton(
- getContext(), this, i, smartReplies, smartReplyController, entry);
- addView(replyButton);
+ buttons.add(inflateReplyButton(
+ this, getContext(), i, smartReplies, smartReplyController, entry));
}
this.mSmartRepliesGeneratedByAssistant = smartReplies.fromAssistant;
}
}
- reallocateCandidateButtonQueueForSqueezing();
+ return buttons;
}
/**
* Add smart actions to be shown next to smart replies. Only the actions that fit into the
* notification are shown.
*/
- public void addSmartActions(SmartActions smartActions,
+ public List<Button> inflateSmartActions(@NonNull SmartActions smartActions,
SmartReplyController smartReplyController, NotificationEntry entry,
HeadsUpManager headsUpManager) {
+ List<Button> buttons = new ArrayList<>();
int numSmartActions = smartActions.actions.size();
for (int n = 0; n < numSmartActions; n++) {
Notification.Action action = smartActions.actions.get(n);
if (action.actionIntent != null) {
- Button actionButton = inflateActionButton(
- getContext(), this, n, smartActions, smartReplyController, entry,
- headsUpManager);
- addView(actionButton);
+ buttons.add(inflateActionButton(
+ this, getContext(), n, smartActions, smartReplyController, entry,
+ headsUpManager));
}
}
- reallocateCandidateButtonQueueForSqueezing();
+ return buttons;
}
- public static SmartReplyView inflate(Context context, ViewGroup root) {
- return (SmartReplyView)
- LayoutInflater.from(context).inflate(R.layout.smart_reply_view, root, false);
+ /**
+ * Inflate an instance of this class.
+ */
+ public static SmartReplyView inflate(Context context) {
+ return (SmartReplyView) LayoutInflater.from(context).inflate(
+ R.layout.smart_reply_view, null /* root */);
}
@VisibleForTesting
- Button inflateReplyButton(Context context, ViewGroup root, int replyIndex,
- SmartReplies smartReplies, SmartReplyController smartReplyController,
+ static Button inflateReplyButton(SmartReplyView smartReplyView, Context context,
+ int replyIndex, SmartReplies smartReplies, SmartReplyController smartReplyController,
NotificationEntry entry) {
Button b = (Button) LayoutInflater.from(context).inflate(
- R.layout.smart_reply_button, root, false);
+ R.layout.smart_reply_button, smartReplyView, false);
CharSequence choice = smartReplies.choices[replyIndex];
b.setText(choice);
OnDismissAction action = () -> {
- if (mConstants.getEffectiveEditChoicesBeforeSending(
+ if (smartReplyView.mConstants.getEffectiveEditChoicesBeforeSending(
smartReplies.remoteInput.getEditChoicesBeforeSending())) {
EditedSuggestionInfo editedSuggestionInfo =
new EditedSuggestionInfo(choice, replyIndex);
- mRemoteInputManager.activateRemoteInput(b,
+ smartReplyView.mRemoteInputManager.activateRemoteInput(b,
new RemoteInput[] { smartReplies.remoteInput }, smartReplies.remoteInput,
smartReplies.pendingIntent, editedSuggestionInfo);
return false;
@@ -276,33 +291,41 @@ public class SmartReplyView extends ViewGroup {
} catch (PendingIntent.CanceledException e) {
Log.w(TAG, "Unable to send smart reply", e);
}
- mSmartReplyContainer.setVisibility(View.GONE);
+ // Note that as inflateReplyButton is called mSmartReplyContainer is null, but when the
+ // reply Button is added to the SmartReplyView mSmartReplyContainer will be set. So, it
+ // will not be possible for a user to trigger this on-click-listener without
+ // mSmartReplyContainer being set.
+ smartReplyView.mSmartReplyContainer.setVisibility(View.GONE);
return false; // do not defer
};
b.setOnClickListener(view -> {
- mKeyguardDismissUtil.executeWhenUnlocked(action);
+ smartReplyView.mKeyguardDismissUtil.executeWhenUnlocked(action);
});
b.setAccessibilityDelegate(new AccessibilityDelegate() {
public void onInitializeAccessibilityNodeInfo(View host, AccessibilityNodeInfo info) {
super.onInitializeAccessibilityNodeInfo(host, info);
- String label = getResources().getString(R.string.accessibility_send_smart_reply);
+ String label = smartReplyView.getResources().getString(
+ R.string.accessibility_send_smart_reply);
info.addAction(new AccessibilityAction(AccessibilityNodeInfo.ACTION_CLICK, label));
}
});
- setColors(b, mCurrentBackgroundColor, mDefaultStrokeColor, mDefaultTextColor, mRippleColor);
+ SmartReplyView.setButtonColors(b, smartReplyView.mCurrentBackgroundColor,
+ smartReplyView.mDefaultStrokeColor, smartReplyView.mDefaultTextColor,
+ smartReplyView.mRippleColor, smartReplyView.mStrokeWidth);
return b;
}
@VisibleForTesting
- Button inflateActionButton(Context context, ViewGroup root, int actionIndex,
- SmartActions smartActions, SmartReplyController smartReplyController,
- NotificationEntry entry, HeadsUpManager headsUpManager) {
+ static Button inflateActionButton(SmartReplyView smartReplyView, Context context,
+ int actionIndex, SmartActions smartActions,
+ SmartReplyController smartReplyController, NotificationEntry entry,
+ HeadsUpManager headsUpManager) {
Notification.Action action = smartActions.actions.get(actionIndex);
Button button = (Button) LayoutInflater.from(context).inflate(
- R.layout.smart_action_button, root, false);
+ R.layout.smart_action_button, smartReplyView, false);
button.setText(action.title);
Drawable iconDrawable = action.getIcon().loadDrawable(context);
@@ -313,7 +336,7 @@ public class SmartReplyView extends ViewGroup {
button.setCompoundDrawables(iconDrawable, null, null, null);
button.setOnClickListener(view ->
- getActivityStarter().startPendingIntentDismissingKeyguard(
+ smartReplyView.getActivityStarter().startPendingIntentDismissingKeyguard(
action.actionIntent,
() -> {
smartReplyController.smartActionClicked(
@@ -803,12 +826,13 @@ public class SmartReplyView extends ViewGroup {
int childCount = getChildCount();
for (int i = 0; i < childCount; i++) {
final Button child = (Button) getChildAt(i);
- setColors(child, backgroundColor, strokeColor, textColor, rippleColor);
+ setButtonColors(child, backgroundColor, strokeColor, textColor, rippleColor,
+ mStrokeWidth);
}
}
- private void setColors(Button button, int backgroundColor, int strokeColor, int textColor,
- int rippleColor) {
+ private static void setButtonColors(Button button, int backgroundColor, int strokeColor,
+ int textColor, int rippleColor, int strokeWidth) {
Drawable drawable = button.getBackground();
if (drawable instanceof RippleDrawable) {
// Mutate in case other notifications are using this drawable.
@@ -821,7 +845,7 @@ public class SmartReplyView extends ViewGroup {
if (background instanceof GradientDrawable) {
GradientDrawable gradientDrawable = (GradientDrawable) background;
gradientDrawable.setColor(backgroundColor);
- gradientDrawable.setStroke(mStrokeWidth, strokeColor);
+ gradientDrawable.setStroke(strokeWidth, strokeColor);
}
}
button.setBackground(drawable);
diff --git a/packages/SystemUI/tests/src/com/android/keyguard/clock/BubbleClockControllerTest.java b/packages/SystemUI/tests/src/com/android/keyguard/clock/BubbleClockControllerTest.java
index 9e946faf2a52..267468ffa4d6 100644
--- a/packages/SystemUI/tests/src/com/android/keyguard/clock/BubbleClockControllerTest.java
+++ b/packages/SystemUI/tests/src/com/android/keyguard/clock/BubbleClockControllerTest.java
@@ -17,6 +17,7 @@ package com.android.keyguard.clock;
import static com.google.common.truth.Truth.assertThat;
+import android.content.res.Resources;
import android.test.suitebuilder.annotation.SmallTest;
import android.testing.AndroidTestingRunner;
import android.testing.TestableLooper.RunWithLooper;
@@ -40,8 +41,9 @@ public final class BubbleClockControllerTest extends SysuiTestCase {
@Before
public void setUp() {
+ Resources res = getContext().getResources();
LayoutInflater layoutInflater = LayoutInflater.from(getContext());
- mClockController = BubbleClockController.build(layoutInflater);
+ mClockController = new BubbleClockController(res, layoutInflater);
}
@Test
diff --git a/packages/SystemUI/tests/src/com/android/keyguard/clock/ClockManagerTest.java b/packages/SystemUI/tests/src/com/android/keyguard/clock/ClockManagerTest.java
index 58701e72e406..36265d485e2c 100644
--- a/packages/SystemUI/tests/src/com/android/keyguard/clock/ClockManagerTest.java
+++ b/packages/SystemUI/tests/src/com/android/keyguard/clock/ClockManagerTest.java
@@ -31,6 +31,7 @@ import com.android.systemui.SysuiTestCase;
import com.android.systemui.colorextraction.SysuiColorExtractor;
import com.android.systemui.dock.DockManager;
import com.android.systemui.dock.DockManagerFake;
+import com.android.systemui.shared.plugins.PluginManager;
import com.android.systemui.util.InjectionInflationController;
import org.junit.After;
@@ -52,6 +53,7 @@ public final class ClockManagerTest extends SysuiTestCase {
private ContentObserver mContentObserver;
private DockManagerFake mFakeDockManager;
@Mock InjectionInflationController mMockInjectionInflationController;
+ @Mock PluginManager mMockPluginManager;
@Mock SysuiColorExtractor mMockColorExtractor;
@Mock ContentResolver mMockContentResolver;
@Mock SettingsWrapper mMockSettingsWrapper;
@@ -66,7 +68,8 @@ public final class ClockManagerTest extends SysuiTestCase {
mFakeDockManager = new DockManagerFake();
mClockManager = new ClockManager(getContext(), mMockInjectionInflationController,
- mFakeDockManager, mMockColorExtractor, mMockContentResolver, mMockSettingsWrapper);
+ mMockPluginManager, mFakeDockManager, mMockColorExtractor, mMockContentResolver,
+ mMockSettingsWrapper);
mClockManager.addOnClockChangedListener(mMockListener);
mContentObserver = mClockManager.getContentObserver();
diff --git a/packages/SystemUI/tests/src/com/android/keyguard/clock/StretchAnalogClockControllerTest.java b/packages/SystemUI/tests/src/com/android/keyguard/clock/StretchAnalogClockControllerTest.java
index 8de8f3d0674d..0659b4fe71cd 100644
--- a/packages/SystemUI/tests/src/com/android/keyguard/clock/StretchAnalogClockControllerTest.java
+++ b/packages/SystemUI/tests/src/com/android/keyguard/clock/StretchAnalogClockControllerTest.java
@@ -17,6 +17,7 @@ package com.android.keyguard.clock;
import static com.google.common.truth.Truth.assertThat;
+import android.content.res.Resources;
import android.test.suitebuilder.annotation.SmallTest;
import android.testing.AndroidTestingRunner;
import android.testing.TestableLooper.RunWithLooper;
@@ -40,8 +41,9 @@ public final class StretchAnalogClockControllerTest extends SysuiTestCase {
@Before
public void setUp() {
+ Resources res = getContext().getResources();
LayoutInflater layoutInflater = LayoutInflater.from(getContext());
- mClockController = StretchAnalogClockController.build(layoutInflater);
+ mClockController = new StretchAnalogClockController(res, layoutInflater);
}
@Test
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationContentViewTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationContentViewTest.java
index c80396d8292a..d756b0970346 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationContentViewTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationContentViewTest.java
@@ -16,8 +16,6 @@
package com.android.systemui.statusbar.notification.row;
-import static com.google.common.truth.Truth.assertThat;
-
import static org.junit.Assert.assertFalse;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyFloat;
@@ -31,62 +29,31 @@ import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import android.app.AppOpsManager;
-import android.app.Notification;
-import android.app.PendingIntent;
-import android.app.RemoteInput;
-import android.content.Intent;
import android.graphics.drawable.Icon;
-import android.service.notification.StatusBarNotification;
import android.support.test.annotation.UiThreadTest;
import android.support.test.filters.SmallTest;
import android.support.test.runner.AndroidJUnit4;
import android.util.ArraySet;
-import android.util.Pair;
import android.view.NotificationHeaderView;
import android.view.View;
-import com.android.systemui.R;
import com.android.systemui.SysuiTestCase;
-import com.android.systemui.statusbar.notification.collection.NotificationEntry;
-import com.android.systemui.statusbar.policy.SmartReplyConstants;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
-import org.mockito.Mock;
-import org.mockito.MockitoAnnotations;
-
-import java.util.ArrayList;
-import java.util.List;
@SmallTest
@RunWith(AndroidJUnit4.class)
public class NotificationContentViewTest extends SysuiTestCase {
- private static final String TEST_ACTION = "com.android.SMART_REPLY_VIEW_ACTION";
-
NotificationContentView mView;
- @Mock
- SmartReplyConstants mSmartReplyConstants;
- @Mock
- StatusBarNotification mStatusBarNotification;
- @Mock
- Notification mNotification;
- NotificationEntry mEntry;
- @Mock
- RemoteInput mRemoteInput;
- @Mock
- RemoteInput mFreeFormRemoteInput;
-
private Icon mActionIcon;
-
@Before
@UiThreadTest
public void setup() {
- MockitoAnnotations.initMocks(this);
-
mView = new NotificationContentView(mContext, null);
ExpandableNotificationRow row = new ExpandableNotificationRow(mContext, null);
ExpandableNotificationRow mockRow = spy(row);
@@ -103,13 +70,6 @@ public class NotificationContentViewTest extends SysuiTestCase {
mView.measure(View.MeasureSpec.UNSPECIFIED, View.MeasureSpec.UNSPECIFIED);
mView.layout(0, 0, mView.getMeasuredWidth(), mView.getMeasuredHeight());
-
- // Smart replies and actions
- when(mNotification.getAllowSystemGeneratedContextualActions()).thenReturn(true);
- when(mStatusBarNotification.getNotification()).thenReturn(mNotification);
- mEntry = new NotificationEntry(mStatusBarNotification);
- when(mSmartReplyConstants.isEnabled()).thenReturn(true);
- mActionIcon = Icon.createWithResource(mContext, R.drawable.ic_person);
}
private View createViewWithHeight(int height) {
@@ -158,204 +118,4 @@ public class NotificationContentViewTest extends SysuiTestCase {
verify(mockAmbient, never()).showAppOpsIcons(ops);
verify(mockHeadsUp, times(1)).showAppOpsIcons(any());
}
-
- private void setupAppGeneratedReplies(CharSequence[] smartReplies) {
- setupAppGeneratedReplies(smartReplies, true /* allowSystemGeneratedReplies */);
- }
-
- private void setupAppGeneratedReplies(
- CharSequence[] smartReplies, boolean allowSystemGeneratedReplies) {
- PendingIntent pendingIntent =
- PendingIntent.getBroadcast(mContext, 0, new Intent(TEST_ACTION), 0);
- Notification.Action action =
- new Notification.Action.Builder(null, "Test Action", pendingIntent).build();
- when(mRemoteInput.getChoices()).thenReturn(smartReplies);
- Pair<RemoteInput, Notification.Action> remoteInputActionPair =
- Pair.create(mRemoteInput, action);
- when(mNotification.findRemoteInputActionPair(false)).thenReturn(remoteInputActionPair);
-
- Notification.Action freeFormRemoteInputAction =
- createActionBuilder("Freeform Test Action")
- .setAllowGeneratedReplies(allowSystemGeneratedReplies)
- .build();
- Pair<RemoteInput, Notification.Action> freeFormRemoteInputActionPair =
- Pair.create(mFreeFormRemoteInput, freeFormRemoteInputAction);
- when(mNotification.findRemoteInputActionPair(true)).thenReturn(
- freeFormRemoteInputActionPair);
-
- when(mSmartReplyConstants.requiresTargetingP()).thenReturn(false);
- }
-
- private void setupAppGeneratedSuggestions(
- CharSequence[] smartReplies, List<Notification.Action> smartActions) {
- setupAppGeneratedReplies(smartReplies);
- when(mNotification.getContextualActions()).thenReturn(smartActions);
- }
-
- @Test
- public void chooseSmartRepliesAndActions_smartRepliesOff_noAppGeneratedSmartSuggestions() {
- CharSequence[] smartReplies = new String[] {"Reply1", "Reply2"};
- List<Notification.Action> smartActions =
- createActions(new String[] {"Test Action 1", "Test Action 2"});
- setupAppGeneratedSuggestions(smartReplies, smartActions);
- when(mSmartReplyConstants.isEnabled()).thenReturn(false);
-
- NotificationContentView.SmartRepliesAndActions repliesAndActions =
- NotificationContentView.chooseSmartRepliesAndActions(mSmartReplyConstants, mEntry);
-
- assertThat(repliesAndActions.smartReplies).isNull();
- assertThat(repliesAndActions.smartActions).isNull();
- }
-
- @Test
- public void chooseSmartRepliesAndActions_smartRepliesOff_noSystemGeneratedSmartSuggestions() {
- mEntry.systemGeneratedSmartReplies =
- new String[] {"Sys Smart Reply 1", "Sys Smart Reply 2"};
- mEntry.systemGeneratedSmartActions =
- createActions(new String[] {"Sys Smart Action 1", "Sys Smart Action 2"});
- when(mSmartReplyConstants.isEnabled()).thenReturn(false);
-
- NotificationContentView.SmartRepliesAndActions repliesAndActions =
- NotificationContentView.chooseSmartRepliesAndActions(mSmartReplyConstants, mEntry);
-
- assertThat(repliesAndActions.smartReplies).isNull();
- assertThat(repliesAndActions.smartActions).isNull();
- }
-
- @Test
- public void chooseSmartRepliesAndActions_appGeneratedSmartReplies() {
- CharSequence[] smartReplies = new String[] {"Reply1", "Reply2"};
- setupAppGeneratedReplies(smartReplies);
-
- NotificationContentView.SmartRepliesAndActions repliesAndActions =
- NotificationContentView.chooseSmartRepliesAndActions(mSmartReplyConstants, mEntry);
-
- assertThat(repliesAndActions.smartReplies.choices).isEqualTo(smartReplies);
- assertThat(repliesAndActions.smartReplies.fromAssistant).isFalse();
- assertThat(repliesAndActions.smartActions).isNull();
- }
-
- @Test
- public void chooseSmartRepliesAndActions_appGeneratedSmartRepliesAndActions() {
- CharSequence[] smartReplies = new String[] {"Reply1", "Reply2"};
- List<Notification.Action> smartActions =
- createActions(new String[] {"Test Action 1", "Test Action 2"});
- setupAppGeneratedSuggestions(smartReplies, smartActions);
-
- NotificationContentView.SmartRepliesAndActions repliesAndActions =
- NotificationContentView.chooseSmartRepliesAndActions(mSmartReplyConstants, mEntry);
-
- assertThat(repliesAndActions.smartReplies.choices).isEqualTo(smartReplies);
- assertThat(repliesAndActions.smartReplies.fromAssistant).isFalse();
- assertThat(repliesAndActions.smartActions.actions).isEqualTo(smartActions);
- assertThat(repliesAndActions.smartActions.fromAssistant).isFalse();
- }
-
- @Test
- public void chooseSmartRepliesAndActions_sysGeneratedSmartReplies() {
- // Pass a null-array as app-generated smart replies, so that we use NAS-generated smart
- // replies.
- setupAppGeneratedReplies(null /* smartReplies */);
-
- mEntry.systemGeneratedSmartReplies =
- new String[] {"Sys Smart Reply 1", "Sys Smart Reply 2"};
- NotificationContentView.SmartRepliesAndActions repliesAndActions =
- NotificationContentView.chooseSmartRepliesAndActions(mSmartReplyConstants, mEntry);
-
- assertThat(repliesAndActions.smartReplies.choices).isEqualTo(
- mEntry.systemGeneratedSmartReplies);
- assertThat(repliesAndActions.smartReplies.fromAssistant).isTrue();
- assertThat(repliesAndActions.smartActions).isNull();
- }
-
- @Test
- public void chooseSmartRepliesAndActions_noSysGeneratedSmartRepliesIfNotAllowed() {
- // Pass a null-array as app-generated smart replies, so that we use NAS-generated smart
- // replies.
- setupAppGeneratedReplies(null /* smartReplies */, false /* allowSystemGeneratedReplies */);
-
- mEntry.systemGeneratedSmartReplies =
- new String[] {"Sys Smart Reply 1", "Sys Smart Reply 2"};
- NotificationContentView.SmartRepliesAndActions repliesAndActions =
- NotificationContentView.chooseSmartRepliesAndActions(mSmartReplyConstants, mEntry);
-
- assertThat(repliesAndActions.smartReplies).isNull();
- assertThat(repliesAndActions.smartActions).isNull();
- }
-
- @Test
- public void chooseSmartRepliesAndActions_sysGeneratedSmartActions() {
- // Pass a null-array as app-generated smart replies, so that we use NAS-generated smart
- // actions.
- setupAppGeneratedReplies(null /* smartReplies */);
-
- mEntry.systemGeneratedSmartActions =
- createActions(new String[] {"Sys Smart Action 1", "Sys Smart Action 2"});
- NotificationContentView.SmartRepliesAndActions repliesAndActions =
- NotificationContentView.chooseSmartRepliesAndActions(mSmartReplyConstants, mEntry);
-
- assertThat(repliesAndActions.smartReplies).isNull();
- assertThat(repliesAndActions.smartActions.actions)
- .isEqualTo(mEntry.systemGeneratedSmartActions);
- assertThat(repliesAndActions.smartActions.fromAssistant).isTrue();
- }
-
- @Test
- public void chooseSmartRepliesAndActions_appGenPreferredOverSysGen() {
- CharSequence[] appGenSmartReplies = new String[] {"Reply1", "Reply2"};
- // Pass a null-array as app-generated smart replies, so that we use NAS-generated smart
- // replies.
- List<Notification.Action> appGenSmartActions =
- createActions(new String[] {"Test Action 1", "Test Action 2"});
- setupAppGeneratedSuggestions(appGenSmartReplies, appGenSmartActions);
-
- mEntry.systemGeneratedSmartReplies =
- new String[] {"Sys Smart Reply 1", "Sys Smart Reply 2"};
- mEntry.systemGeneratedSmartActions =
- createActions(new String[] {"Sys Smart Action 1", "Sys Smart Action 2"});
-
- NotificationContentView.SmartRepliesAndActions repliesAndActions =
- NotificationContentView.chooseSmartRepliesAndActions(mSmartReplyConstants, mEntry);
-
- assertThat(repliesAndActions.smartReplies.choices).isEqualTo(appGenSmartReplies);
- assertThat(repliesAndActions.smartReplies.fromAssistant).isFalse();
- assertThat(repliesAndActions.smartActions.actions).isEqualTo(appGenSmartActions);
- assertThat(repliesAndActions.smartActions.fromAssistant).isFalse();
- }
-
- @Test
- public void chooseSmartRepliesAndActions_disallowSysGenSmartActions() {
- // Pass a null-array as app-generated smart replies, so that we use NAS-generated smart
- // actions.
- setupAppGeneratedReplies(null /* smartReplies */, false /* allowSystemGeneratedReplies */);
- when(mNotification.getAllowSystemGeneratedContextualActions()).thenReturn(false);
- mEntry.systemGeneratedSmartReplies =
- new String[] {"Sys Smart Reply 1", "Sys Smart Reply 2"};
- mEntry.systemGeneratedSmartActions =
- createActions(new String[] {"Sys Smart Action 1", "Sys Smart Action 2"});
-
- NotificationContentView.SmartRepliesAndActions repliesAndActions =
- NotificationContentView.chooseSmartRepliesAndActions(mSmartReplyConstants, mEntry);
-
- assertThat(repliesAndActions.smartActions).isNull();
- assertThat(repliesAndActions.smartReplies).isNull();
- }
-
- private Notification.Action.Builder createActionBuilder(String actionTitle) {
- PendingIntent pendingIntent = PendingIntent.getBroadcast(mContext, 0,
- new Intent(TEST_ACTION), 0);
- return new Notification.Action.Builder(mActionIcon, actionTitle, pendingIntent);
- }
-
- private Notification.Action createAction(String actionTitle) {
- return createActionBuilder(actionTitle).build();
- }
-
- private List<Notification.Action> createActions(String[] actionTitles) {
- List<Notification.Action> actions = new ArrayList<>();
- for (String title : actionTitles) {
- actions.add(createAction(title));
- }
- return actions;
- }
}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/InflatedSmartRepliesTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/InflatedSmartRepliesTest.java
new file mode 100644
index 000000000000..3382a906d057
--- /dev/null
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/InflatedSmartRepliesTest.java
@@ -0,0 +1,279 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.systemui.statusbar.policy;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.Mockito.when;
+
+import android.app.Notification;
+import android.app.PendingIntent;
+import android.app.RemoteInput;
+import android.content.Intent;
+import android.graphics.drawable.Icon;
+import android.service.notification.StatusBarNotification;
+import android.support.test.annotation.UiThreadTest;
+import android.support.test.filters.SmallTest;
+import android.support.test.runner.AndroidJUnit4;
+import android.util.Pair;
+
+import com.android.systemui.R;
+import com.android.systemui.SysuiTestCase;
+import com.android.systemui.statusbar.notification.collection.NotificationEntry;
+import com.android.systemui.statusbar.policy.InflatedSmartReplies.SmartRepliesAndActions;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+
+import java.util.ArrayList;
+import java.util.List;
+
+@SmallTest
+@RunWith(AndroidJUnit4.class)
+public class InflatedSmartRepliesTest extends SysuiTestCase {
+
+ private static final String TEST_ACTION = "com.android.SMART_REPLY_VIEW_ACTION";
+
+ @Mock
+ SmartReplyConstants mSmartReplyConstants;
+ @Mock
+ StatusBarNotification mStatusBarNotification;
+ @Mock
+ Notification mNotification;
+ NotificationEntry mEntry;
+ @Mock
+ RemoteInput mRemoteInput;
+ @Mock
+ RemoteInput mFreeFormRemoteInput;
+
+ private Icon mActionIcon;
+
+ @Before
+ @UiThreadTest
+ public void setUp() {
+ MockitoAnnotations.initMocks(this);
+
+ when(mNotification.getAllowSystemGeneratedContextualActions()).thenReturn(true);
+ when(mStatusBarNotification.getNotification()).thenReturn(mNotification);
+ mEntry = new NotificationEntry(mStatusBarNotification);
+ when(mSmartReplyConstants.isEnabled()).thenReturn(true);
+ mActionIcon = Icon.createWithResource(mContext, R.drawable.ic_person);
+ }
+
+ @Test
+ public void chooseSmartRepliesAndActions_smartRepliesOff_noAppGeneratedSmartSuggestions() {
+ CharSequence[] smartReplies = new String[] {"Reply1", "Reply2"};
+ List<Notification.Action> smartActions =
+ createActions(new String[] {"Test Action 1", "Test Action 2"});
+ setupAppGeneratedSuggestions(smartReplies, smartActions);
+ when(mSmartReplyConstants.isEnabled()).thenReturn(false);
+
+ SmartRepliesAndActions repliesAndActions =
+ InflatedSmartReplies.chooseSmartRepliesAndActions(mSmartReplyConstants, mEntry);
+
+ assertThat(repliesAndActions.smartReplies).isNull();
+ assertThat(repliesAndActions.smartActions).isNull();
+ }
+
+ @Test
+ public void chooseSmartRepliesAndActions_smartRepliesOff_noSystemGeneratedSmartSuggestions() {
+ mEntry.systemGeneratedSmartReplies =
+ new String[] {"Sys Smart Reply 1", "Sys Smart Reply 2"};
+ mEntry.systemGeneratedSmartActions =
+ createActions(new String[] {"Sys Smart Action 1", "Sys Smart Action 2"});
+ when(mSmartReplyConstants.isEnabled()).thenReturn(false);
+
+ SmartRepliesAndActions repliesAndActions =
+ InflatedSmartReplies.chooseSmartRepliesAndActions(mSmartReplyConstants, mEntry);
+
+ assertThat(repliesAndActions.smartReplies).isNull();
+ assertThat(repliesAndActions.smartActions).isNull();
+ }
+
+ @Test
+ public void chooseSmartRepliesAndActions_appGeneratedSmartReplies() {
+ CharSequence[] smartReplies = new String[] {"Reply1", "Reply2"};
+ setupAppGeneratedReplies(smartReplies);
+
+ SmartRepliesAndActions repliesAndActions =
+ InflatedSmartReplies.chooseSmartRepliesAndActions(mSmartReplyConstants, mEntry);
+
+ assertThat(repliesAndActions.smartReplies.choices).isEqualTo(smartReplies);
+ assertThat(repliesAndActions.smartReplies.fromAssistant).isFalse();
+ assertThat(repliesAndActions.smartActions).isNull();
+ }
+
+ @Test
+ public void chooseSmartRepliesAndActions_appGeneratedSmartRepliesAndActions() {
+ CharSequence[] smartReplies = new String[] {"Reply1", "Reply2"};
+ List<Notification.Action> smartActions =
+ createActions(new String[] {"Test Action 1", "Test Action 2"});
+ setupAppGeneratedSuggestions(smartReplies, smartActions);
+
+ SmartRepliesAndActions repliesAndActions =
+ InflatedSmartReplies.chooseSmartRepliesAndActions(mSmartReplyConstants, mEntry);
+
+ assertThat(repliesAndActions.smartReplies.choices).isEqualTo(smartReplies);
+ assertThat(repliesAndActions.smartReplies.fromAssistant).isFalse();
+ assertThat(repliesAndActions.smartActions.actions).isEqualTo(smartActions);
+ assertThat(repliesAndActions.smartActions.fromAssistant).isFalse();
+ }
+
+ @Test
+ public void chooseSmartRepliesAndActions_sysGeneratedSmartReplies() {
+ // Pass a null-array as app-generated smart replies, so that we use NAS-generated smart
+ // replies.
+ setupAppGeneratedReplies(null /* smartReplies */);
+
+ mEntry.systemGeneratedSmartReplies =
+ new String[] {"Sys Smart Reply 1", "Sys Smart Reply 2"};
+ SmartRepliesAndActions repliesAndActions =
+ InflatedSmartReplies.chooseSmartRepliesAndActions(mSmartReplyConstants, mEntry);
+
+ assertThat(repliesAndActions.smartReplies.choices).isEqualTo(
+ mEntry.systemGeneratedSmartReplies);
+ assertThat(repliesAndActions.smartReplies.fromAssistant).isTrue();
+ assertThat(repliesAndActions.smartActions).isNull();
+ }
+
+ @Test
+ public void chooseSmartRepliesAndActions_noSysGeneratedSmartRepliesIfNotAllowed() {
+ // Pass a null-array as app-generated smart replies, so that we use NAS-generated smart
+ // replies.
+ setupAppGeneratedReplies(null /* smartReplies */, false /* allowSystemGeneratedReplies */);
+
+ mEntry.systemGeneratedSmartReplies =
+ new String[] {"Sys Smart Reply 1", "Sys Smart Reply 2"};
+ SmartRepliesAndActions repliesAndActions =
+ InflatedSmartReplies.chooseSmartRepliesAndActions(mSmartReplyConstants, mEntry);
+
+ assertThat(repliesAndActions.smartReplies).isNull();
+ assertThat(repliesAndActions.smartActions).isNull();
+ }
+
+ @Test
+ public void chooseSmartRepliesAndActions_sysGeneratedSmartActions() {
+ // Pass a null-array as app-generated smart replies, so that we use NAS-generated smart
+ // actions.
+ setupAppGeneratedReplies(null /* smartReplies */);
+
+ mEntry.systemGeneratedSmartActions =
+ createActions(new String[] {"Sys Smart Action 1", "Sys Smart Action 2"});
+ SmartRepliesAndActions repliesAndActions =
+ InflatedSmartReplies.chooseSmartRepliesAndActions(mSmartReplyConstants, mEntry);
+
+ assertThat(repliesAndActions.smartReplies).isNull();
+ assertThat(repliesAndActions.smartActions.actions)
+ .isEqualTo(mEntry.systemGeneratedSmartActions);
+ assertThat(repliesAndActions.smartActions.fromAssistant).isTrue();
+ }
+
+ @Test
+ public void chooseSmartRepliesAndActions_appGenPreferredOverSysGen() {
+ CharSequence[] appGenSmartReplies = new String[] {"Reply1", "Reply2"};
+ // Pass a null-array as app-generated smart replies, so that we use NAS-generated smart
+ // replies.
+ List<Notification.Action> appGenSmartActions =
+ createActions(new String[] {"Test Action 1", "Test Action 2"});
+ setupAppGeneratedSuggestions(appGenSmartReplies, appGenSmartActions);
+
+ mEntry.systemGeneratedSmartReplies =
+ new String[] {"Sys Smart Reply 1", "Sys Smart Reply 2"};
+ mEntry.systemGeneratedSmartActions =
+ createActions(new String[] {"Sys Smart Action 1", "Sys Smart Action 2"});
+
+ SmartRepliesAndActions repliesAndActions =
+ InflatedSmartReplies.chooseSmartRepliesAndActions(mSmartReplyConstants, mEntry);
+
+ assertThat(repliesAndActions.smartReplies.choices).isEqualTo(appGenSmartReplies);
+ assertThat(repliesAndActions.smartReplies.fromAssistant).isFalse();
+ assertThat(repliesAndActions.smartActions.actions).isEqualTo(appGenSmartActions);
+ assertThat(repliesAndActions.smartActions.fromAssistant).isFalse();
+ }
+
+ @Test
+ public void chooseSmartRepliesAndActions_disallowSysGenSmartActions() {
+ // Pass a null-array as app-generated smart replies, so that we use NAS-generated smart
+ // actions.
+ setupAppGeneratedReplies(null /* smartReplies */, false /* allowSystemGeneratedReplies */);
+ when(mNotification.getAllowSystemGeneratedContextualActions()).thenReturn(false);
+ mEntry.systemGeneratedSmartReplies =
+ new String[] {"Sys Smart Reply 1", "Sys Smart Reply 2"};
+ mEntry.systemGeneratedSmartActions =
+ createActions(new String[] {"Sys Smart Action 1", "Sys Smart Action 2"});
+
+ SmartRepliesAndActions repliesAndActions =
+ InflatedSmartReplies.chooseSmartRepliesAndActions(mSmartReplyConstants, mEntry);
+
+ assertThat(repliesAndActions.smartActions).isNull();
+ assertThat(repliesAndActions.smartReplies).isNull();
+ }
+
+ private void setupAppGeneratedReplies(CharSequence[] smartReplies) {
+ setupAppGeneratedReplies(smartReplies, true /* allowSystemGeneratedReplies */);
+ }
+
+ private void setupAppGeneratedReplies(
+ CharSequence[] smartReplies, boolean allowSystemGeneratedReplies) {
+ PendingIntent pendingIntent =
+ PendingIntent.getBroadcast(mContext, 0, new Intent(TEST_ACTION), 0);
+ Notification.Action action =
+ new Notification.Action.Builder(null, "Test Action", pendingIntent).build();
+ when(mRemoteInput.getChoices()).thenReturn(smartReplies);
+ Pair<RemoteInput, Notification.Action> remoteInputActionPair =
+ Pair.create(mRemoteInput, action);
+ when(mNotification.findRemoteInputActionPair(false)).thenReturn(remoteInputActionPair);
+
+ Notification.Action freeFormRemoteInputAction =
+ createActionBuilder("Freeform Test Action")
+ .setAllowGeneratedReplies(allowSystemGeneratedReplies)
+ .build();
+ Pair<RemoteInput, Notification.Action> freeFormRemoteInputActionPair =
+ Pair.create(mFreeFormRemoteInput, freeFormRemoteInputAction);
+ when(mNotification.findRemoteInputActionPair(true)).thenReturn(
+ freeFormRemoteInputActionPair);
+
+ when(mSmartReplyConstants.requiresTargetingP()).thenReturn(false);
+ }
+
+ private void setupAppGeneratedSuggestions(
+ CharSequence[] smartReplies, List<Notification.Action> smartActions) {
+ setupAppGeneratedReplies(smartReplies);
+ when(mNotification.getContextualActions()).thenReturn(smartActions);
+ }
+
+ private Notification.Action.Builder createActionBuilder(String actionTitle) {
+ PendingIntent pendingIntent = PendingIntent.getBroadcast(mContext, 0,
+ new Intent(TEST_ACTION), 0);
+ return new Notification.Action.Builder(mActionIcon, actionTitle, pendingIntent);
+ }
+
+ private Notification.Action createAction(String actionTitle) {
+ return createActionBuilder(actionTitle).build();
+ }
+
+ private List<Notification.Action> createActions(String[] actionTitles) {
+ List<Notification.Action> actions = new ArrayList<>();
+ for (String title : actionTitles) {
+ actions.add(createAction(title));
+ }
+ return actions;
+ }
+}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/SmartReplyViewTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/SmartReplyViewTest.java
index 6793ecaabdd7..60b0d61558e8 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/SmartReplyViewTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/SmartReplyViewTest.java
@@ -113,7 +113,7 @@ public class SmartReplyViewTest extends SysuiTestCase {
mDependency.injectTestDependency(SmartReplyConstants.class, mConstants);
mContainer = new View(mContext, null);
- mView = SmartReplyView.inflate(mContext, null);
+ mView = SmartReplyView.inflate(mContext);
// Any number of replies are fine.
when(mConstants.getMinNumSystemGeneratedReplies()).thenReturn(0);
@@ -402,17 +402,18 @@ public class SmartReplyViewTest extends SysuiTestCase {
}
private void setSmartReplies(CharSequence[] choices) {
- setSmartReplies(choices, false /* fromAssistant */);
+ mView.resetSmartSuggestions(mContainer);
+ List<Button> replyButtons = inflateSmartReplies(choices, false /* fromAssistant */);
+ mView.addPreInflatedButtons(replyButtons);
}
- private void setSmartReplies(CharSequence[] choices, boolean fromAssistant) {
+ private List<Button> inflateSmartReplies(CharSequence[] choices, boolean fromAssistant) {
PendingIntent pendingIntent = PendingIntent.getBroadcast(mContext, 0,
new Intent(TEST_ACTION), 0);
RemoteInput input = new RemoteInput.Builder(TEST_RESULT_KEY).setChoices(choices).build();
SmartReplyView.SmartReplies smartReplies =
new SmartReplyView.SmartReplies(choices, input, pendingIntent, fromAssistant);
- mView.resetSmartSuggestions(mContainer);
- mView.addRepliesFromRemoteInput(smartReplies, mLogger, mEntry);
+ return mView.inflateRepliesFromRemoteInput(smartReplies, mLogger, mEntry);
}
private Notification.Action createAction(String actionTitle) {
@@ -431,11 +432,12 @@ public class SmartReplyViewTest extends SysuiTestCase {
private void setSmartActions(String[] actionTitles) {
mView.resetSmartSuggestions(mContainer);
- mView.addSmartActions(
+ List<Button> actions = mView.inflateSmartActions(
new SmartReplyView.SmartActions(createActions(actionTitles), false),
mLogger,
mEntry,
mHeadsUpManager);
+ mView.addPreInflatedButtons(actions);
}
private void setSmartRepliesAndActions(CharSequence[] choices, String[] actionTitles) {
@@ -444,12 +446,14 @@ public class SmartReplyViewTest extends SysuiTestCase {
private void setSmartRepliesAndActions(
CharSequence[] choices, String[] actionTitles, boolean fromAssistant) {
- setSmartReplies(choices, fromAssistant);
- mView.addSmartActions(
+ mView.resetSmartSuggestions(mContainer);
+ List<Button> smartSuggestions = inflateSmartReplies(choices, fromAssistant);
+ smartSuggestions.addAll(mView.inflateSmartActions(
new SmartReplyView.SmartActions(createActions(actionTitles), fromAssistant),
mLogger,
mEntry,
- mHeadsUpManager);
+ mHeadsUpManager));
+ mView.addPreInflatedButtons(smartSuggestions);
}
private ViewGroup buildExpectedView(CharSequence[] choices, int lineCount) {
@@ -485,8 +489,8 @@ public class SmartReplyViewTest extends SysuiTestCase {
SmartReplyView.SmartReplies smartReplies =
new SmartReplyView.SmartReplies(choices, null, null, false);
for (int i = 0; i < choices.length; ++i) {
- Button current = mView.inflateReplyButton(mContext, mView, i, smartReplies,
- null, null);
+ Button current = SmartReplyView.inflateReplyButton(mView, mContext, i, smartReplies,
+ null /* SmartReplyController */, null /* NotificationEntry */);
current.setPadding(paddingHorizontal, current.getPaddingTop(), paddingHorizontal,
current.getPaddingBottom());
if (previous != null) {
@@ -752,7 +756,7 @@ public class SmartReplyViewTest extends SysuiTestCase {
}
private Button inflateActionButton(Notification.Action action) {
- return mView.inflateActionButton(getContext(), mView, 0,
+ return SmartReplyView.inflateActionButton(mView, getContext(), 0,
new SmartReplyView.SmartActions(Collections.singletonList(action), false),
mLogger, mEntry, mHeadsUpManager);
}
diff --git a/proto/src/wifi.proto b/proto/src/wifi.proto
index 7bf37ff379c9..d68442fcda35 100644
--- a/proto/src/wifi.proto
+++ b/proto/src/wifi.proto
@@ -527,6 +527,12 @@ message WifiLog {
// List of NetworkSelectionExperimentDecisions stats for each experiment
repeated NetworkSelectionExperimentDecisions network_selection_experiment_decisions_list = 140;
+
+ // Network Request API surface metrics.
+ optional WifiNetworkRequestApiLog wifi_network_request_api_log = 141;
+
+ // Network Suggestion API surface metrics.
+ optional WifiNetworkSuggestionApiLog wifi_network_suggestion_api_log = 142;
}
// Information that gets logged for every WiFi connection.
@@ -2341,3 +2347,39 @@ message NetworkSelectionExperimentDecisions {
// a single network choice, since choosing not to connect to that network is a valid choice.
repeated MapEntryInt32Int32 different_selection_num_choices_counter = 4;
}
+
+// NetworkRequest API metrics.
+message WifiNetworkRequestApiLog {
+ // Number of requests via this API surface.
+ optional int32 num_request = 1;
+
+ // Histogram of requests via this API surface to number of networks matched in scan results.
+ optional HistogramBucketInt32 network_match_size_histogram = 2;
+
+ // Number of successful network connection from this API.
+ optional int32 num_connect_success = 3;
+
+ // Number of requests via this API surface that bypassed user approval.
+ optional int32 num_user_approval_bypass = 4;
+
+ // Number of requests via this API surface that was rejected by the user.
+ optional int32 num_user_reject = 5;
+
+ // Number of unique apps using this API surface.
+ optional int32 num_apps = 6;
+}
+
+// NetworkSuggestion API metrics.
+message WifiNetworkSuggestionApiLog {
+ // Number of modifications to their suggestions by apps.
+ optional int32 num_modification = 1;
+
+ // Number of successful network connection from app suggestions.
+ optional int32 num_connect_success = 2;
+
+ // Number of network connection failures from app suggestions.
+ optional int32 num_connect_failure = 3;
+
+ // Histogram for size of the network lists provided by various apps on the device.
+ repeated HistogramBucketInt32 network_list_size_histogram = 4;
+}
diff --git a/services/autofill/java/com/android/server/autofill/Session.java b/services/autofill/java/com/android/server/autofill/Session.java
index 2b94d10d6dac..7fbfc42800a4 100644
--- a/services/autofill/java/com/android/server/autofill/Session.java
+++ b/services/autofill/java/com/android/server/autofill/Session.java
@@ -335,7 +335,7 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
if (mContexts == null) {
mContexts = new ArrayList<>(1);
}
- mContexts.add(new FillContext(requestId, structure));
+ mContexts.add(new FillContext(requestId, structure, mCurrentViewId));
cancelCurrentRequestLocked();
diff --git a/services/contentsuggestions/java/com/android/server/contentsuggestions/ContentSuggestionsPerUserService.java b/services/contentsuggestions/java/com/android/server/contentsuggestions/ContentSuggestionsPerUserService.java
index 385bc6cf3932..a18686da653e 100644
--- a/services/contentsuggestions/java/com/android/server/contentsuggestions/ContentSuggestionsPerUserService.java
+++ b/services/contentsuggestions/java/com/android/server/contentsuggestions/ContentSuggestionsPerUserService.java
@@ -80,12 +80,7 @@ public final class ContentSuggestionsPerUserService extends
@Override // from PerUserSystemService
protected boolean updateLocked(boolean disabled) {
final boolean enabledChanged = super.updateLocked(disabled);
- if (enabledChanged) {
- if (!isEnabledLocked()) {
- // Clear the remote service for the next call
- mRemoteService = null;
- }
- }
+ updateRemoteServiceLocked();
return enabledChanged;
}
@@ -133,6 +128,15 @@ public final class ContentSuggestionsPerUserService extends
}
@GuardedBy("mLock")
+ private void updateRemoteServiceLocked() {
+ if (mRemoteService != null) {
+ mRemoteService.destroy();
+ mRemoteService = null;
+ }
+ }
+
+
+ @GuardedBy("mLock")
@Nullable
private RemoteContentSuggestionsService getRemoteServiceLocked() {
if (mRemoteService == null) {
diff --git a/services/core/java/com/android/server/ConnectivityService.java b/services/core/java/com/android/server/ConnectivityService.java
index c37a805bc30c..9dc673b848e5 100644
--- a/services/core/java/com/android/server/ConnectivityService.java
+++ b/services/core/java/com/android/server/ConnectivityService.java
@@ -71,6 +71,8 @@ import android.net.INetworkMonitorCallbacks;
import android.net.INetworkPolicyListener;
import android.net.INetworkPolicyManager;
import android.net.INetworkStatsService;
+import android.net.InetAddresses;
+import android.net.IpPrefix;
import android.net.LinkProperties;
import android.net.LinkProperties.CompareResult;
import android.net.MatchAllNetworkSpecifier;
@@ -1742,6 +1744,12 @@ public class ConnectivityService extends IConnectivityManager.Stub
}
}
}
+
+ @Override
+ public void onNat64PrefixEvent(int netId, boolean added,
+ String prefixString, int prefixLength) {
+ mHandler.post(() -> handleNat64PrefixEvent(netId, added, prefixString, prefixLength));
+ }
};
@VisibleForTesting
@@ -2783,6 +2791,29 @@ public class ConnectivityService extends IConnectivityManager.Stub
handleUpdateLinkProperties(nai, new LinkProperties(nai.linkProperties));
}
+ private void handleNat64PrefixEvent(int netId, boolean added, String prefixString,
+ int prefixLength) {
+ NetworkAgentInfo nai = mNetworkForNetId.get(netId);
+ if (nai == null) return;
+
+ log(String.format("NAT64 prefix %s on netId %d: %s/%d",
+ (added ? "added" : "removed"), netId, prefixString, prefixLength));
+
+ IpPrefix prefix = null;
+ if (added) {
+ try {
+ prefix = new IpPrefix(InetAddresses.parseNumericAddress(prefixString),
+ prefixLength);
+ } catch (IllegalArgumentException e) {
+ loge("Invalid NAT64 prefix " + prefixString + "/" + prefixLength);
+ return;
+ }
+ }
+
+ nai.clatd.setNat64Prefix(prefix);
+ handleUpdateLinkProperties(nai, new LinkProperties(nai.linkProperties));
+ }
+
private void updateLingerState(NetworkAgentInfo nai, long now) {
// 1. Update the linger timer. If it's changed, reschedule or cancel the alarm.
// 2. If the network was lingering and there are now requests, unlinger it.
@@ -2910,7 +2941,7 @@ public class ConnectivityService extends IConnectivityManager.Stub
e.rethrowFromSystemServer();
}
mNetworkAgentInfos.remove(nai.messenger);
- nai.maybeStopClat();
+ nai.clatd.update();
synchronized (mNetworkForNetId) {
// Remove the NetworkAgent, but don't mark the netId as
// available until we've told netd to delete it below.
@@ -4099,12 +4130,14 @@ public class ConnectivityService extends IConnectivityManager.Stub
}
/**
- * Return the information of all ongoing VPNs. This method is used by NetworkStatsService
- * and not available in ConnectivityManager.
+ * Return the information of all ongoing VPNs.
+ *
+ * <p>This method is used to update NetworkStatsService.
+ *
+ * <p>Must be called on the handler thread.
*/
- @Override
- public VpnInfo[] getAllVpnInfo() {
- enforceConnectivityInternalPermission();
+ private VpnInfo[] getAllVpnInfo() {
+ ensureRunningOnConnectivityServiceThread();
synchronized (mVpns) {
if (mLockdownEnabled) {
return new VpnInfo[0];
@@ -5256,11 +5289,10 @@ public class ConnectivityService extends IConnectivityManager.Stub
LinkProperties oldLp) {
int netId = networkAgent.network.netId;
- // The NetworkAgentInfo does not know whether clatd is running on its network or not. Before
- // we do anything else, make sure its LinkProperties are accurate.
- if (networkAgent.clatd != null) {
- networkAgent.clatd.fixupLinkProperties(oldLp, newLp);
- }
+ // The NetworkAgentInfo does not know whether clatd is running on its network or not, or
+ // whether there is a NAT64 prefix. Before we do anything else, make sure its LinkProperties
+ // are accurate.
+ networkAgent.clatd.fixupLinkProperties(oldLp, newLp);
updateInterfaces(newLp, oldLp, netId, networkAgent.networkCapabilities);
updateMtu(newLp, oldLp);
@@ -5290,8 +5322,8 @@ public class ConnectivityService extends IConnectivityManager.Stub
synchronized (networkAgent) {
networkAgent.linkProperties = newLp;
}
- // Start or stop clat accordingly to network state.
- networkAgent.updateClat(mNMS);
+ // Start or stop DNS64 detection and 464xlat according to network state.
+ networkAgent.clatd.update();
notifyIfacesChangedForNetworkStats();
if (networkAgent.everConnected) {
try {
@@ -6439,6 +6471,7 @@ public class ConnectivityService extends IConnectivityManager.Stub
* Must be called on the handler thread.
*/
private Network[] getDefaultNetworks() {
+ ensureRunningOnConnectivityServiceThread();
ArrayList<Network> defaultNetworks = new ArrayList<>();
NetworkAgentInfo defaultNetwork = getDefaultNetwork();
for (NetworkAgentInfo nai : mNetworkAgentInfos.values()) {
@@ -6454,8 +6487,15 @@ public class ConnectivityService extends IConnectivityManager.Stub
* properties tracked by NetworkStatsService on an active iface has changed.
*/
private void notifyIfacesChangedForNetworkStats() {
+ ensureRunningOnConnectivityServiceThread();
+ String activeIface = null;
+ LinkProperties activeLinkProperties = getActiveLinkProperties();
+ if (activeLinkProperties != null) {
+ activeIface = activeLinkProperties.getInterfaceName();
+ }
try {
- mStatsService.forceUpdateIfaces(getDefaultNetworks());
+ mStatsService.forceUpdateIfaces(
+ getDefaultNetworks(), getAllVpnInfo(), getAllNetworkState(), activeIface);
} catch (Exception ignored) {
}
}
diff --git a/services/core/java/com/android/server/ExtconUEventObserver.java b/services/core/java/com/android/server/ExtconUEventObserver.java
index 775e4c8cf4ed..6b42b3d06d4b 100644
--- a/services/core/java/com/android/server/ExtconUEventObserver.java
+++ b/services/core/java/com/android/server/ExtconUEventObserver.java
@@ -162,15 +162,6 @@ public abstract class ExtconUEventObserver extends UEventObserver {
/** Does the {@link /sys/class/extcon} directory exist */
public static boolean extconExists() {
File extconDir = new File("/sys/class/extcon");
- boolean retVal = extconDir.exists() && extconDir.isDirectory();
- // TODO(b/124364409): return the correct value after selinux policy is updated.
- if (retVal) {
- Slog.w(TAG, extconDir + " exists " + extconDir.exists() + " isDir "
- + extconDir.isDirectory()
- + " but reporting it does not exist until selinux policies are updated."
- + " see b/124364409"
- );
- }
- return false;
+ return extconDir.exists() && extconDir.isDirectory();
}
}
diff --git a/services/core/java/com/android/server/LocationManagerService.java b/services/core/java/com/android/server/LocationManagerService.java
index 4b8ba1056c85..d7cc19b6dbd4 100644
--- a/services/core/java/com/android/server/LocationManagerService.java
+++ b/services/core/java/com/android/server/LocationManagerService.java
@@ -337,7 +337,7 @@ public class LocationManagerService extends ILocationManager.Stub {
@Override
public void onChange(boolean selfChange) {
synchronized (mLock) {
- onProviderAllowedChangedLocked(true);
+ onProviderAllowedChangedLocked();
}
}
}, UserHandle.USER_ALL);
@@ -436,6 +436,10 @@ public class LocationManagerService extends ILocationManager.Stub {
@GuardedBy("mLock")
private void onLocationModeChangedLocked(boolean broadcast) {
+ if (D) {
+ Log.d(TAG, "location enabled is now " + isLocationEnabled());
+ }
+
for (LocationProvider p : mProviders) {
p.onLocationModeChangedLocked();
}
@@ -448,16 +452,10 @@ public class LocationManagerService extends ILocationManager.Stub {
}
@GuardedBy("mLock")
- private void onProviderAllowedChangedLocked(boolean broadcast) {
+ private void onProviderAllowedChangedLocked() {
for (LocationProvider p : mProviders) {
p.onAllowedChangedLocked();
}
-
- if (broadcast) {
- mContext.sendBroadcastAsUser(
- new Intent(LocationManager.PROVIDERS_CHANGED_ACTION),
- UserHandle.ALL);
- }
}
@GuardedBy("mLock")
@@ -827,6 +825,10 @@ public class LocationManagerService extends ILocationManager.Stub {
return;
}
+ if (D) {
+ Log.d(TAG, "foreground user is changing to " + userId);
+ }
+
// let providers know the current user is on the way out before changing the user
for (LocationProvider p : mProviders) {
p.onUserChangingLocked();
@@ -839,7 +841,12 @@ public class LocationManagerService extends ILocationManager.Stub {
// if the user changes, per-user settings may also have changed
onLocationModeChangedLocked(false);
- onProviderAllowedChangedLocked(false);
+ onProviderAllowedChangedLocked();
+
+ // always force useability to be rechecked, even if no per-user settings have changed
+ for (LocationProvider p : mProviders) {
+ p.onUseableChangedLocked(false);
+ }
}
private class LocationProvider implements AbstractLocationProvider.LocationProviderManager {
@@ -891,9 +898,13 @@ public class LocationManagerService extends ILocationManager.Stub {
public void attachLocked(AbstractLocationProvider provider) {
checkNotNull(provider);
checkState(mProvider == null);
- mProvider = provider;
- onUseableChangedLocked();
+ if (D) {
+ Log.d(TAG, mName + " provider attached");
+ }
+
+ mProvider = provider;
+ onUseableChangedLocked(false);
}
public String getName() {
@@ -1054,26 +1065,12 @@ public class LocationManagerService extends ILocationManager.Stub {
return;
}
- mEnabled = enabled;
-
- // update provider allowed settings to reflect enabled status
- if (mIsManagedBySettings) {
- if (mEnabled && !mAllowed) {
- Settings.Secure.putStringForUser(
- mContext.getContentResolver(),
- Settings.Secure.LOCATION_PROVIDERS_ALLOWED,
- "+" + mName,
- mCurrentUserId);
- } else if (!mEnabled && mAllowed) {
- Settings.Secure.putStringForUser(
- mContext.getContentResolver(),
- Settings.Secure.LOCATION_PROVIDERS_ALLOWED,
- "-" + mName,
- mCurrentUserId);
- }
+ if (D) {
+ Log.d(TAG, mName + " provider enabled is now " + mEnabled);
}
- onUseableChangedLocked();
+ mEnabled = enabled;
+ onUseableChangedLocked(false);
}
});
}
@@ -1091,41 +1088,28 @@ public class LocationManagerService extends ILocationManager.Stub {
@GuardedBy("mLock")
public void onLocationModeChangedLocked() {
- onUseableChangedLocked();
- }
-
- private boolean isAllowed() {
- return isAllowedForUser(mCurrentUserId);
- }
-
- private boolean isAllowedForUser(int userId) {
- String allowedProviders = Settings.Secure.getStringForUser(
- mContext.getContentResolver(),
- Settings.Secure.LOCATION_PROVIDERS_ALLOWED,
- userId);
- return TextUtils.delimitedStringContains(allowedProviders, ',', mName);
+ onUseableChangedLocked(false);
}
@GuardedBy("mLock")
public void onAllowedChangedLocked() {
if (mIsManagedBySettings) {
- boolean allowed = isAllowed();
+ String allowedProviders = Settings.Secure.getStringForUser(
+ mContext.getContentResolver(),
+ Settings.Secure.LOCATION_PROVIDERS_ALLOWED,
+ mCurrentUserId);
+ boolean allowed = TextUtils.delimitedStringContains(allowedProviders, ',', mName);
+
if (allowed == mAllowed) {
return;
}
- mAllowed = allowed;
- // make a best effort to keep the setting matching the real enabled state of the
- // provider so that legacy applications aren't broken.
- if (mAllowed && !mEnabled) {
- Settings.Secure.putStringForUser(
- mContext.getContentResolver(),
- Settings.Secure.LOCATION_PROVIDERS_ALLOWED,
- "-" + mName,
- mCurrentUserId);
+ if (D) {
+ Log.d(TAG, mName + " provider allowed is now " + mAllowed);
}
- onUseableChangedLocked();
+ mAllowed = allowed;
+ onUseableChangedLocked(true);
}
}
@@ -1140,17 +1124,49 @@ public class LocationManagerService extends ILocationManager.Stub {
}
@GuardedBy("mLock")
- public void onUseableChangedLocked() {
+ private boolean isUseableIgnoringAllowedLocked() {
+ return mProvider != null && mProviders.contains(this) && isLocationEnabled()
+ && mEnabled;
+ }
+
+ @GuardedBy("mLock")
+ public void onUseableChangedLocked(boolean isAllowedChanged) {
// if any property that contributes to "useability" here changes state, it MUST result
// in a direct or indrect call to onUseableChangedLocked. this allows the provider to
// guarantee that it will always eventually reach the correct state.
- boolean useable = mProvider != null
- && mProviders.contains(this) && isLocationEnabled() && mAllowed && mEnabled;
+ boolean useableIgnoringAllowed = isUseableIgnoringAllowedLocked();
+ boolean useable = useableIgnoringAllowed && mAllowed;
+
+ // update deprecated provider allowed settings for backwards compatibility, and do this
+ // even if there is no change in overall useability state. this may result in trying to
+ // overwrite the same value, but Settings handles deduping this.
+ if (mIsManagedBySettings) {
+ // a "-" change derived from the allowed setting should not be overwritten, but a
+ // "+" change should be corrected if necessary
+ if (useableIgnoringAllowed && !isAllowedChanged) {
+ Settings.Secure.putStringForUser(
+ mContext.getContentResolver(),
+ Settings.Secure.LOCATION_PROVIDERS_ALLOWED,
+ "+" + mName,
+ mCurrentUserId);
+ } else if (!useableIgnoringAllowed) {
+ Settings.Secure.putStringForUser(
+ mContext.getContentResolver(),
+ Settings.Secure.LOCATION_PROVIDERS_ALLOWED,
+ "-" + mName,
+ mCurrentUserId);
+ }
+ }
+
if (useable == mUseable) {
return;
}
mUseable = useable;
+ if (D) {
+ Log.d(TAG, mName + " provider useable is now " + mUseable);
+ }
+
if (!mUseable) {
// If any provider has been disabled, clear all last locations for all
// providers. This is to be on the safe side in case a provider has location
@@ -1160,6 +1176,10 @@ public class LocationManagerService extends ILocationManager.Stub {
}
updateProviderUseableLocked(this);
+
+ mContext.sendBroadcastAsUser(
+ new Intent(LocationManager.PROVIDERS_CHANGED_ACTION),
+ UserHandle.ALL);
}
@GuardedBy("mLock")
@@ -1720,7 +1740,7 @@ public class LocationManagerService extends ILocationManager.Stub {
mProviders.add(provider);
provider.onAllowedChangedLocked(); // allowed state may change while provider was inactive
- provider.onUseableChangedLocked();
+ provider.onUseableChangedLocked(false);
}
@GuardedBy("mLock")
@@ -1728,7 +1748,7 @@ public class LocationManagerService extends ILocationManager.Stub {
if (mProviders.remove(provider)) {
long identity = Binder.clearCallingIdentity();
try {
- provider.onUseableChangedLocked();
+ provider.onUseableChangedLocked(false);
} finally {
Binder.restoreCallingIdentity(identity);
}
@@ -2113,7 +2133,6 @@ public class LocationManagerService extends ILocationManager.Stub {
}
}
- if (D) Log.d(TAG, "provider request: " + provider + " " + providerRequest);
provider.setRequestLocked(providerRequest, worksource);
}
@@ -2507,7 +2526,6 @@ public class LocationManagerService extends ILocationManager.Stub {
@Override
public Location getLastLocation(LocationRequest r, String packageName) {
- if (D) Log.d(TAG, "getLastLocation: " + r);
synchronized (mLock) {
LocationRequest request = r != null ? r : DEFAULT_LOCATION_REQUEST;
int allowedResolutionLevel = getCallerAllowedResolutionLevel();
diff --git a/services/core/java/com/android/server/StorageManagerService.java b/services/core/java/com/android/server/StorageManagerService.java
index ada3947477de..c8e8ef862f84 100644
--- a/services/core/java/com/android/server/StorageManagerService.java
+++ b/services/core/java/com/android/server/StorageManagerService.java
@@ -205,6 +205,9 @@ class StorageManagerService extends IStorageManager.Stub
private static final boolean ENABLE_ISOLATED_STORAGE = StorageManager.hasIsolatedStorage();
+ private static final boolean ENABLE_LEGACY_GREYLIST = SystemProperties
+ .getBoolean(StorageManager.PROP_LEGACY_GREYLIST, true);
+
public static class Lifecycle extends SystemService {
private StorageManagerService mStorageManagerService;
@@ -2289,7 +2292,26 @@ class StorageManagerService extends IStorageManager.Stub
refreshIsolatedStorageSettings();
// Perform hard reboot to kick policy into place
- mContext.getSystemService(PowerManager.class).reboot(null);
+ mHandler.post(() -> {
+ mContext.getSystemService(PowerManager.class).reboot(null);
+ });
+ } finally {
+ Binder.restoreCallingIdentity(token);
+ }
+ }
+
+ if ((mask & StorageManager.DEBUG_LEGACY_GREYLIST) != 0) {
+ final boolean enabled = (flags & StorageManager.DEBUG_LEGACY_GREYLIST) != 0;
+
+ final long token = Binder.clearCallingIdentity();
+ try {
+ SystemProperties.set(StorageManager.PROP_LEGACY_GREYLIST,
+ Boolean.toString(enabled));
+
+ // Perform hard reboot to kick policy into place
+ mHandler.post(() -> {
+ mContext.getSystemService(PowerManager.class).reboot(null);
+ });
} finally {
Binder.restoreCallingIdentity(token);
}
@@ -2639,8 +2661,8 @@ class StorageManagerService extends IStorageManager.Stub
mContext.enforceCallingOrSelfPermission(Manifest.permission.CRYPT_KEEPER,
"no permission to access the crypt keeper");
- if (StorageManager.isFileEncryptedNativeOnly()) {
- // Not supported on FBE devices
+ if (!StorageManager.isBlockEncrypted()) {
+ // Only supported on FDE devices
return;
}
@@ -2663,8 +2685,8 @@ class StorageManagerService extends IStorageManager.Stub
mContext.enforceCallingOrSelfPermission(Manifest.permission.CRYPT_KEEPER,
"no permission to access the crypt keeper");
- if (StorageManager.isFileEncryptedNativeOnly()) {
- // Not supported on FBE devices
+ if (!StorageManager.isBlockEncrypted()) {
+ // Only supported on FDE devices
return null;
}
@@ -2961,7 +2983,9 @@ class StorageManagerService extends IStorageManager.Stub
@Override
public void mkdirs(String callingPkg, String appPath) {
- final int userId = UserHandle.getUserId(Binder.getCallingUid());
+ final int callingPid = Binder.getCallingPid();
+ final int callingUid = Binder.getCallingUid();
+ final int userId = UserHandle.getUserId(callingUid);
final UserEnvironment userEnv = new UserEnvironment(userId);
final String propertyName = "sys.user." + userId + ".ce_available";
@@ -2979,7 +3003,7 @@ class StorageManagerService extends IStorageManager.Stub
// Validate that reported package name belongs to caller
final AppOpsManager appOps = (AppOpsManager) mContext.getSystemService(
Context.APP_OPS_SERVICE);
- appOps.checkPackage(Binder.getCallingUid(), callingPkg);
+ appOps.checkPackage(callingUid, callingPkg);
File appFile = null;
try {
@@ -2998,11 +3022,13 @@ class StorageManagerService extends IStorageManager.Stub
appPath = appPath + "/";
}
+ final String systemPath = translateAppToSystem(appPath, callingPid, callingUid);
+
try {
- mVold.mkdirs(appPath);
+ mVold.mkdirs(systemPath);
return;
} catch (Exception e) {
- throw new IllegalStateException("Failed to prepare " + appPath + ": " + e);
+ throw new IllegalStateException("Failed to prepare " + systemPath + ": " + e);
}
}
@@ -3675,16 +3701,17 @@ class StorageManagerService extends IStorageManager.Stub
} else if (mPmInternal.isInstantApp(packageName, UserHandle.getUserId(uid))) {
return Zygote.MOUNT_EXTERNAL_NONE;
} else {
- // STOPSHIP: remove this temporary workaround once developers
- // fix bugs where they're opening _data paths in native code
- switch (packageName) {
- case "com.facebook.katana": // b/123996076
- case "jp.naver.line.android": // b/124767356
- case "com.mxtech.videoplayer.ad": // b/124531483
- return Zygote.MOUNT_EXTERNAL_LEGACY;
- default:
- return Zygote.MOUNT_EXTERNAL_WRITE;
+ if (ENABLE_LEGACY_GREYLIST) {
+ // STOPSHIP: remove this temporary workaround once developers
+ // fix bugs where they're opening _data paths in native code
+ switch (packageName) {
+ case "com.facebook.katana": // b/123996076
+ case "jp.naver.line.android": // b/124767356
+ case "com.mxtech.videoplayer.ad": // b/124531483
+ return Zygote.MOUNT_EXTERNAL_LEGACY;
+ }
}
+ return Zygote.MOUNT_EXTERNAL_WRITE;
}
} catch (RemoteException e) {
// Should not happen
diff --git a/services/core/java/com/android/server/TelephonyRegistry.java b/services/core/java/com/android/server/TelephonyRegistry.java
index 5633082ce4b3..0955cc56fe14 100644
--- a/services/core/java/com/android/server/TelephonyRegistry.java
+++ b/services/core/java/com/android/server/TelephonyRegistry.java
@@ -1455,7 +1455,7 @@ public class TelephonyRegistry extends ITelephonyRegistry.Stub {
synchronized (mRecords) {
mPreciseDataConnectionState = new PreciseDataConnectionState(
TelephonyManager.DATA_UNKNOWN,TelephonyManager.NETWORK_TYPE_UNKNOWN,
- ApnSetting.getApnTypesBitmaskFromString(apnType), "", null,
+ ApnSetting.getApnTypesBitmaskFromString(apnType), null, null,
DataFailCause.NONE);
for (Record r : mRecords) {
if (r.matchPhoneStateListenerEvent(
@@ -1471,7 +1471,7 @@ public class TelephonyRegistry extends ITelephonyRegistry.Stub {
}
broadcastDataConnectionFailed(apnType, subId);
broadcastPreciseDataConnectionStateChanged(TelephonyManager.DATA_UNKNOWN,
- TelephonyManager.NETWORK_TYPE_UNKNOWN, apnType, "", null,
+ TelephonyManager.NETWORK_TYPE_UNKNOWN, apnType, null, null,
DataFailCause.NONE);
}
diff --git a/services/core/java/com/android/server/am/ActiveServices.java b/services/core/java/com/android/server/am/ActiveServices.java
index fb541e00f588..346492fccc21 100644
--- a/services/core/java/com/android/server/am/ActiveServices.java
+++ b/services/core/java/com/android/server/am/ActiveServices.java
@@ -933,6 +933,27 @@ public final class ActiveServices {
}
}
+ /**
+ * Return the current foregroundServiceType of the ServiceRecord.
+ * @param className ComponentName of the Service class.
+ * @param token IBinder token.
+ * @return current foreground service type.
+ */
+ public int getForegroundServiceTypeLocked(ComponentName className, IBinder token) {
+ final int userId = UserHandle.getCallingUserId();
+ final long origId = Binder.clearCallingIdentity();
+ int ret = ServiceInfo.FOREGROUND_SERVICE_TYPE_NONE;
+ try {
+ ServiceRecord r = findServiceLocked(className, token, userId);
+ if (r != null) {
+ ret = r.foregroundServiceType;
+ }
+ } finally {
+ Binder.restoreCallingIdentity(origId);
+ }
+ return ret;
+ }
+
boolean foregroundAppShownEnoughLocked(ActiveForegroundApp aa, long nowElapsed) {
if (DEBUG_FOREGROUND_SERVICE) Slog.d(TAG, "Shown enough: pkg=" + aa.mPackageName + ", uid="
+ aa.mUid);
diff --git a/services/core/java/com/android/server/am/ActivityManagerConstants.java b/services/core/java/com/android/server/am/ActivityManagerConstants.java
index de41152570d8..415a8927295d 100644
--- a/services/core/java/com/android/server/am/ActivityManagerConstants.java
+++ b/services/core/java/com/android/server/am/ActivityManagerConstants.java
@@ -16,8 +16,6 @@
package com.android.server.am;
-import static android.provider.DeviceConfig.ActivityManager.KEY_MAX_CACHED_PROCESSES;
-
import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_POWER_QUICK;
import android.app.ActivityThread;
@@ -105,6 +103,12 @@ final class ActivityManagerConstants extends ContentObserver {
private static final long DEFAULT_MEMORY_INFO_THROTTLE_TIME = 5*60*1000;
private static final long DEFAULT_TOP_TO_FGS_GRACE_DURATION = 15 * 1000;
+ // Flag stored in the DeviceConfig API.
+ /**
+ * Maximum number of cached processes.
+ */
+ private static final String KEY_MAX_CACHED_PROCESSES = "max_cached_processes";
+
// Maximum number of cached processes we will allow.
public int MAX_CACHED_PROCESSES = DEFAULT_MAX_CACHED_PROCESSES;
@@ -292,7 +296,7 @@ final class ActivityManagerConstants extends ContentObserver {
updateConstants();
updateActivityStartsLoggingEnabled();
updateBackgroundActivityStartsEnabled();
- DeviceConfig.addOnPropertyChangedListener(DeviceConfig.ActivityManager.NAMESPACE,
+ DeviceConfig.addOnPropertyChangedListener(DeviceConfig.NAMESPACE_ACTIVITY_MANAGER,
ActivityThread.currentApplication().getMainExecutor(),
mOnDeviceConfigChangedListener);
updateMaxCachedProcesses();
@@ -412,7 +416,7 @@ final class ActivityManagerConstants extends ContentObserver {
private void updateMaxCachedProcesses() {
String maxCachedProcessesFlag = DeviceConfig.getProperty(
- DeviceConfig.ActivityManager.NAMESPACE, KEY_MAX_CACHED_PROCESSES);
+ DeviceConfig.NAMESPACE_ACTIVITY_MANAGER, KEY_MAX_CACHED_PROCESSES);
try {
CUR_MAX_CACHED_PROCESSES = mOverrideMaxCachedProcesses < 0
? (TextUtils.isEmpty(maxCachedProcessesFlag)
diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java
index f2902b172502..fe85d231b903 100644
--- a/services/core/java/com/android/server/am/ActivityManagerService.java
+++ b/services/core/java/com/android/server/am/ActivityManagerService.java
@@ -13586,6 +13586,13 @@ public class ActivityManagerService extends IActivityManager.Stub
}
@Override
+ public int getForegroundServiceType(ComponentName className, IBinder token) {
+ synchronized (this) {
+ return mServices.getForegroundServiceTypeLocked(className, token);
+ }
+ }
+
+ @Override
public int handleIncomingUser(int callingPid, int callingUid, int userId, boolean allowAll,
boolean requireFull, String name, String callerPackage) {
return mUserController.handleIncomingUser(callingPid, callingUid, userId, allowAll,
diff --git a/services/core/java/com/android/server/am/AppCompactor.java b/services/core/java/com/android/server/am/AppCompactor.java
index 17ffd9c5e093..1f2116065bc1 100644
--- a/services/core/java/com/android/server/am/AppCompactor.java
+++ b/services/core/java/com/android/server/am/AppCompactor.java
@@ -17,14 +17,6 @@
package com.android.server.am;
import static android.os.Process.THREAD_PRIORITY_FOREGROUND;
-import static android.provider.DeviceConfig.ActivityManager.KEY_COMPACT_ACTION_1;
-import static android.provider.DeviceConfig.ActivityManager.KEY_COMPACT_ACTION_2;
-import static android.provider.DeviceConfig.ActivityManager.KEY_COMPACT_STATSD_SAMPLE_RATE;
-import static android.provider.DeviceConfig.ActivityManager.KEY_COMPACT_THROTTLE_1;
-import static android.provider.DeviceConfig.ActivityManager.KEY_COMPACT_THROTTLE_2;
-import static android.provider.DeviceConfig.ActivityManager.KEY_COMPACT_THROTTLE_3;
-import static android.provider.DeviceConfig.ActivityManager.KEY_COMPACT_THROTTLE_4;
-import static android.provider.DeviceConfig.ActivityManager.KEY_USE_COMPACTION;
import android.app.ActivityManager;
import android.app.ActivityThread;
@@ -51,6 +43,17 @@ import java.util.Random;
public final class AppCompactor {
+ // Flags stored in the DeviceConfig API.
+ @VisibleForTesting static final String KEY_USE_COMPACTION = "use_compaction";
+ @VisibleForTesting static final String KEY_COMPACT_ACTION_1 = "compact_action_1";
+ @VisibleForTesting static final String KEY_COMPACT_ACTION_2 = "compact_action_2";
+ @VisibleForTesting static final String KEY_COMPACT_THROTTLE_1 = "compact_throttle_1";
+ @VisibleForTesting static final String KEY_COMPACT_THROTTLE_2 = "compact_throttle_2";
+ @VisibleForTesting static final String KEY_COMPACT_THROTTLE_3 = "compact_throttle_3";
+ @VisibleForTesting static final String KEY_COMPACT_THROTTLE_4 = "compact_throttle_4";
+ @VisibleForTesting static final String KEY_COMPACT_STATSD_SAMPLE_RATE =
+ "compact_statsd_sample_rate";
+
// Phenotype sends int configurations and we map them to the strings we'll use on device,
// preventing a weird string value entering the kernel.
private static final int COMPACT_ACTION_FILE_FLAG = 1;
@@ -165,7 +168,7 @@ public final class AppCompactor {
* starts the background thread if necessary.
*/
public void init() {
- DeviceConfig.addOnPropertyChangedListener(DeviceConfig.ActivityManager.NAMESPACE,
+ DeviceConfig.addOnPropertyChangedListener(DeviceConfig.NAMESPACE_ACTIVITY_MANAGER,
ActivityThread.currentApplication().getMainExecutor(), mOnFlagsChangedListener);
synchronized (mPhenotypeFlagLock) {
updateUseCompaction();
@@ -228,7 +231,7 @@ public final class AppCompactor {
@GuardedBy("mPhenotypeFlagLock")
private void updateUseCompaction() {
String useCompactionFlag =
- DeviceConfig.getProperty(DeviceConfig.ActivityManager.NAMESPACE,
+ DeviceConfig.getProperty(DeviceConfig.NAMESPACE_ACTIVITY_MANAGER,
KEY_USE_COMPACTION);
mUseCompaction = TextUtils.isEmpty(useCompactionFlag)
? DEFAULT_USE_COMPACTION : Boolean.parseBoolean(useCompactionFlag);
@@ -241,10 +244,10 @@ public final class AppCompactor {
@GuardedBy("mPhenotypeFlagLock")
private void updateCompactionActions() {
String compactAction1Flag =
- DeviceConfig.getProperty(DeviceConfig.ActivityManager.NAMESPACE,
+ DeviceConfig.getProperty(DeviceConfig.NAMESPACE_ACTIVITY_MANAGER,
KEY_COMPACT_ACTION_1);
String compactAction2Flag =
- DeviceConfig.getProperty(DeviceConfig.ActivityManager.NAMESPACE,
+ DeviceConfig.getProperty(DeviceConfig.NAMESPACE_ACTIVITY_MANAGER,
KEY_COMPACT_ACTION_2);
int compactAction1 = DEFAULT_COMPACT_ACTION_1;
@@ -271,16 +274,16 @@ public final class AppCompactor {
private void updateCompactionThrottles() {
boolean useThrottleDefaults = false;
String throttleSomeSomeFlag =
- DeviceConfig.getProperty(DeviceConfig.ActivityManager.NAMESPACE,
+ DeviceConfig.getProperty(DeviceConfig.NAMESPACE_ACTIVITY_MANAGER,
KEY_COMPACT_THROTTLE_1);
String throttleSomeFullFlag =
- DeviceConfig.getProperty(DeviceConfig.ActivityManager.NAMESPACE,
+ DeviceConfig.getProperty(DeviceConfig.NAMESPACE_ACTIVITY_MANAGER,
KEY_COMPACT_THROTTLE_2);
String throttleFullSomeFlag =
- DeviceConfig.getProperty(DeviceConfig.ActivityManager.NAMESPACE,
+ DeviceConfig.getProperty(DeviceConfig.NAMESPACE_ACTIVITY_MANAGER,
KEY_COMPACT_THROTTLE_3);
String throttleFullFullFlag =
- DeviceConfig.getProperty(DeviceConfig.ActivityManager.NAMESPACE,
+ DeviceConfig.getProperty(DeviceConfig.NAMESPACE_ACTIVITY_MANAGER,
KEY_COMPACT_THROTTLE_4);
if (TextUtils.isEmpty(throttleSomeSomeFlag) || TextUtils.isEmpty(throttleSomeFullFlag)
@@ -309,7 +312,7 @@ public final class AppCompactor {
@GuardedBy("mPhenotypeFlagLock")
private void updateStatsdSampleRate() {
- String sampleRateFlag = DeviceConfig.getProperty(DeviceConfig.ActivityManager.NAMESPACE,
+ String sampleRateFlag = DeviceConfig.getProperty(DeviceConfig.NAMESPACE_ACTIVITY_MANAGER,
KEY_COMPACT_STATSD_SAMPLE_RATE);
try {
mStatsdSampleRate = TextUtils.isEmpty(sampleRateFlag)
diff --git a/services/core/java/com/android/server/audio/AudioService.java b/services/core/java/com/android/server/audio/AudioService.java
index 5d802a76ae95..6bd412bcd536 100644
--- a/services/core/java/com/android/server/audio/AudioService.java
+++ b/services/core/java/com/android/server/audio/AudioService.java
@@ -89,6 +89,8 @@ import android.media.audiopolicy.AudioMix;
import android.media.audiopolicy.AudioPolicy;
import android.media.audiopolicy.AudioPolicyConfig;
import android.media.audiopolicy.AudioProductStrategies;
+import android.media.audiopolicy.AudioVolumeGroup;
+import android.media.audiopolicy.AudioVolumeGroups;
import android.media.audiopolicy.IAudioPolicyCallback;
import android.media.projection.IMediaProjection;
import android.media.projection.IMediaProjectionManager;
@@ -128,6 +130,7 @@ import android.widget.Toast;
import com.android.internal.annotations.GuardedBy;
import com.android.internal.util.DumpUtils;
+import com.android.internal.util.Preconditions;
import com.android.internal.util.XmlUtils;
import com.android.server.EventLogTags;
import com.android.server.LocalServices;
@@ -277,6 +280,8 @@ public class AudioService extends IAudioService.Stub
/** @see AudioProductStrategies */
private static AudioProductStrategies sAudioProductStrategies;
+ /** @see AudioVolumeGroups */
+ private static AudioVolumeGroups sAudioVolumeGroups;
private int mMode = AudioSystem.MODE_NORMAL;
// protects mRingerMode
@@ -629,6 +634,7 @@ public class AudioService extends IAudioService.Stub
mHasVibrator = mVibrator == null ? false : mVibrator.hasVibrator();
sAudioProductStrategies = new AudioProductStrategies();
+ sAudioVolumeGroups = new AudioVolumeGroups();
// Initialize volume
int maxCallVolume = SystemProperties.getInt("ro.config.vc_call_vol_steps", -1);
@@ -1002,6 +1008,14 @@ public class AudioService extends IAudioService.Stub
return sAudioProductStrategies;
}
+ /**
+ * @return the {@link android.media.audiopolicy.AudioVolumeGroups} discovered from the
+ * platform configuration file.
+ */
+ public @NonNull AudioVolumeGroups listAudioVolumeGroups() {
+ return sAudioVolumeGroups;
+ }
+
private void checkAllAliasStreamVolumes() {
synchronized (mSettingsLock) {
synchronized (VolumeStreamState.class) {
@@ -1892,6 +1906,62 @@ public class AudioService extends IAudioService.Stub
mStreamStates[stream].mute(index == 0);
}
+ private void enforceModifyAudioRoutingPermission() {
+ if (mContext.checkCallingPermission(
+ android.Manifest.permission.MODIFY_AUDIO_ROUTING)
+ != PackageManager.PERMISSION_GRANTED) {
+ throw new SecurityException("Missing MODIFY_AUDIO_ROUTING permission");
+ }
+ }
+
+ /** @see AudioManager#setVolumeIndexForAttributes(attr, int, int) */
+ public void setVolumeIndexForAttributes(@NonNull AudioAttributes attr, int index, int flags,
+ String callingPackage) {
+ enforceModifyAudioRoutingPermission();
+ Preconditions.checkNotNull(attr, "attr must not be null");
+ // @todo not hold the caller context, post message
+ int stream = sAudioProductStrategies.getLegacyStreamTypeForAudioAttributes(attr);
+ final int device = getDeviceForStream(stream);
+
+ int oldIndex = AudioSystem.getVolumeIndexForAttributes(attr, device);
+
+ AudioSystem.setVolumeIndexForAttributes(attr, index, device);
+
+ final int volumeGroup = sAudioProductStrategies.getVolumeGroupIdForAttributes(attr);
+ final AudioVolumeGroup avg = sAudioVolumeGroups.getById(volumeGroup);
+ if (avg == null) {
+ return;
+ }
+ for (final int groupedStream : avg.getLegacyStreamTypes()) {
+ setStreamVolume(stream, index, flags, callingPackage, callingPackage,
+ Binder.getCallingUid());
+ }
+ }
+
+ /** @see AudioManager#getVolumeIndexForAttributes(attr) */
+ public int getVolumeIndexForAttributes(@NonNull AudioAttributes attr) {
+ enforceModifyAudioRoutingPermission();
+ Preconditions.checkNotNull(attr, "attr must not be null");
+ int stream = sAudioProductStrategies.getLegacyStreamTypeForAudioAttributes(attr);
+ final int device = getDeviceForStream(stream);
+
+ return AudioSystem.getVolumeIndexForAttributes(attr, device);
+ }
+
+ /** @see AudioManager#getMaxVolumeIndexForAttributes(attr) */
+ public int getMaxVolumeIndexForAttributes(@NonNull AudioAttributes attr) {
+ enforceModifyAudioRoutingPermission();
+ Preconditions.checkNotNull(attr, "attr must not be null");
+ return AudioSystem.getMaxVolumeIndexForAttributes(attr);
+ }
+
+ /** @see AudioManager#getMinVolumeIndexForAttributes(attr) */
+ public int getMinVolumeIndexForAttributes(@NonNull AudioAttributes attr) {
+ enforceModifyAudioRoutingPermission();
+ Preconditions.checkNotNull(attr, "attr must not be null");
+ return AudioSystem.getMinVolumeIndexForAttributes(attr);
+ }
+
/** @see AudioManager#setStreamVolume(int, int, int) */
public void setStreamVolume(int streamType, int index, int flags, String callingPackage) {
if ((streamType == AudioManager.STREAM_ACCESSIBILITY) && !canChangeAccessibilityVolume()) {
diff --git a/services/core/java/com/android/server/biometrics/ClientMonitor.java b/services/core/java/com/android/server/biometrics/ClientMonitor.java
index 89fa2de92c1c..87b9eaaa9cbb 100644
--- a/services/core/java/com/android/server/biometrics/ClientMonitor.java
+++ b/services/core/java/com/android/server/biometrics/ClientMonitor.java
@@ -158,6 +158,7 @@ public abstract class ClientMonitor extends LoggableMonitor implements IBinder.D
*/
public boolean onAcquired(int acquiredInfo, int vendorCode) {
super.logOnAcquired(acquiredInfo, vendorCode, getTargetUserId());
+ if (DEBUG) Slog.v(getLogTag(), "Acquired: " + acquiredInfo + " " + vendorCode);
try {
if (mListener != null) {
mListener.onAcquired(getHalDeviceId(), acquiredInfo, vendorCode);
diff --git a/services/core/java/com/android/server/connectivity/Nat464Xlat.java b/services/core/java/com/android/server/connectivity/Nat464Xlat.java
index 9d9b1cfdf6e2..2646d7669d79 100644
--- a/services/core/java/com/android/server/connectivity/Nat464Xlat.java
+++ b/services/core/java/com/android/server/connectivity/Nat464Xlat.java
@@ -18,19 +18,24 @@ package com.android.server.connectivity;
import android.net.ConnectivityManager;
import android.net.INetd;
+import android.net.InetAddresses;
import android.net.InterfaceConfiguration;
+import android.net.IpPrefix;
import android.net.LinkAddress;
import android.net.LinkProperties;
import android.net.NetworkInfo;
import android.net.RouteInfo;
import android.os.INetworkManagementService;
import android.os.RemoteException;
+import android.os.ServiceSpecificException;
import android.util.Slog;
+import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.util.ArrayUtils;
import com.android.server.net.BaseNetworkObserver;
import java.net.Inet4Address;
+import java.net.Inet6Address;
import java.util.Objects;
/**
@@ -67,15 +72,16 @@ public class Nat464Xlat extends BaseNetworkObserver {
private final NetworkAgentInfo mNetwork;
private enum State {
- IDLE, // start() not called. Base iface and stacked iface names are null.
- STARTING, // start() called. Base iface and stacked iface names are known.
- RUNNING, // start() called, and the stacked iface is known to be up.
- STOPPING; // stop() called, this Nat464Xlat is still registered as a network observer for
- // the stacked interface.
+ IDLE, // start() not called. Base iface and stacked iface names are null.
+ DISCOVERING, // same as IDLE, except prefix discovery in progress.
+ STARTING, // start() called. Base iface and stacked iface names are known.
+ RUNNING, // start() called, and the stacked iface is known to be up.
}
+ private IpPrefix mNat64Prefix;
private String mBaseIface;
private String mIface;
+ private Inet6Address mIPv6Address;
private State mState = State.IDLE;
public Nat464Xlat(NetworkAgentInfo nai, INetd netd, INetworkManagementService nmService) {
@@ -85,20 +91,51 @@ public class Nat464Xlat extends BaseNetworkObserver {
}
/**
- * Determines whether a network requires clat.
+ * Whether to attempt 464xlat on this network. This is true for an IPv6-only network that is
+ * currently connected and where the NetworkAgent has not disabled 464xlat. It is the signal to
+ * enable NAT64 prefix discovery.
+ *
* @param network the NetworkAgentInfo corresponding to the network.
* @return true if the network requires clat, false otherwise.
*/
- public static boolean requiresClat(NetworkAgentInfo nai) {
+ @VisibleForTesting
+ protected static boolean requiresClat(NetworkAgentInfo nai) {
// TODO: migrate to NetworkCapabilities.TRANSPORT_*.
final boolean supported = ArrayUtils.contains(NETWORK_TYPES, nai.networkInfo.getType());
final boolean connected = ArrayUtils.contains(NETWORK_STATES, nai.networkInfo.getState());
- // We only run clat on networks that don't have a native IPv4 address.
- final boolean hasIPv4Address =
- (nai.linkProperties != null) && nai.linkProperties.hasIPv4Address();
- final boolean skip464xlat =
- (nai.netMisc() != null) && nai.netMisc().skip464xlat;
- return supported && connected && !hasIPv4Address && !skip464xlat;
+
+ // Only run clat on networks that have a global IPv6 address and don't have a native IPv4
+ // address.
+ LinkProperties lp = nai.linkProperties;
+ final boolean isIpv6OnlyNetwork = (lp != null) && lp.hasGlobalIPv6Address()
+ && !lp.hasIPv4Address();
+
+ // If the network tells us it doesn't use clat, respect that.
+ final boolean skip464xlat = (nai.netMisc() != null) && nai.netMisc().skip464xlat;
+
+ return supported && connected && isIpv6OnlyNetwork && !skip464xlat;
+ }
+
+ /**
+ * Whether the clat demon should be started on this network now. This is true if requiresClat is
+ * true and a NAT64 prefix has been discovered.
+ *
+ * @param nai the NetworkAgentInfo corresponding to the network.
+ * @return true if the network should start clat, false otherwise.
+ */
+ @VisibleForTesting
+ protected static boolean shouldStartClat(NetworkAgentInfo nai) {
+ LinkProperties lp = nai.linkProperties;
+ return requiresClat(nai) && lp != null && lp.getNat64Prefix() != null;
+ }
+
+ /**
+ * @return true if we have started prefix discovery and not yet stopped it (regardless of
+ * whether it is still running or has succeeded).
+ * A true result corresponds to internal states DISCOVERING, STARTING and RUNNING.
+ */
+ public boolean isPrefixDiscoveryStarted() {
+ return mState == State.DISCOVERING || isStarted();
}
/**
@@ -106,7 +143,7 @@ public class Nat464Xlat extends BaseNetworkObserver {
* A true result corresponds to internal states STARTING and RUNNING.
*/
public boolean isStarted() {
- return mState != State.IDLE;
+ return (mState == State.STARTING || mState == State.RUNNING);
}
/**
@@ -124,32 +161,31 @@ public class Nat464Xlat extends BaseNetworkObserver {
}
/**
- * @return true if clatd has been stopped.
- */
- public boolean isStopping() {
- return mState == State.STOPPING;
- }
-
- /**
* Start clatd, register this Nat464Xlat as a network observer for the stacked interface,
* and set internal state.
*/
private void enterStartingState(String baseIface) {
try {
mNMService.registerObserver(this);
- } catch(RemoteException e) {
- Slog.e(TAG,
- "startClat: Can't register interface observer for clat on " + mNetwork.name());
+ } catch (RemoteException e) {
+ Slog.e(TAG, "Can't register interface observer for clat on " + mNetwork.name());
return;
}
+
+ String addrStr = null;
try {
- mNetd.clatdStart(baseIface);
- } catch(RemoteException|IllegalStateException e) {
- Slog.e(TAG, "Error starting clatd on " + baseIface, e);
+ addrStr = mNetd.clatdStart(baseIface, mNat64Prefix.toString());
+ } catch (RemoteException | ServiceSpecificException e) {
+ Slog.e(TAG, "Error starting clatd on " + baseIface + ": " + e);
}
mIface = CLAT_PREFIX + baseIface;
mBaseIface = baseIface;
mState = State.STARTING;
+ try {
+ mIPv6Address = (Inet6Address) InetAddresses.parseNumericAddress(addrStr);
+ } catch (ClassCastException | IllegalArgumentException | NullPointerException e) {
+ Slog.e(TAG, "Invalid IPv6 address " + addrStr);
+ }
}
/**
@@ -161,37 +197,27 @@ public class Nat464Xlat extends BaseNetworkObserver {
}
/**
- * Stop clatd, and turn ND offload on if it had been turned off.
- */
- private void enterStoppingState() {
- try {
- mNetd.clatdStop(mBaseIface);
- } catch(RemoteException|IllegalStateException e) {
- Slog.e(TAG, "Error stopping clatd on " + mBaseIface, e);
- }
-
- mState = State.STOPPING;
- }
-
- /**
* Unregister as a base observer for the stacked interface, and clear internal state.
*/
- private void enterIdleState() {
+ private void leaveStartedState() {
try {
mNMService.unregisterObserver(this);
- } catch(RemoteException|IllegalStateException e) {
- Slog.e(TAG, "Error unregistering clatd observer on " + mBaseIface, e);
+ } catch (RemoteException | IllegalStateException e) {
+ Slog.e(TAG, "Error unregistering clatd observer on " + mBaseIface + ": " + e);
}
-
mIface = null;
mBaseIface = null;
mState = State.IDLE;
+ if (requiresClat(mNetwork)) {
+ mState = State.DISCOVERING;
+ } else {
+ stopPrefixDiscovery();
+ mState = State.IDLE;
+ }
}
- /**
- * Starts the clat daemon.
- */
- public void start() {
+ @VisibleForTesting
+ protected void start() {
if (isStarted()) {
Slog.e(TAG, "startClat: already started");
return;
@@ -212,28 +238,92 @@ public class Nat464Xlat extends BaseNetworkObserver {
enterStartingState(baseIface);
}
- /**
- * Stops the clat daemon.
- */
- public void stop() {
+ @VisibleForTesting
+ protected void stop() {
if (!isStarted()) {
+ Slog.e(TAG, "stopClat: already stopped");
return;
}
+
Slog.i(TAG, "Stopping clatd on " + mBaseIface);
+ try {
+ mNetd.clatdStop(mBaseIface);
+ } catch (RemoteException | ServiceSpecificException e) {
+ Slog.e(TAG, "Error stopping clatd on " + mBaseIface + ": " + e);
+ }
+
+ String iface = mIface;
+ boolean wasRunning = isRunning();
+
+ // Change state before updating LinkProperties. handleUpdateLinkProperties ends up calling
+ // fixupLinkProperties, and if at that time the state is still RUNNING, fixupLinkProperties
+ // would wrongly inform ConnectivityService that there is still a stacked interface.
+ leaveStartedState();
+
+ if (wasRunning) {
+ LinkProperties lp = new LinkProperties(mNetwork.linkProperties);
+ lp.removeStackedLink(iface);
+ mNetwork.connService().handleUpdateLinkProperties(mNetwork, lp);
+ }
+ }
+
+ private void startPrefixDiscovery() {
+ try {
+ mNetd.resolverStartPrefix64Discovery(getNetId());
+ mState = State.DISCOVERING;
+ } catch (RemoteException | ServiceSpecificException e) {
+ Slog.e(TAG, "Error starting prefix discovery on netId " + getNetId() + ": " + e);
+ }
+ }
- boolean wasStarting = isStarting();
- enterStoppingState();
- if (wasStarting) {
- enterIdleState();
+ private void stopPrefixDiscovery() {
+ try {
+ mNetd.resolverStopPrefix64Discovery(getNetId());
+ } catch (RemoteException | ServiceSpecificException e) {
+ Slog.e(TAG, "Error stopping prefix discovery on netId " + getNetId() + ": " + e);
}
}
/**
+ * Starts/stops NAT64 prefix discovery and clatd as necessary.
+ */
+ public void update() {
+ // TODO: turn this class into a proper StateMachine. // http://b/126113090
+ if (requiresClat(mNetwork)) {
+ if (!isPrefixDiscoveryStarted()) {
+ startPrefixDiscovery();
+ } else if (shouldStartClat(mNetwork)) {
+ // NAT64 prefix detected. Start clatd.
+ // TODO: support the NAT64 prefix changing after it's been discovered. There is no
+ // need to support this at the moment because it cannot happen without changes to
+ // the Dns64Configuration code in netd.
+ start();
+ } else {
+ // NAT64 prefix removed. Stop clatd and go back into DISCOVERING state.
+ stop();
+ }
+ } else {
+ // Network no longer requires clat. Stop clat and prefix discovery.
+ if (isStarted()) {
+ stop();
+ } else if (isPrefixDiscoveryStarted()) {
+ leaveStartedState();
+ }
+ }
+ }
+
+ public void setNat64Prefix(IpPrefix nat64Prefix) {
+ mNat64Prefix = nat64Prefix;
+ }
+
+ /**
* Copies the stacked clat link in oldLp, if any, to the passed LinkProperties.
* This is necessary because the LinkProperties in mNetwork come from the transport layer, which
* has no idea that 464xlat is running on top of it.
*/
public void fixupLinkProperties(LinkProperties oldLp, LinkProperties lp) {
+ lp.setNat64Prefix(mNat64Prefix);
+
if (!isRunning()) {
return;
}
@@ -272,7 +362,7 @@ public class Nat464Xlat extends BaseNetworkObserver {
try {
InterfaceConfiguration config = mNMService.getInterfaceConfig(iface);
return config.getLinkAddress();
- } catch(RemoteException|IllegalStateException e) {
+ } catch (RemoteException | IllegalStateException e) {
Slog.e(TAG, "Error getting link properties: " + e);
return null;
}
@@ -282,6 +372,20 @@ public class Nat464Xlat extends BaseNetworkObserver {
* Adds stacked link on base link and transitions to RUNNING state.
*/
private void handleInterfaceLinkStateChanged(String iface, boolean up) {
+ // TODO: if we call start(), then stop(), then start() again, and the
+ // interfaceLinkStateChanged notification for the first start is delayed past the first
+ // stop, then the code becomes out of sync with system state and will behave incorrectly.
+ //
+ // This is not trivial to fix because:
+ // 1. It is not guaranteed that start() will eventually result in the interface coming up,
+ // because there could be an error starting clat (e.g., if the interface goes down before
+ // the packet socket can be bound).
+ // 2. If start is called multiple times, there is nothing in the interfaceLinkStateChanged
+ // notification that says which start() call the interface was created by.
+ //
+ // Once this code is converted to StateMachine, it will be possible to use deferMessage to
+ // ensure it stays in STARTING state until the interfaceLinkStateChanged notification fires,
+ // and possibly use a timeout (or provide some guarantees at the lower layer) to address #1.
if (!isStarting() || !up || !Objects.equals(mIface, iface)) {
return;
}
@@ -307,20 +411,16 @@ public class Nat464Xlat extends BaseNetworkObserver {
if (!Objects.equals(mIface, iface)) {
return;
}
- if (!isRunning() && !isStopping()) {
+ if (!isRunning()) {
return;
}
Slog.i(TAG, "interface " + iface + " removed");
- if (!isStopping()) {
- // Ensure clatd is stopped if stop() has not been called: this likely means that clatd
- // has crashed.
- enterStoppingState();
- }
- enterIdleState();
- LinkProperties lp = new LinkProperties(mNetwork.linkProperties);
- lp.removeStackedLink(iface);
- mNetwork.connService().handleUpdateLinkProperties(mNetwork, lp);
+ // If we're running, and the interface was removed, then we didn't call stop(), and it's
+ // likely that clatd crashed. Ensure we call stop() so we can start clatd again. Calling
+ // stop() will also update LinkProperties, and if clatd crashed, the LinkProperties update
+ // will cause ConnectivityService to call start() again.
+ stop();
}
@Override
@@ -337,4 +437,9 @@ public class Nat464Xlat extends BaseNetworkObserver {
public String toString() {
return "mBaseIface: " + mBaseIface + ", mIface: " + mIface + ", mState: " + mState;
}
+
+ @VisibleForTesting
+ protected int getNetId() {
+ return mNetwork.network.netId;
+ }
}
diff --git a/services/core/java/com/android/server/connectivity/NetworkAgentInfo.java b/services/core/java/com/android/server/connectivity/NetworkAgentInfo.java
index cd4ce2d142bb..6ef9fbbf0da8 100644
--- a/services/core/java/com/android/server/connectivity/NetworkAgentInfo.java
+++ b/services/core/java/com/android/server/connectivity/NetworkAgentInfo.java
@@ -238,7 +238,7 @@ public class NetworkAgentInfo implements Comparable<NetworkAgentInfo> {
public final int factorySerialNumber;
// Used by ConnectivityService to keep track of 464xlat.
- public Nat464Xlat clatd;
+ public final Nat464Xlat clatd;
// Set after asynchronous creation of the NetworkMonitor.
private volatile INetworkMonitor mNetworkMonitor;
@@ -246,8 +246,6 @@ public class NetworkAgentInfo implements Comparable<NetworkAgentInfo> {
private static final String TAG = ConnectivityService.class.getSimpleName();
private static final boolean VDBG = false;
private final ConnectivityService mConnService;
- private final INetd mNetd;
- private final INetworkManagementService mNMS;
private final Context mContext;
private final Handler mHandler;
@@ -262,9 +260,8 @@ public class NetworkAgentInfo implements Comparable<NetworkAgentInfo> {
linkProperties = lp;
networkCapabilities = nc;
currentScore = score;
+ clatd = new Nat464Xlat(this, netd, nms);
mConnService = connService;
- mNetd = netd;
- mNMS = nms;
mContext = context;
mHandler = handler;
networkMisc = misc;
@@ -598,32 +595,6 @@ public class NetworkAgentInfo implements Comparable<NetworkAgentInfo> {
for (LingerTimer timer : mLingerTimers) { pw.println(timer); }
}
- public void updateClat(INetworkManagementService netd) {
- if (Nat464Xlat.requiresClat(this)) {
- maybeStartClat();
- } else {
- maybeStopClat();
- }
- }
-
- /** Ensure clat has started for this network. */
- public void maybeStartClat() {
- if (clatd != null && clatd.isStarted()) {
- return;
- }
- clatd = new Nat464Xlat(this, mNetd, mNMS);
- clatd.start();
- }
-
- /** Ensure clat has stopped for this network. */
- public void maybeStopClat() {
- if (clatd == null) {
- return;
- }
- clatd.stop();
- clatd = null;
- }
-
public String toString() {
return "NetworkAgentInfo{ ni{" + networkInfo + "} "
+ "network{" + network + "} nethandle{" + network.getNetworkHandle() + "} "
diff --git a/services/core/java/com/android/server/content/SyncManager.java b/services/core/java/com/android/server/content/SyncManager.java
index 8a208a56098f..9f80a83038af 100644
--- a/services/core/java/com/android/server/content/SyncManager.java
+++ b/services/core/java/com/android/server/content/SyncManager.java
@@ -1639,13 +1639,12 @@ public class SyncManager {
}
}
- if (syncOperation.isAppStandbyExempted()) {
- final UsageStatsManagerInternal usmi = LocalServices.getService(
- UsageStatsManagerInternal.class);
- if (usmi != null) {
- usmi.reportExemptedSyncScheduled(syncOperation.owningPackage,
- UserHandle.getUserId(syncOperation.owningUid));
- }
+ final UsageStatsManagerInternal usmi =
+ LocalServices.getService(UsageStatsManagerInternal.class);
+ if (usmi != null) {
+ usmi.reportSyncScheduled(syncOperation.owningPackage,
+ UserHandle.getUserId(syncOperation.owningUid),
+ syncOperation.isAppStandbyExempted());
}
getJobScheduler().scheduleAsPackage(b.build(), syncOperation.owningPackage,
diff --git a/services/core/java/com/android/server/display/AutomaticBrightnessController.java b/services/core/java/com/android/server/display/AutomaticBrightnessController.java
index d57431e6b58b..1f28a6cf0951 100644
--- a/services/core/java/com/android/server/display/AutomaticBrightnessController.java
+++ b/services/core/java/com/android/server/display/AutomaticBrightnessController.java
@@ -288,6 +288,10 @@ class AutomaticBrightnessController {
return mScreenAutoBrightness;
}
+ public boolean hasValidAmbientLux() {
+ return mAmbientLuxValid;
+ }
+
public float getAutomaticScreenBrightnessAdjustment() {
return mBrightnessMapper.getAutoBrightnessAdjustment();
}
@@ -648,9 +652,9 @@ class AutomaticBrightnessController {
mLightSensorWarmUpTimeConfig + mLightSensorEnableTime;
if (time < timeWhenSensorWarmedUp) {
if (mLoggingEnabled) {
- Slog.d(TAG, "updateAmbientLux: Sensor not ready yet: " +
- "time=" + time + ", " +
- "timeWhenSensorWarmedUp=" + timeWhenSensorWarmedUp);
+ Slog.d(TAG, "updateAmbientLux: Sensor not ready yet: "
+ + "time=" + time + ", "
+ + "timeWhenSensorWarmedUp=" + timeWhenSensorWarmedUp);
}
mHandler.sendEmptyMessageAtTime(MSG_UPDATE_AMBIENT_LUX,
timeWhenSensorWarmedUp);
diff --git a/services/core/java/com/android/server/display/DisplayPowerController.java b/services/core/java/com/android/server/display/DisplayPowerController.java
index 15c7ef75866f..74cda9df4323 100644
--- a/services/core/java/com/android/server/display/DisplayPowerController.java
+++ b/services/core/java/com/android/server/display/DisplayPowerController.java
@@ -874,7 +874,7 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call
// If the brightness is already set then it's been overridden by something other than the
// user, or is a temporary adjustment.
- final boolean userInitiatedChange = brightness < 0
+ boolean userInitiatedChange = brightness < 0
&& (autoBrightnessAdjustmentChanged || userSetBrightnessChanged);
boolean hadUserBrightnessPoint = false;
@@ -1010,6 +1010,12 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call
}
if (!brightnessIsTemporary) {
+ if (userInitiatedChange && (mAutomaticBrightnessController == null
+ || !mAutomaticBrightnessController.hasValidAmbientLux())) {
+ // If we don't have a valid lux reading we can't report a valid
+ // slider event so notify as if the system changed the brightness.
+ userInitiatedChange = false;
+ }
notifyBrightnessChanged(brightness, userInitiatedChange, hadUserBrightnessPoint);
}
diff --git a/services/core/java/com/android/server/location/GnssLocationProvider.java b/services/core/java/com/android/server/location/GnssLocationProvider.java
index 51563008464c..ae915037947e 100644
--- a/services/core/java/com/android/server/location/GnssLocationProvider.java
+++ b/services/core/java/com/android/server/location/GnssLocationProvider.java
@@ -687,7 +687,7 @@ public class GnssLocationProvider extends AbstractLocationProvider implements
}
}
- private void handleRequestLocation(boolean independentFromGnss) {
+ private void handleRequestLocation(boolean independentFromGnss, boolean isUserEmergency) {
if (isRequestLocationRateLimited()) {
if (DEBUG) {
Log.d(TAG, "RequestLocation is denied due to too frequent requests.");
@@ -723,9 +723,17 @@ public class GnssLocationProvider extends AbstractLocationProvider implements
String.format(
"GNSS HAL Requesting location updates from %s provider for %d millis.",
provider, durationMillis));
+
+ LocationRequest locationRequest = LocationRequest.createFromDeprecatedProvider(provider,
+ LOCATION_UPDATE_MIN_TIME_INTERVAL_MILLIS, /* minDistance= */ 0,
+ /* singleShot= */ false);
+
+ // Ignore location settings if in emergency mode.
+ if (isUserEmergency && mNIHandler.getInEmergency()) {
+ locationRequest.setLocationSettingsIgnored(true);
+ }
try {
- locationManager.requestLocationUpdates(provider,
- LOCATION_UPDATE_MIN_TIME_INTERVAL_MILLIS, /*minDistance=*/ 0,
+ locationManager.requestLocationUpdates(locationRequest,
locationListener, mHandler.getLooper());
locationListener.mNumLocationUpdateRequest++;
mHandler.postDelayed(() -> {
@@ -1828,11 +1836,13 @@ public class GnssLocationProvider extends AbstractLocationProvider implements
}
@NativeEntryPoint
- private void requestLocation(boolean independentFromGnss) {
+ private void requestLocation(boolean independentFromGnss, boolean isUserEmergency) {
if (DEBUG) {
- Log.d(TAG, "requestLocation. independentFromGnss: " + independentFromGnss);
+ Log.d(TAG, "requestLocation. independentFromGnss: " + independentFromGnss
+ + ", isUserEmergency: "
+ + isUserEmergency);
}
- sendMessage(REQUEST_LOCATION, 0, independentFromGnss);
+ sendMessage(REQUEST_LOCATION, independentFromGnss ? 1 : 0, isUserEmergency);
}
@NativeEntryPoint
@@ -1923,7 +1933,7 @@ public class GnssLocationProvider extends AbstractLocationProvider implements
mNtpTimeHelper.retrieveAndInjectNtpTime();
break;
case REQUEST_LOCATION:
- handleRequestLocation((boolean) msg.obj);
+ handleRequestLocation(msg.arg1 == 1, (boolean) msg.obj);
break;
case DOWNLOAD_XTRA_DATA:
handleDownloadXtraData();
diff --git a/services/core/java/com/android/server/media/projection/MediaProjectionManagerService.java b/services/core/java/com/android/server/media/projection/MediaProjectionManagerService.java
index fccff57e3234..270fbc68e143 100644
--- a/services/core/java/com/android/server/media/projection/MediaProjectionManagerService.java
+++ b/services/core/java/com/android/server/media/projection/MediaProjectionManagerService.java
@@ -16,17 +16,15 @@
package com.android.server.media.projection;
-import com.android.server.Watchdog;
-
import android.Manifest;
import android.app.AppOpsManager;
import android.content.Context;
import android.content.pm.PackageManager;
import android.hardware.display.DisplayManager;
import android.media.MediaRouter;
-import android.media.projection.IMediaProjectionManager;
import android.media.projection.IMediaProjection;
import android.media.projection.IMediaProjectionCallback;
+import android.media.projection.IMediaProjectionManager;
import android.media.projection.IMediaProjectionWatcherCallback;
import android.media.projection.MediaProjectionInfo;
import android.media.projection.MediaProjectionManager;
@@ -41,6 +39,7 @@ import android.util.Slog;
import com.android.internal.util.DumpUtils;
import com.android.server.SystemService;
+import com.android.server.Watchdog;
import java.io.FileDescriptor;
import java.io.PrintWriter;
@@ -361,8 +360,9 @@ public final class MediaProjectionManagerService extends SystemService
@Override // Binder call
public boolean canProjectAudio() {
- return mType == MediaProjectionManager.TYPE_MIRRORING ||
- mType == MediaProjectionManager.TYPE_PRESENTATION;
+ return mType == MediaProjectionManager.TYPE_MIRRORING
+ || mType == MediaProjectionManager.TYPE_PRESENTATION
+ || mType == MediaProjectionManager.TYPE_SCREEN_CAPTURE;
}
@Override // Binder call
diff --git a/services/core/java/com/android/server/net/NetworkStatsService.java b/services/core/java/com/android/server/net/NetworkStatsService.java
index bffd60bcb87f..205ddb07ec44 100644
--- a/services/core/java/com/android/server/net/NetworkStatsService.java
+++ b/services/core/java/com/android/server/net/NetworkStatsService.java
@@ -82,7 +82,6 @@ import android.content.IntentFilter;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageManager;
import android.net.DataUsageRequest;
-import android.net.IConnectivityManager;
import android.net.INetworkManagementEventObserver;
import android.net.INetworkStatsService;
import android.net.INetworkStatsSession;
@@ -196,8 +195,6 @@ public class NetworkStatsService extends INetworkStatsService.Stub {
private final boolean mUseBpfTrafficStats;
- private IConnectivityManager mConnManager;
-
@VisibleForTesting
public static final String ACTION_NETWORK_STATS_POLL =
"com.android.server.action.NETWORK_STATS_POLL";
@@ -259,6 +256,7 @@ public class NetworkStatsService extends INetworkStatsService.Stub {
private final ArrayMap<String, NetworkIdentitySet> mActiveUidIfaces = new ArrayMap<>();
/** Current default active iface. */
+ @GuardedBy("mStatsLock")
private String mActiveIface;
/** Set of any ifaces associated with mobile networks since boot. */
@@ -269,6 +267,10 @@ public class NetworkStatsService extends INetworkStatsService.Stub {
@GuardedBy("mStatsLock")
private Network[] mDefaultNetworks = new Network[0];
+ /** Set containing info about active VPNs and their underlying networks. */
+ @GuardedBy("mStatsLock")
+ private VpnInfo[] mVpnInfos = new VpnInfo[0];
+
private final DropBoxNonMonotonicObserver mNonMonotonicObserver =
new DropBoxNonMonotonicObserver();
@@ -382,10 +384,6 @@ public class NetworkStatsService extends INetworkStatsService.Stub {
mHandlerCallback = callback;
}
- public void bindConnectivityManager(IConnectivityManager connManager) {
- mConnManager = checkNotNull(connManager, "missing IConnectivityManager");
- }
-
public void systemReady() {
mSystemReady = true;
@@ -864,13 +862,17 @@ public class NetworkStatsService extends INetworkStatsService.Stub {
}
@Override
- public void forceUpdateIfaces(Network[] defaultNetworks) {
+ public void forceUpdateIfaces(
+ Network[] defaultNetworks,
+ VpnInfo[] vpnArray,
+ NetworkState[] networkStates,
+ String activeIface) {
mContext.enforceCallingOrSelfPermission(READ_NETWORK_USAGE_HISTORY, TAG);
assertBandwidthControlEnabled();
final long token = Binder.clearCallingIdentity();
try {
- updateIfaces(defaultNetworks);
+ updateIfaces(defaultNetworks, vpnArray, networkStates, activeIface);
} finally {
Binder.restoreCallingIdentity(token);
}
@@ -1134,11 +1136,17 @@ public class NetworkStatsService extends INetworkStatsService.Stub {
}
};
- private void updateIfaces(Network[] defaultNetworks) {
+ private void updateIfaces(
+ Network[] defaultNetworks,
+ VpnInfo[] vpnArray,
+ NetworkState[] networkStates,
+ String activeIface) {
synchronized (mStatsLock) {
mWakeLock.acquire();
try {
- updateIfacesLocked(defaultNetworks);
+ mVpnInfos = vpnArray;
+ mActiveIface = activeIface;
+ updateIfacesLocked(defaultNetworks, networkStates);
} finally {
mWakeLock.release();
}
@@ -1152,7 +1160,7 @@ public class NetworkStatsService extends INetworkStatsService.Stub {
* {@link NetworkIdentitySet}.
*/
@GuardedBy("mStatsLock")
- private void updateIfacesLocked(Network[] defaultNetworks) {
+ private void updateIfacesLocked(Network[] defaultNetworks, NetworkState[] states) {
if (!mSystemReady) return;
if (LOGV) Slog.v(TAG, "updateIfacesLocked()");
@@ -1164,18 +1172,6 @@ public class NetworkStatsService extends INetworkStatsService.Stub {
// will be persisted during next alarm poll event.
performPollLocked(FLAG_PERSIST_NETWORK);
- final NetworkState[] states;
- final LinkProperties activeLink;
- try {
- states = mConnManager.getAllNetworkState();
- activeLink = mConnManager.getActiveLinkProperties();
- } catch (RemoteException e) {
- // ignored; service lives in system_server
- return;
- }
-
- mActiveIface = activeLink != null ? activeLink.getInterfaceName() : null;
-
// Rebuild active interfaces based on connected networks
mActiveIfaces.clear();
mActiveUidIfaces.clear();
@@ -1287,7 +1283,7 @@ public class NetworkStatsService extends INetworkStatsService.Stub {
Trace.traceEnd(TRACE_TAG_NETWORK);
// For per-UID stats, pass the VPN info so VPN traffic is reattributed to responsible apps.
- VpnInfo[] vpnArray = mConnManager.getAllVpnInfo();
+ VpnInfo[] vpnArray = mVpnInfos;
Trace.traceBegin(TRACE_TAG_NETWORK, "recordUid");
mUidRecorder.recordSnapshotLocked(uidSnapshot, mActiveUidIfaces, vpnArray, currentTime);
Trace.traceEnd(TRACE_TAG_NETWORK);
diff --git a/services/core/java/com/android/server/pm/DynamicCodeLoggingService.java b/services/core/java/com/android/server/pm/DynamicCodeLoggingService.java
index d53d81cf0860..a1ff76fc8c09 100644
--- a/services/core/java/com/android/server/pm/DynamicCodeLoggingService.java
+++ b/services/core/java/com/android/server/pm/DynamicCodeLoggingService.java
@@ -61,7 +61,7 @@ public class DynamicCodeLoggingService extends JobService {
private static final Pattern EXECUTE_NATIVE_AUDIT_PATTERN =
Pattern.compile(".*\\bavc: granted \\{ execute(?:_no_trans|) \\} .*"
+ "\\bpath=(?:\"([^\" ]*)\"|([0-9A-F]+)) .*"
- + "\\bscontext=u:r:untrusted_app_2(?:5|7):.*"
+ + "\\bscontext=u:r:untrusted_app(?:_25|_27)?:.*"
+ "\\btcontext=u:object_r:app_data_file:.*"
+ "\\btclass=file\\b.*");
diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java
index 487861fa31ea..6fe085b38d40 100644
--- a/services/core/java/com/android/server/pm/PackageManagerService.java
+++ b/services/core/java/com/android/server/pm/PackageManagerService.java
@@ -1935,7 +1935,7 @@ public class PackageManagerService extends IPackageManager.Stub
final PackageSetting pkgSetting = mSettings.mPackages.get(packageName);
if (pkgSetting.getInstallReason(userId)
!= PackageManager.INSTALL_REASON_DEVICE_RESTORE) {
- setDefaultBrowserPackageName(null, userId);
+ setDefaultBrowserAsyncLPw(null, userId);
}
}
@@ -13687,6 +13687,23 @@ public class PackageManagerService extends IPackageManager.Stub
return true;
}
+ private void setDefaultBrowserAsyncLPw(@Nullable String packageName, @UserIdInt int userId) {
+ if (userId == UserHandle.USER_ALL) {
+ return;
+ }
+ if (mDefaultBrowserProvider == null) {
+ Slog.e(TAG, "mDefaultBrowserProvider is null");
+ return;
+ }
+ mDefaultBrowserProvider.setDefaultBrowserAsync(packageName, userId);
+ if (packageName != null) {
+ synchronized (mPackages) {
+ mDefaultPermissionPolicy.grantDefaultPermissionsToDefaultBrowser(packageName,
+ userId);
+ }
+ }
+ }
+
@Override
public String getDefaultBrowserPackageName(int userId) {
if (UserHandle.getCallingUserId() != userId) {
@@ -23100,6 +23117,18 @@ public class PackageManagerService extends IPackageManager.Stub
}
return 0;
}
+
+ @Override
+ public boolean[] isAudioPlaybackCaptureAllowed(String[] packageNames)
+ throws RemoteException {
+ int callingUser = UserHandle.getUserId(Binder.getCallingUid());
+ boolean[] results = new boolean[packageNames.length];
+ for (int i = results.length - 1; i >= 0; --i) {
+ ApplicationInfo appInfo = getApplicationInfo(packageNames[i], 0, callingUser);
+ results[i] = appInfo == null ? false : appInfo.isAudioPlaybackCaptureAllowed();
+ }
+ return results;
+ }
}
private class PackageManagerInternalImpl extends PackageManagerInternal {
diff --git a/services/core/java/com/android/server/pm/Settings.java b/services/core/java/com/android/server/pm/Settings.java
index 92fe377e9495..59e5d7716369 100644
--- a/services/core/java/com/android/server/pm/Settings.java
+++ b/services/core/java/com/android/server/pm/Settings.java
@@ -4372,6 +4372,7 @@ public final class Settings {
ApplicationInfo.PRIVATE_FLAG_ACTIVITIES_RESIZE_MODE_RESIZEABLE, "PRIVATE_FLAG_ACTIVITIES_RESIZE_MODE_RESIZEABLE",
ApplicationInfo.PRIVATE_FLAG_ACTIVITIES_RESIZE_MODE_RESIZEABLE_VIA_SDK_VERSION, "PRIVATE_FLAG_ACTIVITIES_RESIZE_MODE_RESIZEABLE_VIA_SDK_VERSION",
ApplicationInfo.PRIVATE_FLAG_ACTIVITIES_RESIZE_MODE_UNRESIZEABLE, "PRIVATE_FLAG_ACTIVITIES_RESIZE_MODE_UNRESIZEABLE",
+ ApplicationInfo.PRIVATE_FLAG_ALLOW_AUDIO_PLAYBACK_CAPTURE, "ALLOW_AUDIO_PLAYBACK_CAPTURE",
ApplicationInfo.PRIVATE_FLAG_BACKUP_IN_FOREGROUND, "BACKUP_IN_FOREGROUND",
ApplicationInfo.PRIVATE_FLAG_CANT_SAVE_STATE, "CANT_SAVE_STATE",
ApplicationInfo.PRIVATE_FLAG_DEFAULT_TO_DEVICE_PROTECTED_STORAGE, "DEFAULT_TO_DEVICE_PROTECTED_STORAGE",
diff --git a/services/core/java/com/android/server/power/AttentionDetector.java b/services/core/java/com/android/server/power/AttentionDetector.java
index 8740256af04d..406cbc10a8aa 100644
--- a/services/core/java/com/android/server/power/AttentionDetector.java
+++ b/services/core/java/com/android/server/power/AttentionDetector.java
@@ -19,9 +19,13 @@ package com.android.server.power;
import android.attention.AttentionManagerInternal;
import android.attention.AttentionManagerInternal.AttentionCallbackInternal;
import android.content.Context;
+import android.database.ContentObserver;
+import android.os.Handler;
import android.os.PowerManager;
import android.os.PowerManagerInternal;
import android.os.SystemClock;
+import android.os.UserHandle;
+import android.provider.Settings;
import android.service.attention.AttentionService;
import android.util.Slog;
import android.util.StatsLog;
@@ -44,6 +48,8 @@ public class AttentionDetector {
private static final String TAG = "AttentionDetector";
private static final boolean DEBUG = false;
+ private boolean mIsSettingEnabled;
+
/**
* Invoked whenever user attention is detected.
*/
@@ -128,15 +134,35 @@ public class AttentionDetector {
mWakefulness = PowerManagerInternal.WAKEFULNESS_AWAKE;
}
+ @VisibleForTesting
+ void updateEnabledFromSettings(Context context) {
+ mIsSettingEnabled = Settings.System.getIntForUser(context.getContentResolver(),
+ Settings.System.ADAPTIVE_SLEEP, 0, UserHandle.USER_CURRENT) == 1;
+ }
+
public void systemReady(Context context) {
+ updateEnabledFromSettings(context);
mAttentionManager = LocalServices.getService(AttentionManagerInternal.class);
mMaximumExtensionMillis = context.getResources().getInteger(
com.android.internal.R.integer.config_attentionMaximumExtension);
mMaxAttentionApiTimeoutMillis = context.getResources().getInteger(
com.android.internal.R.integer.config_attentionApiTimeout);
+
+ context.getContentResolver().registerContentObserver(Settings.System.getUriFor(
+ Settings.System.ADAPTIVE_SLEEP),
+ false, new ContentObserver(new Handler()) {
+ @Override
+ public void onChange(boolean selfChange) {
+ updateEnabledFromSettings(context);
+ }
+ }, UserHandle.USER_ALL);
}
public long updateUserActivity(long nextScreenDimming) {
+ if (!mIsSettingEnabled) {
+ return nextScreenDimming;
+ }
+
if (!isAttentionServiceSupported()) {
return nextScreenDimming;
}
@@ -182,7 +208,7 @@ public class AttentionDetector {
* the activity happened.
*
* @param eventTime Activity time, in uptime millis.
- * @param event Activity type as defined in {@link PowerManager}.
+ * @param event Activity type as defined in {@link PowerManager}.
* @return 0 when activity was ignored, 1 when handled, -1 when invalid.
*/
public int onUserActivity(long eventTime, int event) {
diff --git a/services/core/java/com/android/server/power/PowerManagerService.java b/services/core/java/com/android/server/power/PowerManagerService.java
index 89d24b194b13..bb23bc0e2414 100644
--- a/services/core/java/com/android/server/power/PowerManagerService.java
+++ b/services/core/java/com/android/server/power/PowerManagerService.java
@@ -715,6 +715,15 @@ public final class PowerManagerService extends SystemService
NativeWrapper createNativeWrapper() {
return new NativeWrapper();
}
+
+ WirelessChargerDetector createWirelessChargerDetector(
+ SensorManager sensorManager, SuspendBlocker suspendBlocker, Handler handler) {
+ return new WirelessChargerDetector(sensorManager, suspendBlocker, handler);
+ }
+
+ AmbientDisplayConfiguration createAmbientDisplayConfiguration(Context context) {
+ return new AmbientDisplayConfiguration(context);
+ }
}
final Constants mConstants;
@@ -747,7 +756,7 @@ public final class PowerManagerService extends SystemService
mHandlerThread.start();
mHandler = new PowerManagerHandler(mHandlerThread.getLooper());
mConstants = new Constants(mHandler);
- mAmbientDisplayConfiguration = new AmbientDisplayConfiguration(mContext);
+ mAmbientDisplayConfiguration = mInjector.createAmbientDisplayConfiguration(context);
mAttentionDetector = new AttentionDetector(this::onUserAttention, mLock);
mBatterySavingStats = new BatterySavingStats(mLock);
@@ -833,7 +842,7 @@ public final class PowerManagerService extends SystemService
mInjector.createSuspendBlocker(this, "PowerManagerService.Broadcasts"),
mPolicy);
- mWirelessChargerDetector = new WirelessChargerDetector(sensorManager,
+ mWirelessChargerDetector = mInjector.createWirelessChargerDetector(sensorManager,
mInjector.createSuspendBlocker(
this, "PowerManagerService.WirelessChargerDetector"),
mHandler);
@@ -932,7 +941,8 @@ public final class PowerManagerService extends SystemService
mContext.registerReceiver(new DockReceiver(), filter, null, mHandler);
}
- private void readConfigurationLocked() {
+ @VisibleForTesting
+ void readConfigurationLocked() {
final Resources resources = mContext.getResources();
mDecoupleHalAutoSuspendModeFromDisplayConfig = resources.getBoolean(
@@ -3865,7 +3875,8 @@ public final class PowerManagerService extends SystemService
return workSource != null ? new WorkSource(workSource) : null;
}
- private final class BatteryReceiver extends BroadcastReceiver {
+ @VisibleForTesting
+ final class BatteryReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
synchronized (mLock) {
@@ -3883,7 +3894,8 @@ public final class PowerManagerService extends SystemService
}
}
- private final class UserSwitchedReceiver extends BroadcastReceiver {
+ @VisibleForTesting
+ final class UserSwitchedReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
synchronized (mLock) {
diff --git a/services/core/java/com/android/server/power/WirelessChargerDetector.java b/services/core/java/com/android/server/power/WirelessChargerDetector.java
index 18e5ce465df6..e8e9c676135d 100644
--- a/services/core/java/com/android/server/power/WirelessChargerDetector.java
+++ b/services/core/java/com/android/server/power/WirelessChargerDetector.java
@@ -28,6 +28,8 @@ import android.util.Slog;
import android.util.TimeUtils;
import android.util.proto.ProtoOutputStream;
+import com.android.internal.annotations.VisibleForTesting;
+
import java.io.PrintWriter;
/**
@@ -70,7 +72,8 @@ import java.io.PrintWriter;
* sensor to detect this case.
* </p>
*/
-final class WirelessChargerDetector {
+@VisibleForTesting
+public class WirelessChargerDetector {
private static final String TAG = "WirelessChargerDetector";
private static final boolean DEBUG = false;
diff --git a/services/core/java/com/android/server/role/RoleManagerService.java b/services/core/java/com/android/server/role/RoleManagerService.java
index 17d3066bd37a..f533ad167761 100644
--- a/services/core/java/com/android/server/role/RoleManagerService.java
+++ b/services/core/java/com/android/server/role/RoleManagerService.java
@@ -743,6 +743,25 @@ public class RoleManagerService extends SystemService implements RoleUserState.C
return false;
}
}
+
+ @Override
+ public void setDefaultBrowserAsync(@Nullable String packageName, @UserIdInt int userId) {
+ IRoleManagerCallback callback = new IRoleManagerCallback.Stub() {
+ @Override
+ public void onSuccess() {}
+ @Override
+ public void onFailure() {
+ Slog.e(LOG_TAG, "Failed to set default browser: " + packageName);
+ }
+ };
+ if (packageName != null) {
+ getOrCreateControllerService(userId).onAddRoleHolder(RoleManager.ROLE_BROWSER,
+ packageName, 0, callback);
+ } else {
+ getOrCreateControllerService(userId).onClearRoleHolders(RoleManager.ROLE_BROWSER, 0,
+ callback);
+ }
+ }
}
private class DefaultHomeProvider implements PackageManagerInternal.DefaultHomeProvider {
diff --git a/services/core/java/com/android/server/rollback/AppDataRollbackHelper.java b/services/core/java/com/android/server/rollback/AppDataRollbackHelper.java
index e9ccea54fe99..36f18f05c23e 100644
--- a/services/core/java/com/android/server/rollback/AppDataRollbackHelper.java
+++ b/services/core/java/com/android/server/rollback/AppDataRollbackHelper.java
@@ -166,7 +166,7 @@ public class AppDataRollbackHelper {
List<RollbackData> rd = new ArrayList<>();
for (RollbackData data : availableRollbacks) {
- for (PackageRollbackInfo info : data.packages) {
+ for (PackageRollbackInfo info : data.info.getPackages()) {
final IntArray pendingBackupUsers = info.getPendingBackups();
if (pendingBackupUsers != null) {
final int idx = pendingBackupUsers.indexOf(userId);
@@ -246,13 +246,13 @@ public class AppDataRollbackHelper {
if (!pendingBackupPackages.isEmpty()) {
for (RollbackData data : pendingBackups) {
- for (PackageRollbackInfo info : data.packages) {
+ for (PackageRollbackInfo info : data.info.getPackages()) {
final IntArray pendingBackupUsers = info.getPendingBackups();
final int idx = pendingBackupUsers.indexOf(userId);
if (idx != -1) {
try {
long ceSnapshotInode = mInstaller.snapshotAppData(info.getPackageName(),
- userId, data.rollbackId, Installer.FLAG_STORAGE_CE);
+ userId, data.info.getRollbackId(), Installer.FLAG_STORAGE_CE);
info.putCeSnapshotInode(userId, ceSnapshotInode);
pendingBackupUsers.remove(idx);
} catch (InstallerException ie) {
diff --git a/services/core/java/com/android/server/rollback/RollbackData.java b/services/core/java/com/android/server/rollback/RollbackData.java
index fcd5297f1363..655bf4ab57a7 100644
--- a/services/core/java/com/android/server/rollback/RollbackData.java
+++ b/services/core/java/com/android/server/rollback/RollbackData.java
@@ -16,12 +16,11 @@
package com.android.server.rollback;
-import android.content.rollback.PackageRollbackInfo;
+import android.content.rollback.RollbackInfo;
import java.io.File;
import java.time.Instant;
import java.util.ArrayList;
-import java.util.List;
/**
* Information about a rollback available for a set of atomically installed
@@ -29,14 +28,9 @@ import java.util.List;
*/
class RollbackData {
/**
- * A unique identifier for this rollback.
+ * The rollback info for this rollback.
*/
- public final int rollbackId;
-
- /**
- * The per-package rollback information.
- */
- public final List<PackageRollbackInfo> packages = new ArrayList<>();
+ public final RollbackInfo info;
/**
* The directory where the rollback data is stored.
@@ -69,24 +63,49 @@ class RollbackData {
public int apkSessionId = -1;
/**
- * Whether this Rollback is currently in progress. This field is true from the point
- * we commit a {@code PackageInstaller} session containing these packages to the point the
- * {@code PackageInstaller} calls into the {@code onFinished} callback.
+ * True if we are expecting the package manager to call restoreUserData
+ * for this rollback because it has just been committed but the rollback
+ * has not yet been fully applied.
*/
// NOTE: All accesses to this field are from the RollbackManager handler thread.
- public boolean inProgress = false;
+ public boolean restoreUserDataInProgress = false;
- RollbackData(int rollbackId, File backupDir, int stagedSessionId, boolean isAvailable) {
- this.rollbackId = rollbackId;
+ /**
+ * Constructs a new, empty RollbackData instance.
+ *
+ * @param rollbackId the id of the rollback.
+ * @param backupDir the directory where the rollback data is stored.
+ * @param stagedSessionId the session id if this is a staged rollback, -1 otherwise.
+ */
+ RollbackData(int rollbackId, File backupDir, int stagedSessionId) {
+ this.info = new RollbackInfo(rollbackId,
+ /* packages */ new ArrayList<>(),
+ /* isStaged */ stagedSessionId != -1,
+ /* causePackages */ new ArrayList<>(),
+ /* committedSessionId */ -1);
+ this.backupDir = backupDir;
+ this.stagedSessionId = stagedSessionId;
+ this.isAvailable = (stagedSessionId == -1);
+ }
+
+ /**
+ * Constructs a RollbackData instance with full rollback data information.
+ */
+ RollbackData(RollbackInfo info, File backupDir, Instant timestamp, int stagedSessionId,
+ boolean isAvailable, int apkSessionId, boolean restoreUserDataInProgress) {
+ this.info = info;
this.backupDir = backupDir;
+ this.timestamp = timestamp;
this.stagedSessionId = stagedSessionId;
this.isAvailable = isAvailable;
+ this.apkSessionId = apkSessionId;
+ this.restoreUserDataInProgress = restoreUserDataInProgress;
}
/**
* Whether the rollback is for rollback of a staged install.
*/
public boolean isStaged() {
- return stagedSessionId != -1;
+ return info.isStaged();
}
}
diff --git a/services/core/java/com/android/server/rollback/RollbackManagerServiceImpl.java b/services/core/java/com/android/server/rollback/RollbackManagerServiceImpl.java
index 88a5fb48ada4..52d441255da6 100644
--- a/services/core/java/com/android/server/rollback/RollbackManagerServiceImpl.java
+++ b/services/core/java/com/android/server/rollback/RollbackManagerServiceImpl.java
@@ -243,8 +243,7 @@ class RollbackManagerServiceImpl extends IRollbackManager.Stub {
for (int i = 0; i < mAvailableRollbacks.size(); ++i) {
RollbackData data = mAvailableRollbacks.get(i);
if (data.isAvailable) {
- rollbacks.add(new RollbackInfo(data.rollbackId,
- data.packages, data.isStaged()));
+ rollbacks.add(data.info);
}
}
return new ParceledListSlice<>(rollbacks);
@@ -297,12 +296,12 @@ class RollbackManagerServiceImpl extends IRollbackManager.Stub {
data.timestamp = data.timestamp.plusMillis(timeDifference);
try {
- mRollbackStore.saveAvailableRollback(data);
+ mRollbackStore.saveRollbackData(data);
} catch (IOException ioe) {
// TODO: figure out the right way to deal with this, especially if
// it fails for some data and succeeds for others.
- Log.e(TAG, "Unable to save rollback info for : " + data.rollbackId,
- ioe);
+ Log.e(TAG, "Unable to save rollback info for : "
+ + data.info.getRollbackId(), ioe);
}
}
@@ -335,7 +334,7 @@ class RollbackManagerServiceImpl extends IRollbackManager.Stub {
return;
}
- if (data.inProgress) {
+ if (data.restoreUserDataInProgress) {
sendFailure(statusReceiver, RollbackManager.STATUS_FAILURE_ROLLBACK_UNAVAILABLE,
"Rollback for package is already in progress.");
return;
@@ -349,7 +348,7 @@ class RollbackManagerServiceImpl extends IRollbackManager.Stub {
// rollback racing with a roll-forward fix of a buggy package.
// Figure out how to ensure we don't commit the rollback if
// roll forward happens at the same time.
- for (PackageRollbackInfo info : data.packages) {
+ for (PackageRollbackInfo info : data.info.getPackages()) {
VersionedPackage installedVersion = getInstalledPackageVersion(info.getPackageName());
if (installedVersion == null) {
// TODO: Test this case
@@ -391,7 +390,7 @@ class RollbackManagerServiceImpl extends IRollbackManager.Stub {
int parentSessionId = packageInstaller.createSession(parentParams);
PackageInstaller.Session parentSession = packageInstaller.openSession(parentSessionId);
- for (PackageRollbackInfo info : data.packages) {
+ for (PackageRollbackInfo info : data.info.getPackages()) {
PackageInstaller.SessionParams params = new PackageInstaller.SessionParams(
PackageInstaller.SessionParams.MODE_FULL_INSTALL);
// TODO: We can't get the installerPackageName for apex
@@ -441,7 +440,7 @@ class RollbackManagerServiceImpl extends IRollbackManager.Stub {
getHandler().post(() -> {
// We've now completed the rollback, so we mark it as no longer in
// progress.
- data.inProgress = false;
+ data.restoreUserDataInProgress = false;
int status = result.getIntExtra(PackageInstaller.EXTRA_STATUS,
PackageInstaller.STATUS_FAILURE);
@@ -453,9 +452,9 @@ class RollbackManagerServiceImpl extends IRollbackManager.Stub {
return;
}
- addRecentlyExecutedRollback(new RollbackInfo(
- data.rollbackId, data.packages, data.isStaged(),
- causePackages, parentSessionId));
+ data.info.setCommittedSessionId(parentSessionId);
+ data.info.getCausePackages().addAll(causePackages);
+ addRecentlyExecutedRollback(data.info);
sendSuccess(statusReceiver);
Intent broadcast = new Intent(Intent.ACTION_ROLLBACK_COMMITTED);
@@ -469,7 +468,7 @@ class RollbackManagerServiceImpl extends IRollbackManager.Stub {
}
);
- data.inProgress = true;
+ data.restoreUserDataInProgress = true;
parentSession.commit(receiver.getIntentSender());
} catch (IOException e) {
Log.e(TAG, "Rollback failed", e);
@@ -510,7 +509,7 @@ class RollbackManagerServiceImpl extends IRollbackManager.Stub {
Iterator<RollbackData> iter = mAvailableRollbacks.iterator();
while (iter.hasNext()) {
RollbackData data = iter.next();
- for (PackageRollbackInfo info : data.packages) {
+ for (PackageRollbackInfo info : data.info.getPackages()) {
if (info.getPackageName().equals(packageName)) {
iter.remove();
deleteRollback(data);
@@ -537,9 +536,10 @@ class RollbackManagerServiceImpl extends IRollbackManager.Stub {
for (RollbackData rd : changed) {
try {
- mRollbackStore.saveAvailableRollback(rd);
+ mRollbackStore.saveRollbackData(rd);
} catch (IOException ioe) {
- Log.e(TAG, "Unable to save rollback info for : " + rd.rollbackId, ioe);
+ Log.e(TAG, "Unable to save rollback info for : "
+ + rd.info.getRollbackId(), ioe);
}
}
@@ -575,7 +575,7 @@ class RollbackManagerServiceImpl extends IRollbackManager.Stub {
synchronized (mLock) {
ensureRollbackDataLoadedLocked();
for (RollbackData data : mAvailableRollbacks) {
- if (data.stagedSessionId != -1) {
+ if (!data.isAvailable && data.isStaged()) {
staged.add(data);
}
}
@@ -591,10 +591,10 @@ class RollbackManagerServiceImpl extends IRollbackManager.Stub {
data.isAvailable = true;
}
try {
- mRollbackStore.saveAvailableRollback(data);
+ mRollbackStore.saveRollbackData(data);
} catch (IOException ioe) {
Log.e(TAG, "Unable to save rollback info for : "
- + data.rollbackId, ioe);
+ + data.info.getRollbackId(), ioe);
}
} else if (session.isStagedSessionFailed()) {
// TODO: Do we need to remove this from
@@ -641,7 +641,7 @@ class RollbackManagerServiceImpl extends IRollbackManager.Stub {
private void loadAllRollbackDataLocked() {
mAvailableRollbacks = mRollbackStore.loadAvailableRollbacks();
for (RollbackData data : mAvailableRollbacks) {
- mAllocatedRollbackIds.put(data.rollbackId, true);
+ mAllocatedRollbackIds.put(data.info.getRollbackId(), true);
}
mRecentlyExecutedRollbacks = mRollbackStore.loadRecentlyExecutedRollbacks();
@@ -665,7 +665,7 @@ class RollbackManagerServiceImpl extends IRollbackManager.Stub {
Iterator<RollbackData> iter = mAvailableRollbacks.iterator();
while (iter.hasNext()) {
RollbackData data = iter.next();
- for (PackageRollbackInfo info : data.packages) {
+ for (PackageRollbackInfo info : data.info.getPackages()) {
if (info.getPackageName().equals(packageName)
&& !packageVersionsEqual(
info.getVersionRolledBackFrom(),
@@ -897,18 +897,19 @@ class RollbackManagerServiceImpl extends IRollbackManager.Stub {
return false;
}
String packageName = newPackage.packageName;
- for (PackageRollbackInfo info : rd.packages) {
+ for (PackageRollbackInfo info : rd.info.getPackages()) {
if (info.getPackageName().equals(packageName)) {
info.getInstalledUsers().addAll(IntArray.wrap(installedUsers));
- mAppDataRollbackHelper.snapshotAppData(rd.rollbackId, info);
+ mAppDataRollbackHelper.snapshotAppData(rd.info.getRollbackId(), info);
try {
- mRollbackStore.saveAvailableRollback(rd);
+ mRollbackStore.saveRollbackData(rd);
} catch (IOException ioe) {
// TODO: Hopefully this is okay because we will try
// again to save the rollback when the staged session
// is applied. Just so long as the device doesn't
// reboot before then.
- Log.e(TAG, "Unable to save rollback info for : " + rd.rollbackId, ioe);
+ Log.e(TAG, "Unable to save rollback info for : "
+ + rd.info.getRollbackId(), ioe);
}
return true;
}
@@ -989,14 +990,13 @@ class RollbackManagerServiceImpl extends IRollbackManager.Stub {
if (data == null) {
int rollbackId = allocateRollbackIdLocked();
if (session.isStaged()) {
- data = mRollbackStore.createPendingStagedRollback(rollbackId,
- parentSessionId);
+ data = mRollbackStore.createStagedRollback(rollbackId, parentSessionId);
} else {
- data = mRollbackStore.createAvailableRollback(rollbackId);
+ data = mRollbackStore.createNonStagedRollback(rollbackId);
}
mPendingRollbacks.put(parentSessionId, data);
}
- data.packages.add(info);
+ data.info.getPackages().add(info);
}
} catch (IOException e) {
Log.e(TAG, "Unable to create rollback for " + packageName, e);
@@ -1004,7 +1004,7 @@ class RollbackManagerServiceImpl extends IRollbackManager.Stub {
}
if (snapshotUserData && !isApex) {
- mAppDataRollbackHelper.snapshotAppData(data.rollbackId, info);
+ mAppDataRollbackHelper.snapshotAppData(data.info.getRollbackId(), info);
}
try {
@@ -1044,7 +1044,7 @@ class RollbackManagerServiceImpl extends IRollbackManager.Stub {
return;
}
- if (!rollbackData.inProgress) {
+ if (!rollbackData.restoreUserDataInProgress) {
Log.e(TAG, "Request to restore userData for: " + packageName
+ ", but no rollback in progress.");
return;
@@ -1053,12 +1053,12 @@ class RollbackManagerServiceImpl extends IRollbackManager.Stub {
for (int userId : userIds) {
final PackageRollbackInfo info = getPackageRollbackInfo(rollbackData, packageName);
final boolean changedRollbackData = mAppDataRollbackHelper.restoreAppData(
- rollbackData.rollbackId, info, userId, appId, seInfo);
+ rollbackData.info.getRollbackId(), info, userId, appId, seInfo);
// We've updated metadata about this rollback, so save it to flash.
if (changedRollbackData) {
try {
- mRollbackStore.saveAvailableRollback(rollbackData);
+ mRollbackStore.saveRollbackData(rollbackData);
} catch (IOException ioe) {
// TODO(narayan): What is the right thing to do here ? This isn't a fatal
// error, since it will only result in us trying to restore data again,
@@ -1137,9 +1137,10 @@ class RollbackManagerServiceImpl extends IRollbackManager.Stub {
if (rd != null) {
try {
- mRollbackStore.saveAvailableRollback(rd);
+ mRollbackStore.saveRollbackData(rd);
} catch (IOException ioe) {
- Log.e(TAG, "Unable to save rollback info for : " + rd.rollbackId, ioe);
+ Log.e(TAG, "Unable to save rollback info for : "
+ + rd.info.getRollbackId(), ioe);
}
}
});
@@ -1212,7 +1213,7 @@ class RollbackManagerServiceImpl extends IRollbackManager.Stub {
try {
data.timestamp = Instant.now();
- mRollbackStore.saveAvailableRollback(data);
+ mRollbackStore.saveRollbackData(data);
synchronized (mLock) {
// Note: There is a small window of time between when
// the session has been committed by the package
@@ -1233,8 +1234,8 @@ class RollbackManagerServiceImpl extends IRollbackManager.Stub {
// After enabling and commiting any rollback, observe packages and
// prepare to rollback if packages crashes too frequently.
List<String> packages = new ArrayList<>();
- for (int i = 0; i < data.packages.size(); i++) {
- packages.add(data.packages.get(i).getPackageName());
+ for (int i = 0; i < data.info.getPackages().size(); i++) {
+ packages.add(data.info.getPackages().get(i).getPackageName());
}
mPackageHealthObserver.startObservingHealth(packages,
mRollbackLifetimeDurationInMillis);
@@ -1307,7 +1308,7 @@ class RollbackManagerServiceImpl extends IRollbackManager.Stub {
ensureRollbackDataLoadedLocked();
for (int i = 0; i < mAvailableRollbacks.size(); ++i) {
RollbackData data = mAvailableRollbacks.get(i);
- if (data.isAvailable && data.rollbackId == rollbackId) {
+ if (data.isAvailable && data.info.getRollbackId() == rollbackId) {
return data;
}
}
@@ -1322,7 +1323,7 @@ class RollbackManagerServiceImpl extends IRollbackManager.Stub {
*/
private static PackageRollbackInfo getPackageRollbackInfo(RollbackData data,
String packageName) {
- for (PackageRollbackInfo info : data.packages) {
+ for (PackageRollbackInfo info : data.info.getPackages()) {
if (info.getPackageName().equals(packageName)) {
return info;
}
@@ -1347,14 +1348,14 @@ class RollbackManagerServiceImpl extends IRollbackManager.Stub {
}
private void deleteRollback(RollbackData rollbackData) {
- for (PackageRollbackInfo info : rollbackData.packages) {
+ for (PackageRollbackInfo info : rollbackData.info.getPackages()) {
IntArray installedUsers = info.getInstalledUsers();
for (int i = 0; i < installedUsers.size(); i++) {
int userId = installedUsers.get(i);
- mAppDataRollbackHelper.destroyAppDataSnapshot(rollbackData.rollbackId, info,
- userId);
+ mAppDataRollbackHelper.destroyAppDataSnapshot(rollbackData.info.getRollbackId(),
+ info, userId);
}
}
- mRollbackStore.deleteAvailableRollback(rollbackData);
+ mRollbackStore.deleteRollbackData(rollbackData);
}
}
diff --git a/services/core/java/com/android/server/rollback/RollbackStore.java b/services/core/java/com/android/server/rollback/RollbackStore.java
index bb4e89eca5da..ecdb2ccd872b 100644
--- a/services/core/java/com/android/server/rollback/RollbackStore.java
+++ b/services/core/java/com/android/server/rollback/RollbackStore.java
@@ -183,6 +183,25 @@ class RollbackStore {
return ceSnapshotInodes;
}
+ private static JSONObject rollbackInfoToJson(RollbackInfo rollback) throws JSONException {
+ JSONObject json = new JSONObject();
+ json.put("rollbackId", rollback.getRollbackId());
+ json.put("packages", toJson(rollback.getPackages()));
+ json.put("isStaged", rollback.isStaged());
+ json.put("causePackages", versionedPackagesToJson(rollback.getCausePackages()));
+ json.put("committedSessionId", rollback.getCommittedSessionId());
+ return json;
+ }
+
+ private static RollbackInfo rollbackInfoFromJson(JSONObject json) throws JSONException {
+ return new RollbackInfo(
+ json.getInt("rollbackId"),
+ packageRollbackInfosFromJson(json.getJSONArray("packages")),
+ json.getBoolean("isStaged"),
+ versionedPackagesFromJson(json.getJSONArray("causePackages")),
+ json.getInt("committedSessionId"));
+ }
+
/**
* Reads the list of recently executed rollbacks from persistent storage.
*/
@@ -197,17 +216,7 @@ class RollbackStore {
JSONObject object = new JSONObject(jsonString);
JSONArray array = object.getJSONArray("recentlyExecuted");
for (int i = 0; i < array.length(); ++i) {
- JSONObject element = array.getJSONObject(i);
- int rollbackId = element.getInt("rollbackId");
- List<PackageRollbackInfo> packages = packageRollbackInfosFromJson(
- element.getJSONArray("packages"));
- boolean isStaged = element.getBoolean("isStaged");
- List<VersionedPackage> causePackages = versionedPackagesFromJson(
- element.getJSONArray("causePackages"));
- int committedSessionId = element.getInt("committedSessionId");
- RollbackInfo rollback = new RollbackInfo(rollbackId, packages, isStaged,
- causePackages, committedSessionId);
- recentlyExecutedRollbacks.add(rollback);
+ recentlyExecutedRollbacks.add(rollbackInfoFromJson(array.getJSONObject(i)));
}
} catch (IOException | JSONException e) {
// TODO: What to do here? Surely we shouldn't just forget about
@@ -220,17 +229,22 @@ class RollbackStore {
}
/**
- * Creates a new RollbackData instance with backupDir assigned.
+ * Creates a new RollbackData instance for a non-staged rollback with
+ * backupDir assigned.
*/
- RollbackData createAvailableRollback(int rollbackId) throws IOException {
+ RollbackData createNonStagedRollback(int rollbackId) throws IOException {
File backupDir = new File(mAvailableRollbacksDir, Integer.toString(rollbackId));
- return new RollbackData(rollbackId, backupDir, -1, true);
+ return new RollbackData(rollbackId, backupDir, -1);
}
- RollbackData createPendingStagedRollback(int rollbackId, int stagedSessionId)
+ /**
+ * Creates a new RollbackData instance for a staged rollback with
+ * backupDir assigned.
+ */
+ RollbackData createStagedRollback(int rollbackId, int stagedSessionId)
throws IOException {
File backupDir = new File(mAvailableRollbacksDir, Integer.toString(rollbackId));
- return new RollbackData(rollbackId, backupDir, stagedSessionId, false);
+ return new RollbackData(rollbackId, backupDir, stagedSessionId);
}
/**
@@ -263,17 +277,17 @@ class RollbackStore {
}
/**
- * Writes the metadata for an available rollback to persistent storage.
+ * Saves the rollback data to persistent storage.
*/
- void saveAvailableRollback(RollbackData data) throws IOException {
+ void saveRollbackData(RollbackData data) throws IOException {
try {
JSONObject dataJson = new JSONObject();
- dataJson.put("rollbackId", data.rollbackId);
- dataJson.put("packages", toJson(data.packages));
+ dataJson.put("info", rollbackInfoToJson(data.info));
dataJson.put("timestamp", data.timestamp.toString());
dataJson.put("stagedSessionId", data.stagedSessionId);
dataJson.put("isAvailable", data.isAvailable);
dataJson.put("apkSessionId", data.apkSessionId);
+ dataJson.put("restoreUserDataInProgress", data.restoreUserDataInProgress);
PrintWriter pw = new PrintWriter(new File(data.backupDir, "rollback.json"));
pw.println(dataJson.toString());
@@ -284,10 +298,9 @@ class RollbackStore {
}
/**
- * Removes all persistant storage associated with the given available
- * rollback.
+ * Removes all persistant storage associated with the given rollback data.
*/
- void deleteAvailableRollback(RollbackData data) {
+ void deleteRollbackData(RollbackData data) {
removeFile(data.backupDir);
}
@@ -302,13 +315,7 @@ class RollbackStore {
for (int i = 0; i < recentlyExecutedRollbacks.size(); ++i) {
RollbackInfo rollback = recentlyExecutedRollbacks.get(i);
- JSONObject element = new JSONObject();
- element.put("rollbackId", rollback.getRollbackId());
- element.put("packages", toJson(rollback.getPackages()));
- element.put("isStaged", rollback.isStaged());
- element.put("causePackages", versionedPackagesToJson(rollback.getCausePackages()));
- element.put("committedSessionId", rollback.getCommittedSessionId());
- array.put(element);
+ array.put(rollbackInfoToJson(rollback));
}
PrintWriter pw = new PrintWriter(mRecentlyExecutedRollbacksFile);
@@ -324,40 +331,39 @@ class RollbackStore {
* Reads the metadata for a rollback from the given directory.
* @throws IOException in case of error reading the data.
*/
- private RollbackData loadRollbackData(File backupDir) throws IOException {
+ private static RollbackData loadRollbackData(File backupDir) throws IOException {
try {
File rollbackJsonFile = new File(backupDir, "rollback.json");
JSONObject dataJson = new JSONObject(
IoUtils.readFileAsString(rollbackJsonFile.getAbsolutePath()));
- int rollbackId = dataJson.getInt("rollbackId");
- int stagedSessionId = dataJson.getInt("stagedSessionId");
- boolean isAvailable = dataJson.getBoolean("isAvailable");
- RollbackData data = new RollbackData(rollbackId, backupDir,
- stagedSessionId, isAvailable);
- data.packages.addAll(packageRollbackInfosFromJson(dataJson.getJSONArray("packages")));
- data.timestamp = Instant.parse(dataJson.getString("timestamp"));
- data.apkSessionId = dataJson.getInt("apkSessionId");
- return data;
+ return new RollbackData(
+ rollbackInfoFromJson(dataJson.getJSONObject("info")),
+ backupDir,
+ Instant.parse(dataJson.getString("timestamp")),
+ dataJson.getInt("stagedSessionId"),
+ dataJson.getBoolean("isAvailable"),
+ dataJson.getInt("apkSessionId"),
+ dataJson.getBoolean("restoreUserDataInProgress"));
} catch (JSONException | DateTimeParseException e) {
throw new IOException(e);
}
}
- private JSONObject toJson(VersionedPackage pkg) throws JSONException {
+ private static JSONObject toJson(VersionedPackage pkg) throws JSONException {
JSONObject json = new JSONObject();
json.put("packageName", pkg.getPackageName());
json.put("longVersionCode", pkg.getLongVersionCode());
return json;
}
- private VersionedPackage versionedPackageFromJson(JSONObject json) throws JSONException {
+ private static VersionedPackage versionedPackageFromJson(JSONObject json) throws JSONException {
String packageName = json.getString("packageName");
long longVersionCode = json.getLong("longVersionCode");
return new VersionedPackage(packageName, longVersionCode);
}
- private JSONObject toJson(PackageRollbackInfo info) throws JSONException {
+ private static JSONObject toJson(PackageRollbackInfo info) throws JSONException {
JSONObject json = new JSONObject();
json.put("versionRolledBackFrom", toJson(info.getVersionRolledBackFrom()));
json.put("versionRolledBackTo", toJson(info.getVersionRolledBackTo()));
@@ -376,7 +382,8 @@ class RollbackStore {
return json;
}
- private PackageRollbackInfo packageRollbackInfoFromJson(JSONObject json) throws JSONException {
+ private static PackageRollbackInfo packageRollbackInfoFromJson(JSONObject json)
+ throws JSONException {
VersionedPackage versionRolledBackFrom = versionedPackageFromJson(
json.getJSONObject("versionRolledBackFrom"));
VersionedPackage versionRolledBackTo = versionedPackageFromJson(
@@ -397,7 +404,7 @@ class RollbackStore {
pendingBackups, pendingRestores, isApex, installedUsers, ceSnapshotInodes);
}
- private JSONArray versionedPackagesToJson(List<VersionedPackage> packages)
+ private static JSONArray versionedPackagesToJson(List<VersionedPackage> packages)
throws JSONException {
JSONArray json = new JSONArray();
for (VersionedPackage pkg : packages) {
@@ -406,7 +413,8 @@ class RollbackStore {
return json;
}
- private List<VersionedPackage> versionedPackagesFromJson(JSONArray json) throws JSONException {
+ private static List<VersionedPackage> versionedPackagesFromJson(JSONArray json)
+ throws JSONException {
List<VersionedPackage> packages = new ArrayList<>();
for (int i = 0; i < json.length(); ++i) {
packages.add(versionedPackageFromJson(json.getJSONObject(i)));
@@ -414,7 +422,7 @@ class RollbackStore {
return packages;
}
- private JSONArray toJson(List<PackageRollbackInfo> infos) throws JSONException {
+ private static JSONArray toJson(List<PackageRollbackInfo> infos) throws JSONException {
JSONArray json = new JSONArray();
for (PackageRollbackInfo info : infos) {
json.put(toJson(info));
@@ -422,7 +430,7 @@ class RollbackStore {
return json;
}
- private List<PackageRollbackInfo> packageRollbackInfosFromJson(JSONArray json)
+ private static List<PackageRollbackInfo> packageRollbackInfosFromJson(JSONArray json)
throws JSONException {
List<PackageRollbackInfo> infos = new ArrayList<>();
for (int i = 0; i < json.length(); ++i) {
diff --git a/services/core/java/com/android/server/wm/ActivityRecord.java b/services/core/java/com/android/server/wm/ActivityRecord.java
index e976975bd675..f70adefd7696 100644
--- a/services/core/java/com/android/server/wm/ActivityRecord.java
+++ b/services/core/java/com/android/server/wm/ActivityRecord.java
@@ -289,10 +289,11 @@ final class ActivityRecord extends ConfigurationContainer {
private int windowFlags; // custom window flags for preview window.
private TaskRecord task; // the task this is in.
private long createTime = System.currentTimeMillis();
- long lastVisibleTime; // last time this activity became visible
- long cpuTimeAtResume; // the cpu time of host process at the time of resuming activity
- long pauseTime; // last time we started pausing the activity
- long launchTickTime; // base time for launch tick messages
+ long lastVisibleTime; // last time this activity became visible
+ long cpuTimeAtResume; // the cpu time of host process at the time of resuming activity
+ long pauseTime; // last time we started pausing the activity
+ long launchTickTime; // base time for launch tick messages
+ long topResumedStateLossTime; // last time we reported top resumed state loss to an activity
// Last configuration reported to the activity in the client process.
private MergedConfiguration mLastReportedConfiguration;
private int mLastReportedDisplayId;
@@ -694,14 +695,14 @@ final class ActivityRecord extends ConfigurationContainer {
void scheduleTopResumedActivityChanged(boolean onTop) {
if (!attachedToProcess()) {
- if (DEBUG_CONFIGURATION) {
+ if (DEBUG_STATES) {
Slog.w(TAG, "Can't report activity position update - client not running"
+ ", activityRecord=" + this);
}
return;
}
try {
- if (DEBUG_CONFIGURATION) {
+ if (DEBUG_STATES) {
Slog.v(TAG, "Sending position change to " + this + ", onTop: " + onTop);
}
@@ -3285,7 +3286,7 @@ final class ActivityRecord extends ConfigurationContainer {
transaction.addCallback(callbackItem);
transaction.setLifecycleStateRequest(lifecycleItem);
mAtmService.getLifecycleManager().scheduleTransaction(transaction);
- mRootActivityContainer.updateTopResumedActivityIfNeeded();
+ mStackSupervisor.updateTopResumedActivityIfNeeded();
// Note: don't need to call pauseIfSleepingLocked() here, because the caller will only
// request resume if this activity is currently resumed, which implies we aren't
// sleeping.
diff --git a/services/core/java/com/android/server/wm/ActivityStack.java b/services/core/java/com/android/server/wm/ActivityStack.java
index a4457e291cc3..ea2aff220030 100644
--- a/services/core/java/com/android/server/wm/ActivityStack.java
+++ b/services/core/java/com/android/server/wm/ActivityStack.java
@@ -1491,6 +1491,7 @@ class ActivityStack extends ConfigurationContainer {
+ " callers=" + Debug.getCallers(5));
r.setState(RESUMED, "minimalResumeActivityLocked");
r.completeResumeLocked();
+ mStackSupervisor.updateTopResumedActivityIfNeeded();
if (DEBUG_SAVED_STATE) Slog.i(TAG_SAVED_STATE,
"Launch completed; removing icicle of " + r.icicle);
}
@@ -2575,7 +2576,7 @@ class ActivityStack extends ConfigurationContainer {
// Protect against recursion.
mInResumeTopActivity = true;
result = resumeTopActivityInnerLocked(prev, options);
- mRootActivityContainer.updateTopResumedActivityIfNeeded();
+ mStackSupervisor.updateTopResumedActivityIfNeeded();
// When resuming the top activity, it may be necessary to pause the top activity (for
// example, returning to the lock screen. We suppress the normal pause logic in
diff --git a/services/core/java/com/android/server/wm/ActivityStackSupervisor.java b/services/core/java/com/android/server/wm/ActivityStackSupervisor.java
index df760306f12a..758a76546c9b 100644
--- a/services/core/java/com/android/server/wm/ActivityStackSupervisor.java
+++ b/services/core/java/com/android/server/wm/ActivityStackSupervisor.java
@@ -170,6 +170,9 @@ public class ActivityStackSupervisor implements RecentTasks.Callbacks {
// How long we can hold the launch wake lock before giving up.
static final int LAUNCH_TIMEOUT = 10 * 1000;
+ /** How long we wait until giving up on the activity telling us it released the top state. */
+ static final int TOP_RESUMED_STATE_LOSS_TIMEOUT = 500;
+
static final int IDLE_TIMEOUT_MSG = FIRST_SUPERVISOR_STACK_MSG;
static final int IDLE_NOW_MSG = FIRST_SUPERVISOR_STACK_MSG + 1;
static final int RESUME_TOP_ACTIVITY_MSG = FIRST_SUPERVISOR_STACK_MSG + 2;
@@ -179,6 +182,7 @@ public class ActivityStackSupervisor implements RecentTasks.Callbacks {
static final int REPORT_MULTI_WINDOW_MODE_CHANGED_MSG = FIRST_SUPERVISOR_STACK_MSG + 14;
static final int REPORT_PIP_MODE_CHANGED_MSG = FIRST_SUPERVISOR_STACK_MSG + 15;
static final int REPORT_HOME_CHANGED_MSG = FIRST_SUPERVISOR_STACK_MSG + 16;
+ static final int TOP_RESUMED_STATE_LOSS_TIMEOUT_MSG = FIRST_SUPERVISOR_STACK_MSG + 17;
// Used to indicate that windows of activities should be preserved during the resize.
static final boolean PRESERVE_WINDOWS = true;
@@ -300,6 +304,18 @@ public class ActivityStackSupervisor implements RecentTasks.Callbacks {
*/
final ArrayList<ActivityRecord> mNoAnimActivities = new ArrayList<>();
+ /**
+ * Cached value of the topmost resumed activity in the system. Updated when new activity is
+ * resumed.
+ */
+ private ActivityRecord mTopResumedActivity;
+
+ /**
+ * Flag indicating whether we're currently waiting for the previous top activity to handle the
+ * loss of the state and report back before making new activity top resumed.
+ */
+ private boolean mTopResumedActivityWaitingForPrev;
+
/** The target stack bounds for the picture-in-picture mode changed that we need to report to
* the application */
Rect mPipModeChangedTargetStackBounds;
@@ -844,7 +860,7 @@ public class ActivityStackSupervisor implements RecentTasks.Callbacks {
// Schedule transaction.
mService.getLifecycleManager().scheduleTransaction(clientTransaction);
- mRootActivityContainer.updateTopResumedActivityIfNeeded();
+ updateTopResumedActivityIfNeeded();
if ((proc.mInfo.privateFlags & ApplicationInfo.PRIVATE_FLAG_CANT_SAVE_STATE) != 0
&& mService.mHasHeavyWeightFeature) {
@@ -2296,6 +2312,73 @@ public class ActivityStackSupervisor implements RecentTasks.Callbacks {
mHandler.sendEmptyMessage(IDLE_NOW_MSG);
}
+ /**
+ * Updates the record of top resumed activity when it changes and handles reporting of the
+ * state changes to previous and new top activities. It will immediately dispatch top resumed
+ * state loss message to previous top activity (if haven't done it already). After the previous
+ * activity releases the top state and reports back, message about acquiring top state will be
+ * sent to the new top resumed activity.
+ */
+ void updateTopResumedActivityIfNeeded() {
+ final ActivityRecord prevTopActivity = mTopResumedActivity;
+ final ActivityStack topStack = mRootActivityContainer.getTopDisplayFocusedStack();
+ if (topStack == null || topStack.mResumedActivity == prevTopActivity) {
+ return;
+ }
+
+ // Ask previous activity to release the top state.
+ final boolean prevActivityReceivedTopState =
+ prevTopActivity != null && !mTopResumedActivityWaitingForPrev;
+ // mTopResumedActivityWaitingForPrev == true at this point would mean that an activity
+ // before the prevTopActivity one hasn't reported back yet. So server never sent the top
+ // resumed state change message to prevTopActivity.
+ if (prevActivityReceivedTopState) {
+ prevTopActivity.scheduleTopResumedActivityChanged(false /* onTop */);
+ scheduleTopResumedStateLossTimeout(prevTopActivity);
+ mTopResumedActivityWaitingForPrev = true;
+ }
+
+ // Update the current top activity.
+ mTopResumedActivity = topStack.mResumedActivity;
+ scheduleTopResumedActivityStateIfNeeded();
+ }
+
+ /** Schedule top resumed state change if previous top activity already reported back. */
+ private void scheduleTopResumedActivityStateIfNeeded() {
+ if (mTopResumedActivity != null && !mTopResumedActivityWaitingForPrev) {
+ mTopResumedActivity.scheduleTopResumedActivityChanged(true /* onTop */);
+ }
+ }
+
+ /**
+ * Limit the time given to the app to report handling of the state loss.
+ */
+ private void scheduleTopResumedStateLossTimeout(ActivityRecord r) {
+ final Message msg = mHandler.obtainMessage(TOP_RESUMED_STATE_LOSS_TIMEOUT_MSG);
+ msg.obj = r;
+ r.topResumedStateLossTime = SystemClock.uptimeMillis();
+ mHandler.sendMessageDelayed(msg, TOP_RESUMED_STATE_LOSS_TIMEOUT);
+ if (DEBUG_STATES) Slog.v(TAG_STATES, "Waiting for top state to be released by " + r);
+ }
+
+ /**
+ * Handle a loss of top resumed state by an activity - update internal state and inform next top
+ * activity if needed.
+ */
+ void handleTopResumedStateReleased(boolean timeout) {
+ if (DEBUG_STATES) {
+ Slog.v(TAG_STATES, "Top resumed state released "
+ + (timeout ? " (due to timeout)" : " (transition complete)"));
+ }
+ mHandler.removeMessages(TOP_RESUMED_STATE_LOSS_TIMEOUT_MSG);
+ if (!mTopResumedActivityWaitingForPrev) {
+ // Top resumed activity state loss already handled.
+ return;
+ }
+ mTopResumedActivityWaitingForPrev = false;
+ scheduleTopResumedActivityStateIfNeeded();
+ }
+
void removeTimeoutsForActivityLocked(ActivityRecord r) {
if (DEBUG_IDLE) Slog.d(TAG_IDLE, "removeTimeoutsForActivity: Callers="
+ Debug.getCallers(4));
@@ -2351,6 +2434,9 @@ public class ActivityStackSupervisor implements RecentTasks.Callbacks {
// Suppress the warning toast if the preferredDisplay was set to singleTask.
// The singleTaskInstance displays will only contain one task and any attempt to
// launch new task will re-route to the default display.
+ mService.getTaskChangeNotificationController()
+ .notifyActivityLaunchOnSecondaryDisplayRerouted(task.getTaskInfo(),
+ preferredDisplayId);
return;
}
@@ -2587,8 +2673,18 @@ public class ActivityStackSupervisor implements RecentTasks.Callbacks {
// Start home activities on displays with no activities.
mRootActivityContainer.startHomeOnEmptyDisplays("homeChanged");
}
- }
- break;
+ } break;
+ case TOP_RESUMED_STATE_LOSS_TIMEOUT_MSG: {
+ ActivityRecord r = (ActivityRecord) msg.obj;
+ Slog.w(TAG, "Activity top resumed state loss timeout for " + r);
+ synchronized (mService.mGlobalLock) {
+ if (r.hasProcess()) {
+ mService.logAppTooSlow(r.app, r.topResumedStateLossTime,
+ "top state loss for " + r);
+ }
+ }
+ handleTopResumedStateReleased(true /* timeout */);
+ } break;
}
}
}
diff --git a/services/core/java/com/android/server/wm/ActivityTaskManagerService.java b/services/core/java/com/android/server/wm/ActivityTaskManagerService.java
index 486a4ea24f65..d747198bc3f1 100644
--- a/services/core/java/com/android/server/wm/ActivityTaskManagerService.java
+++ b/services/core/java/com/android/server/wm/ActivityTaskManagerService.java
@@ -1634,6 +1634,15 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub {
}
@Override
+ public final void activityTopResumedStateLost() {
+ final long origId = Binder.clearCallingIdentity();
+ synchronized (mGlobalLock) {
+ mStackSupervisor.handleTopResumedStateReleased(false /* timeout */);
+ }
+ Binder.restoreCallingIdentity(origId);
+ }
+
+ @Override
public final void activityPaused(IBinder token) {
final long origId = Binder.clearCallingIdentity();
synchronized (mGlobalLock) {
diff --git a/services/core/java/com/android/server/wm/AppWindowThumbnail.java b/services/core/java/com/android/server/wm/AppWindowThumbnail.java
index 5519729c17f5..bbbf11d2a7a2 100644
--- a/services/core/java/com/android/server/wm/AppWindowThumbnail.java
+++ b/services/core/java/com/android/server/wm/AppWindowThumbnail.java
@@ -118,7 +118,8 @@ class AppWindowThumbnail implements Animatable {
anim.scaleCurrentDuration(mAppToken.mWmService.getTransitionAnimationScaleLocked());
mSurfaceAnimator.startAnimation(t, new LocalAnimationAdapter(
new WindowAnimationSpec(anim, position,
- mAppToken.getDisplayContent().mAppTransition.canSkipFirstFrame()),
+ mAppToken.getDisplayContent().mAppTransition.canSkipFirstFrame(),
+ mAppToken.mWmService.mWindowCornerRadius),
mAppToken.mWmService.mSurfaceAnimationRunner), false /* hidden */);
}
diff --git a/services/core/java/com/android/server/wm/AppWindowToken.java b/services/core/java/com/android/server/wm/AppWindowToken.java
index 05c4c2793a01..78199d4412a6 100644
--- a/services/core/java/com/android/server/wm/AppWindowToken.java
+++ b/services/core/java/com/android/server/wm/AppWindowToken.java
@@ -582,6 +582,8 @@ class AppWindowToken extends WindowToken implements WindowManagerService.AppFree
}
}
}
+ // Changes in opening apps and closing apps may cause orientation change.
+ reportDescendantOrientationChangeIfNeeded();
return;
}
@@ -729,11 +731,31 @@ class AppWindowToken extends WindowToken implements WindowManagerService.AppFree
}
SurfaceControl.closeTransaction();
}
+
+ // Visibility changes may cause orientation request change.
+ reportDescendantOrientationChangeIfNeeded();
}
return delayed;
}
+ private void reportDescendantOrientationChangeIfNeeded() {
+ // Orientation request is exposed only when we're visible. Therefore visibility change
+ // will change requested orientation. Notify upward the hierarchy ladder to adjust
+ // configuration. This is important to cases where activities with incompatible
+ // orientations launch, or user goes back from an activity of bi-orientation to an
+ // activity with specified orientation.
+ if (mActivityRecord.getRequestedConfigurationOrientation() == getConfiguration().orientation
+ || getOrientationIgnoreVisibility() == SCREEN_ORIENTATION_UNSET) {
+ return;
+ }
+
+ final IBinder freezeToken =
+ mActivityRecord.mayFreezeScreenLocked(mActivityRecord.app)
+ ? mActivityRecord.appToken : null;
+ onDescendantOrientationChanged(freezeToken, mActivityRecord);
+ }
+
/**
* @return The to top most child window for which {@link LayoutParams#isFullscreen()} returns
* true.
@@ -2526,7 +2548,8 @@ class AppWindowToken extends WindowToken implements WindowManagerService.AppFree
new WindowAnimationSpec(a, mTmpPoint, mTmpRect,
getDisplayContent().mAppTransition.canSkipFirstFrame(),
appStackClipMode,
- true /* isAppAnimation */),
+ true /* isAppAnimation */,
+ mWmService.mWindowCornerRadius),
mWmService.mSurfaceAnimationRunner);
if (a.getZAdjustment() == Animation.ZORDER_TOP) {
mNeedsZBoost = true;
diff --git a/services/core/java/com/android/server/wm/KeyguardController.java b/services/core/java/com/android/server/wm/KeyguardController.java
index feb711abaead..8c8b05f1307a 100644
--- a/services/core/java/com/android/server/wm/KeyguardController.java
+++ b/services/core/java/com/android/server/wm/KeyguardController.java
@@ -29,6 +29,7 @@ import static android.view.WindowManagerPolicyConstants.KEYGUARD_GOING_AWAY_FLAG
import static android.view.WindowManagerPolicyConstants.KEYGUARD_GOING_AWAY_FLAG_TO_SHADE;
import static android.view.WindowManagerPolicyConstants.KEYGUARD_GOING_AWAY_FLAG_WITH_WALLPAPER;
+import static com.android.server.am.KeyguardControllerProto.AOD_SHOWING;
import static com.android.server.am.KeyguardControllerProto.KEYGUARD_OCCLUDED_STATES;
import static com.android.server.am.KeyguardControllerProto.KEYGUARD_SHOWING;
import static com.android.server.am.KeyguardOccludedProto.DISPLAY_ID;
@@ -86,7 +87,7 @@ class KeyguardController {
/**
* @return true if either Keyguard or AOD are showing, not going away, and not being occluded
- * on the given display, false otherwise
+ * on the given display, false otherwise.
*/
boolean isKeyguardOrAodShowing(int displayId) {
return (mKeyguardShowing || mAodShowing) && !mKeyguardGoingAway
@@ -94,6 +95,16 @@ class KeyguardController {
}
/**
+ * @return {@code true} if 1) Keyguard is showing, not going away, and not being occluded on the
+ * given display, or 2) AOD is showing, {@code false} otherwise.
+ * TODO(b/125198167): Replace isKeyguardOrAodShowing() by this logic.
+ */
+ boolean isKeyguardUnoccludedOrAodShowing(int displayId) {
+ return (mKeyguardShowing && !mKeyguardGoingAway && !isDisplayOccluded(displayId))
+ || mAodShowing;
+ }
+
+ /**
* @return true if Keyguard is showing, not going away, and not being occluded on the given
* display, false otherwise
*/
@@ -380,10 +391,11 @@ class KeyguardController {
for (int displayNdx = mRootActivityContainer.getChildCount() - 1;
displayNdx >= 0; displayNdx--) {
final ActivityDisplay display = mRootActivityContainer.getChildAt(displayNdx);
- final KeyguardDisplayState state = getDisplay(display.mDisplayId);
- if (isKeyguardOrAodShowing(display.mDisplayId) && state.mSleepToken == null) {
+ final int displayId = display.mDisplayId;
+ final KeyguardDisplayState state = getDisplay(displayId);
+ if (isKeyguardUnoccludedOrAodShowing(displayId) && state.mSleepToken == null) {
state.acquiredSleepToken();
- } else if (!isKeyguardOrAodShowing(display.mDisplayId) && state.mSleepToken != null) {
+ } else if (!isKeyguardUnoccludedOrAodShowing(displayId) && state.mSleepToken != null) {
state.releaseSleepToken();
}
}
@@ -528,6 +540,7 @@ class KeyguardController {
void writeToProto(ProtoOutputStream proto, long fieldId) {
final long token = proto.start(fieldId);
+ proto.write(AOD_SHOWING, mAodShowing);
proto.write(KEYGUARD_SHOWING, mKeyguardShowing);
writeDisplayStatesToProto(proto, KEYGUARD_OCCLUDED_STATES);
proto.end(token);
diff --git a/services/core/java/com/android/server/wm/RootActivityContainer.java b/services/core/java/com/android/server/wm/RootActivityContainer.java
index 698835772df5..e3beb19408e1 100644
--- a/services/core/java/com/android/server/wm/RootActivityContainer.java
+++ b/services/core/java/com/android/server/wm/RootActivityContainer.java
@@ -175,12 +175,6 @@ class RootActivityContainer extends ConfigurationContainer
private ActivityDisplay mDefaultDisplay;
private final SparseArray<IntArray> mDisplayAccessUIDs = new SparseArray<>();
- /**
- * Cached value of the topmost resumed activity in the system. Updated when new activity is
- * resumed.
- */
- private ActivityRecord mTopResumedActivity;
-
/** The current user */
int mCurrentUser;
/** Stack id of the front stack when user switched, indexed by userId. */
@@ -1155,23 +1149,6 @@ class RootActivityContainer extends ConfigurationContainer
return result;
}
- void updateTopResumedActivityIfNeeded() {
- final ActivityRecord prevTopActivity = mTopResumedActivity;
- final ActivityStack topStack = getTopDisplayFocusedStack();
- if (topStack == null || topStack.mResumedActivity == prevTopActivity) {
- return;
- }
- // Clear previous top state
- if (prevTopActivity != null) {
- prevTopActivity.scheduleTopResumedActivityChanged(false /* onTop */);
- }
- // Update the current top activity
- mTopResumedActivity = topStack.mResumedActivity;
- if (mTopResumedActivity != null) {
- mTopResumedActivity.scheduleTopResumedActivityChanged(true /* onTop */);
- }
- }
-
void applySleepTokens(boolean applyToStacks) {
for (int displayNdx = mActivityDisplays.size() - 1; displayNdx >= 0; --displayNdx) {
// Set the sleeping state of the display.
@@ -1434,7 +1411,7 @@ class RootActivityContainer extends ConfigurationContainer
mActivityDisplays.remove(display);
mActivityDisplays.add(position, display);
}
- updateTopResumedActivityIfNeeded();
+ mStackSupervisor.updateTopResumedActivityIfNeeded();
}
@VisibleForTesting
diff --git a/services/core/java/com/android/server/wm/Task.java b/services/core/java/com/android/server/wm/Task.java
index 888d74163163..499cbaf915a1 100644
--- a/services/core/java/com/android/server/wm/Task.java
+++ b/services/core/java/com/android/server/wm/Task.java
@@ -330,7 +330,7 @@ class Task extends WindowContainer<AppWindowToken> implements ConfigurationConta
// No one in higher hierarchy handles this request, let's adjust our bounds to fulfill
// it if possible.
// TODO: Move to TaskRecord after unification is done.
- if (mTaskRecord != null) {
+ if (mTaskRecord != null && mTaskRecord.getParent() != null) {
mTaskRecord.onConfigurationChanged(mTaskRecord.getParent().getConfiguration());
return true;
}
diff --git a/services/core/java/com/android/server/wm/TaskChangeNotificationController.java b/services/core/java/com/android/server/wm/TaskChangeNotificationController.java
index 789f987e3d46..42d25833000d 100644
--- a/services/core/java/com/android/server/wm/TaskChangeNotificationController.java
+++ b/services/core/java/com/android/server/wm/TaskChangeNotificationController.java
@@ -50,6 +50,7 @@ class TaskChangeNotificationController {
private static final int NOTIFY_PINNED_STACK_ANIMATION_STARTED_LISTENERS_MSG = 16;
private static final int NOTIFY_ACTIVITY_UNPINNED_LISTENERS_MSG = 17;
private static final int NOTIFY_ACTIVITY_LAUNCH_ON_SECONDARY_DISPLAY_FAILED_MSG = 18;
+ private static final int NOTIFY_ACTIVITY_LAUNCH_ON_SECONDARY_DISPLAY_REROUTED_MSG = 19;
// Delay in notifying task stack change listeners (in millis)
private static final int NOTIFY_TASK_STACK_CHANGE_LISTENERS_DELAY = 100;
@@ -130,6 +131,10 @@ class TaskChangeNotificationController {
l.onActivityLaunchOnSecondaryDisplayFailed((RunningTaskInfo) m.obj, m.arg1);
};
+ private final TaskStackConsumer mNotifyActivityLaunchOnSecondaryDisplayRerouted = (l, m) -> {
+ l.onActivityLaunchOnSecondaryDisplayRerouted((RunningTaskInfo) m.obj, m.arg1);
+ };
+
private final TaskStackConsumer mNotifyTaskProfileLocked = (l, m) -> {
l.onTaskProfileLocked(m.arg1, m.arg2);
};
@@ -202,6 +207,9 @@ class TaskChangeNotificationController {
case NOTIFY_ACTIVITY_LAUNCH_ON_SECONDARY_DISPLAY_FAILED_MSG:
forAllRemoteListeners(mNotifyActivityLaunchOnSecondaryDisplayFailed, msg);
break;
+ case NOTIFY_ACTIVITY_LAUNCH_ON_SECONDARY_DISPLAY_REROUTED_MSG:
+ forAllRemoteListeners(mNotifyActivityLaunchOnSecondaryDisplayRerouted, msg);
+ break;
case NOTIFY_TASK_PROFILE_LOCKED_LISTENERS_MSG:
forAllRemoteListeners(mNotifyTaskProfileLocked, msg);
break;
@@ -355,6 +363,15 @@ class TaskChangeNotificationController {
msg.sendToTarget();
}
+ void notifyActivityLaunchOnSecondaryDisplayRerouted(TaskInfo ti, int requestedDisplayId) {
+ mHandler.removeMessages(NOTIFY_ACTIVITY_LAUNCH_ON_SECONDARY_DISPLAY_REROUTED_MSG);
+ final Message msg = mHandler.obtainMessage(
+ NOTIFY_ACTIVITY_LAUNCH_ON_SECONDARY_DISPLAY_REROUTED_MSG, requestedDisplayId,
+ 0 /* unused */, ti);
+ forAllLocalListeners(mNotifyActivityLaunchOnSecondaryDisplayRerouted, msg);
+ msg.sendToTarget();
+ }
+
void notifyTaskCreated(int taskId, ComponentName componentName) {
final Message msg = mHandler.obtainMessage(NOTIFY_TASK_ADDED_LISTENERS_MSG,
taskId, 0 /* unused */, componentName);
diff --git a/services/core/java/com/android/server/wm/WindowAnimationSpec.java b/services/core/java/com/android/server/wm/WindowAnimationSpec.java
index 98c77ac719f9..57311e19bc76 100644
--- a/services/core/java/com/android/server/wm/WindowAnimationSpec.java
+++ b/services/core/java/com/android/server/wm/WindowAnimationSpec.java
@@ -17,10 +17,10 @@
package com.android.server.wm;
import static com.android.server.wm.AnimationAdapter.STATUS_BAR_TRANSITION_DURATION;
-import static com.android.server.wm.WindowStateAnimator.STACK_CLIP_AFTER_ANIM;
-import static com.android.server.wm.WindowStateAnimator.STACK_CLIP_NONE;
import static com.android.server.wm.AnimationSpecProto.WINDOW;
import static com.android.server.wm.WindowAnimationSpecProto.ANIMATION;
+import static com.android.server.wm.WindowStateAnimator.STACK_CLIP_AFTER_ANIM;
+import static com.android.server.wm.WindowStateAnimator.STACK_CLIP_NONE;
import android.graphics.Point;
import android.graphics.Rect;
@@ -51,18 +51,22 @@ public class WindowAnimationSpec implements AnimationSpec {
private final Rect mStackBounds = new Rect();
private int mStackClipMode;
private final Rect mTmpRect = new Rect();
+ private final float mWindowCornerRadius;
- public WindowAnimationSpec(Animation animation, Point position, boolean canSkipFirstFrame) {
+ public WindowAnimationSpec(Animation animation, Point position, boolean canSkipFirstFrame,
+ float windowCornerRadius) {
this(animation, position, null /* stackBounds */, canSkipFirstFrame, STACK_CLIP_NONE,
- false /* isAppAnimation */);
+ false /* isAppAnimation */, windowCornerRadius);
}
public WindowAnimationSpec(Animation animation, Point position, Rect stackBounds,
- boolean canSkipFirstFrame, int stackClipMode, boolean isAppAnimation) {
+ boolean canSkipFirstFrame, int stackClipMode, boolean isAppAnimation,
+ float windowCornerRadius) {
mAnimation = animation;
if (position != null) {
mPosition.set(position.x, position.y);
}
+ mWindowCornerRadius = windowCornerRadius;
mCanSkipFirstFrame = canSkipFirstFrame;
mIsAppAnimation = isAppAnimation;
mStackClipMode = stackClipMode;
@@ -101,6 +105,9 @@ public class WindowAnimationSpec implements AnimationSpec {
mTmpRect.intersect(tmp.transformation.getClipRect());
t.setWindowCrop(leash, mTmpRect);
}
+ if (mAnimation.hasRoundedCorners() && mWindowCornerRadius > 0) {
+ t.setCornerRadius(leash, mWindowCornerRadius);
+ }
}
@Override
diff --git a/services/core/java/com/android/server/wm/WindowManagerService.java b/services/core/java/com/android/server/wm/WindowManagerService.java
index 474a9dabf9c4..1bd1795dadd8 100644
--- a/services/core/java/com/android/server/wm/WindowManagerService.java
+++ b/services/core/java/com/android/server/wm/WindowManagerService.java
@@ -145,6 +145,7 @@ import android.hardware.configstore.V1_0.OptionalBool;
import android.hardware.display.DisplayManager;
import android.hardware.display.DisplayManagerInternal;
import android.hardware.input.InputManager;
+import android.hardware.input.InputManagerInternal;
import android.net.Uri;
import android.os.Binder;
import android.os.Build;
@@ -234,6 +235,7 @@ import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.os.IResultReceiver;
import com.android.internal.policy.IKeyguardDismissCallback;
import com.android.internal.policy.IShortcutService;
+import com.android.internal.policy.ScreenDecorationsUtils;
import com.android.internal.util.DumpUtils;
import com.android.internal.util.FastPrintWriter;
import com.android.internal.util.LatencyTracker;
@@ -753,24 +755,27 @@ public class WindowManagerService extends IWindowManager.Stub
final DisplayManager mDisplayManager;
final ActivityTaskManagerService mAtmService;
- // Indicates whether this device supports wide color gamut / HDR rendering
+ /** Corner radius that windows should have in order to match the display. */
+ final float mWindowCornerRadius;
+
+ /** Indicates whether this device supports wide color gamut / HDR rendering */
private boolean mHasWideColorGamutSupport;
private boolean mHasHdrSupport;
- // Who is holding the screen on.
+ /** Who is holding the screen on. */
private Session mHoldingScreenOn;
private PowerManager.WakeLock mHoldingScreenWakeLock;
- // Whether or not a layout can cause a wake up when theater mode is enabled.
+ /** Whether or not a layout can cause a wake up when theater mode is enabled. */
boolean mAllowTheaterModeWakeFromLayout;
final TaskPositioningController mTaskPositioningController;
final DragDropController mDragDropController;
- // For frozen screen animations.
+ /** For frozen screen animations. */
private int mExitAnimId, mEnterAnimId;
- // The display that the rotation animation is applying to.
+ /** The display that the rotation animation is applying to. */
private int mFrozenDisplayId;
/** Skip repeated AppWindowTokens initialization. Note that AppWindowsToken's version of this
@@ -977,7 +982,7 @@ public class WindowManagerService extends IWindowManager.Stub
mInputManager = inputManager; // Must be before createDisplayContentLocked.
mDisplayManagerInternal = LocalServices.getService(DisplayManagerInternal.class);
mDisplayWindowSettings = new DisplayWindowSettings(this);
-
+ mWindowCornerRadius = ScreenDecorationsUtils.getWindowCornerRadius(context.getResources());
mTransactionFactory = transactionFactory;
mTransaction = mTransactionFactory.make();
@@ -7434,7 +7439,7 @@ public class WindowManagerService extends IWindowManager.Stub
new SurfaceControl.Transaction().syncInputWindows().apply(true);
- return mInputManager.injectInputEvent(ev, mode);
+ return LocalServices.getService(InputManagerInternal.class).injectInputEvent(ev, mode);
}
private void waitForAnimationsToComplete() {
diff --git a/services/core/java/com/android/server/wm/WindowState.java b/services/core/java/com/android/server/wm/WindowState.java
index a13086dcc279..b7925f20be86 100644
--- a/services/core/java/com/android/server/wm/WindowState.java
+++ b/services/core/java/com/android/server/wm/WindowState.java
@@ -4458,7 +4458,8 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP
anim.restrictDuration(MAX_ANIMATION_DURATION);
anim.scaleCurrentDuration(mWmService.getWindowAnimationScaleLocked());
final AnimationAdapter adapter = new LocalAnimationAdapter(
- new WindowAnimationSpec(anim, mSurfacePosition, false /* canSkipFirstFrame */),
+ new WindowAnimationSpec(anim, mSurfacePosition, false /* canSkipFirstFrame */,
+ mWmService.mWindowCornerRadius),
mWmService.mSurfaceAnimationRunner);
startAnimation(mPendingTransaction, adapter);
commitPendingTransaction();
diff --git a/services/core/jni/com_android_server_location_GnssLocationProvider.cpp b/services/core/jni/com_android_server_location_GnssLocationProvider.cpp
index 03240c076ede..d39f20c0f214 100644
--- a/services/core/jni/com_android_server_location_GnssLocationProvider.cpp
+++ b/services/core/jni/com_android_server_location_GnssLocationProvider.cpp
@@ -548,12 +548,15 @@ struct GnssCallback : public IGnssCallback {
Return<void> gnssReleaseWakelockCb() override;
Return<void> gnssRequestTimeCb() override;
Return<void> gnssRequestLocationCb(const bool independentFromGnss) override;
+
Return<void> gnssSetSystemInfoCb(const IGnssCallback::GnssSystemInfo& info) override;
// New in 1.1
Return<void> gnssNameCb(const android::hardware::hidl_string& name) override;
// New in 2.0
+ Return<void> gnssRequestLocationCb_2_0(const bool independentFromGnss, const bool isUserEmergency)
+ override;
Return<void> gnssSetCapabilitiesCb_2_0(uint32_t capabilities) override;
Return<void> gnssLocationCb_2_0(const GnssLocation_V2_0& location) override;
@@ -713,8 +716,15 @@ Return<void> GnssCallback::gnssRequestTimeCb() {
}
Return<void> GnssCallback::gnssRequestLocationCb(const bool independentFromGnss) {
+ return GnssCallback::gnssRequestLocationCb_2_0(independentFromGnss, /* isUserEmergency= */
+ false);
+}
+
+Return<void> GnssCallback::gnssRequestLocationCb_2_0(const bool independentFromGnss, const bool
+ isUserEmergency) {
JNIEnv* env = getJniEnv();
- env->CallVoidMethod(mCallbacksObj, method_requestLocation, boolToJbool(independentFromGnss));
+ env->CallVoidMethod(mCallbacksObj, method_requestLocation, boolToJbool(independentFromGnss),
+ boolToJbool(isUserEmergency));
checkAndClearExceptionFromCallback(env, __FUNCTION__);
return Void();
}
@@ -1422,7 +1432,7 @@ static void android_location_GnssLocationProvider_init_once(JNIEnv* env, jclass
method_xtraDownloadRequest = env->GetMethodID(clazz, "xtraDownloadRequest", "()V");
method_reportNiNotification = env->GetMethodID(clazz, "reportNiNotification",
"(IIIIILjava/lang/String;Ljava/lang/String;II)V");
- method_requestLocation = env->GetMethodID(clazz, "requestLocation", "(Z)V");
+ method_requestLocation = env->GetMethodID(clazz, "requestLocation", "(ZZ)V");
method_requestRefLocation = env->GetMethodID(clazz, "requestRefLocation", "()V");
method_requestSetID = env->GetMethodID(clazz, "requestSetID", "(I)V");
method_requestUtcTime = env->GetMethodID(clazz, "requestUtcTime", "()V");
diff --git a/services/java/com/android/server/SystemServer.java b/services/java/com/android/server/SystemServer.java
index 512a745f5abe..a19d5d5a5d76 100644
--- a/services/java/com/android/server/SystemServer.java
+++ b/services/java/com/android/server/SystemServer.java
@@ -1366,7 +1366,6 @@ public final class SystemServer {
ServiceManager.addService(Context.CONNECTIVITY_SERVICE, connectivity,
/* allowIsolated= */ false,
DUMP_FLAG_PRIORITY_HIGH | DUMP_FLAG_PRIORITY_NORMAL);
- networkStats.bindConnectivityManager(connectivity);
networkPolicy.bindConnectivityManager(connectivity);
} catch (Throwable e) {
reportWtf("starting Connectivity Service", e);
diff --git a/services/tests/mockingservicestests/src/com/android/server/am/AppCompactorTest.java b/services/tests/mockingservicestests/src/com/android/server/am/AppCompactorTest.java
index d32f1f77b88f..e100d162813b 100644
--- a/services/tests/mockingservicestests/src/com/android/server/am/AppCompactorTest.java
+++ b/services/tests/mockingservicestests/src/com/android/server/am/AppCompactorTest.java
@@ -16,15 +16,6 @@
package com.android.server.am;
-import static android.provider.DeviceConfig.ActivityManager.KEY_COMPACT_ACTION_1;
-import static android.provider.DeviceConfig.ActivityManager.KEY_COMPACT_ACTION_2;
-import static android.provider.DeviceConfig.ActivityManager.KEY_COMPACT_STATSD_SAMPLE_RATE;
-import static android.provider.DeviceConfig.ActivityManager.KEY_COMPACT_THROTTLE_1;
-import static android.provider.DeviceConfig.ActivityManager.KEY_COMPACT_THROTTLE_2;
-import static android.provider.DeviceConfig.ActivityManager.KEY_COMPACT_THROTTLE_3;
-import static android.provider.DeviceConfig.ActivityManager.KEY_COMPACT_THROTTLE_4;
-import static android.provider.DeviceConfig.ActivityManager.KEY_USE_COMPACTION;
-
import static com.android.server.am.ActivityManagerService.Injector;
import static com.android.server.am.AppCompactor.compactActionIntToString;
@@ -117,28 +108,28 @@ public final class AppCompactorTest {
// When the DeviceConfig already has a flag value stored (note this test will need to
// change if the default value changes from false).
assertThat(AppCompactor.DEFAULT_USE_COMPACTION).isFalse();
- DeviceConfig.setProperty(DeviceConfig.ActivityManager.NAMESPACE,
- KEY_USE_COMPACTION, "true", false);
- DeviceConfig.setProperty(DeviceConfig.ActivityManager.NAMESPACE,
- KEY_COMPACT_ACTION_1,
+ DeviceConfig.setProperty(DeviceConfig.NAMESPACE_ACTIVITY_MANAGER,
+ AppCompactor.KEY_USE_COMPACTION, "true", false);
+ DeviceConfig.setProperty(DeviceConfig.NAMESPACE_ACTIVITY_MANAGER,
+ AppCompactor.KEY_COMPACT_ACTION_1,
Integer.toString((AppCompactor.DEFAULT_COMPACT_ACTION_1 + 1 % 4) + 1), false);
- DeviceConfig.setProperty(DeviceConfig.ActivityManager.NAMESPACE,
- KEY_COMPACT_ACTION_2,
+ DeviceConfig.setProperty(DeviceConfig.NAMESPACE_ACTIVITY_MANAGER,
+ AppCompactor.KEY_COMPACT_ACTION_2,
Integer.toString((AppCompactor.DEFAULT_COMPACT_ACTION_2 + 1 % 4) + 1), false);
- DeviceConfig.setProperty(DeviceConfig.ActivityManager.NAMESPACE,
- KEY_COMPACT_THROTTLE_1,
+ DeviceConfig.setProperty(DeviceConfig.NAMESPACE_ACTIVITY_MANAGER,
+ AppCompactor.KEY_COMPACT_THROTTLE_1,
Long.toString(AppCompactor.DEFAULT_COMPACT_THROTTLE_1 + 1), false);
- DeviceConfig.setProperty(DeviceConfig.ActivityManager.NAMESPACE,
- KEY_COMPACT_THROTTLE_2,
+ DeviceConfig.setProperty(DeviceConfig.NAMESPACE_ACTIVITY_MANAGER,
+ AppCompactor.KEY_COMPACT_THROTTLE_2,
Long.toString(AppCompactor.DEFAULT_COMPACT_THROTTLE_2 + 1), false);
- DeviceConfig.setProperty(DeviceConfig.ActivityManager.NAMESPACE,
- KEY_COMPACT_THROTTLE_3,
+ DeviceConfig.setProperty(DeviceConfig.NAMESPACE_ACTIVITY_MANAGER,
+ AppCompactor.KEY_COMPACT_THROTTLE_3,
Long.toString(AppCompactor.DEFAULT_COMPACT_THROTTLE_3 + 1), false);
- DeviceConfig.setProperty(DeviceConfig.ActivityManager.NAMESPACE,
- KEY_COMPACT_THROTTLE_4,
+ DeviceConfig.setProperty(DeviceConfig.NAMESPACE_ACTIVITY_MANAGER,
+ AppCompactor.KEY_COMPACT_THROTTLE_4,
Long.toString(AppCompactor.DEFAULT_COMPACT_THROTTLE_4 + 1), false);
- DeviceConfig.setProperty(DeviceConfig.ActivityManager.NAMESPACE,
- KEY_COMPACT_STATSD_SAMPLE_RATE,
+ DeviceConfig.setProperty(DeviceConfig.NAMESPACE_ACTIVITY_MANAGER,
+ AppCompactor.KEY_COMPACT_STATSD_SAMPLE_RATE,
Float.toString(AppCompactor.DEFAULT_STATSD_SAMPLE_RATE + 0.1f), false);
// Then calling init will read and set that flag.
@@ -169,8 +160,8 @@ public final class AppCompactorTest {
// When we call init and change some the flag value...
mCompactorUnderTest.init();
mCountDown = new CountDownLatch(1);
- DeviceConfig.setProperty(DeviceConfig.ActivityManager.NAMESPACE,
- KEY_USE_COMPACTION, "true", false);
+ DeviceConfig.setProperty(DeviceConfig.NAMESPACE_ACTIVITY_MANAGER,
+ AppCompactor.KEY_USE_COMPACTION, "true", false);
assertThat(mCountDown.await(5, TimeUnit.SECONDS)).isTrue();
// Then that new flag value is updated in the implementation.
@@ -179,8 +170,8 @@ public final class AppCompactorTest {
// And again, setting the flag the other way.
mCountDown = new CountDownLatch(1);
- DeviceConfig.setProperty(DeviceConfig.ActivityManager.NAMESPACE,
- KEY_USE_COMPACTION, "false", false);
+ DeviceConfig.setProperty(DeviceConfig.NAMESPACE_ACTIVITY_MANAGER,
+ AppCompactor.KEY_USE_COMPACTION, "false", false);
assertThat(mCountDown.await(5, TimeUnit.SECONDS)).isTrue();
assertThat(mCompactorUnderTest.useCompaction()).isFalse();
}
@@ -193,8 +184,8 @@ public final class AppCompactorTest {
// When we push an invalid flag value...
mCountDown = new CountDownLatch(1);
- DeviceConfig.setProperty(DeviceConfig.ActivityManager.NAMESPACE,
- KEY_USE_COMPACTION, "foobar", false);
+ DeviceConfig.setProperty(DeviceConfig.NAMESPACE_ACTIVITY_MANAGER,
+ AppCompactor.KEY_USE_COMPACTION, "foobar", false);
assertThat(mCountDown.await(5, TimeUnit.SECONDS)).isTrue();
// Then we set the default.
@@ -212,11 +203,11 @@ public final class AppCompactorTest {
for (int i = 1; i < 5; i++) {
mCountDown = new CountDownLatch(2);
int expectedSome = (AppCompactor.DEFAULT_COMPACT_ACTION_1 + i) % 4 + 1;
- DeviceConfig.setProperty(DeviceConfig.ActivityManager.NAMESPACE,
- KEY_COMPACT_ACTION_1, Integer.toString(expectedSome), false);
+ DeviceConfig.setProperty(DeviceConfig.NAMESPACE_ACTIVITY_MANAGER,
+ AppCompactor.KEY_COMPACT_ACTION_1, Integer.toString(expectedSome), false);
int expectedFull = (AppCompactor.DEFAULT_COMPACT_ACTION_2 + i) % 4 + 1;
- DeviceConfig.setProperty(DeviceConfig.ActivityManager.NAMESPACE,
- KEY_COMPACT_ACTION_2, Integer.toString(expectedFull), false);
+ DeviceConfig.setProperty(DeviceConfig.NAMESPACE_ACTIVITY_MANAGER,
+ AppCompactor.KEY_COMPACT_ACTION_2, Integer.toString(expectedFull), false);
assertThat(mCountDown.await(5, TimeUnit.SECONDS)).isTrue();
// Then the updates are reflected in the flags.
@@ -233,10 +224,10 @@ public final class AppCompactorTest {
// When we override new values for the compaction action with bad values ...
mCountDown = new CountDownLatch(2);
- DeviceConfig.setProperty(DeviceConfig.ActivityManager.NAMESPACE,
- KEY_COMPACT_ACTION_1, "foo", false);
- DeviceConfig.setProperty(DeviceConfig.ActivityManager.NAMESPACE,
- KEY_COMPACT_ACTION_2, "foo", false);
+ DeviceConfig.setProperty(DeviceConfig.NAMESPACE_ACTIVITY_MANAGER,
+ AppCompactor.KEY_COMPACT_ACTION_1, "foo", false);
+ DeviceConfig.setProperty(DeviceConfig.NAMESPACE_ACTIVITY_MANAGER,
+ AppCompactor.KEY_COMPACT_ACTION_2, "foo", false);
assertThat(mCountDown.await(5, TimeUnit.SECONDS)).isTrue();
// Then the default values are reflected in the flag
@@ -246,10 +237,10 @@ public final class AppCompactorTest {
compactActionIntToString(AppCompactor.DEFAULT_COMPACT_ACTION_2));
mCountDown = new CountDownLatch(2);
- DeviceConfig.setProperty(DeviceConfig.ActivityManager.NAMESPACE,
- KEY_COMPACT_ACTION_1, "", false);
- DeviceConfig.setProperty(DeviceConfig.ActivityManager.NAMESPACE,
- KEY_COMPACT_ACTION_2, "", false);
+ DeviceConfig.setProperty(DeviceConfig.NAMESPACE_ACTIVITY_MANAGER,
+ AppCompactor.KEY_COMPACT_ACTION_1, "", false);
+ DeviceConfig.setProperty(DeviceConfig.NAMESPACE_ACTIVITY_MANAGER,
+ AppCompactor.KEY_COMPACT_ACTION_2, "", false);
assertThat(mCountDown.await(5, TimeUnit.SECONDS)).isTrue();
assertThat(mCompactorUnderTest.mCompactActionSome).isEqualTo(
@@ -264,17 +255,17 @@ public final class AppCompactorTest {
// When we override new reasonable throttle values after init...
mCountDown = new CountDownLatch(4);
- DeviceConfig.setProperty(DeviceConfig.ActivityManager.NAMESPACE,
- KEY_COMPACT_THROTTLE_1,
+ DeviceConfig.setProperty(DeviceConfig.NAMESPACE_ACTIVITY_MANAGER,
+ AppCompactor.KEY_COMPACT_THROTTLE_1,
Long.toString(AppCompactor.DEFAULT_COMPACT_THROTTLE_1 + 1), false);
- DeviceConfig.setProperty(DeviceConfig.ActivityManager.NAMESPACE,
- KEY_COMPACT_THROTTLE_2,
+ DeviceConfig.setProperty(DeviceConfig.NAMESPACE_ACTIVITY_MANAGER,
+ AppCompactor.KEY_COMPACT_THROTTLE_2,
Long.toString(AppCompactor.DEFAULT_COMPACT_THROTTLE_2 + 1), false);
- DeviceConfig.setProperty(DeviceConfig.ActivityManager.NAMESPACE,
- KEY_COMPACT_THROTTLE_3,
+ DeviceConfig.setProperty(DeviceConfig.NAMESPACE_ACTIVITY_MANAGER,
+ AppCompactor.KEY_COMPACT_THROTTLE_3,
Long.toString(AppCompactor.DEFAULT_COMPACT_THROTTLE_3 + 1), false);
- DeviceConfig.setProperty(DeviceConfig.ActivityManager.NAMESPACE,
- KEY_COMPACT_THROTTLE_4,
+ DeviceConfig.setProperty(DeviceConfig.NAMESPACE_ACTIVITY_MANAGER,
+ AppCompactor.KEY_COMPACT_THROTTLE_4,
Long.toString(AppCompactor.DEFAULT_COMPACT_THROTTLE_4 + 1), false);
assertThat(mCountDown.await(5, TimeUnit.SECONDS)).isTrue();
@@ -296,8 +287,8 @@ public final class AppCompactorTest {
// When one of the throttles is overridden with a bad value...
mCountDown = new CountDownLatch(1);
- DeviceConfig.setProperty(DeviceConfig.ActivityManager.NAMESPACE,
- KEY_COMPACT_THROTTLE_1, "foo", false);
+ DeviceConfig.setProperty(DeviceConfig.NAMESPACE_ACTIVITY_MANAGER,
+ AppCompactor.KEY_COMPACT_THROTTLE_1, "foo", false);
// Then all the throttles have the defaults set.
assertThat(mCountDown.await(5, TimeUnit.SECONDS)).isTrue();
assertThat(mCompactorUnderTest.mCompactThrottleSomeSome).isEqualTo(
@@ -311,8 +302,8 @@ public final class AppCompactorTest {
// Repeat for each of the throttle keys.
mCountDown = new CountDownLatch(1);
- DeviceConfig.setProperty(DeviceConfig.ActivityManager.NAMESPACE,
- KEY_COMPACT_THROTTLE_2, "foo", false);
+ DeviceConfig.setProperty(DeviceConfig.NAMESPACE_ACTIVITY_MANAGER,
+ AppCompactor.KEY_COMPACT_THROTTLE_2, "foo", false);
assertThat(mCountDown.await(5, TimeUnit.SECONDS)).isTrue();
assertThat(mCompactorUnderTest.mCompactThrottleSomeSome).isEqualTo(
AppCompactor.DEFAULT_COMPACT_THROTTLE_1);
@@ -324,8 +315,8 @@ public final class AppCompactorTest {
AppCompactor.DEFAULT_COMPACT_THROTTLE_4);
mCountDown = new CountDownLatch(1);
- DeviceConfig.setProperty(DeviceConfig.ActivityManager.NAMESPACE,
- KEY_COMPACT_THROTTLE_3, "foo", false);
+ DeviceConfig.setProperty(DeviceConfig.NAMESPACE_ACTIVITY_MANAGER,
+ AppCompactor.KEY_COMPACT_THROTTLE_3, "foo", false);
assertThat(mCountDown.await(5, TimeUnit.SECONDS)).isTrue();
assertThat(mCompactorUnderTest.mCompactThrottleSomeSome).isEqualTo(
AppCompactor.DEFAULT_COMPACT_THROTTLE_1);
@@ -337,8 +328,8 @@ public final class AppCompactorTest {
AppCompactor.DEFAULT_COMPACT_THROTTLE_4);
mCountDown = new CountDownLatch(1);
- DeviceConfig.setProperty(DeviceConfig.ActivityManager.NAMESPACE,
- KEY_COMPACT_THROTTLE_4, "foo", false);
+ DeviceConfig.setProperty(DeviceConfig.NAMESPACE_ACTIVITY_MANAGER,
+ AppCompactor.KEY_COMPACT_THROTTLE_4, "foo", false);
assertThat(mCountDown.await(5, TimeUnit.SECONDS)).isTrue();
assertThat(mCompactorUnderTest.mCompactThrottleSomeSome).isEqualTo(
AppCompactor.DEFAULT_COMPACT_THROTTLE_1);
@@ -356,8 +347,8 @@ public final class AppCompactorTest {
// When we override mStatsdSampleRate with a reasonable values ...
mCountDown = new CountDownLatch(1);
- DeviceConfig.setProperty(DeviceConfig.ActivityManager.NAMESPACE,
- KEY_COMPACT_STATSD_SAMPLE_RATE,
+ DeviceConfig.setProperty(DeviceConfig.NAMESPACE_ACTIVITY_MANAGER,
+ AppCompactor.KEY_COMPACT_STATSD_SAMPLE_RATE,
Float.toString(AppCompactor.DEFAULT_STATSD_SAMPLE_RATE + 0.1f), false);
assertThat(mCountDown.await(5, TimeUnit.SECONDS)).isTrue();
@@ -373,8 +364,8 @@ public final class AppCompactorTest {
// When we override mStatsdSampleRate with a reasonable values ...
mCountDown = new CountDownLatch(1);
- DeviceConfig.setProperty(DeviceConfig.ActivityManager.NAMESPACE,
- KEY_COMPACT_STATSD_SAMPLE_RATE, "foo", false);
+ DeviceConfig.setProperty(DeviceConfig.NAMESPACE_ACTIVITY_MANAGER,
+ AppCompactor.KEY_COMPACT_STATSD_SAMPLE_RATE, "foo", false);
assertThat(mCountDown.await(5, TimeUnit.SECONDS)).isTrue();
// Then that override is reflected in the compactor.
@@ -389,8 +380,8 @@ public final class AppCompactorTest {
// When we override mStatsdSampleRate with an value outside of [0..1]...
mCountDown = new CountDownLatch(1);
- DeviceConfig.setProperty(DeviceConfig.ActivityManager.NAMESPACE,
- KEY_COMPACT_STATSD_SAMPLE_RATE,
+ DeviceConfig.setProperty(DeviceConfig.NAMESPACE_ACTIVITY_MANAGER,
+ AppCompactor.KEY_COMPACT_STATSD_SAMPLE_RATE,
Float.toString(-1.0f), false);
assertThat(mCountDown.await(5, TimeUnit.SECONDS)).isTrue();
@@ -398,8 +389,8 @@ public final class AppCompactorTest {
assertThat(mCompactorUnderTest.mStatsdSampleRate).isEqualTo(0.0f);
mCountDown = new CountDownLatch(1);
- DeviceConfig.setProperty(DeviceConfig.ActivityManager.NAMESPACE,
- KEY_COMPACT_STATSD_SAMPLE_RATE,
+ DeviceConfig.setProperty(DeviceConfig.NAMESPACE_ACTIVITY_MANAGER,
+ AppCompactor.KEY_COMPACT_STATSD_SAMPLE_RATE,
Float.toString(1.01f), false);
assertThat(mCountDown.await(5, TimeUnit.SECONDS)).isTrue();
diff --git a/services/tests/servicestests/src/com/android/server/power/AttentionDetectorTest.java b/services/tests/servicestests/src/com/android/server/power/AttentionDetectorTest.java
index 6a937fabd3ec..a2f1f01b689f 100644
--- a/services/tests/servicestests/src/com/android/server/power/AttentionDetectorTest.java
+++ b/services/tests/servicestests/src/com/android/server/power/AttentionDetectorTest.java
@@ -32,10 +32,13 @@ import android.attention.AttentionManagerInternal;
import android.os.PowerManager;
import android.os.PowerManagerInternal;
import android.os.SystemClock;
+import android.os.UserHandle;
+import android.provider.Settings;
import android.service.attention.AttentionService;
import android.test.AndroidTestCase;
import android.test.suitebuilder.annotation.SmallTest;
+import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.mockito.Mock;
@@ -49,6 +52,7 @@ public class AttentionDetectorTest extends AndroidTestCase {
private TestableAttentionDetector mAttentionDetector;
private long mAttentionTimeout;
private long mNextDimming;
+ private int mIsSettingEnabled;
@Before
public void setUp() {
@@ -59,6 +63,20 @@ public class AttentionDetectorTest extends AndroidTestCase {
mAttentionDetector.onWakefulnessChangeStarted(PowerManagerInternal.WAKEFULNESS_AWAKE);
mAttentionDetector.setAttentionServiceSupported(true);
mNextDimming = SystemClock.uptimeMillis() + 3000L;
+
+ // Save the existing state.
+ mIsSettingEnabled = Settings.System.getIntForUser(getContext().getContentResolver(),
+ Settings.System.ADAPTIVE_SLEEP, 0, UserHandle.USER_CURRENT);
+
+ Settings.System.putIntForUser(getContext().getContentResolver(),
+ Settings.System.ADAPTIVE_SLEEP, 1, UserHandle.USER_CURRENT);
+ mAttentionDetector.updateEnabledFromSettings(getContext());
+ }
+
+ @After
+ public void tearDown() {
+ Settings.System.putIntForUser(getContext().getContentResolver(),
+ Settings.System.ADAPTIVE_SLEEP, mIsSettingEnabled, UserHandle.USER_CURRENT);
}
@Test
@@ -69,6 +87,16 @@ public class AttentionDetectorTest extends AndroidTestCase {
}
@Test
+ public void testOnUserActivity_doesntCheckIfNotEnabled() {
+ Settings.System.putIntForUser(getContext().getContentResolver(),
+ Settings.System.ADAPTIVE_SLEEP, 0, UserHandle.USER_CURRENT);
+ mAttentionDetector.updateEnabledFromSettings(getContext());
+ long when = registerAttention();
+ verify(mAttentionManagerInternal, never()).checkAttention(anyInt(), anyLong(), any());
+ assertThat(mNextDimming).isEqualTo(when);
+ }
+
+ @Test
public void testOnUserActivity_doesntCheckIfNotSupported() {
mAttentionDetector.setAttentionServiceSupported(false);
long when = registerAttention();
diff --git a/services/tests/servicestests/src/com/android/server/power/PowerManagerServiceTest.java b/services/tests/servicestests/src/com/android/server/power/PowerManagerServiceTest.java
index 911c4a2f4122..1bda412f2f89 100644
--- a/services/tests/servicestests/src/com/android/server/power/PowerManagerServiceTest.java
+++ b/services/tests/servicestests/src/com/android/server/power/PowerManagerServiceTest.java
@@ -18,44 +18,67 @@ package com.android.server.power;
import static android.os.PowerManagerInternal.WAKEFULNESS_ASLEEP;
import static android.os.PowerManagerInternal.WAKEFULNESS_AWAKE;
+import static android.os.PowerManagerInternal.WAKEFULNESS_DOZING;
+import static android.os.PowerManagerInternal.WAKEFULNESS_DREAMING;
import static com.google.common.truth.Truth.assertThat;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyInt;
import static org.mockito.ArgumentMatchers.anyString;
+import static org.mockito.ArgumentMatchers.argThat;
import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.ArgumentMatchers.isA;
+import static org.mockito.ArgumentMatchers.isNull;
import static org.mockito.Mockito.doAnswer;
import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import android.app.ActivityManagerInternal;
import android.attention.AttentionManagerInternal;
import android.content.Context;
+import android.content.ContextWrapper;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.content.res.Resources;
+import android.hardware.SensorManager;
+import android.hardware.display.AmbientDisplayConfiguration;
import android.hardware.display.DisplayManagerInternal;
import android.hardware.display.DisplayManagerInternal.DisplayPowerRequest;
+import android.os.BatteryManager;
import android.os.BatteryManagerInternal;
import android.os.Binder;
+import android.os.Handler;
+import android.os.IBinder;
import android.os.Looper;
import android.os.PowerManager;
import android.os.PowerSaveState;
import android.os.SystemClock;
import android.os.SystemProperties;
-import android.test.AndroidTestCase;
-import android.test.suitebuilder.annotation.MediumTest;
-import android.test.suitebuilder.annotation.SmallTest;
+import android.os.UserHandle;
+import android.provider.Settings;
+
+import androidx.test.InstrumentationRegistry;
import com.android.internal.app.IBatteryStats;
import com.android.server.LocalServices;
import com.android.server.SystemService;
import com.android.server.lights.LightsManager;
import com.android.server.policy.WindowManagerPolicy;
+import com.android.server.power.PowerManagerService.BatteryReceiver;
import com.android.server.power.PowerManagerService.Injector;
import com.android.server.power.PowerManagerService.NativeWrapper;
+import com.android.server.power.PowerManagerService.UserSwitchedReceiver;
import com.android.server.power.batterysaver.BatterySaverPolicy;
import com.android.server.power.batterysaver.BatterySavingStats;
-import org.junit.Rule;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.mockito.ArgumentCaptor;
+import org.mockito.ArgumentMatcher;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
@@ -65,29 +88,54 @@ import java.util.Map;
/**
* Tests for {@link com.android.server.power.PowerManagerService}
*/
-public class PowerManagerServiceTest extends AndroidTestCase {
+public class PowerManagerServiceTest {
private static final float PRECISION = 0.001f;
private static final float BRIGHTNESS_FACTOR = 0.7f;
private static final boolean BATTERY_SAVER_ENABLED = true;
private static final String TEST_LAST_REBOOT_PROPERTY = "test.sys.boot.reason";
- private @Mock BatterySaverPolicy mBatterySaverPolicyMock;
- private @Mock LightsManager mLightsManagerMock;
- private @Mock DisplayManagerInternal mDisplayManagerInternalMock;
- private @Mock BatteryManagerInternal mBatteryManagerInternalMock;
- private @Mock ActivityManagerInternal mActivityManagerInternalMock;
- private @Mock AttentionManagerInternal mAttentionManagerInternalMock;
- private @Mock PowerManagerService.NativeWrapper mNativeWrapperMock;
- private @Mock Notifier mNotifierMock;
+ @Mock private BatterySaverPolicy mBatterySaverPolicyMock;
+ @Mock private LightsManager mLightsManagerMock;
+ @Mock private DisplayManagerInternal mDisplayManagerInternalMock;
+ @Mock private BatteryManagerInternal mBatteryManagerInternalMock;
+ @Mock private ActivityManagerInternal mActivityManagerInternalMock;
+ @Mock private AttentionManagerInternal mAttentionManagerInternalMock;
+ @Mock private PowerManagerService.NativeWrapper mNativeWrapperMock;
+ @Mock private Notifier mNotifierMock;
+ @Mock private WirelessChargerDetector mWirelessChargerDetectorMock;
+ @Mock private AmbientDisplayConfiguration mAmbientDisplayConfigurationMock;
+
private PowerManagerService mService;
private PowerSaveState mPowerSaveState;
private DisplayPowerRequest mDisplayPowerRequest;
+ private ContextWrapper mContextSpy;
+ private BatteryReceiver mBatteryReceiver;
+ private UserSwitchedReceiver mUserSwitchedReceiver;
+ private Resources mResourcesSpy;
+
+ private class IntentFilterMatcher implements ArgumentMatcher<IntentFilter> {
+ private final IntentFilter mFilter;
+
+ IntentFilterMatcher(IntentFilter filter) {
+ mFilter = filter;
+ }
+
+ @Override
+ public boolean matches(IntentFilter other) {
+ if (other.countActions() != mFilter.countActions()) {
+ return false;
+ }
+ for (int i = 0; i < mFilter.countActions(); i++) {
+ if (!mFilter.getAction(i).equals(other.getAction(i))) {
+ return false;
+ }
+ }
+ return true;
+ }
+ }
-
-
- @Rule
+ @Before
public void setUp() throws Exception {
- super.setUp();
MockitoAnnotations.initMocks(this);
mPowerSaveState = new PowerSaveState.Builder()
@@ -105,33 +153,54 @@ public class PowerManagerServiceTest extends AndroidTestCase {
addLocalServiceMock(ActivityManagerInternal.class, mActivityManagerInternalMock);
addLocalServiceMock(AttentionManagerInternal.class, mAttentionManagerInternalMock);
- mService = new PowerManagerService(getContext(), new Injector() {
+ mContextSpy = spy(new ContextWrapper(InstrumentationRegistry.getContext()));
+ mResourcesSpy = spy(mContextSpy.getResources());
+ when(mContextSpy.getResources()).thenReturn(mResourcesSpy);
+
+ mService = new PowerManagerService(mContextSpy, new Injector() {
+ @Override
Notifier createNotifier(Looper looper, Context context, IBatteryStats batteryStats,
SuspendBlocker suspendBlocker, WindowManagerPolicy policy) {
return mNotifierMock;
}
+ @Override
SuspendBlocker createSuspendBlocker(PowerManagerService service, String name) {
return mock(SuspendBlocker.class);
}
+ @Override
BatterySaverPolicy createBatterySaverPolicy(
Object lock, Context context, BatterySavingStats batterySavingStats) {
return mBatterySaverPolicyMock;
}
+ @Override
NativeWrapper createNativeWrapper() {
return mNativeWrapperMock;
}
+
+ @Override
+ WirelessChargerDetector createWirelessChargerDetector(
+ SensorManager sensorManager, SuspendBlocker suspendBlocker, Handler handler) {
+ return mWirelessChargerDetectorMock;
+ }
+
+ @Override
+ AmbientDisplayConfiguration createAmbientDisplayConfiguration(Context context) {
+ return mAmbientDisplayConfigurationMock;
+ }
});
}
- @Override
+ @After
public void tearDown() throws Exception {
LocalServices.removeServiceForTest(LightsManager.class);
LocalServices.removeServiceForTest(DisplayManagerInternal.class);
LocalServices.removeServiceForTest(BatteryManagerInternal.class);
LocalServices.removeServiceForTest(ActivityManagerInternal.class);
+ Settings.Global.putInt(
+ mContextSpy.getContentResolver(), Settings.Global.THEATER_MODE_ON, 0);
}
/**
@@ -142,7 +211,56 @@ public class PowerManagerServiceTest extends AndroidTestCase {
LocalServices.addService(clazz, mock);
}
- @SmallTest
+ private void startSystem() throws Exception {
+ mService.systemReady(null);
+
+ // Grab the BatteryReceiver
+ ArgumentCaptor<BatteryReceiver> batCaptor = ArgumentCaptor.forClass(BatteryReceiver.class);
+ IntentFilter batFilter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED);
+ batFilter.setPriority(IntentFilter.SYSTEM_HIGH_PRIORITY);
+ verify(mContextSpy).registerReceiver(batCaptor.capture(),
+ argThat(new IntentFilterMatcher(batFilter)), isNull(), isA(Handler.class));
+ mBatteryReceiver = batCaptor.getValue();
+
+ // Grab the UserSwitchedReceiver
+ ArgumentCaptor<UserSwitchedReceiver> userSwitchedCaptor =
+ ArgumentCaptor.forClass(UserSwitchedReceiver.class);
+ IntentFilter usFilter = new IntentFilter(Intent.ACTION_USER_SWITCHED);
+ verify(mContextSpy).registerReceiver(userSwitchedCaptor.capture(),
+ argThat(new IntentFilterMatcher(usFilter)), isNull(), isA(Handler.class));
+ mUserSwitchedReceiver = userSwitchedCaptor.getValue();
+
+ mService.onBootPhase(SystemService.PHASE_BOOT_COMPLETED);
+ }
+
+ private void forceSleep() {
+ mService.getBinderServiceInstance().goToSleep(SystemClock.uptimeMillis(),
+ PowerManager.GO_TO_SLEEP_REASON_APPLICATION, PowerManager.GO_TO_SLEEP_FLAG_NO_DOZE);
+ }
+
+ private void forceDream() {
+ mService.getBinderServiceInstance().nap(SystemClock.uptimeMillis());
+ }
+
+ private void forceAwake() {
+ mService.getBinderServiceInstance().wakeUp(SystemClock.uptimeMillis(),
+ PowerManager.WAKE_REASON_UNKNOWN, "testing IPowerManager.wakeUp()", "pkg.name");
+ }
+
+ private void forceDozing() {
+ mService.getBinderServiceInstance().goToSleep(SystemClock.uptimeMillis(),
+ PowerManager.GO_TO_SLEEP_REASON_APPLICATION, 0);
+ }
+
+ private void setPluggedIn(boolean isPluggedIn) {
+ // Set the callback to return the new state
+ when(mBatteryManagerInternalMock.isPowered(BatteryManager.BATTERY_PLUGGED_ANY))
+ .thenReturn(isPluggedIn);
+ // Trigger PowerManager to reread the plug-in state
+ mBatteryReceiver.onReceive(mContextSpy, new Intent(Intent.ACTION_BATTERY_CHANGED));
+ }
+
+ @Test
public void testUpdatePowerScreenPolicy_UpdateDisplayPowerRequest() {
mService.updatePowerRequestFromBatterySaverPolicy(mDisplayPowerRequest);
assertThat(mDisplayPowerRequest.lowPowerMode).isEqualTo(BATTERY_SAVER_ENABLED);
@@ -150,7 +268,7 @@ public class PowerManagerServiceTest extends AndroidTestCase {
.isWithin(PRECISION).of(BRIGHTNESS_FACTOR);
}
- @SmallTest
+ @Test
public void testGetLastShutdownReasonInternal() {
SystemProperties.set(TEST_LAST_REBOOT_PROPERTY, "shutdown,thermal");
int reason = mService.getLastShutdownReasonInternal(TEST_LAST_REBOOT_PROPERTY);
@@ -158,7 +276,7 @@ public class PowerManagerServiceTest extends AndroidTestCase {
assertThat(reason).isEqualTo(PowerManager.SHUTDOWN_REASON_THERMAL_SHUTDOWN);
}
- @SmallTest
+ @Test
public void testGetDesiredScreenPolicy_WithVR() throws Exception {
// Brighten up the screen
mService.setWakefulnessLocked(WAKEFULNESS_AWAKE, PowerManager.WAKE_REASON_UNKNOWN, 0);
@@ -187,42 +305,171 @@ public class PowerManagerServiceTest extends AndroidTestCase {
DisplayPowerRequest.POLICY_BRIGHT);
}
- @SmallTest
+ @Test
public void testWakefulnessAwake_InitialValue() throws Exception {
assertThat(mService.getWakefulness()).isEqualTo(WAKEFULNESS_AWAKE);
}
- @SmallTest
+ @Test
public void testWakefulnessSleep_NoDozeSleepFlag() throws Exception {
// Start with AWAKE state
+ startSystem();
assertThat(mService.getWakefulness()).isEqualTo(WAKEFULNESS_AWAKE);
- mService.systemReady(null);
- mService.onBootPhase(SystemService.PHASE_BOOT_COMPLETED);
-
- // Take a nap with a flag.
+ // Take a nap and verify.
mService.getBinderServiceInstance().goToSleep(SystemClock.uptimeMillis(),
- PowerManager.GO_TO_SLEEP_REASON_APPLICATION, PowerManager.GO_TO_SLEEP_FLAG_NO_DOZE);
+ PowerManager.GO_TO_SLEEP_REASON_APPLICATION, PowerManager.GO_TO_SLEEP_FLAG_NO_DOZE);
+ assertThat(mService.getWakefulness()).isEqualTo(WAKEFULNESS_ASLEEP);
+ }
+
+ @Test
+ public void testWakefulnessAwake_AcquireCausesWakeup() throws Exception {
+ startSystem();
+ forceSleep();
+
+ IBinder token = new Binder();
+ String tag = "acq_causes_wakeup";
+ String packageName = "pkg.name";
+
+ // First, ensure that a normal full wake lock does not cause a wakeup
+ int flags = PowerManager.FULL_WAKE_LOCK;
+ mService.getBinderServiceInstance().acquireWakeLock(token, flags, tag, packageName,
+ null /* workSource */, null /* historyTag */);
+ assertThat(mService.getWakefulness()).isEqualTo(WAKEFULNESS_ASLEEP);
+ mService.getBinderServiceInstance().releaseWakeLock(token, 0 /* flags */);
+
+ // Ensure that the flag does *NOT* work with a partial wake lock.
+ flags = PowerManager.PARTIAL_WAKE_LOCK | PowerManager.ACQUIRE_CAUSES_WAKEUP;
+ mService.getBinderServiceInstance().acquireWakeLock(token, flags, tag, packageName,
+ null /* workSource */, null /* historyTag */);
+ assertThat(mService.getWakefulness()).isEqualTo(WAKEFULNESS_ASLEEP);
+ mService.getBinderServiceInstance().releaseWakeLock(token, 0 /* flags */);
+
+ // Verify that flag forces a wakeup when paired to a FULL_WAKE_LOCK
+ flags = PowerManager.FULL_WAKE_LOCK | PowerManager.ACQUIRE_CAUSES_WAKEUP;
+ mService.getBinderServiceInstance().acquireWakeLock(token, flags, tag, packageName,
+ null /* workSource */, null /* historyTag */);
+ assertThat(mService.getWakefulness()).isEqualTo(WAKEFULNESS_AWAKE);
+ mService.getBinderServiceInstance().releaseWakeLock(token, 0 /* flags */);
+ }
+
+ @Test
+ public void testWakefulnessAwake_IPowerManagerWakeUp() throws Exception {
+ startSystem();
+ forceSleep();
+ mService.getBinderServiceInstance().wakeUp(SystemClock.uptimeMillis(),
+ PowerManager.WAKE_REASON_UNKNOWN, "testing IPowerManager.wakeUp()", "pkg.name");
+ assertThat(mService.getWakefulness()).isEqualTo(WAKEFULNESS_AWAKE);
+ }
+
+ /**
+ * Tests a series of variants that control whether a device wakes-up when it is plugged in
+ * or docked.
+ */
+ @Test
+ public void testWakefulnessAwake_ShouldWakeUpWhenPluggedIn() throws Exception {
+ boolean powerState;
+ startSystem();
+ forceSleep();
+
+ // Test 1:
+ // Set config to prevent it wake up, test, verify, reset config value.
+ when(mResourcesSpy.getBoolean(com.android.internal.R.bool.config_unplugTurnsOnScreen))
+ .thenReturn(false);
+ mService.readConfigurationLocked();
+ setPluggedIn(true);
+ assertThat(mService.getWakefulness()).isEqualTo(WAKEFULNESS_ASLEEP);
+ when(mResourcesSpy.getBoolean(com.android.internal.R.bool.config_unplugTurnsOnScreen))
+ .thenReturn(true);
+ mService.readConfigurationLocked();
+
+ // Test 2:
+ // Turn the power off, sleep, then plug into a wireless charger.
+ // Verify that we do not wake up if the phone is being plugged into a wireless charger.
+ setPluggedIn(false);
+ forceSleep();
+ when(mBatteryManagerInternalMock.getPlugType())
+ .thenReturn(BatteryManager.BATTERY_PLUGGED_WIRELESS);
+ when(mWirelessChargerDetectorMock.update(true /* isPowered */,
+ BatteryManager.BATTERY_PLUGGED_WIRELESS)).thenReturn(false);
+ setPluggedIn(true);
+ assertThat(mService.getWakefulness()).isEqualTo(WAKEFULNESS_ASLEEP);
+
+ // Test 3:
+ // Do not wake up if the phone is being REMOVED from a wireless charger
+ when(mBatteryManagerInternalMock.getPlugType()).thenReturn(0);
+ setPluggedIn(false);
+ assertThat(mService.getWakefulness()).isEqualTo(WAKEFULNESS_ASLEEP);
+ // Test 4:
+ // Do not wake if we are dreaming.
+ forceAwake(); // Needs to be awake first before it can dream.
+ forceDream();
+ setPluggedIn(true);
+ assertThat(mService.getWakefulness()).isEqualTo(WAKEFULNESS_DREAMING);
+ forceSleep();
+
+ // Test 5:
+ // Don't wake if the device is configured not to wake up in theater mode (and theater
+ // mode is enabled).
+ Settings.Global.putInt(
+ mContextSpy.getContentResolver(), Settings.Global.THEATER_MODE_ON, 1);
+ mUserSwitchedReceiver.onReceive(mContextSpy, new Intent(Intent.ACTION_USER_SWITCHED));
+ when(mResourcesSpy.getBoolean(
+ com.android.internal.R.bool.config_allowTheaterModeWakeFromUnplug))
+ .thenReturn(false);
+ setPluggedIn(false);
assertThat(mService.getWakefulness()).isEqualTo(WAKEFULNESS_ASLEEP);
+ Settings.Global.putInt(
+ mContextSpy.getContentResolver(), Settings.Global.THEATER_MODE_ON, 0);
+ mUserSwitchedReceiver.onReceive(mContextSpy, new Intent(Intent.ACTION_USER_SWITCHED));
+
+ // Test 6:
+ // Don't wake up if we are Dozing away and always-on is enabled.
+ when(mAmbientDisplayConfigurationMock.alwaysOnEnabled(UserHandle.USER_CURRENT))
+ .thenReturn(true);
+ mUserSwitchedReceiver.onReceive(mContextSpy, new Intent(Intent.ACTION_USER_SWITCHED));
+ forceAwake();
+ forceDozing();
+ setPluggedIn(true);
+ assertThat(mService.getWakefulness()).isEqualTo(WAKEFULNESS_DOZING);
+
+ // Test 7:
+ // Finally, take away all the factors above and ensure the device wakes up!
+ forceAwake();
+ forceSleep();
+ setPluggedIn(false);
+ assertThat(mService.getWakefulness()).isEqualTo(WAKEFULNESS_AWAKE);
+ }
+
+ @Test
+ public void testWakefulnessDoze_goToSleep() throws Exception {
+ // Start with AWAKE state
+ startSystem();
+ assertThat(mService.getWakefulness()).isEqualTo(WAKEFULNESS_AWAKE);
+
+ // Take a nap and verify.
+ mService.getBinderServiceInstance().goToSleep(SystemClock.uptimeMillis(),
+ PowerManager.GO_TO_SLEEP_REASON_APPLICATION, 0);
+ assertThat(mService.getWakefulness()).isEqualTo(WAKEFULNESS_DOZING);
}
- @MediumTest
+ @Test
public void testWasDeviceIdleFor_true() {
int interval = 1000;
mService.onUserActivity();
- SystemClock.sleep(interval);
+ SystemClock.sleep(interval + 1 /* just a little more */);
assertThat(mService.wasDeviceIdleForInternal(interval)).isTrue();
}
- @SmallTest
+ @Test
public void testWasDeviceIdleFor_false() {
int interval = 1000;
mService.onUserActivity();
assertThat(mService.wasDeviceIdleForInternal(interval)).isFalse();
}
- @SmallTest
+ @Test
public void testForceSuspend_putsDeviceToSleep() {
mService.systemReady(null);
mService.onBootPhase(SystemService.PHASE_BOOT_COMPLETED);
@@ -244,11 +491,11 @@ public class PowerManagerServiceTest extends AndroidTestCase {
assertThat(mService.getWakefulness()).isEqualTo(WAKEFULNESS_ASLEEP);
}
- @SmallTest
+ @Test
public void testForceSuspend_pakeLocksDisabled() {
final String tag = "TestWakelockTag_098213";
final int flags = PowerManager.PARTIAL_WAKE_LOCK;
- final String pkg = getContext().getOpPackageName();
+ final String pkg = mContextSpy.getOpPackageName();
// Set up the Notification mock to keep track of the wakelocks that are currently
// active or disabled. We'll use this to verify that wakelocks are disabled when
@@ -292,7 +539,7 @@ public class PowerManagerServiceTest extends AndroidTestCase {
}
- @SmallTest
+ @Test
public void testForceSuspend_forceSuspendFailurePropogated() {
when(mNativeWrapperMock.nativeForceSuspend()).thenReturn(false);
assertThat(mService.getBinderServiceInstance().forceSuspend()).isFalse();
diff --git a/services/tests/servicestests/src/com/android/server/rollback/AppDataRollbackHelperTest.java b/services/tests/servicestests/src/com/android/server/rollback/AppDataRollbackHelperTest.java
index d848b2dc75fe..fc7ccc576abb 100644
--- a/services/tests/servicestests/src/com/android/server/rollback/AppDataRollbackHelperTest.java
+++ b/services/tests/servicestests/src/com/android/server/rollback/AppDataRollbackHelperTest.java
@@ -236,20 +236,20 @@ public class AppDataRollbackHelperTest {
wasRecentlyRestored.getPendingRestores().add(
new RestoreInfo(73 /* userId */, 239 /* appId*/, "seInfo"));
- RollbackData dataWithPendingBackup = new RollbackData(101, new File("/does/not/exist"), -1,
- true);
- dataWithPendingBackup.packages.add(pendingBackup);
+ RollbackData dataWithPendingBackup = new RollbackData(101, new File("/does/not/exist"), -1);
+ dataWithPendingBackup.info.getPackages().add(pendingBackup);
RollbackData dataWithRecentRestore = new RollbackData(17239, new File("/does/not/exist"),
- -1, true);
- dataWithRecentRestore.packages.add(wasRecentlyRestored);
+ -1);
+ dataWithRecentRestore.info.getPackages().add(wasRecentlyRestored);
RollbackData dataForDifferentUser = new RollbackData(17239, new File("/does/not/exist"),
- -1, true);
- dataForDifferentUser.packages.add(ignoredInfo);
+ -1);
+ dataForDifferentUser.info.getPackages().add(ignoredInfo);
RollbackInfo rollbackInfo = new RollbackInfo(17239,
- Arrays.asList(pendingRestore, wasRecentlyRestored), false);
+ Arrays.asList(pendingRestore, wasRecentlyRestored), false,
+ new ArrayList<>(), -1);
List<RollbackData> changed = helper.commitPendingBackupAndRestoreForUser(37,
Arrays.asList(dataWithPendingBackup, dataWithRecentRestore, dataForDifferentUser),
diff --git a/services/tests/wmtests/src/com/android/server/wm/AppWindowTokenTests.java b/services/tests/wmtests/src/com/android/server/wm/AppWindowTokenTests.java
index 2c575f59a020..68b40b92b9cc 100644
--- a/services/tests/wmtests/src/com/android/server/wm/AppWindowTokenTests.java
+++ b/services/tests/wmtests/src/com/android/server/wm/AppWindowTokenTests.java
@@ -18,11 +18,11 @@ package com.android.server.wm;
import static android.app.WindowConfiguration.WINDOWING_MODE_FREEFORM;
import static android.app.WindowConfiguration.WINDOWING_MODE_SPLIT_SCREEN_SECONDARY;
-import static android.content.ActivityInfoProto.SCREEN_ORIENTATION_UNSPECIFIED;
import static android.content.pm.ActivityInfo.SCREEN_ORIENTATION_BEHIND;
import static android.content.pm.ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE;
import static android.content.pm.ActivityInfo.SCREEN_ORIENTATION_REVERSE_LANDSCAPE;
import static android.content.pm.ActivityInfo.SCREEN_ORIENTATION_UNSET;
+import static android.content.pm.ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED;
import static android.view.WindowManager.LayoutParams.FIRST_APPLICATION_WINDOW;
import static android.view.WindowManager.LayoutParams.FIRST_SUB_WINDOW;
import static android.view.WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD;
@@ -42,12 +42,16 @@ import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
+import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyInt;
+import static org.mockito.Mockito.RETURNS_DEEP_STUBS;
+import static org.mockito.Mockito.verify;
import android.content.res.Configuration;
import android.graphics.Point;
import android.graphics.Rect;
import android.platform.test.annotations.Presubmit;
+import android.view.Display;
import android.view.Surface;
import android.view.WindowManager;
@@ -55,6 +59,7 @@ import androidx.test.filters.SmallTest;
import org.junit.Before;
import org.junit.Test;
+import org.mockito.Mockito;
/**
* Tests for the {@link AppWindowToken} class.
@@ -332,6 +337,46 @@ public class AppWindowTokenTests extends WindowTestsBase {
}
@Test
+ public void testReportOrientationChangeOnVisibilityChange() {
+ synchronized (mWm.mGlobalLock) {
+ mToken.setOrientation(SCREEN_ORIENTATION_LANDSCAPE);
+
+ mDisplayContent.getDisplayRotation().setFixedToUserRotation(
+ DisplayRotation.FIXED_TO_USER_ROTATION_ENABLED);
+
+ doReturn(Configuration.ORIENTATION_LANDSCAPE).when(mToken.mActivityRecord)
+ .getRequestedConfigurationOrientation();
+
+ mTask.mTaskRecord = Mockito.mock(TaskRecord.class, RETURNS_DEEP_STUBS);
+ mToken.commitVisibility(null, false /* visible */, TRANSIT_UNSET,
+ true /* performLayout */, false /* isVoiceInteraction */);
+ }
+
+ verify(mTask.mTaskRecord).onConfigurationChanged(any(Configuration.class));
+ }
+
+ @Test
+ public void testReportOrientationChangeOnOpeningClosingAppChange() {
+ synchronized (mWm.mGlobalLock) {
+ mToken.setOrientation(SCREEN_ORIENTATION_LANDSCAPE);
+
+ mDisplayContent.getDisplayRotation().setFixedToUserRotation(
+ DisplayRotation.FIXED_TO_USER_ROTATION_ENABLED);
+ mDisplayContent.getDisplayInfo().state = Display.STATE_ON;
+ mDisplayContent.prepareAppTransition(WindowManager.TRANSIT_ACTIVITY_CLOSE,
+ false /* alwaysKeepCurrent */, 0 /* flags */, true /* forceOverride */);
+
+ doReturn(Configuration.ORIENTATION_LANDSCAPE).when(mToken.mActivityRecord)
+ .getRequestedConfigurationOrientation();
+
+ mTask.mTaskRecord = Mockito.mock(TaskRecord.class, RETURNS_DEEP_STUBS);
+ mToken.setVisibility(false, false);
+ }
+
+ verify(mTask.mTaskRecord).onConfigurationChanged(any(Configuration.class));
+ }
+
+ @Test
public void testCreateRemoveStartingWindow() {
mToken.addStartingWindow(mPackageName,
android.R.style.Theme, null, "Test", 0, 0, 0, 0, null, true, true, false, true,
diff --git a/services/tests/wmtests/src/com/android/server/wm/SurfaceAnimationRunnerTest.java b/services/tests/wmtests/src/com/android/server/wm/SurfaceAnimationRunnerTest.java
index 6cce9f088ee4..c48348992196 100644
--- a/services/tests/wmtests/src/com/android/server/wm/SurfaceAnimationRunnerTest.java
+++ b/services/tests/wmtests/src/com/android/server/wm/SurfaceAnimationRunnerTest.java
@@ -213,7 +213,8 @@ public class SurfaceAnimationRunnerTest extends WindowTestsBase {
final Animation a = new TranslateAnimation(-10, 10, 0, 0);
a.initialize(0, 0, 0, 0);
a.setDuration(50);
- return new WindowAnimationSpec(a, new Point(0, 0), false /* canSkipFirstFrame */);
+ return new WindowAnimationSpec(a, new Point(0, 0), false /* canSkipFirstFrame */,
+ 0 /* windowCornerRadius */);
}
/**
diff --git a/services/tests/wmtests/src/com/android/server/wm/WindowAnimationSpecTest.java b/services/tests/wmtests/src/com/android/server/wm/WindowAnimationSpecTest.java
index 9a825e068584..897f0a2c6e81 100644
--- a/services/tests/wmtests/src/com/android/server/wm/WindowAnimationSpecTest.java
+++ b/services/tests/wmtests/src/com/android/server/wm/WindowAnimationSpecTest.java
@@ -24,6 +24,8 @@ import static com.android.server.wm.WindowStateAnimator.STACK_CLIP_NONE;
import static org.mockito.ArgumentMatchers.argThat;
import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.when;
import android.graphics.Point;
import android.graphics.Rect;
@@ -56,7 +58,7 @@ public class WindowAnimationSpecTest {
Animation a = createClipRectAnimation(windowCrop, windowCrop);
WindowAnimationSpec windowAnimationSpec = new WindowAnimationSpec(a, null,
mStackBounds, false /* canSkipFirstFrame */, STACK_CLIP_NONE,
- true /* isAppAnimation */);
+ true /* isAppAnimation */, 0 /* windowCornerRadius */);
windowAnimationSpec.apply(mTransaction, mSurfaceControl, 0);
verify(mTransaction).setWindowCrop(eq(mSurfaceControl),
argThat(rect -> rect.equals(windowCrop)));
@@ -66,7 +68,7 @@ public class WindowAnimationSpecTest {
public void testApply_clipAfter() {
WindowAnimationSpec windowAnimationSpec = new WindowAnimationSpec(mAnimation, null,
mStackBounds, false /* canSkipFirstFrame */, STACK_CLIP_AFTER_ANIM,
- true /* isAppAnimation */);
+ true /* isAppAnimation */, 0 /* windowCornerRadius */);
windowAnimationSpec.apply(mTransaction, mSurfaceControl, 0);
verify(mTransaction).setWindowCrop(eq(mSurfaceControl), argThat(Rect::isEmpty));
}
@@ -76,8 +78,7 @@ public class WindowAnimationSpecTest {
// Stack bounds is (0, 0, 10, 10) position is (20, 40)
WindowAnimationSpec windowAnimationSpec = new WindowAnimationSpec(mAnimation,
new Point(20, 40), mStackBounds, false /* canSkipFirstFrame */,
- STACK_CLIP_AFTER_ANIM,
- true /* isAppAnimation */);
+ STACK_CLIP_AFTER_ANIM, true /* isAppAnimation */, 0 /* windowCornerRadius */);
windowAnimationSpec.apply(mTransaction, mSurfaceControl, 0);
verify(mTransaction).setWindowCrop(eq(mSurfaceControl), argThat(Rect::isEmpty));
}
@@ -87,7 +88,7 @@ public class WindowAnimationSpecTest {
// Stack bounds is (0, 0, 10, 10) animation clip is (0, 0, 0, 0)
WindowAnimationSpec windowAnimationSpec = new WindowAnimationSpec(mAnimation, null,
mStackBounds, false /* canSkipFirstFrame */, STACK_CLIP_BEFORE_ANIM,
- true /* isAppAnimation */);
+ true /* isAppAnimation */, 0 /* windowCornerRadius */);
windowAnimationSpec.apply(mTransaction, mSurfaceControl, 0);
verify(mTransaction).setWindowCrop(eq(mSurfaceControl),
argThat(rect -> rect.equals(mStackBounds)));
@@ -101,19 +102,32 @@ public class WindowAnimationSpecTest {
a.initialize(0, 0, 0, 0);
WindowAnimationSpec windowAnimationSpec = new WindowAnimationSpec(a, null,
null, false /* canSkipFirstFrame */, STACK_CLIP_BEFORE_ANIM,
- true /* isAppAnimation */);
+ true /* isAppAnimation */, 0 /* windowCornerRadius */);
windowAnimationSpec.apply(mTransaction, mSurfaceControl, 0);
verify(mTransaction).setWindowCrop(eq(mSurfaceControl), argThat(Rect::isEmpty));
}
@Test
+ public void testApply_setCornerRadius() {
+ final float windowCornerRadius = 30f;
+ WindowAnimationSpec windowAnimationSpec = new WindowAnimationSpec(mAnimation, null,
+ mStackBounds, false /* canSkipFirstFrame */, STACK_CLIP_BEFORE_ANIM,
+ true /* isAppAnimation */, windowCornerRadius);
+ windowAnimationSpec.apply(mTransaction, mSurfaceControl, 0);
+ verify(mTransaction, never()).setCornerRadius(eq(mSurfaceControl), eq(windowCornerRadius));
+ when(mAnimation.hasRoundedCorners()).thenReturn(true);
+ windowAnimationSpec.apply(mTransaction, mSurfaceControl, 0);
+ verify(mTransaction).setCornerRadius(eq(mSurfaceControl), eq(windowCornerRadius));
+ }
+
+ @Test
public void testApply_clipBeforeSmallerAnimationClip() {
// Stack bounds is (0, 0, 10, 10) animation clip is (0, 0, 5, 5)
Rect windowCrop = new Rect(0, 0, 5, 5);
Animation a = createClipRectAnimation(windowCrop, windowCrop);
WindowAnimationSpec windowAnimationSpec = new WindowAnimationSpec(a, null,
mStackBounds, false /* canSkipFirstFrame */, STACK_CLIP_BEFORE_ANIM,
- true /* isAppAnimation */);
+ true /* isAppAnimation */, 0 /* windowCornerRadius */);
windowAnimationSpec.apply(mTransaction, mSurfaceControl, 0);
verify(mTransaction).setWindowCrop(eq(mSurfaceControl),
argThat(rect -> rect.equals(windowCrop)));
@@ -126,7 +140,7 @@ public class WindowAnimationSpecTest {
Animation a = createClipRectAnimation(windowCrop, windowCrop);
WindowAnimationSpec windowAnimationSpec = new WindowAnimationSpec(a, null,
mStackBounds, false /* canSkipFirstFrame */, STACK_CLIP_BEFORE_ANIM,
- true /* isAppAnimation */);
+ true /* isAppAnimation */, 0 /* windowCornerRadius */);
windowAnimationSpec.apply(mTransaction, mSurfaceControl, 0);
verify(mTransaction).setWindowCrop(eq(mSurfaceControl),
argThat(rect -> rect.equals(mStackBounds)));
diff --git a/services/tests/wmtests/src/com/android/server/wm/WindowTestUtils.java b/services/tests/wmtests/src/com/android/server/wm/WindowTestUtils.java
index da1defabeaaf..0dec8ee7776f 100644
--- a/services/tests/wmtests/src/com/android/server/wm/WindowTestUtils.java
+++ b/services/tests/wmtests/src/com/android/server/wm/WindowTestUtils.java
@@ -82,6 +82,8 @@ class WindowTestUtils {
}, new ComponentName("", ""), false, dc, true /* fillsParent */);
mTargetSdk = Build.VERSION_CODES.CUR_DEVELOPMENT;
mSkipOnParentChanged = skipOnParentChanged;
+ mActivityRecord = mock(ActivityRecord.class);
+ mActivityRecord.app = mock(WindowProcessController.class);
}
int getWindowsCount() {
diff --git a/services/usage/java/com/android/server/usage/AppStandbyController.java b/services/usage/java/com/android/server/usage/AppStandbyController.java
index 65ed85db17bd..ffafb6d0800e 100644
--- a/services/usage/java/com/android/server/usage/AppStandbyController.java
+++ b/services/usage/java/com/android/server/usage/AppStandbyController.java
@@ -35,6 +35,7 @@ import static android.app.usage.UsageStatsManager.REASON_SUB_USAGE_SLICE_PINNED_
import static android.app.usage.UsageStatsManager.REASON_SUB_USAGE_SYNC_ADAPTER;
import static android.app.usage.UsageStatsManager.REASON_SUB_USAGE_SYSTEM_INTERACTION;
import static android.app.usage.UsageStatsManager.REASON_SUB_USAGE_SYSTEM_UPDATE;
+import static android.app.usage.UsageStatsManager.REASON_SUB_USAGE_UNEXEMPTED_SYNC_SCHEDULED;
import static android.app.usage.UsageStatsManager.REASON_SUB_USAGE_USER_INTERACTION;
import static android.app.usage.UsageStatsManager.STANDBY_BUCKET_ACTIVE;
import static android.app.usage.UsageStatsManager.STANDBY_BUCKET_EXEMPTED;
@@ -197,7 +198,7 @@ public class AppStandbyController {
static final int MSG_ONE_TIME_CHECK_IDLE_STATES = 10;
/** Check the state of one app: arg1 = userId, arg2 = uid, obj = (String) packageName */
static final int MSG_CHECK_PACKAGE_IDLE_STATE = 11;
- static final int MSG_REPORT_EXEMPTED_SYNC_SCHEDULED = 12;
+ static final int MSG_REPORT_SYNC_SCHEDULED = 12;
static final int MSG_REPORT_EXEMPTED_SYNC_START = 13;
static final int MSG_UPDATE_STABLE_CHARGING= 14;
@@ -231,6 +232,10 @@ public class AppStandbyController {
* Maximum time an exempted sync should keep the buckets elevated, when sync is started.
*/
long mExemptedSyncStartTimeoutMillis;
+ /**
+ * Maximum time an unexempted sync should keep the buckets elevated, when sync is scheduled
+ */
+ long mUnexemptedSyncScheduledTimeoutMillis;
/** Maximum time a system interaction should keep the buckets elevated. */
long mSystemInteractionTimeoutMillis;
/** The length of time phone must be charging before considered stable enough to run jobs */
@@ -447,6 +452,25 @@ public class AppStandbyController {
}
}
+ void reportUnexemptedSyncScheduled(String packageName, int userId) {
+ if (!mAppIdleEnabled) return;
+
+ final long elapsedRealtime = mInjector.elapsedRealtime();
+ synchronized (mAppIdleLock) {
+ final int currentBucket =
+ mAppIdleHistory.getAppStandbyBucket(packageName, userId, elapsedRealtime);
+ if (currentBucket == STANDBY_BUCKET_NEVER) {
+ // Bring the app out of the never bucket
+ AppUsageHistory appUsage = mAppIdleHistory.reportUsage(packageName, userId,
+ STANDBY_BUCKET_WORKING_SET, REASON_SUB_USAGE_UNEXEMPTED_SYNC_SCHEDULED,
+ 0,
+ elapsedRealtime + mUnexemptedSyncScheduledTimeoutMillis);
+ maybeInformListeners(packageName, userId, elapsedRealtime,
+ appUsage.currentBucket, appUsage.bucketingReason, false);
+ }
+ }
+ }
+
void reportExemptedSyncStart(String packageName, int userId) {
if (!mAppIdleEnabled) return;
@@ -1423,8 +1447,8 @@ public class AppStandbyController {
.sendToTarget();
}
- void postReportExemptedSyncScheduled(String packageName, int userId) {
- mHandler.obtainMessage(MSG_REPORT_EXEMPTED_SYNC_SCHEDULED, userId, 0, packageName)
+ void postReportSyncScheduled(String packageName, int userId, boolean exempted) {
+ mHandler.obtainMessage(MSG_REPORT_SYNC_SCHEDULED, userId, exempted ? 1 : 0, packageName)
.sendToTarget();
}
@@ -1492,6 +1516,9 @@ public class AppStandbyController {
pw.print(" mExemptedSyncStartTimeoutMillis=");
TimeUtils.formatDuration(mExemptedSyncStartTimeoutMillis, pw);
pw.println();
+ pw.print(" mUnexemptedSyncScheduledTimeoutMillis=");
+ TimeUtils.formatDuration(mUnexemptedSyncScheduledTimeoutMillis, pw);
+ pw.println();
pw.print(" mSystemUpdateUsageTimeoutMillis=");
TimeUtils.formatDuration(mSystemUpdateUsageTimeoutMillis, pw);
@@ -1706,8 +1733,13 @@ public class AppStandbyController {
mInjector.elapsedRealtime());
break;
- case MSG_REPORT_EXEMPTED_SYNC_SCHEDULED:
- reportExemptedSyncScheduled((String) msg.obj, msg.arg1);
+ case MSG_REPORT_SYNC_SCHEDULED:
+ final boolean exempted = msg.arg1 > 0 ? true : false;
+ if (exempted) {
+ reportExemptedSyncScheduled((String) msg.obj, msg.arg1);
+ } else {
+ reportUnexemptedSyncScheduled((String) msg.obj, msg.arg1);
+ }
break;
case MSG_REPORT_EXEMPTED_SYNC_START:
@@ -1799,12 +1831,14 @@ public class AppStandbyController {
"system_update_usage_duration";
private static final String KEY_PREDICTION_TIMEOUT = "prediction_timeout";
private static final String KEY_SYNC_ADAPTER_HOLD_DURATION = "sync_adapter_duration";
- private static final String KEY_EXEMPTED_SYNC_SCHEDULED_NON_DOZE_HOLD_DURATION
- = "exempted_sync_scheduled_nd_duration";
- private static final String KEY_EXEMPTED_SYNC_SCHEDULED_DOZE_HOLD_DURATION
- = "exempted_sync_scheduled_d_duration";
- private static final String KEY_EXEMPTED_SYNC_START_HOLD_DURATION
- = "exempted_sync_start_duration";
+ private static final String KEY_EXEMPTED_SYNC_SCHEDULED_NON_DOZE_HOLD_DURATION =
+ "exempted_sync_scheduled_nd_duration";
+ private static final String KEY_EXEMPTED_SYNC_SCHEDULED_DOZE_HOLD_DURATION =
+ "exempted_sync_scheduled_d_duration";
+ private static final String KEY_EXEMPTED_SYNC_START_HOLD_DURATION =
+ "exempted_sync_start_duration";
+ private static final String KEY_UNEXEMPTED_SYNC_SCHEDULED_HOLD_DURATION =
+ "unexempted_sync_scheduled_duration";
private static final String KEY_SYSTEM_INTERACTION_HOLD_DURATION =
"system_interaction_duration";
private static final String KEY_STABLE_CHARGING_THRESHOLD = "stable_charging_threshold";
@@ -1816,6 +1850,7 @@ public class AppStandbyController {
public static final long DEFAULT_EXEMPTED_SYNC_SCHEDULED_NON_DOZE_TIMEOUT = 10 * ONE_MINUTE;
public static final long DEFAULT_EXEMPTED_SYNC_SCHEDULED_DOZE_TIMEOUT = 4 * ONE_HOUR;
public static final long DEFAULT_EXEMPTED_SYNC_START_TIMEOUT = 10 * ONE_MINUTE;
+ public static final long DEFAULT_UNEXEMPTED_SYNC_SCHEDULED_TIMEOUT = 10 * ONE_MINUTE;
public static final long DEFAULT_STABLE_CHARGING_THRESHOLD = 10 * ONE_MINUTE;
private final KeyValueListParser mParser = new KeyValueListParser(',');
@@ -1883,42 +1918,47 @@ public class AppStandbyController {
ELAPSED_TIME_THRESHOLDS);
mCheckIdleIntervalMillis = Math.min(mAppStandbyElapsedThresholds[1] / 4,
COMPRESS_TIME ? ONE_MINUTE : 4 * 60 * ONE_MINUTE); // 4 hours
- mStrongUsageTimeoutMillis = mParser.getDurationMillis
- (KEY_STRONG_USAGE_HOLD_DURATION,
+ mStrongUsageTimeoutMillis = mParser.getDurationMillis(
+ KEY_STRONG_USAGE_HOLD_DURATION,
COMPRESS_TIME ? ONE_MINUTE : DEFAULT_STRONG_USAGE_TIMEOUT);
- mNotificationSeenTimeoutMillis = mParser.getDurationMillis
- (KEY_NOTIFICATION_SEEN_HOLD_DURATION,
+ mNotificationSeenTimeoutMillis = mParser.getDurationMillis(
+ KEY_NOTIFICATION_SEEN_HOLD_DURATION,
COMPRESS_TIME ? 12 * ONE_MINUTE : DEFAULT_NOTIFICATION_TIMEOUT);
- mSystemUpdateUsageTimeoutMillis = mParser.getDurationMillis
- (KEY_SYSTEM_UPDATE_HOLD_DURATION,
+ mSystemUpdateUsageTimeoutMillis = mParser.getDurationMillis(
+ KEY_SYSTEM_UPDATE_HOLD_DURATION,
COMPRESS_TIME ? 2 * ONE_MINUTE : DEFAULT_SYSTEM_UPDATE_TIMEOUT);
- mPredictionTimeoutMillis = mParser.getDurationMillis
- (KEY_PREDICTION_TIMEOUT,
+ mPredictionTimeoutMillis = mParser.getDurationMillis(
+ KEY_PREDICTION_TIMEOUT,
COMPRESS_TIME ? 10 * ONE_MINUTE : DEFAULT_PREDICTION_TIMEOUT);
- mSyncAdapterTimeoutMillis = mParser.getDurationMillis
- (KEY_SYNC_ADAPTER_HOLD_DURATION,
+ mSyncAdapterTimeoutMillis = mParser.getDurationMillis(
+ KEY_SYNC_ADAPTER_HOLD_DURATION,
COMPRESS_TIME ? ONE_MINUTE : DEFAULT_SYNC_ADAPTER_TIMEOUT);
- mExemptedSyncScheduledNonDozeTimeoutMillis = mParser.getDurationMillis
- (KEY_EXEMPTED_SYNC_SCHEDULED_NON_DOZE_HOLD_DURATION,
+ mExemptedSyncScheduledNonDozeTimeoutMillis = mParser.getDurationMillis(
+ KEY_EXEMPTED_SYNC_SCHEDULED_NON_DOZE_HOLD_DURATION,
COMPRESS_TIME ? (ONE_MINUTE / 2)
: DEFAULT_EXEMPTED_SYNC_SCHEDULED_NON_DOZE_TIMEOUT);
- mExemptedSyncScheduledDozeTimeoutMillis = mParser.getDurationMillis
- (KEY_EXEMPTED_SYNC_SCHEDULED_DOZE_HOLD_DURATION,
+ mExemptedSyncScheduledDozeTimeoutMillis = mParser.getDurationMillis(
+ KEY_EXEMPTED_SYNC_SCHEDULED_DOZE_HOLD_DURATION,
COMPRESS_TIME ? ONE_MINUTE
: DEFAULT_EXEMPTED_SYNC_SCHEDULED_DOZE_TIMEOUT);
- mExemptedSyncStartTimeoutMillis = mParser.getDurationMillis
- (KEY_EXEMPTED_SYNC_START_HOLD_DURATION,
+ mExemptedSyncStartTimeoutMillis = mParser.getDurationMillis(
+ KEY_EXEMPTED_SYNC_START_HOLD_DURATION,
COMPRESS_TIME ? ONE_MINUTE
: DEFAULT_EXEMPTED_SYNC_START_TIMEOUT);
- mSystemInteractionTimeoutMillis = mParser.getDurationMillis
- (KEY_SYSTEM_INTERACTION_HOLD_DURATION,
+ mUnexemptedSyncScheduledTimeoutMillis = mParser.getDurationMillis(
+ KEY_EXEMPTED_SYNC_SCHEDULED_DOZE_HOLD_DURATION,
+ COMPRESS_TIME ? ONE_MINUTE
+ : DEFAULT_UNEXEMPTED_SYNC_SCHEDULED_TIMEOUT); // TODO
+
+ mSystemInteractionTimeoutMillis = mParser.getDurationMillis(
+ KEY_SYSTEM_INTERACTION_HOLD_DURATION,
COMPRESS_TIME ? ONE_MINUTE : DEFAULT_SYSTEM_INTERACTION_TIMEOUT);
- mStableChargingThresholdMillis = mParser.getDurationMillis
- (KEY_STABLE_CHARGING_THRESHOLD,
+ mStableChargingThresholdMillis = mParser.getDurationMillis(
+ KEY_STABLE_CHARGING_THRESHOLD,
COMPRESS_TIME ? ONE_MINUTE : DEFAULT_STABLE_CHARGING_THRESHOLD);
}
diff --git a/services/usage/java/com/android/server/usage/UsageStatsService.java b/services/usage/java/com/android/server/usage/UsageStatsService.java
index ebb0210cb553..b14d7228dcb4 100644
--- a/services/usage/java/com/android/server/usage/UsageStatsService.java
+++ b/services/usage/java/com/android/server/usage/UsageStatsService.java
@@ -1751,8 +1751,8 @@ public class UsageStatsService extends SystemService implements
}
@Override
- public void reportExemptedSyncScheduled(String packageName, int userId) {
- mAppStandby.postReportExemptedSyncScheduled(packageName, userId);
+ public void reportSyncScheduled(String packageName, int userId, boolean exempted) {
+ mAppStandby.postReportSyncScheduled(packageName, userId, exempted);
}
@Override
diff --git a/telecomm/java/android/telecom/ConnectionRequest.java b/telecomm/java/android/telecom/ConnectionRequest.java
index b6e6b0ed8270..d69d2cd756dc 100644
--- a/telecomm/java/android/telecom/ConnectionRequest.java
+++ b/telecomm/java/android/telecom/ConnectionRequest.java
@@ -337,7 +337,31 @@ public final class ConnectionRequest implements Parcelable {
mAddress == null
? Uri.EMPTY
: Connection.toLogSafePhoneNumber(mAddress.toString()),
- mExtras == null ? "" : mExtras);
+ bundleToString(mExtras));
+ }
+
+ private static String bundleToString(Bundle extras){
+ if (extras == null) {
+ return "";
+ }
+ StringBuilder sb = new StringBuilder();
+ sb.append("Bundle[");
+ for (String key : extras.keySet()) {
+ sb.append(key);
+ sb.append("=");
+ switch (key) {
+ case TelecomManager.EXTRA_INCOMING_CALL_ADDRESS:
+ case TelecomManager.EXTRA_UNKNOWN_CALL_HANDLE:
+ sb.append(Log.pii(extras.get(key)));
+ break;
+ default:
+ sb.append(extras.get(key));
+ break;
+ }
+ sb.append(", ");
+ }
+ sb.append("]");
+ return sb.toString();
}
public static final Creator<ConnectionRequest> CREATOR = new Creator<ConnectionRequest> () {
diff --git a/telecomm/java/com/android/internal/telecom/ITelecomService.aidl b/telecomm/java/com/android/internal/telecom/ITelecomService.aidl
index 5030f90afd3e..93eea56f6490 100644
--- a/telecomm/java/com/android/internal/telecom/ITelecomService.aidl
+++ b/telecomm/java/com/android/internal/telecom/ITelecomService.aidl
@@ -182,6 +182,7 @@ interface ITelecomService {
/**
* @see TelecomServiceImpl#getCallState
*/
+ @UnsupportedAppUsage
int getCallState();
/**
diff --git a/telephony/java/android/provider/Telephony.java b/telephony/java/android/provider/Telephony.java
index fecdb089ae48..79b78077609f 100644
--- a/telephony/java/android/provider/Telephony.java
+++ b/telephony/java/android/provider/Telephony.java
@@ -17,6 +17,7 @@
package android.provider;
import android.annotation.IntDef;
+import android.annotation.NonNull;
import android.annotation.RequiresPermission;
import android.annotation.SdkConstant;
import android.annotation.SdkConstant.SdkConstantType;
@@ -4340,6 +4341,7 @@ public final class Telephony {
* @param subscriptionId the subscriptionId to receive updates on
* @return the Uri used to observe precise carrier identity changes
*/
+ @NonNull
public static Uri getPreciseCarrierIdUriForSubscriptionId(int subscriptionId) {
return Uri.withAppendedPath(Uri.withAppendedPath(CONTENT_URI, "precise"),
String.valueOf(subscriptionId));
diff --git a/telephony/java/android/telephony/CellIdentityNr.java b/telephony/java/android/telephony/CellIdentityNr.java
index 856f08107fd7..19bc0ceaf00a 100644
--- a/telephony/java/android/telephony/CellIdentityNr.java
+++ b/telephony/java/android/telephony/CellIdentityNr.java
@@ -81,7 +81,8 @@ public final class CellIdentityNr extends CellIdentity {
/**
* Get the NR Cell Identity.
*
- * @return The NR Cell Identity in range [0, 68719476735] or Long.MAX_VALUE if unknown.
+ * @return The 36-bit NR Cell Identity in range [0, 68719476735] or
+ * {@link CellInfo#UNAVAILABLE_LONG} if unknown.
*/
public long getNci() {
return mNci;
diff --git a/telephony/java/android/telephony/CellInfo.java b/telephony/java/android/telephony/CellInfo.java
index 8ce5c54c810e..c7853f184407 100644
--- a/telephony/java/android/telephony/CellInfo.java
+++ b/telephony/java/android/telephony/CellInfo.java
@@ -40,6 +40,11 @@ public abstract class CellInfo implements Parcelable {
public static final int UNAVAILABLE = Integer.MAX_VALUE;
/**
+ * This value indicates that the long field is unreported.
+ */
+ public static final long UNAVAILABLE_LONG = Long.MAX_VALUE;
+
+ /**
* Cell identity type
* @hide
*/
diff --git a/telephony/java/android/telephony/PhoneStateListener.java b/telephony/java/android/telephony/PhoneStateListener.java
index bb0673f921e3..5fd36f4fb253 100644
--- a/telephony/java/android/telephony/PhoneStateListener.java
+++ b/telephony/java/android/telephony/PhoneStateListener.java
@@ -609,7 +609,7 @@ public class PhoneStateListener {
@RequiresPermission((android.Manifest.permission.READ_PRECISE_PHONE_STATE))
@SystemApi
public void onPreciseDataConnectionStateChanged(
- PreciseDataConnectionState dataConnectionState) {
+ @NonNull PreciseDataConnectionState dataConnectionState) {
// default implementation empty
}
diff --git a/telephony/java/android/telephony/PreciseDataConnectionState.java b/telephony/java/android/telephony/PreciseDataConnectionState.java
index 57a18266259a..d59367821a5d 100644
--- a/telephony/java/android/telephony/PreciseDataConnectionState.java
+++ b/telephony/java/android/telephony/PreciseDataConnectionState.java
@@ -16,6 +16,8 @@
package android.telephony;
+import android.annotation.NonNull;
+import android.annotation.Nullable;
import android.annotation.SystemApi;
import android.annotation.UnsupportedAppUsage;
import android.net.LinkProperties;
@@ -25,6 +27,7 @@ import android.telephony.data.ApnSetting;
import java.util.Objects;
+
/**
* Contains precise data connection state.
*
@@ -119,6 +122,7 @@ public final class PreciseDataConnectionState implements Parcelable {
/**
* Returns APN {@link ApnSetting} of this data connection.
*/
+ @Nullable
public String getDataConnectionApn() {
return mAPN;
}
diff --git a/telephony/java/android/telephony/SubscriptionManager.java b/telephony/java/android/telephony/SubscriptionManager.java
index c28d1fb6d43e..e0b7fc44ffaf 100644
--- a/telephony/java/android/telephony/SubscriptionManager.java
+++ b/telephony/java/android/telephony/SubscriptionManager.java
@@ -63,14 +63,17 @@ import com.android.internal.telephony.ISetOpportunisticDataCallback;
import com.android.internal.telephony.ISub;
import com.android.internal.telephony.ITelephonyRegistry;
import com.android.internal.telephony.PhoneConstants;
+import com.android.internal.util.Preconditions;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
+import java.util.HashMap;
import java.util.List;
import java.util.Locale;
+import java.util.Map;
import java.util.concurrent.Executor;
import java.util.concurrent.TimeUnit;
import java.util.function.Consumer;
@@ -151,6 +154,7 @@ public class SubscriptionManager {
* {@link Uri#withAppendedPath(Uri, String)}.
* @hide
*/
+ @NonNull
@SystemApi
public static final Uri WFC_ENABLED_CONTENT_URI = Uri.withAppendedPath(CONTENT_URI, "wfc");
@@ -169,6 +173,7 @@ public class SubscriptionManager {
* {@link Uri#withAppendedPath(Uri, String)}.
* @hide
*/
+ @NonNull
@SystemApi
public static final Uri ADVANCED_CALLING_ENABLED_CONTENT_URI = Uri.withAppendedPath(
CONTENT_URI, "advanced_calling");
@@ -186,6 +191,7 @@ public class SubscriptionManager {
* {@link Uri#withAppendedPath(Uri, String)}.
* @hide
*/
+ @NonNull
@SystemApi
public static final Uri WFC_MODE_CONTENT_URI = Uri.withAppendedPath(CONTENT_URI, "wfc_mode");
@@ -202,6 +208,7 @@ public class SubscriptionManager {
* {@link Uri#withAppendedPath(Uri, String)}.
* @hide
*/
+ @NonNull
@SystemApi
public static final Uri WFC_ROAMING_MODE_CONTENT_URI = Uri.withAppendedPath(
CONTENT_URI, "wfc_roaming_mode");
@@ -220,6 +227,7 @@ public class SubscriptionManager {
* {@link Uri#withAppendedPath(Uri, String)}.
* @hide
*/
+ @NonNull
@SystemApi
public static final Uri VT_ENABLED_CONTENT_URI = Uri.withAppendedPath(
CONTENT_URI, "vt_enabled");
@@ -237,6 +245,7 @@ public class SubscriptionManager {
* {@link Uri#withAppendedPath(Uri, String)}.
* @hide
*/
+ @NonNull
@SystemApi
public static final Uri WFC_ROAMING_ENABLED_CONTENT_URI = Uri.withAppendedPath(
CONTENT_URI, "wfc_roaming_enabled");
@@ -1066,7 +1075,8 @@ public class SubscriptionManager {
* @param listener that is to be unregistered.
*/
public void removeOnOpportunisticSubscriptionsChangedListener(
- OnOpportunisticSubscriptionsChangedListener listener) {
+ @NonNull OnOpportunisticSubscriptionsChangedListener listener) {
+ Preconditions.checkNotNull(listener, "listener cannot be null");
String pkgForDebug = mContext != null ? mContext.getOpPackageName() : "<unknown>";
if (DBG) {
logd("unregister OnOpportunisticSubscriptionsChangedListener pkgForDebug="
@@ -2682,7 +2692,8 @@ public class SubscriptionManager {
* @param callbackIntent pending intent that will be sent after operation is done.
*/
@RequiresPermission(android.Manifest.permission.WRITE_EMBEDDED_SUBSCRIPTIONS)
- public void switchToSubscription(int subId, PendingIntent callbackIntent) {
+ public void switchToSubscription(int subId, @NonNull PendingIntent callbackIntent) {
+ Preconditions.checkNotNull(callbackIntent, "callbackIntent cannot be null");
EuiccManager euiccManager = new EuiccManager(mContext);
euiccManager.switchToSubscription(subId, callbackIntent);
}
@@ -2900,8 +2911,33 @@ public class SubscriptionManager {
if (availableList == null) {
return null;
} else {
- return availableList.stream().filter(subInfo -> !shouldHideSubscription(subInfo))
- .collect(Collectors.toList());
+ // Multiple subscriptions in a group should only have one representative.
+ // It should be the current active primary subscription if any, or any
+ // primary subscription.
+ List<SubscriptionInfo> selectableList = new ArrayList<>();
+ Map<String, SubscriptionInfo> groupMap = new HashMap<>();
+
+ for (SubscriptionInfo info : availableList) {
+ // Opportunistic subscriptions are considered invisible
+ // to users so they should never be returned.
+ if (isInvisibleSubscription(info)) continue;
+
+ String groupUuid = info.getGroupUuid();
+ if (groupUuid == null) {
+ // Doesn't belong to any group. Add in the list.
+ selectableList.add(info);
+ } else if (!groupMap.containsKey(groupUuid)
+ || (groupMap.get(groupUuid).getSimSlotIndex() == INVALID_SIM_SLOT_INDEX
+ && info.getSimSlotIndex() != INVALID_SIM_SLOT_INDEX)) {
+ // If it belongs to a group that has never been recorded or it's the current
+ // active subscription, add it in the list.
+ selectableList.remove(groupMap.get(groupUuid));
+ selectableList.add(info);
+ groupMap.put(groupUuid, info);
+ }
+
+ }
+ return selectableList;
}
}
diff --git a/telephony/java/android/telephony/TelephonyManager.java b/telephony/java/android/telephony/TelephonyManager.java
index d39c5f8892c8..31d8ddbbd35f 100644
--- a/telephony/java/android/telephony/TelephonyManager.java
+++ b/telephony/java/android/telephony/TelephonyManager.java
@@ -3249,6 +3249,7 @@ public class TelephonyManager {
* the caller does not have adequate permissions for that card.
*/
@RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE)
+ @NonNull
public List<UiccCardInfo> getUiccCardsInfo() {
try {
ITelephony telephony = getITelephony();
diff --git a/telephony/java/android/telephony/UiccCardInfo.java b/telephony/java/android/telephony/UiccCardInfo.java
index 0192ffbe263c..d95a4992f808 100644
--- a/telephony/java/android/telephony/UiccCardInfo.java
+++ b/telephony/java/android/telephony/UiccCardInfo.java
@@ -15,6 +15,8 @@
*/
package android.telephony;
+import android.annotation.NonNull;
+import android.annotation.Nullable;
import android.os.Parcel;
import android.os.Parcelable;
@@ -104,6 +106,7 @@ public final class UiccCardInfo implements Parcelable {
* Note that this field may be omitted if the caller does not have the correct permissions
* (see {@link TelephonyManager#getUiccCardsInfo()}).
*/
+ @Nullable
public String getEid() {
if (!mIsEuicc) {
return null;
@@ -117,6 +120,7 @@ public final class UiccCardInfo implements Parcelable {
* Note that this field may be omitted if the caller does not have the correct permissions
* (see {@link TelephonyManager#getUiccCardsInfo()}).
*/
+ @Nullable
public String getIccId() {
return mIccId;
}
@@ -129,11 +133,12 @@ public final class UiccCardInfo implements Parcelable {
}
/**
- * Returns a copy of the UiccCardinfo with the clears the EID and ICCID set to null. These
- * values are generally private and require carrier privileges to view.
+ * Returns a copy of the UiccCardinfo with the EID and ICCID set to null. These values are
+ * generally private and require carrier privileges to view.
*
* @hide
*/
+ @NonNull
public UiccCardInfo getUnprivileged() {
return new UiccCardInfo(mIsEuicc, mCardId, null, null, mSlotIndex, mIsRemovable);
}
diff --git a/telephony/java/android/telephony/ims/ImsConferenceState.java b/telephony/java/android/telephony/ims/ImsConferenceState.java
index 66d2f8d929d3..8af8cffcd878 100644
--- a/telephony/java/android/telephony/ims/ImsConferenceState.java
+++ b/telephony/java/android/telephony/ims/ImsConferenceState.java
@@ -16,17 +16,18 @@
package android.telephony.ims;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.Map.Entry;
-import java.util.Set;
-
import android.annotation.SystemApi;
import android.os.Bundle;
import android.os.Parcel;
import android.os.Parcelable;
import android.telecom.Call;
import android.telecom.Connection;
+import android.telecom.Log;
+
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Map.Entry;
+import java.util.Set;
/**
* Provides the conference information (defined in RFC 4575) for IMS conference call.
@@ -189,7 +190,7 @@ public final class ImsConferenceState implements Parcelable {
sb.append("<");
while (iterator.hasNext()) {
Entry<String, Bundle> entry = iterator.next();
- sb.append(entry.getKey());
+ sb.append(Log.pii(entry.getKey()));
sb.append(": ");
Bundle participantData = entry.getValue();
@@ -197,7 +198,7 @@ public final class ImsConferenceState implements Parcelable {
sb.append(key);
sb.append("=");
if (ENDPOINT.equals(key) || USER.equals(key)) {
- sb.append(android.telecom.Log.pii(participantData.get(key)));
+ sb.append(Log.pii(participantData.get(key)));
} else {
sb.append(participantData.get(key));
}
diff --git a/telephony/java/android/telephony/ims/ImsMmTelManager.java b/telephony/java/android/telephony/ims/ImsMmTelManager.java
index eb99d5dcaaeb..bb85be16eb3a 100644
--- a/telephony/java/android/telephony/ims/ImsMmTelManager.java
+++ b/telephony/java/android/telephony/ims/ImsMmTelManager.java
@@ -139,7 +139,7 @@ public class ImsMmTelManager {
if (mLocalCallback == null) return;
Binder.withCleanCallingIdentity(() ->
- mExecutor.execute(() -> mLocalCallback.onDeregistered(info)));
+ mExecutor.execute(() -> mLocalCallback.onUnregistered(info)));
}
@Override
@@ -199,7 +199,7 @@ public class ImsMmTelManager {
*
* @param info the {@link ImsReasonInfo} associated with why registration was disconnected.
*/
- public void onDeregistered(ImsReasonInfo info) {
+ public void onUnregistered(ImsReasonInfo info) {
}
/**
@@ -485,7 +485,7 @@ public class ImsMmTelManager {
* @see android.telephony.CarrierConfigManager#KEY_HIDE_ENHANCED_4G_LTE_BOOL
* @see android.telephony.CarrierConfigManager#KEY_ENHANCED_4G_LTE_ON_BY_DEFAULT_BOOL
* @see android.telephony.CarrierConfigManager#KEY_CARRIER_VOLTE_AVAILABLE_BOOL
- * @see #setAdvancedCallingSetting(boolean)
+ * @see #setAdvancedCallingSettingEnabled(boolean)
* @return true if the user's setting for advanced calling is enabled, false otherwise.
*/
@RequiresPermission(Manifest.permission.READ_PRIVILEGED_PHONE_STATE)
@@ -519,9 +519,9 @@ public class ImsMmTelManager {
* @see #isAdvancedCallingSettingEnabled()
*/
@RequiresPermission(Manifest.permission.MODIFY_PHONE_STATE)
- public void setAdvancedCallingSetting(boolean isEnabled) {
+ public void setAdvancedCallingSettingEnabled(boolean isEnabled) {
try {
- getITelephony().setAdvancedCallingSetting(mSubId, isEnabled);
+ getITelephony().setAdvancedCallingSettingEnabled(mSubId, isEnabled);
return;
} catch (RemoteException e) {
throw e.rethrowAsRuntimeException();
@@ -589,7 +589,7 @@ public class ImsMmTelManager {
/**
* The user's setting for whether or not they have enabled the "Video Calling" setting.
* @return true if the user’s “Video Calling” setting is currently enabled.
- * @see #setVtSetting(boolean)
+ * @see #setVtSettingEnabled(boolean)
*/
@RequiresPermission(Manifest.permission.READ_PRIVILEGED_PHONE_STATE)
public boolean isVtSettingEnabled() {
@@ -605,9 +605,9 @@ public class ImsMmTelManager {
* @see #isVtSettingEnabled()
*/
@RequiresPermission(Manifest.permission.MODIFY_PHONE_STATE)
- public void setVtSetting(boolean isEnabled) {
+ public void setVtSettingEnabled(boolean isEnabled) {
try {
- getITelephony().setVtSetting(mSubId, isEnabled);
+ getITelephony().setVtSettingEnabled(mSubId, isEnabled);
return;
} catch (RemoteException e) {
throw e.rethrowAsRuntimeException();
@@ -616,7 +616,7 @@ public class ImsMmTelManager {
/**
* @return true if the user's setting for Voice over WiFi is enabled and false if it is not.
- * @see #setVoWiFiSetting(boolean)
+ * @see #setVoWiFiSettingEnabled(boolean)
*/
@RequiresPermission(Manifest.permission.READ_PRIVILEGED_PHONE_STATE)
public boolean isVoWiFiSettingEnabled() {
@@ -633,9 +633,9 @@ public class ImsMmTelManager {
* @see #isVoWiFiSettingEnabled()
*/
@RequiresPermission(Manifest.permission.MODIFY_PHONE_STATE)
- public void setVoWiFiSetting(boolean isEnabled) {
+ public void setVoWiFiSettingEnabled(boolean isEnabled) {
try {
- getITelephony().setVoWiFiSetting(mSubId, isEnabled);
+ getITelephony().setVoWiFiSettingEnabled(mSubId, isEnabled);
return;
} catch (RemoteException e) {
throw e.rethrowAsRuntimeException();
@@ -645,7 +645,7 @@ public class ImsMmTelManager {
/**
* @return true if the user's setting for Voice over WiFi while roaming is enabled, false
* if disabled.
- * @see #setVoWiFiRoamingSetting(boolean)
+ * @see #setVoWiFiRoamingSettingEnabled(boolean)
*/
@RequiresPermission(Manifest.permission.READ_PRIVILEGED_PHONE_STATE)
public boolean isVoWiFiRoamingSettingEnabled() {
@@ -663,9 +663,9 @@ public class ImsMmTelManager {
* @see #isVoWiFiRoamingSettingEnabled()
*/
@RequiresPermission(Manifest.permission.MODIFY_PHONE_STATE)
- public void setVoWiFiRoamingSetting(boolean isEnabled) {
+ public void setVoWiFiRoamingSettingEnabled(boolean isEnabled) {
try {
- getITelephony().setVoWiFiRoamingSetting(mSubId, isEnabled);
+ getITelephony().setVoWiFiRoamingSettingEnabled(mSubId, isEnabled);
return;
} catch (RemoteException e) {
throw e.rethrowAsRuntimeException();
@@ -682,7 +682,7 @@ public class ImsMmTelManager {
* - {@link #WIFI_MODE_WIFI_ONLY}
* - {@link #WIFI_MODE_CELLULAR_PREFERRED}
* - {@link #WIFI_MODE_WIFI_PREFERRED}
- * @see #setVoWiFiSetting(boolean)
+ * @see #setVoWiFiSettingEnabled(boolean)
*/
@RequiresPermission(Manifest.permission.MODIFY_PHONE_STATE)
public void setVoWiFiNonPersistent(boolean isCapable, int mode) {
@@ -700,7 +700,7 @@ public class ImsMmTelManager {
* - {@link #WIFI_MODE_WIFI_ONLY}
* - {@link #WIFI_MODE_CELLULAR_PREFERRED}
* - {@link #WIFI_MODE_WIFI_PREFERRED}
- * @see #setVoWiFiSetting(boolean)
+ * @see #setVoWiFiSettingEnabled(boolean)
*/
@RequiresPermission(Manifest.permission.READ_PRIVILEGED_PHONE_STATE)
public @WiFiCallingMode int getVoWiFiModeSetting() {
@@ -739,7 +739,7 @@ public class ImsMmTelManager {
* - {@link #WIFI_MODE_WIFI_ONLY}
* - {@link #WIFI_MODE_CELLULAR_PREFERRED}
* - {@link #WIFI_MODE_WIFI_PREFERRED}
- * @see #setVoWiFiRoamingSetting(boolean)
+ * @see #setVoWiFiRoamingSettingEnabled(boolean)
*/
@RequiresPermission(Manifest.permission.READ_PRIVILEGED_PHONE_STATE)
public @WiFiCallingMode int getVoWiFiRoamingModeSetting() {
diff --git a/telephony/java/android/telephony/mbms/vendor/IMbmsStreamingService.aidl b/telephony/java/android/telephony/mbms/vendor/IMbmsStreamingService.aidl
index c90ffc7726e4..c140127237d4 100755
--- a/telephony/java/android/telephony/mbms/vendor/IMbmsStreamingService.aidl
+++ b/telephony/java/android/telephony/mbms/vendor/IMbmsStreamingService.aidl
@@ -26,13 +26,17 @@ import android.telephony.mbms.StreamingServiceInfo;
*/
interface IMbmsStreamingService
{
+ @UnsupportedAppUsage
int initialize(IMbmsStreamingSessionCallback callback, int subId);
+ @UnsupportedAppUsage
int requestUpdateStreamingServices(int subId, in List<String> serviceClasses);
+ @UnsupportedAppUsage
int startStreaming(int subId, String serviceId,
IStreamingServiceCallback callback);
+ @UnsupportedAppUsage
Uri getPlaybackUri(int subId, String serviceId);
void stopStreaming(int subId, String serviceId);
diff --git a/telephony/java/com/android/ims/ImsConfigListener.aidl b/telephony/java/com/android/ims/ImsConfigListener.aidl
index 64a501552550..4f229df252a6 100644
--- a/telephony/java/com/android/ims/ImsConfigListener.aidl
+++ b/telephony/java/com/android/ims/ImsConfigListener.aidl
@@ -47,6 +47,7 @@ oneway interface ImsConfigListener {
*
* @return void.
*/
+ @UnsupportedAppUsage
void onSetFeatureResponse(int feature, int network, int value, int status);
/**
diff --git a/telephony/java/com/android/ims/internal/IImsCallSessionListener.aidl b/telephony/java/com/android/ims/internal/IImsCallSessionListener.aidl
index 579369f4b549..b33a9f1ad23b 100644
--- a/telephony/java/com/android/ims/internal/IImsCallSessionListener.aidl
+++ b/telephony/java/com/android/ims/internal/IImsCallSessionListener.aidl
@@ -34,33 +34,47 @@ oneway interface IImsCallSessionListener {
/**
* Notifies the result of the basic session operation (setup / terminate).
*/
+ @UnsupportedAppUsage
void callSessionProgressing(in IImsCallSession session, in ImsStreamMediaProfile profile);
+ @UnsupportedAppUsage
void callSessionStarted(in IImsCallSession session, in ImsCallProfile profile);
+ @UnsupportedAppUsage
void callSessionStartFailed(in IImsCallSession session, in ImsReasonInfo reasonInfo);
+ @UnsupportedAppUsage
void callSessionTerminated(in IImsCallSession session, in ImsReasonInfo reasonInfo);
/**
* Notifies the result of the call hold/resume operation.
*/
+ @UnsupportedAppUsage
void callSessionHeld(in IImsCallSession session, in ImsCallProfile profile);
+ @UnsupportedAppUsage
void callSessionHoldFailed(in IImsCallSession session, in ImsReasonInfo reasonInfo);
+ @UnsupportedAppUsage
void callSessionHoldReceived(in IImsCallSession session, in ImsCallProfile profile);
+ @UnsupportedAppUsage
void callSessionResumed(in IImsCallSession session, in ImsCallProfile profile);
+ @UnsupportedAppUsage
void callSessionResumeFailed(in IImsCallSession session, in ImsReasonInfo reasonInfo);
+ @UnsupportedAppUsage
void callSessionResumeReceived(in IImsCallSession session, in ImsCallProfile profile);
/**
* Notifies the result of call merge operation.
*/
+ @UnsupportedAppUsage
void callSessionMergeStarted(in IImsCallSession session,
in IImsCallSession newSession, in ImsCallProfile profile);
+ @UnsupportedAppUsage
void callSessionMergeComplete(in IImsCallSession session);
+ @UnsupportedAppUsage
void callSessionMergeFailed(in IImsCallSession session,
in ImsReasonInfo reasonInfo);
/**
* Notifies the result of call upgrade / downgrade or any other call updates.
*/
+ @UnsupportedAppUsage
void callSessionUpdated(in IImsCallSession session,
in ImsCallProfile profile);
void callSessionUpdateFailed(in IImsCallSession session,
@@ -81,7 +95,9 @@ oneway interface IImsCallSessionListener {
/**
* Notifies the result of the participant invitation / removal to/from the conference session.
*/
+ @UnsupportedAppUsage
void callSessionInviteParticipantsRequestDelivered(in IImsCallSession session);
+ @UnsupportedAppUsage
void callSessionInviteParticipantsRequestFailed(in IImsCallSession session,
in ImsReasonInfo reasonInfo);
void callSessionRemoveParticipantsRequestDelivered(in IImsCallSession session);
@@ -91,6 +107,7 @@ oneway interface IImsCallSessionListener {
/**
* Notifies the changes of the conference info. in the conference session.
*/
+ @UnsupportedAppUsage
void callSessionConferenceStateUpdated(in IImsCallSession session,
in ImsConferenceState state);
@@ -103,8 +120,10 @@ oneway interface IImsCallSessionListener {
/**
* Notifies of handover information for this call
*/
+ @UnsupportedAppUsage
void callSessionHandover(in IImsCallSession session,
in int srcAccessTech, in int targetAccessTech, in ImsReasonInfo reasonInfo);
+ @UnsupportedAppUsage
void callSessionHandoverFailed(in IImsCallSession session,
in int srcAccessTech, in int targetAccessTech, in ImsReasonInfo reasonInfo);
void callSessionMayHandover(in IImsCallSession session,
@@ -118,6 +137,7 @@ oneway interface IImsCallSessionListener {
* - {@link com.android.internal.telephony.Phone#TTY_MODE_HCO}
* - {@link com.android.internal.telephony.Phone#TTY_MODE_VCO}
*/
+ @UnsupportedAppUsage
void callSessionTtyModeReceived(in IImsCallSession session, in int mode);
/**
@@ -126,11 +146,13 @@ oneway interface IImsCallSessionListener {
* @param session The call session.
* @param isMultiParty {@code true} if the session became multiparty, {@code false} otherwise.
*/
+ @UnsupportedAppUsage
void callSessionMultipartyStateChanged(in IImsCallSession session, in boolean isMultiParty);
/**
* Notifies the supplementary service information for the current session.
*/
+ @UnsupportedAppUsage
void callSessionSuppServiceReceived(in IImsCallSession session,
in ImsSuppServiceNotification suppSrvNotification);
diff --git a/telephony/java/com/android/ims/internal/IImsRegistrationListener.aidl b/telephony/java/com/android/ims/internal/IImsRegistrationListener.aidl
index 2212109c8a67..a7a62a625478 100644
--- a/telephony/java/com/android/ims/internal/IImsRegistrationListener.aidl
+++ b/telephony/java/com/android/ims/internal/IImsRegistrationListener.aidl
@@ -32,6 +32,7 @@ oneway interface IImsRegistrationListener {
*
* @deprecated see {@link registrationConnectedWithRadioTech}
*/
+ @UnsupportedAppUsage
void registrationConnected();
/**
@@ -47,6 +48,7 @@ oneway interface IImsRegistrationListener {
* @param imsRadioTech the radio access technology. Valid values are {@code
* RIL_RADIO_TECHNOLOGY_*} defined in {@link ServiceState}.
*/
+ @UnsupportedAppUsage
void registrationConnectedWithRadioTech(int imsRadioTech);
/**
@@ -55,12 +57,14 @@ oneway interface IImsRegistrationListener {
* @param imsRadioTech the radio access technology. Valid values are {@code
* RIL_RADIO_TECHNOLOGY_*} defined in {@link ServiceState}.
*/
+ @UnsupportedAppUsage
void registrationProgressingWithRadioTech(int imsRadioTech);
/**
* Notifies the application when the device is disconnected from the IMS network.
*/
+ @UnsupportedAppUsage
void registrationDisconnected(in ImsReasonInfo imsReasonInfo);
/**
@@ -94,6 +98,7 @@ oneway interface IImsRegistrationListener {
* @param enabledFeatures features enabled as defined in com.android.ims.ImsConfig#FeatureConstants.
* @param disabledFeatures features disabled as defined in com.android.ims.ImsConfig#FeatureConstants.
*/
+ @UnsupportedAppUsage
void registrationFeatureCapabilityChanged(int serviceClass,
in int[] enabledFeatures, in int[] disabledFeatures);
@@ -101,11 +106,13 @@ oneway interface IImsRegistrationListener {
* Updates the application with the waiting voice message count.
* @param count The number of waiting voice messages.
*/
+ @UnsupportedAppUsage
void voiceMessageCountUpdate(int count);
/**
* Notifies the application when the list of URIs associated with IMS client is updated.
*/
+ @UnsupportedAppUsage
void registrationAssociatedUriChanged(in Uri[] uris);
/**
@@ -116,5 +123,6 @@ oneway interface IImsRegistrationListener {
* attempted.
* @param imsReasonInfo Reason for the failure.
*/
+ @UnsupportedAppUsage
void registrationChangeFailed(in int targetAccessTech, in ImsReasonInfo imsReasonInfo);
}
diff --git a/telephony/java/com/android/ims/internal/IImsUtListener.aidl b/telephony/java/com/android/ims/internal/IImsUtListener.aidl
index a603cd34dfcd..fcb9fb1f8773 100644
--- a/telephony/java/com/android/ims/internal/IImsUtListener.aidl
+++ b/telephony/java/com/android/ims/internal/IImsUtListener.aidl
@@ -31,30 +31,37 @@ oneway interface IImsUtListener {
/**
* Notifies the result of the supplementary service configuration udpate.
*/
+ @UnsupportedAppUsage
void utConfigurationUpdated(in IImsUt ut, int id);
+ @UnsupportedAppUsage
void utConfigurationUpdateFailed(in IImsUt ut, int id, in ImsReasonInfo error);
/**
* Notifies the result of the supplementary service configuration query.
*/
+ @UnsupportedAppUsage
void utConfigurationQueried(in IImsUt ut, int id, in Bundle ssInfo);
+ @UnsupportedAppUsage
void utConfigurationQueryFailed(in IImsUt ut, int id, in ImsReasonInfo error);
/**
* Notifies the status of the call barring supplementary service.
*/
+ @UnsupportedAppUsage
void utConfigurationCallBarringQueried(in IImsUt ut,
int id, in ImsSsInfo[] cbInfo);
/**
* Notifies the status of the call forwarding supplementary service.
*/
+ @UnsupportedAppUsage
void utConfigurationCallForwardQueried(in IImsUt ut,
int id, in ImsCallForwardInfo[] cfInfo);
/**
* Notifies the status of the call waiting supplementary service.
*/
+ @UnsupportedAppUsage
void utConfigurationCallWaitingQueried(in IImsUt ut,
int id, in ImsSsInfo[] cwInfo);
diff --git a/telephony/java/com/android/ims/internal/IImsVideoCallCallback.aidl b/telephony/java/com/android/ims/internal/IImsVideoCallCallback.aidl
index 9499c9f5dde9..cf8d63794546 100644
--- a/telephony/java/com/android/ims/internal/IImsVideoCallCallback.aidl
+++ b/telephony/java/com/android/ims/internal/IImsVideoCallCallback.aidl
@@ -31,18 +31,25 @@ import android.telecom.VideoProfile;
* {@hide}
*/
oneway interface IImsVideoCallCallback {
+ @UnsupportedAppUsage
void receiveSessionModifyRequest(in VideoProfile videoProfile);
+ @UnsupportedAppUsage
void receiveSessionModifyResponse(int status, in VideoProfile requestedProfile,
in VideoProfile responseProfile);
+ @UnsupportedAppUsage
void handleCallSessionEvent(int event);
+ @UnsupportedAppUsage
void changePeerDimensions(int width, int height);
+ @UnsupportedAppUsage
void changeCallDataUsage(long dataUsage);
+ @UnsupportedAppUsage
void changeCameraCapabilities(in VideoProfile.CameraCapabilities cameraCapabilities);
+ @UnsupportedAppUsage
void changeVideoQuality(int videoQuality);
}
diff --git a/telephony/java/com/android/ims/internal/IImsVideoCallProvider.aidl b/telephony/java/com/android/ims/internal/IImsVideoCallProvider.aidl
index 0da27e163df1..4d20bd675628 100644
--- a/telephony/java/com/android/ims/internal/IImsVideoCallProvider.aidl
+++ b/telephony/java/com/android/ims/internal/IImsVideoCallProvider.aidl
@@ -41,6 +41,7 @@ import com.android.ims.internal.IImsVideoCallCallback;
* @hide
*/
oneway interface IImsVideoCallProvider {
+ @UnsupportedAppUsage
void setCallback(IImsVideoCallCallback callback);
void setCamera(String cameraId, int uid);
diff --git a/telephony/java/com/android/ims/internal/uce/options/IOptionsListener.aidl b/telephony/java/com/android/ims/internal/uce/options/IOptionsListener.aidl
index 8cb1153c48bb..c69d5a94f760 100644
--- a/telephony/java/com/android/ims/internal/uce/options/IOptionsListener.aidl
+++ b/telephony/java/com/android/ims/internal/uce/options/IOptionsListener.aidl
@@ -29,6 +29,7 @@ interface IOptionsListener
* @param version, version information of the service.
* @hide
*/
+ @UnsupportedAppUsage
void getVersionCb(in String version );
/**
@@ -37,6 +38,7 @@ interface IOptionsListener
* @param statusCode, UCE_SUCCESS as service availability.
* @hide
*/
+ @UnsupportedAppUsage
void serviceAvailable(in StatusCode statusCode);
/**
@@ -45,6 +47,7 @@ interface IOptionsListener
* @param statusCode, UCE_SUCCESS as service unavailability.
* @hide
*/
+ @UnsupportedAppUsage
void serviceUnavailable(in StatusCode statusCode);
/**
@@ -55,6 +58,7 @@ interface IOptionsListener
* @param capInfo, capabilities of the remote entity received.
* @hide
*/
+ @UnsupportedAppUsage
void sipResponseReceived( String uri,
in OptionsSipResponse sipResponse, in OptionsCapInfo capInfo);
@@ -63,6 +67,7 @@ interface IOptionsListener
* @param cmdStatus, command status of the request placed.
* @hide
*/
+ @UnsupportedAppUsage
void cmdStatus(in OptionsCmdStatus cmdStatus);
/**
@@ -73,6 +78,7 @@ interface IOptionsListener
* @param tID, transation of the request received from network.
* @hide
*/
+ @UnsupportedAppUsage
void incomingOptions( String uri, in OptionsCapInfo capInfo,
in int tID);
}
diff --git a/telephony/java/com/android/ims/internal/uce/options/IOptionsService.aidl b/telephony/java/com/android/ims/internal/uce/options/IOptionsService.aidl
index 839bb5574d33..2e49082988c3 100644
--- a/telephony/java/com/android/ims/internal/uce/options/IOptionsService.aidl
+++ b/telephony/java/com/android/ims/internal/uce/options/IOptionsService.aidl
@@ -33,6 +33,7 @@ interface IOptionsService
* @return StatusCode, status of the request placed.
* @hide
*/
+ @UnsupportedAppUsage
StatusCode getVersion(int optionsServiceHandle);
/**
@@ -44,6 +45,7 @@ interface IOptionsService
* The service will fill UceLong.mUceLong with optionsServiceListenerHdl
* @return StatusCode, status of the request placed.
*/
+ @UnsupportedAppUsage
StatusCode addListener(int optionsServiceHandle, IOptionsListener optionsListener,
inout UceLong optionsServiceListenerHdl);
@@ -54,6 +56,7 @@ interface IOptionsService
* @param optionsServiceListenerHdl provided in createOptionsService() or Addlistener().
* @return StatusCode, status of the request placed.
*/
+ @UnsupportedAppUsage
StatusCode removeListener(int optionsServiceHandle, in UceLong optionsServiceListenerHdl);
/**
@@ -66,6 +69,7 @@ interface IOptionsService
* with original request.
* @return StatusCode, status of the request placed.
*/
+ @UnsupportedAppUsage
StatusCode setMyInfo(int optionsServiceHandle , in CapInfo capInfo, int reqUserData);
@@ -78,6 +82,7 @@ interface IOptionsService
* with original request.
* @return StatusCode, status of the request placed.
*/
+ @UnsupportedAppUsage
StatusCode getMyInfo(int optionsServiceHandle , int reqUserdata);
/**
@@ -90,6 +95,7 @@ interface IOptionsService
* with original request.
* @return StatusCode, status of the request placed.
*/
+ @UnsupportedAppUsage
StatusCode getContactCap(int optionsServiceHandle , String remoteURI, int reqUserData);
@@ -103,6 +109,7 @@ interface IOptionsService
* with original request.
* @return StatusCode, status of the request placed.
*/
+ @UnsupportedAppUsage
StatusCode getContactListCap(int optionsServiceHandle, in String[] remoteURIList,
int reqUserData);
@@ -119,6 +126,7 @@ interface IOptionsService
* @param bContactInBL, true if the contact is blacklisted, else false.
* @return StatusCode, status of the request placed.
*/
+ @UnsupportedAppUsage
StatusCode responseIncomingOptions(int optionsServiceHandle, int tId, int sipResponseCode,
String reasonPhrase, in OptionsCapInfo capInfo,
in boolean bContactInBL);
diff --git a/telephony/java/com/android/ims/internal/uce/presence/IPresenceListener.aidl b/telephony/java/com/android/ims/internal/uce/presence/IPresenceListener.aidl
index 2ae424f4af8e..65e7fc9756bb 100644
--- a/telephony/java/com/android/ims/internal/uce/presence/IPresenceListener.aidl
+++ b/telephony/java/com/android/ims/internal/uce/presence/IPresenceListener.aidl
@@ -36,6 +36,7 @@ interface IPresenceListener
* Gets the version of the presence listener implementation.
* @param version, version information.
*/
+ @UnsupportedAppUsage
void getVersionCb(in String version );
/**
@@ -43,6 +44,7 @@ interface IPresenceListener
* availability.
* @param statusCode, UCE_SUCCESS as service availability.
*/
+ @UnsupportedAppUsage
void serviceAvailable(in StatusCode statusCode);
/**
@@ -50,6 +52,7 @@ interface IPresenceListener
* unavailability.
* @param statusCode, UCE_SUCCESS as service unAvailability.
*/
+ @UnsupportedAppUsage
void serviceUnAvailable(in StatusCode statusCode);
/**
@@ -57,12 +60,14 @@ interface IPresenceListener
* publish request.
* @param publishTrigger, Publish trigger for the network being supported.
*/
+ @UnsupportedAppUsage
void publishTriggering(in PresPublishTriggerType publishTrigger);
/**
* Callback function to be invoked to inform the client of the status of an asynchronous call.
* @param cmdStatus, command status of the request placed.
*/
+ @UnsupportedAppUsage
void cmdStatus( in PresCmdStatus cmdStatus);
/**
@@ -70,6 +75,7 @@ interface IPresenceListener
* such as PUBLISH or SUBSCRIBE, has been received.
* @param sipResponse, network response received for the request placed.
*/
+ @UnsupportedAppUsage
void sipResponseReceived(in PresSipResponse sipResponse);
/**
@@ -78,6 +84,7 @@ interface IPresenceListener
* @param presentityURI, URI of the remote entity the request was placed.
* @param tupleInfo, array of capability information remote entity supports.
*/
+ @UnsupportedAppUsage
void capInfoReceived(in String presentityURI,
in PresTupleInfo [] tupleInfo);
@@ -87,6 +94,7 @@ interface IPresenceListener
* @param rlmiInfo, resource infomation received from network.
* @param resInfo, array of capabilities received from network for the list of remore URI.
*/
+ @UnsupportedAppUsage
void listCapInfoReceived(in PresRlmiInfo rlmiInfo,
in PresResInfo [] resInfo);
@@ -94,6 +102,7 @@ interface IPresenceListener
* Callback function to be invoked to inform the client when Unpublish message
* is sent to network.
*/
+ @UnsupportedAppUsage
void unpublishMessageSent();
} \ No newline at end of file
diff --git a/telephony/java/com/android/ims/internal/uce/presence/IPresenceService.aidl b/telephony/java/com/android/ims/internal/uce/presence/IPresenceService.aidl
index fdea6d35c195..26a3e83efcfa 100644
--- a/telephony/java/com/android/ims/internal/uce/presence/IPresenceService.aidl
+++ b/telephony/java/com/android/ims/internal/uce/presence/IPresenceService.aidl
@@ -33,6 +33,7 @@ interface IPresenceService
* @param presenceServiceHdl returned in createPresenceService().
* @return StatusCode, status of the request placed.
*/
+ @UnsupportedAppUsage
StatusCode getVersion(int presenceServiceHdl);
/**
@@ -45,6 +46,7 @@ interface IPresenceService
*
* @return StatusCode, status of the request placed
*/
+ @UnsupportedAppUsage
StatusCode addListener(int presenceServiceHdl, IPresenceListener presenceServiceListener,
inout UceLong presenceServiceListenerHdl);
@@ -54,6 +56,7 @@ interface IPresenceService
* @param presenceServiceListenerHdl provided in createPresenceService() or Addlistener().
* @return StatusCode, status of the request placed.
*/
+ @UnsupportedAppUsage
StatusCode removeListener(int presenceServiceHdl, in UceLong presenceServiceListenerHdl);
/**
@@ -69,6 +72,7 @@ interface IPresenceService
* with original request.
* @return StatusCode, status of the request placed.
*/
+ @UnsupportedAppUsage
StatusCode reenableService(int presenceServiceHdl, int userData);
/**
@@ -81,6 +85,7 @@ interface IPresenceService
* with original request.
* @return StatusCode, status of the request placed.
*/
+ @UnsupportedAppUsage
StatusCode publishMyCap(int presenceServiceHdl, in PresCapInfo myCapInfo , int userData);
/**
@@ -94,6 +99,7 @@ interface IPresenceService
* with original request.
* @return StatusCode, status of the request placed.
*/
+ @UnsupportedAppUsage
StatusCode getContactCap(int presenceServiceHdl , String remoteUri, int userData);
/**
@@ -107,6 +113,7 @@ interface IPresenceService
* with original request.
* @return StatusCode, status of the request placed.
*/
+ @UnsupportedAppUsage
StatusCode getContactListCap(int presenceServiceHdl, in String[] remoteUriList, int userData);
/**
@@ -122,6 +129,7 @@ interface IPresenceService
* with original request.
* @return StatusCode, status of the request placed.
*/
+ @UnsupportedAppUsage
StatusCode setNewFeatureTag(int presenceServiceHdl, String featureTag,
in PresServiceInfo serviceInfo, int userData);
diff --git a/telephony/java/com/android/ims/internal/uce/uceservice/IUceListener.aidl b/telephony/java/com/android/ims/internal/uce/uceservice/IUceListener.aidl
index 13707a16a0c1..41abf7d1a1f0 100644
--- a/telephony/java/com/android/ims/internal/uce/uceservice/IUceListener.aidl
+++ b/telephony/java/com/android/ims/internal/uce/uceservice/IUceListener.aidl
@@ -25,5 +25,6 @@ interface IUceListener
* @param serviceStatusValue defined in ImsUceManager
* @hide
*/
+ @UnsupportedAppUsage
void setStatus(int serviceStatusValue);
}
diff --git a/telephony/java/com/android/ims/internal/uce/uceservice/IUceService.aidl b/telephony/java/com/android/ims/internal/uce/uceservice/IUceService.aidl
index 1fb8513d410a..ec45371689cf 100644
--- a/telephony/java/com/android/ims/internal/uce/uceservice/IUceService.aidl
+++ b/telephony/java/com/android/ims/internal/uce/uceservice/IUceService.aidl
@@ -38,6 +38,7 @@ interface IUceService
* Service status is returned in setStatus callback in IUceListener.
* @hide
*/
+ @UnsupportedAppUsage
boolean startService(IUceListener uceListener);
/**
@@ -45,6 +46,7 @@ interface IUceService
* @return boolean true if the service stop request is processed successfully, FALSE otherwise.
* @hide
*/
+ @UnsupportedAppUsage
boolean stopService();
@@ -54,6 +56,7 @@ interface IUceService
* @return boolean true if service started else false.
* @hide
*/
+ @UnsupportedAppUsage
boolean isServiceStarted();
/**
@@ -71,6 +74,7 @@ interface IUceService
*
* @deprecated This is replaced with new API createOptionsServiceForSubscription()
*/
+ @UnsupportedAppUsage
int createOptionsService(IOptionsListener optionsListener,
inout UceLong optionsServiceListenerHdl);
/**
@@ -97,6 +101,7 @@ interface IUceService
* in IOptionsListener
* @hide
*/
+ @UnsupportedAppUsage
void destroyOptionsService(int optionsServiceHandle);
/**
@@ -114,6 +119,7 @@ interface IUceService
*
* @deprecated This is replaced with new API createPresenceServiceForSubscription()
*/
+ @UnsupportedAppUsage
int createPresenceService(IPresenceListener presenceServiceListener,
inout UceLong presenceServiceListenerHdl);
/**
@@ -141,6 +147,7 @@ interface IUceService
*
* @hide
*/
+ @UnsupportedAppUsage
void destroyPresenceService(int presenceServiceHdl);
@@ -152,6 +159,7 @@ interface IUceService
*
* @hide
*/
+ @UnsupportedAppUsage
boolean getServiceStatus();
/**
@@ -163,6 +171,7 @@ interface IUceService
*
* @deprecated use API getPresenceServiceForSubscription()
*/
+ @UnsupportedAppUsage
IPresenceService getPresenceService();
/**
@@ -185,6 +194,7 @@ interface IUceService
*
* @hide
*/
+ @UnsupportedAppUsage
IOptionsService getOptionsService();
/**
diff --git a/telephony/java/com/android/internal/telephony/ICarrierConfigLoader.aidl b/telephony/java/com/android/internal/telephony/ICarrierConfigLoader.aidl
index 5cd67d977ad5..8e50a8f9d7d5 100644
--- a/telephony/java/com/android/internal/telephony/ICarrierConfigLoader.aidl
+++ b/telephony/java/com/android/internal/telephony/ICarrierConfigLoader.aidl
@@ -23,6 +23,7 @@ import android.os.PersistableBundle;
*/
interface ICarrierConfigLoader {
+ @UnsupportedAppUsage
PersistableBundle getConfigForSubId(int subId, String callingPackage);
void overrideConfig(int subId, in PersistableBundle overrides);
diff --git a/telephony/java/com/android/internal/telephony/IPhoneSubInfo.aidl b/telephony/java/com/android/internal/telephony/IPhoneSubInfo.aidl
index abcb15ae4d50..5b509b7260ba 100644
--- a/telephony/java/com/android/internal/telephony/IPhoneSubInfo.aidl
+++ b/telephony/java/com/android/internal/telephony/IPhoneSubInfo.aidl
@@ -60,6 +60,7 @@ interface IPhoneSubInfo {
/**
* Retrieves the unique sbuscriber ID, e.g., IMSI for GSM phones.
*/
+ @UnsupportedAppUsage
String getSubscriberId(String callingPackage);
/**
@@ -75,6 +76,7 @@ interface IPhoneSubInfo {
/**
* Retrieves the serial number of the ICC, if applicable.
*/
+ @UnsupportedAppUsage
String getIccSerialNumber(String callingPackage);
/**
diff --git a/telephony/java/com/android/internal/telephony/ITelephony.aidl b/telephony/java/com/android/internal/telephony/ITelephony.aidl
index d1838370d023..5c5d44a8f42e 100644
--- a/telephony/java/com/android/internal/telephony/ITelephony.aidl
+++ b/telephony/java/com/android/internal/telephony/ITelephony.aidl
@@ -76,6 +76,7 @@ interface ITelephony {
* @param number the number to be dialed. If null, this
* would display the Dialer screen with no number pre-filled.
*/
+ @UnsupportedAppUsage
void dial(String number);
/**
@@ -83,6 +84,7 @@ interface ITelephony {
* @param callingPackage The package making the call.
* @param number the number to be called.
*/
+ @UnsupportedAppUsage
void call(String callingPackage, String number);
/**
@@ -98,6 +100,7 @@ interface ITelephony {
* @param callingPackage the name of the package making the call.
* @return returns true if the radio is on.
*/
+ @UnsupportedAppUsage
boolean isRadioOnForSubscriber(int subId, String callingPackage);
/**
@@ -105,6 +108,7 @@ interface ITelephony {
* @param pin The pin to check.
* @return whether the operation was a success.
*/
+ @UnsupportedAppUsage
boolean supplyPin(String pin);
/**
@@ -182,6 +186,7 @@ interface ITelephony {
* @param dialString the MMI command to be executed.
* @return true if MMI command is executed.
*/
+ @UnsupportedAppUsage
boolean handlePinMmi(String dialString);
@@ -202,11 +207,13 @@ interface ITelephony {
* @param subId user preferred subId.
* @return true if MMI command is executed.
*/
+ @UnsupportedAppUsage
boolean handlePinMmiForSubscriber(int subId, String dialString);
/**
* Toggles the radio on or off.
*/
+ @UnsupportedAppUsage
void toggleRadioOnOff();
/**
@@ -218,6 +225,7 @@ interface ITelephony {
/**
* Set the radio to on or off
*/
+ @UnsupportedAppUsage
boolean setRadio(boolean turnOn);
/**
@@ -234,6 +242,7 @@ interface ITelephony {
/**
* Request to update location information in service state
*/
+ @UnsupportedAppUsage
void updateServiceLocation();
/**
@@ -245,6 +254,7 @@ interface ITelephony {
/**
* Enable location update notifications.
*/
+ @UnsupportedAppUsage
void enableLocationUpdates();
/**
@@ -256,6 +266,7 @@ interface ITelephony {
/**
* Disable location update notifications.
*/
+ @UnsupportedAppUsage
void disableLocationUpdates();
/**
@@ -267,11 +278,13 @@ interface ITelephony {
/**
* Allow mobile data connections.
*/
+ @UnsupportedAppUsage
boolean enableDataConnectivity();
/**
* Disallow mobile data connections.
*/
+ @UnsupportedAppUsage
boolean disableDataConnectivity();
/**
@@ -293,6 +306,7 @@ interface ITelephony {
*/
List<NeighboringCellInfo> getNeighboringCellInfo(String callingPkg);
+ @UnsupportedAppUsage
int getCallState();
/**
@@ -300,7 +314,9 @@ interface ITelephony {
*/
int getCallStateForSlot(int slotIndex);
+ @UnsupportedAppUsage
int getDataActivity();
+ @UnsupportedAppUsage
int getDataState();
/**
@@ -308,6 +324,7 @@ interface ITelephony {
* Returns TelephonyManager.PHONE_TYPE_CDMA if RILConstants.CDMA_PHONE
* and TelephonyManager.PHONE_TYPE_GSM if RILConstants.GSM_PHONE
*/
+ @UnsupportedAppUsage
int getActivePhoneType();
/**
@@ -444,6 +461,7 @@ interface ITelephony {
* Returns the network type for data transmission
* Legacy call, permission-free
*/
+ @UnsupportedAppUsage
int getNetworkType();
/**
@@ -477,6 +495,7 @@ interface ITelephony {
/**
* Return true if an ICC card is present
*/
+ @UnsupportedAppUsage
boolean hasIccCard();
/**
@@ -557,6 +576,7 @@ interface ITelephony {
* successful iccOpenLogicalChannel.
* @return true if the channel was closed successfully.
*/
+ @UnsupportedAppUsage
boolean iccCloseLogicalChannel(int subId, int channel);
/**
@@ -577,6 +597,7 @@ interface ITelephony {
* @return The APDU response from the ICC card with the status appended at
* the end.
*/
+ @UnsupportedAppUsage
String iccTransmitApduLogicalChannel(int subId, int channel, int cla, int instruction,
int p1, int p2, int p3, String data);
@@ -829,6 +850,7 @@ interface ITelephony {
*
* @return true on enabled
*/
+ @UnsupportedAppUsage
boolean getDataEnabled(int subId);
/**
@@ -1679,7 +1701,7 @@ interface ITelephony {
/**
* Modify the user's setting for whether or not 4G LTE is enabled.
*/
- void setAdvancedCallingSetting(int subId, boolean isEnabled);
+ void setAdvancedCallingSettingEnabled(int subId, boolean isEnabled);
/**
* return true if the user's setting for VT is enabled for the subscription.
@@ -1689,7 +1711,7 @@ interface ITelephony {
/**
* Modify the user's setting for whether or not VT is available for the subscrption specified.
*/
- void setVtSetting(int subId, boolean isEnabled);
+ void setVtSettingEnabled(int subId, boolean isEnabled);
/**
* return true if the user's setting for whether or not Voice over WiFi is currently enabled.
@@ -1699,7 +1721,7 @@ interface ITelephony {
/**
* sets the user's setting for Voice over WiFi enabled state.
*/
- void setVoWiFiSetting(int subId, boolean isEnabled);
+ void setVoWiFiSettingEnabled(int subId, boolean isEnabled);
/**
* return true if the user's setting for Voice over WiFi while roaming is enabled.
@@ -1710,7 +1732,7 @@ interface ITelephony {
* Sets the user's preference for whether or not Voice over WiFi is enabled for the current
* subscription while roaming.
*/
- void setVoWiFiRoamingSetting(int subId, boolean isEnabled);
+ void setVoWiFiRoamingSettingEnabled(int subId, boolean isEnabled);
/**
* Set the Voice over WiFi enabled state, but do not persist the setting.
diff --git a/telephony/java/com/android/internal/telephony/ITelephonyRegistry.aidl b/telephony/java/com/android/internal/telephony/ITelephonyRegistry.aidl
index 6de608e7b53b..0610c5d106c3 100644
--- a/telephony/java/com/android/internal/telephony/ITelephonyRegistry.aidl
+++ b/telephony/java/com/android/internal/telephony/ITelephonyRegistry.aidl
@@ -38,9 +38,11 @@ interface ITelephonyRegistry {
IOnSubscriptionsChangedListener callback);
void removeOnSubscriptionsChangedListener(String pkg,
IOnSubscriptionsChangedListener callback);
+ @UnsupportedAppUsage
void listen(String pkg, IPhoneStateListener callback, int events, boolean notifyNow);
void listenForSubscriber(in int subId, String pkg, IPhoneStateListener callback, int events,
boolean notifyNow);
+ @UnsupportedAppUsage
void notifyCallState(int state, String incomingNumber);
void notifyCallStateForPhoneId(in int phoneId, in int subId, int state, String incomingNumber);
void notifyServiceStateForPhoneId(in int phoneId, in int subId, in ServiceState state);
@@ -57,11 +59,13 @@ interface ITelephonyRegistry {
void notifyDataConnectionForSubscriber(int subId, int state, boolean isDataConnectivityPossible,
String apn, String apnType, in LinkProperties linkProperties,
in NetworkCapabilities networkCapabilities, int networkType, boolean roaming);
+ @UnsupportedAppUsage
void notifyDataConnectionFailed(String apnType);
void notifyDataConnectionFailedForSubscriber(int subId, String apnType);
void notifyCellLocation(in Bundle cellLocation);
void notifyCellLocationForSubscriber(in int subId, in Bundle cellLocation);
void notifyOtaspChanged(in int otaspMode);
+ @UnsupportedAppUsage
void notifyCellInfo(in List<CellInfo> cellInfo);
void notifyPhysicalChannelConfiguration(in List<PhysicalChannelConfig> configs);
void notifyPhysicalChannelConfigurationForSubscriber(in int subId,
diff --git a/telephony/java/com/android/internal/telephony/IWapPushManager.aidl b/telephony/java/com/android/internal/telephony/IWapPushManager.aidl
index d5ecb940c8d1..1c3df65336f8 100644
--- a/telephony/java/com/android/internal/telephony/IWapPushManager.aidl
+++ b/telephony/java/com/android/internal/telephony/IWapPushManager.aidl
@@ -30,6 +30,7 @@ interface IWapPushManager {
* Returns true if inserting the information is successfull. Inserting the duplicated
* record in the application ID table is not allowed. Use update/delete method.
*/
+ @UnsupportedAppUsage
boolean addPackage(String x_app_id, String content_type,
String package_name, String class_name,
int app_type, boolean need_signature, boolean further_processing);
@@ -38,6 +39,7 @@ interface IWapPushManager {
* Updates receiver application that is last added.
* Returns true if updating the information is successfull.
*/
+ @UnsupportedAppUsage
boolean updatePackage(String x_app_id, String content_type,
String package_name, String class_name,
int app_type, boolean need_signature, boolean further_processing);
@@ -46,6 +48,7 @@ interface IWapPushManager {
* Delites receiver application information.
* Returns true if deleting is successfull.
*/
+ @UnsupportedAppUsage
boolean deletePackage(String x_app_id, String content_type,
String package_name, String class_name);
}
diff --git a/telephony/java/com/android/internal/telephony/RILConstants.java b/telephony/java/com/android/internal/telephony/RILConstants.java
index 77b797956cf5..5205973669ac 100644
--- a/telephony/java/com/android/internal/telephony/RILConstants.java
+++ b/telephony/java/com/android/internal/telephony/RILConstants.java
@@ -470,6 +470,7 @@ public interface RILConstants {
int RIL_REQUEST_START_KEEPALIVE = 144;
int RIL_REQUEST_STOP_KEEPALIVE = 145;
int RIL_REQUEST_ENABLE_MODEM = 146;
+ int RIL_REQUEST_GET_MODEM_STATUS = 147;
/* The following requests are not defined in RIL.h */
int RIL_REQUEST_HAL_NON_RIL_BASE = 200;
diff --git a/tests/DynamicCodeLoggerIntegrationTests/src/com/android/server/pm/dex/DynamicCodeLoggerIntegrationTests.java b/tests/DynamicCodeLoggerIntegrationTests/src/com/android/server/pm/dex/DynamicCodeLoggerIntegrationTests.java
index 8ef15d869a0b..4f9aeea5bdb4 100644
--- a/tests/DynamicCodeLoggerIntegrationTests/src/com/android/server/pm/dex/DynamicCodeLoggerIntegrationTests.java
+++ b/tests/DynamicCodeLoggerIntegrationTests/src/com/android/server/pm/dex/DynamicCodeLoggerIntegrationTests.java
@@ -235,6 +235,34 @@ public final class DynamicCodeLoggerIntegrationTests {
}
@Test
+ public void testGeneratesEvents_spoofed_validFile_untrustedApp() throws Exception {
+ File privateCopyFile = privateFile("spoofed2");
+
+ String expectedContentHash = copyAndHashResource(
+ "/DynamicCodeLoggerNativeExecutable", privateCopyFile);
+
+ EventLog.writeEvent(EventLog.getTagCode("auditd"),
+ "type=1400 avc: granted { execute_no_trans } "
+ + "path=\"" + privateCopyFile + "\" "
+ + "scontext=u:r:untrusted_app: "
+ + "tcontext=u:object_r:app_data_file: "
+ + "tclass=file ");
+
+ String expectedNameHash =
+ "3E57AA59249154C391316FDCF07C1D499C26A564E4D305833CCD9A98ED895AC9";
+
+ // Run the job to scan generated audit log entries
+ runDynamicCodeLoggingJob(AUDIT_WATCHING_JOB_ID);
+
+ // And then make sure we log events about it
+ long previousEventNanos = mostRecentEventTimeNanos();
+ runDynamicCodeLoggingJob(IDLE_LOGGING_JOB_ID);
+
+ assertDclLoggedSince(previousEventNanos, DCL_NATIVE_SUBTAG,
+ expectedNameHash, expectedContentHash);
+ }
+
+ @Test
public void testGeneratesEvents_spoofed_pathTraversal() throws Exception {
File privateDir = privateFile("x").getParentFile();
diff --git a/tests/HwAccelerationTest/src/com/android/test/hwui/PositionListenerActivity.java b/tests/HwAccelerationTest/src/com/android/test/hwui/PositionListenerActivity.java
index 316aad343d19..818d899413de 100644
--- a/tests/HwAccelerationTest/src/com/android/test/hwui/PositionListenerActivity.java
+++ b/tests/HwAccelerationTest/src/com/android/test/hwui/PositionListenerActivity.java
@@ -53,7 +53,7 @@ public class PositionListenerActivity extends Activity {
MyPositionReporter(Context c) {
super(c);
mNode = new RenderNode("positionListener");
- mNode.requestPositionUpdates(this);
+ mNode.addPositionUpdateListener(this);
setTextAlignment(TEXT_ALIGNMENT_VIEW_START);
}
diff --git a/tests/net/java/com/android/server/ConnectivityServiceTest.java b/tests/net/java/com/android/server/ConnectivityServiceTest.java
index ed524f61e3bc..1a0e8fa490b3 100644
--- a/tests/net/java/com/android/server/ConnectivityServiceTest.java
+++ b/tests/net/java/com/android/server/ConnectivityServiceTest.java
@@ -17,10 +17,10 @@
package com.android.server;
import static android.net.ConnectivityManager.CONNECTIVITY_ACTION;
+import static android.net.ConnectivityManager.NETID_UNSET;
import static android.net.ConnectivityManager.PRIVATE_DNS_MODE_OFF;
import static android.net.ConnectivityManager.PRIVATE_DNS_MODE_OPPORTUNISTIC;
import static android.net.ConnectivityManager.PRIVATE_DNS_MODE_PROVIDER_HOSTNAME;
-import static android.net.ConnectivityManager.NETID_UNSET;
import static android.net.ConnectivityManager.TYPE_ETHERNET;
import static android.net.ConnectivityManager.TYPE_MOBILE;
import static android.net.ConnectivityManager.TYPE_MOBILE_FOTA;
@@ -125,6 +125,7 @@ import android.net.NetworkParcelable;
import android.net.NetworkRequest;
import android.net.NetworkSpecifier;
import android.net.NetworkStackClient;
+import android.net.NetworkState;
import android.net.NetworkUtils;
import android.net.ProxyInfo;
import android.net.RouteInfo;
@@ -157,6 +158,7 @@ import android.util.Log;
import android.util.SparseArray;
import com.android.internal.net.VpnConfig;
+import com.android.internal.net.VpnInfo;
import com.android.internal.util.ArrayUtils;
import com.android.internal.util.WakeupMessage;
import com.android.internal.util.test.BroadcastInterceptingContext;
@@ -1828,6 +1830,12 @@ public class ConnectivityServiceTest {
fn.test((NetworkCapabilities) cbi.arg));
}
+ void expectLinkPropertiesLike(Predicate<LinkProperties> fn, MockNetworkAgent agent) {
+ CallbackInfo cbi = expectCallback(CallbackState.LINK_PROPERTIES, agent);
+ assertTrue("Received LinkProperties don't match expectations : " + cbi.arg,
+ fn.test((LinkProperties) cbi.arg));
+ }
+
void expectBlockedStatusCallback(boolean expectBlocked, MockNetworkAgent agent) {
CallbackInfo cbi = expectCallback(CallbackState.BLOCKED_STATUS, agent);
boolean actualBlocked = (boolean) cbi.arg;
@@ -4356,48 +4364,91 @@ public class ConnectivityServiceTest {
mCellNetworkAgent = new MockNetworkAgent(TRANSPORT_CELLULAR);
mWiFiNetworkAgent = new MockNetworkAgent(TRANSPORT_WIFI);
- Network[] onlyCell = new Network[]{mCellNetworkAgent.getNetwork()};
- Network[] onlyWifi = new Network[]{mWiFiNetworkAgent.getNetwork()};
+ Network[] onlyCell = new Network[] {mCellNetworkAgent.getNetwork()};
+ Network[] onlyWifi = new Network[] {mWiFiNetworkAgent.getNetwork()};
+
+ LinkProperties cellLp = new LinkProperties();
+ cellLp.setInterfaceName(MOBILE_IFNAME);
+ LinkProperties wifiLp = new LinkProperties();
+ wifiLp.setInterfaceName(WIFI_IFNAME);
// Simple connection should have updated ifaces
mCellNetworkAgent.connect(false);
+ mCellNetworkAgent.sendLinkProperties(cellLp);
waitForIdle();
- verify(mStatsService, atLeastOnce()).forceUpdateIfaces(onlyCell);
+ verify(mStatsService, atLeastOnce())
+ .forceUpdateIfaces(
+ eq(onlyCell),
+ eq(new VpnInfo[0]),
+ any(NetworkState[].class),
+ eq(MOBILE_IFNAME));
reset(mStatsService);
// Default network switch should update ifaces.
mWiFiNetworkAgent.connect(false);
+ mWiFiNetworkAgent.sendLinkProperties(wifiLp);
waitForIdle();
- verify(mStatsService, atLeastOnce()).forceUpdateIfaces(onlyWifi);
+ assertEquals(wifiLp, mService.getActiveLinkProperties());
+ verify(mStatsService, atLeastOnce())
+ .forceUpdateIfaces(
+ eq(onlyWifi),
+ eq(new VpnInfo[0]),
+ any(NetworkState[].class),
+ eq(WIFI_IFNAME));
reset(mStatsService);
// Disconnect should update ifaces.
mWiFiNetworkAgent.disconnect();
waitForIdle();
- verify(mStatsService, atLeastOnce()).forceUpdateIfaces(onlyCell);
+ verify(mStatsService, atLeastOnce())
+ .forceUpdateIfaces(
+ eq(onlyCell),
+ eq(new VpnInfo[0]),
+ any(NetworkState[].class),
+ eq(MOBILE_IFNAME));
reset(mStatsService);
// Metered change should update ifaces
mCellNetworkAgent.addCapability(NetworkCapabilities.NET_CAPABILITY_NOT_METERED);
waitForIdle();
- verify(mStatsService, atLeastOnce()).forceUpdateIfaces(onlyCell);
+ verify(mStatsService, atLeastOnce())
+ .forceUpdateIfaces(
+ eq(onlyCell),
+ eq(new VpnInfo[0]),
+ any(NetworkState[].class),
+ eq(MOBILE_IFNAME));
reset(mStatsService);
mCellNetworkAgent.removeCapability(NetworkCapabilities.NET_CAPABILITY_NOT_METERED);
waitForIdle();
- verify(mStatsService, atLeastOnce()).forceUpdateIfaces(onlyCell);
+ verify(mStatsService, atLeastOnce())
+ .forceUpdateIfaces(
+ eq(onlyCell),
+ eq(new VpnInfo[0]),
+ any(NetworkState[].class),
+ eq(MOBILE_IFNAME));
reset(mStatsService);
// Captive portal change shouldn't update ifaces
mCellNetworkAgent.addCapability(NetworkCapabilities.NET_CAPABILITY_CAPTIVE_PORTAL);
waitForIdle();
- verify(mStatsService, never()).forceUpdateIfaces(onlyCell);
+ verify(mStatsService, never())
+ .forceUpdateIfaces(
+ eq(onlyCell),
+ eq(new VpnInfo[0]),
+ any(NetworkState[].class),
+ eq(MOBILE_IFNAME));
reset(mStatsService);
// Roaming change should update ifaces
mCellNetworkAgent.addCapability(NetworkCapabilities.NET_CAPABILITY_NOT_ROAMING);
waitForIdle();
- verify(mStatsService, atLeastOnce()).forceUpdateIfaces(onlyCell);
+ verify(mStatsService, atLeastOnce())
+ .forceUpdateIfaces(
+ eq(onlyCell),
+ eq(new VpnInfo[0]),
+ any(NetworkState[].class),
+ eq(MOBILE_IFNAME));
reset(mStatsService);
}
@@ -5176,6 +5227,9 @@ public class ConnectivityServiceTest {
public void testStackedLinkProperties() throws UnknownHostException, RemoteException {
final LinkAddress myIpv4 = new LinkAddress("1.2.3.4/24");
final LinkAddress myIpv6 = new LinkAddress("2001:db8:1::1/64");
+ final String kNat64PrefixString = "2001:db8:64:64:64:64::";
+ final IpPrefix kNat64Prefix = new IpPrefix(InetAddress.getByName(kNat64PrefixString), 96);
+
final NetworkRequest networkRequest = new NetworkRequest.Builder()
.addTransportType(TRANSPORT_CELLULAR)
.addCapability(NET_CAPABILITY_INTERNET)
@@ -5183,8 +5237,9 @@ public class ConnectivityServiceTest {
final TestNetworkCallback networkCallback = new TestNetworkCallback();
mCm.registerNetworkCallback(networkRequest, networkCallback);
- // Prepare ipv6 only link properties and connect.
+ // Prepare ipv6 only link properties.
mCellNetworkAgent = new MockNetworkAgent(TRANSPORT_CELLULAR);
+ final int cellNetId = mCellNetworkAgent.getNetwork().netId;
final LinkProperties cellLp = new LinkProperties();
cellLp.setInterfaceName(MOBILE_IFNAME);
cellLp.addLinkAddress(myIpv6);
@@ -5194,15 +5249,44 @@ public class ConnectivityServiceTest {
when(mNetworkManagementService.getInterfaceConfig(CLAT_PREFIX + MOBILE_IFNAME))
.thenReturn(getClatInterfaceConfig(myIpv4));
- // Connect with ipv6 link properties, then expect clat setup ipv4 and update link
- // properties properly.
+ // Connect with ipv6 link properties. Expect prefix discovery to be started.
mCellNetworkAgent.sendLinkProperties(cellLp);
mCellNetworkAgent.connect(true);
networkCallback.expectAvailableThenValidatedCallbacks(mCellNetworkAgent);
- verify(mMockNetd, times(1)).clatdStart(MOBILE_IFNAME);
- Nat464Xlat clat = mService.getNat464Xlat(mCellNetworkAgent);
+ verify(mMockNetd, times(1)).resolverStartPrefix64Discovery(cellNetId);
+
+ // Switching default network updates TCP buffer sizes.
+ verifyTcpBufferSizeChange(ConnectivityService.DEFAULT_TCP_BUFFER_SIZES);
- // Clat iface up, expect stack link updated.
+ // Add an IPv4 address. Expect prefix discovery to be stopped. Netd doesn't tell us that
+ // the NAT64 prefix was removed because one was never discovered.
+ cellLp.addLinkAddress(myIpv4);
+ mCellNetworkAgent.sendLinkProperties(cellLp);
+ networkCallback.expectCallback(CallbackState.LINK_PROPERTIES, mCellNetworkAgent);
+ verify(mMockNetd, times(1)).resolverStopPrefix64Discovery(cellNetId);
+
+ verifyNoMoreInteractions(mMockNetd);
+ reset(mMockNetd);
+
+ // Remove IPv4 address. Expect prefix discovery to be started again.
+ cellLp.removeLinkAddress(myIpv4);
+ cellLp.removeRoute(new RouteInfo(myIpv4, null, MOBILE_IFNAME));
+ mCellNetworkAgent.sendLinkProperties(cellLp);
+ networkCallback.expectCallback(CallbackState.LINK_PROPERTIES, mCellNetworkAgent);
+ verify(mMockNetd, times(1)).resolverStartPrefix64Discovery(cellNetId);
+
+ // When NAT64 prefix discovery succeeds, LinkProperties are updated and clatd is started.
+ Nat464Xlat clat = mService.getNat464Xlat(mCellNetworkAgent);
+ assertNull(mCm.getLinkProperties(mCellNetworkAgent.getNetwork()).getNat64Prefix());
+ mService.mNetdEventCallback.onNat64PrefixEvent(cellNetId, true /* added */,
+ kNat64PrefixString, 96);
+ LinkProperties lpBeforeClat = (LinkProperties) networkCallback.expectCallback(
+ CallbackState.LINK_PROPERTIES, mCellNetworkAgent).arg;
+ assertEquals(0, lpBeforeClat.getStackedLinks().size());
+ assertEquals(kNat64Prefix, lpBeforeClat.getNat64Prefix());
+ verify(mMockNetd, times(1)).clatdStart(MOBILE_IFNAME, kNat64Prefix.toString());
+
+ // Clat iface comes up. Expect stacked link to be added.
clat.interfaceLinkStateChanged(CLAT_PREFIX + MOBILE_IFNAME, true);
networkCallback.expectCallback(CallbackState.LINK_PROPERTIES, mCellNetworkAgent);
List<LinkProperties> stackedLps = mCm.getLinkProperties(mCellNetworkAgent.getNetwork())
@@ -5219,20 +5303,66 @@ public class ConnectivityServiceTest {
assertNotEquals(stackedLpsAfterChange, Collections.EMPTY_LIST);
assertEquals(makeClatLinkProperties(myIpv4), stackedLpsAfterChange.get(0));
- // Add ipv4 address, expect stacked linkproperties be cleaned up
+ // Add ipv4 address, expect that clatd and prefix discovery are stopped and stacked
+ // linkproperties are cleaned up.
cellLp.addLinkAddress(myIpv4);
cellLp.addRoute(new RouteInfo(myIpv4, null, MOBILE_IFNAME));
mCellNetworkAgent.sendLinkProperties(cellLp);
networkCallback.expectCallback(CallbackState.LINK_PROPERTIES, mCellNetworkAgent);
verify(mMockNetd, times(1)).clatdStop(MOBILE_IFNAME);
+ verify(mMockNetd, times(1)).resolverStopPrefix64Discovery(cellNetId);
- // Clat iface removed, expect linkproperties revert to original one
- clat.interfaceRemoved(CLAT_PREFIX + MOBILE_IFNAME);
+ // As soon as stop is called, the linkproperties lose the stacked interface.
networkCallback.expectCallback(CallbackState.LINK_PROPERTIES, mCellNetworkAgent);
LinkProperties actualLpAfterIpv4 = mCm.getLinkProperties(mCellNetworkAgent.getNetwork());
- assertEquals(cellLp, actualLpAfterIpv4);
+ LinkProperties expected = new LinkProperties(cellLp);
+ expected.setNat64Prefix(kNat64Prefix);
+ assertEquals(expected, actualLpAfterIpv4);
+ assertEquals(0, actualLpAfterIpv4.getStackedLinks().size());
- // Clean up
+ // The interface removed callback happens but has no effect after stop is called.
+ clat.interfaceRemoved(CLAT_PREFIX + MOBILE_IFNAME);
+ networkCallback.assertNoCallback();
+
+ verifyNoMoreInteractions(mMockNetd);
+ reset(mMockNetd);
+
+ // Stopping prefix discovery causes netd to tell us that the NAT64 prefix is gone.
+ mService.mNetdEventCallback.onNat64PrefixEvent(cellNetId, false /* added */,
+ kNat64PrefixString, 96);
+ networkCallback.expectLinkPropertiesLike((lp) -> lp.getNat64Prefix() == null,
+ mCellNetworkAgent);
+
+ // Remove IPv4 address and expect prefix discovery and clatd to be started again.
+ cellLp.removeLinkAddress(myIpv4);
+ cellLp.removeRoute(new RouteInfo(myIpv4, null, MOBILE_IFNAME));
+ cellLp.removeDnsServer(InetAddress.getByName("8.8.8.8"));
+ mCellNetworkAgent.sendLinkProperties(cellLp);
+ networkCallback.expectCallback(CallbackState.LINK_PROPERTIES, mCellNetworkAgent);
+ verify(mMockNetd, times(1)).resolverStartPrefix64Discovery(cellNetId);
+ mService.mNetdEventCallback.onNat64PrefixEvent(cellNetId, true /* added */,
+ kNat64PrefixString, 96);
+ networkCallback.expectCallback(CallbackState.LINK_PROPERTIES, mCellNetworkAgent);
+ verify(mMockNetd, times(1)).clatdStart(MOBILE_IFNAME, kNat64Prefix.toString());
+
+
+ // Clat iface comes up. Expect stacked link to be added.
+ clat.interfaceLinkStateChanged(CLAT_PREFIX + MOBILE_IFNAME, true);
+ networkCallback.expectLinkPropertiesLike(
+ (lp) -> lp.getStackedLinks().size() == 1 && lp.getNat64Prefix() != null,
+ mCellNetworkAgent);
+
+ // NAT64 prefix is removed. Expect that clat is stopped.
+ mService.mNetdEventCallback.onNat64PrefixEvent(cellNetId, false /* added */,
+ kNat64PrefixString, 96);
+ networkCallback.expectLinkPropertiesLike(
+ (lp) -> lp.getStackedLinks().size() == 0 && lp.getNat64Prefix() == null,
+ mCellNetworkAgent);
+ verify(mMockNetd, times(1)).clatdStop(MOBILE_IFNAME);
+ networkCallback.expectLinkPropertiesLike((lp) -> lp.getStackedLinks().size() == 0,
+ mCellNetworkAgent);
+
+ // Clean up.
mCellNetworkAgent.disconnect();
networkCallback.expectCallback(CallbackState.LOST, mCellNetworkAgent);
networkCallback.assertNoCallback();
@@ -5313,30 +5443,34 @@ public class ConnectivityServiceTest {
mCm.unregisterNetworkCallback(networkCallback);
}
- private static final String TEST_TCP_BUFFER_SIZES = "1,2,3,4,5,6";
-
- private void verifyTcpBufferSizeChange(String tcpBufferSizes) throws Exception {
+ private void verifyTcpBufferSizeChange(String tcpBufferSizes) {
String[] values = tcpBufferSizes.split(",");
String rmemValues = String.join(" ", values[0], values[1], values[2]);
String wmemValues = String.join(" ", values[3], values[4], values[5]);
waitForIdle();
- verify(mMockNetd, atLeastOnce()).setTcpRWmemorySize(rmemValues, wmemValues);
+ try {
+ verify(mMockNetd, atLeastOnce()).setTcpRWmemorySize(rmemValues, wmemValues);
+ } catch (RemoteException e) {
+ fail("mMockNetd should never throw RemoteException");
+ }
reset(mMockNetd);
}
@Test
- public void testTcpBufferReset() throws Exception {
+ public void testTcpBufferReset() {
+ final String testTcpBufferSizes = "1,2,3,4,5,6";
+
mCellNetworkAgent = new MockNetworkAgent(TRANSPORT_CELLULAR);
reset(mMockNetd);
- // Simple connection should have updated tcp buffer size.
+ // Switching default network updates TCP buffer sizes.
mCellNetworkAgent.connect(false);
verifyTcpBufferSizeChange(ConnectivityService.DEFAULT_TCP_BUFFER_SIZES);
// Change link Properties should have updated tcp buffer size.
LinkProperties lp = new LinkProperties();
- lp.setTcpBufferSizes(TEST_TCP_BUFFER_SIZES);
+ lp.setTcpBufferSizes(testTcpBufferSizes);
mCellNetworkAgent.sendLinkProperties(lp);
- verifyTcpBufferSizeChange(TEST_TCP_BUFFER_SIZES);
+ verifyTcpBufferSizeChange(testTcpBufferSizes);
}
@Test
diff --git a/tests/net/java/com/android/server/connectivity/Nat464XlatTest.java b/tests/net/java/com/android/server/connectivity/Nat464XlatTest.java
index 07b1d057c882..37c0df80f3e3 100644
--- a/tests/net/java/com/android/server/connectivity/Nat464XlatTest.java
+++ b/tests/net/java/com/android/server/connectivity/Nat464XlatTest.java
@@ -16,9 +16,11 @@
package com.android.server.connectivity;
+import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import static org.mockito.Mockito.eq;
+import static org.mockito.Mockito.inOrder;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.verifyNoMoreInteractions;
@@ -27,6 +29,7 @@ import static org.mockito.Mockito.when;
import android.net.ConnectivityManager;
import android.net.INetd;
import android.net.InterfaceConfiguration;
+import android.net.IpPrefix;
import android.net.LinkAddress;
import android.net.LinkProperties;
import android.net.NetworkInfo;
@@ -43,6 +46,7 @@ import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.ArgumentCaptor;
+import org.mockito.InOrder;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
@@ -53,6 +57,8 @@ public class Nat464XlatTest {
static final String BASE_IFACE = "test0";
static final String STACKED_IFACE = "v4-test0";
static final LinkAddress ADDR = new LinkAddress("192.0.2.5/29");
+ static final String NAT64_PREFIX = "64:ff9b::/96";
+ static final int NETID = 42;
@Mock ConnectivityService mConnectivity;
@Mock NetworkMisc mMisc;
@@ -65,7 +71,11 @@ public class Nat464XlatTest {
Handler mHandler;
Nat464Xlat makeNat464Xlat() {
- return new Nat464Xlat(mNai, mNetd, mNms);
+ return new Nat464Xlat(mNai, mNetd, mNms) {
+ @Override protected int getNetId() {
+ return NETID;
+ }
+ };
}
@Before
@@ -87,6 +97,24 @@ public class Nat464XlatTest {
when(mConfig.getLinkAddress()).thenReturn(ADDR);
}
+ private void assertRequiresClat(boolean expected, NetworkAgentInfo nai) {
+ String msg = String.format("requiresClat expected %b for type=%d state=%s skip=%b "
+ + "nat64Prefix=%s addresses=%s", expected, nai.networkInfo.getType(),
+ nai.networkInfo.getDetailedState(),
+ mMisc.skip464xlat, nai.linkProperties.getNat64Prefix(),
+ nai.linkProperties.getLinkAddresses());
+ assertEquals(msg, expected, Nat464Xlat.requiresClat(nai));
+ }
+
+ private void assertShouldStartClat(boolean expected, NetworkAgentInfo nai) {
+ String msg = String.format("shouldStartClat expected %b for type=%d state=%s skip=%b "
+ + "nat64Prefix=%s addresses=%s", expected, nai.networkInfo.getType(),
+ nai.networkInfo.getDetailedState(),
+ mMisc.skip464xlat, nai.linkProperties.getNat64Prefix(),
+ nai.linkProperties.getLinkAddresses());
+ assertEquals(msg, expected, Nat464Xlat.shouldStartClat(nai));
+ }
+
@Test
public void testRequiresClat() throws Exception {
final int[] supportedTypes = {
@@ -102,20 +130,45 @@ public class Nat464XlatTest {
NetworkInfo.DetailedState.SUSPENDED,
};
+ LinkProperties oldLp = new LinkProperties(mNai.linkProperties);
for (int type : supportedTypes) {
mNai.networkInfo.setType(type);
for (NetworkInfo.DetailedState state : supportedDetailedStates) {
mNai.networkInfo.setDetailedState(state, "reason", "extraInfo");
- String msg = String.format("requiresClat expected for type=%d state=%s",
- type, state);
+
+ mNai.linkProperties.setNat64Prefix(new IpPrefix("2001:db8:0:64::/96"));
+ assertRequiresClat(false, mNai);
+ assertShouldStartClat(false, mNai);
+
+ mNai.linkProperties.addLinkAddress(new LinkAddress("fc00::1/64"));
+ assertRequiresClat(false, mNai);
+ assertShouldStartClat(false, mNai);
+
+ mNai.linkProperties.addLinkAddress(new LinkAddress("2001:db8::1/64"));
+ assertRequiresClat(true, mNai);
+ assertShouldStartClat(true, mNai);
mMisc.skip464xlat = true;
- String errorMsg = msg + String.format(" skip464xlat=%b", mMisc.skip464xlat);
- assertFalse(errorMsg, Nat464Xlat.requiresClat(mNai));
+ assertRequiresClat(false, mNai);
+ assertShouldStartClat(false, mNai);
mMisc.skip464xlat = false;
- errorMsg = msg + String.format(" skip464xlat=%b", mMisc.skip464xlat);
- assertTrue(errorMsg, Nat464Xlat.requiresClat(mNai));
+ assertRequiresClat(true, mNai);
+ assertShouldStartClat(true, mNai);
+
+ mNai.linkProperties.addLinkAddress(new LinkAddress("192.0.2.2/24"));
+ assertRequiresClat(false, mNai);
+ assertShouldStartClat(false, mNai);
+
+ mNai.linkProperties.removeLinkAddress(new LinkAddress("192.0.2.2/24"));
+ assertRequiresClat(true, mNai);
+ assertShouldStartClat(true, mNai);
+
+ mNai.linkProperties.setNat64Prefix(null);
+ assertRequiresClat(true, mNai);
+ assertShouldStartClat(false, mNai);
+
+ mNai.linkProperties = new LinkProperties(oldLp);
}
}
}
@@ -125,11 +178,13 @@ public class Nat464XlatTest {
Nat464Xlat nat = makeNat464Xlat();
ArgumentCaptor<LinkProperties> c = ArgumentCaptor.forClass(LinkProperties.class);
- // ConnectivityService starts clat.
+ nat.setNat64Prefix(new IpPrefix(NAT64_PREFIX));
+
+ // Start clat.
nat.start();
verify(mNms).registerObserver(eq(nat));
- verify(mNetd).clatdStart(eq(BASE_IFACE));
+ verify(mNetd).clatdStart(eq(BASE_IFACE), eq(NAT64_PREFIX));
// Stacked interface up notification arrives.
nat.interfaceLinkStateChanged(STACKED_IFACE, true);
@@ -141,22 +196,109 @@ public class Nat464XlatTest {
assertTrue(c.getValue().getAllInterfaceNames().contains(STACKED_IFACE));
assertRunning(nat);
- // ConnectivityService stops clat (Network disconnects, IPv4 addr appears, ...).
+ // Stop clat (Network disconnects, IPv4 addr appears, ...).
nat.stop();
verify(mNetd).clatdStop(eq(BASE_IFACE));
+ verify(mConnectivity, times(2)).handleUpdateLinkProperties(eq(mNai), c.capture());
+ verify(mNms).unregisterObserver(eq(nat));
+ assertTrue(c.getValue().getStackedLinks().isEmpty());
+ assertFalse(c.getValue().getAllInterfaceNames().contains(STACKED_IFACE));
+ verify(mNetd).resolverStopPrefix64Discovery(eq(NETID));
+ assertIdle(nat);
- // Stacked interface removed notification arrives.
+ // Stacked interface removed notification arrives and is ignored.
nat.interfaceRemoved(STACKED_IFACE);
mLooper.dispatchNext();
- verify(mNms).unregisterObserver(eq(nat));
- verify(mConnectivity, times(2)).handleUpdateLinkProperties(eq(mNai), c.capture());
+ verifyNoMoreInteractions(mNetd, mNms, mConnectivity);
+ }
+
+ private void checkStartStopStart(boolean interfaceRemovedFirst) throws Exception {
+ Nat464Xlat nat = makeNat464Xlat();
+ ArgumentCaptor<LinkProperties> c = ArgumentCaptor.forClass(LinkProperties.class);
+ InOrder inOrder = inOrder(mNetd, mConnectivity);
+
+ nat.setNat64Prefix(new IpPrefix(NAT64_PREFIX));
+
+ nat.start();
+
+ inOrder.verify(mNetd).clatdStart(eq(BASE_IFACE), eq(NAT64_PREFIX));
+
+ // Stacked interface up notification arrives.
+ nat.interfaceLinkStateChanged(STACKED_IFACE, true);
+ mLooper.dispatchNext();
+
+ inOrder.verify(mConnectivity).handleUpdateLinkProperties(eq(mNai), c.capture());
+ assertFalse(c.getValue().getStackedLinks().isEmpty());
+ assertTrue(c.getValue().getAllInterfaceNames().contains(STACKED_IFACE));
+ assertRunning(nat);
+
+ // ConnectivityService stops clat (Network disconnects, IPv4 addr appears, ...).
+ nat.stop();
+
+ inOrder.verify(mNetd).clatdStop(eq(BASE_IFACE));
+
+ inOrder.verify(mConnectivity, times(1)).handleUpdateLinkProperties(eq(mNai), c.capture());
assertTrue(c.getValue().getStackedLinks().isEmpty());
assertFalse(c.getValue().getAllInterfaceNames().contains(STACKED_IFACE));
assertIdle(nat);
- verifyNoMoreInteractions(mNetd, mNms, mConnectivity);
+ if (interfaceRemovedFirst) {
+ // Stacked interface removed notification arrives and is ignored.
+ nat.interfaceRemoved(STACKED_IFACE);
+ mLooper.dispatchNext();
+ nat.interfaceLinkStateChanged(STACKED_IFACE, false);
+ mLooper.dispatchNext();
+ }
+
+ assertTrue(c.getValue().getStackedLinks().isEmpty());
+ assertFalse(c.getValue().getAllInterfaceNames().contains(STACKED_IFACE));
+ assertIdle(nat);
+ inOrder.verifyNoMoreInteractions();
+
+ nat.start();
+
+ inOrder.verify(mNetd).clatdStart(eq(BASE_IFACE), eq(NAT64_PREFIX));
+
+ if (!interfaceRemovedFirst) {
+ // Stacked interface removed notification arrives and is ignored.
+ nat.interfaceRemoved(STACKED_IFACE);
+ mLooper.dispatchNext();
+ nat.interfaceLinkStateChanged(STACKED_IFACE, false);
+ mLooper.dispatchNext();
+ }
+
+ // Stacked interface up notification arrives.
+ nat.interfaceLinkStateChanged(STACKED_IFACE, true);
+ mLooper.dispatchNext();
+
+ inOrder.verify(mConnectivity).handleUpdateLinkProperties(eq(mNai), c.capture());
+ assertFalse(c.getValue().getStackedLinks().isEmpty());
+ assertTrue(c.getValue().getAllInterfaceNames().contains(STACKED_IFACE));
+ assertRunning(nat);
+
+ // ConnectivityService stops clat again.
+ nat.stop();
+
+ inOrder.verify(mNetd).clatdStop(eq(BASE_IFACE));
+
+ inOrder.verify(mConnectivity, times(1)).handleUpdateLinkProperties(eq(mNai), c.capture());
+ assertTrue(c.getValue().getStackedLinks().isEmpty());
+ assertFalse(c.getValue().getAllInterfaceNames().contains(STACKED_IFACE));
+ assertIdle(nat);
+
+ inOrder.verifyNoMoreInteractions();
+ }
+
+ @Test
+ public void testStartStopStart() throws Exception {
+ checkStartStopStart(true);
+ }
+
+ @Test
+ public void testStartStopStartBeforeInterfaceRemoved() throws Exception {
+ checkStartStopStart(false);
}
@Test
@@ -164,11 +306,12 @@ public class Nat464XlatTest {
Nat464Xlat nat = makeNat464Xlat();
ArgumentCaptor<LinkProperties> c = ArgumentCaptor.forClass(LinkProperties.class);
- // ConnectivityService starts clat.
+ nat.setNat64Prefix(new IpPrefix(NAT64_PREFIX));
+
nat.start();
verify(mNms).registerObserver(eq(nat));
- verify(mNetd).clatdStart(eq(BASE_IFACE));
+ verify(mNetd).clatdStart(eq(BASE_IFACE), eq(NAT64_PREFIX));
// Stacked interface up notification arrives.
nat.interfaceLinkStateChanged(STACKED_IFACE, true);
@@ -184,9 +327,10 @@ public class Nat464XlatTest {
nat.interfaceRemoved(STACKED_IFACE);
mLooper.dispatchNext();
- verify(mNms).unregisterObserver(eq(nat));
verify(mNetd).clatdStop(eq(BASE_IFACE));
verify(mConnectivity, times(2)).handleUpdateLinkProperties(eq(mNai), c.capture());
+ verify(mNms).unregisterObserver(eq(nat));
+ verify(mNetd).resolverStopPrefix64Discovery(eq(NETID));
assertTrue(c.getValue().getStackedLinks().isEmpty());
assertFalse(c.getValue().getAllInterfaceNames().contains(STACKED_IFACE));
assertIdle(nat);
@@ -201,24 +345,25 @@ public class Nat464XlatTest {
public void testStopBeforeClatdStarts() throws Exception {
Nat464Xlat nat = makeNat464Xlat();
- // ConnectivityService starts clat.
+ nat.setNat64Prefix(new IpPrefix(NAT64_PREFIX));
+
nat.start();
verify(mNms).registerObserver(eq(nat));
- verify(mNetd).clatdStart(eq(BASE_IFACE));
+ verify(mNetd).clatdStart(eq(BASE_IFACE), eq(NAT64_PREFIX));
// ConnectivityService immediately stops clat (Network disconnects, IPv4 addr appears, ...)
nat.stop();
- verify(mNms).unregisterObserver(eq(nat));
verify(mNetd).clatdStop(eq(BASE_IFACE));
+ verify(mNms).unregisterObserver(eq(nat));
+ verify(mNetd).resolverStopPrefix64Discovery(eq(NETID));
assertIdle(nat);
// In-flight interface up notification arrives: no-op
nat.interfaceLinkStateChanged(STACKED_IFACE, true);
mLooper.dispatchNext();
-
// Interface removed notification arrives after stopClatd() takes effect: no-op.
nat.interfaceRemoved(STACKED_IFACE);
mLooper.dispatchNext();
@@ -232,17 +377,19 @@ public class Nat464XlatTest {
public void testStopAndClatdNeverStarts() throws Exception {
Nat464Xlat nat = makeNat464Xlat();
- // ConnectivityService starts clat.
+ nat.setNat64Prefix(new IpPrefix(NAT64_PREFIX));
+
nat.start();
verify(mNms).registerObserver(eq(nat));
- verify(mNetd).clatdStart(eq(BASE_IFACE));
+ verify(mNetd).clatdStart(eq(BASE_IFACE), eq(NAT64_PREFIX));
// ConnectivityService immediately stops clat (Network disconnects, IPv4 addr appears, ...)
nat.stop();
- verify(mNms).unregisterObserver(eq(nat));
verify(mNetd).clatdStop(eq(BASE_IFACE));
+ verify(mNms).unregisterObserver(eq(nat));
+ verify(mNetd).resolverStopPrefix64Discovery(eq(NETID));
assertIdle(nat);
verifyNoMoreInteractions(mNetd, mNms, mConnectivity);
diff --git a/tests/net/java/com/android/server/net/NetworkStatsServiceTest.java b/tests/net/java/com/android/server/net/NetworkStatsServiceTest.java
index f89f303a1345..d91d3eb10f87 100644
--- a/tests/net/java/com/android/server/net/NetworkStatsServiceTest.java
+++ b/tests/net/java/com/android/server/net/NetworkStatsServiceTest.java
@@ -70,7 +70,6 @@ import android.app.usage.NetworkStatsManager;
import android.content.Context;
import android.content.Intent;
import android.net.DataUsageRequest;
-import android.net.IConnectivityManager;
import android.net.INetworkManagementEventObserver;
import android.net.INetworkStatsSession;
import android.net.LinkProperties;
@@ -163,7 +162,6 @@ public class NetworkStatsServiceTest {
private @Mock INetworkManagementService mNetManager;
private @Mock NetworkStatsSettings mSettings;
- private @Mock IConnectivityManager mConnManager;
private @Mock IBinder mBinder;
private @Mock AlarmManager mAlarmManager;
private HandlerThread mHandlerThread;
@@ -205,7 +203,6 @@ public class NetworkStatsServiceTest {
Handler.Callback callback = new NetworkStatsService.HandlerCallback(mService);
mHandler = new Handler(mHandlerThread.getLooper(), callback);
mService.setHandler(mHandler, callback);
- mService.bindConnectivityManager(mConnManager);
mElapsedRealtime = 0L;
@@ -234,7 +231,6 @@ public class NetworkStatsServiceTest {
mNetManager = null;
mSettings = null;
- mConnManager = null;
mSession.close();
mService = null;
@@ -245,12 +241,12 @@ public class NetworkStatsServiceTest {
// pretend that wifi network comes online; service should ask about full
// network state, and poll any existing interfaces before updating.
expectDefaultSettings();
- expectNetworkState(buildWifiState());
+ NetworkState[] states = new NetworkState[] {buildWifiState()};
expectNetworkStatsSummary(buildEmptyStats());
expectNetworkStatsUidDetail(buildEmptyStats());
expectBandwidthControlCheck();
- mService.forceUpdateIfaces(NETWORKS_WIFI);
+ mService.forceUpdateIfaces(NETWORKS_WIFI, new VpnInfo[0], states, getActiveIface(states));
// verify service has empty history for wifi
assertNetworkTotal(sTemplateWifi, 0L, 0L, 0L, 0L, 0);
@@ -289,12 +285,12 @@ public class NetworkStatsServiceTest {
// pretend that wifi network comes online; service should ask about full
// network state, and poll any existing interfaces before updating.
expectDefaultSettings();
- expectNetworkState(buildWifiState());
+ NetworkState[] states = new NetworkState[] {buildWifiState()};
expectNetworkStatsSummary(buildEmptyStats());
expectNetworkStatsUidDetail(buildEmptyStats());
expectBandwidthControlCheck();
- mService.forceUpdateIfaces(NETWORKS_WIFI);
+ mService.forceUpdateIfaces(NETWORKS_WIFI, new VpnInfo[0], states, getActiveIface(states));
// verify service has empty history for wifi
assertNetworkTotal(sTemplateWifi, 0L, 0L, 0L, 0L, 0);
@@ -363,12 +359,12 @@ public class NetworkStatsServiceTest {
// pretend that wifi network comes online; service should ask about full
// network state, and poll any existing interfaces before updating.
expectSettings(0L, HOUR_IN_MILLIS, WEEK_IN_MILLIS);
- expectNetworkState(buildWifiState());
+ NetworkState[] states = new NetworkState[] {buildWifiState()};
expectNetworkStatsSummary(buildEmptyStats());
expectNetworkStatsUidDetail(buildEmptyStats());
expectBandwidthControlCheck();
- mService.forceUpdateIfaces(NETWORKS_WIFI);
+ mService.forceUpdateIfaces(NETWORKS_WIFI, new VpnInfo[0], states, getActiveIface(states));
// modify some number on wifi, and trigger poll event
@@ -405,12 +401,12 @@ public class NetworkStatsServiceTest {
public void testUidStatsAcrossNetworks() throws Exception {
// pretend first mobile network comes online
expectDefaultSettings();
- expectNetworkState(buildMobile3gState(IMSI_1));
+ NetworkState[] states = new NetworkState[] {buildMobile3gState(IMSI_1)};
expectNetworkStatsSummary(buildEmptyStats());
expectNetworkStatsUidDetail(buildEmptyStats());
expectBandwidthControlCheck();
- mService.forceUpdateIfaces(NETWORKS_MOBILE);
+ mService.forceUpdateIfaces(NETWORKS_MOBILE, new VpnInfo[0], states, getActiveIface(states));
// create some traffic on first network
@@ -437,7 +433,7 @@ public class NetworkStatsServiceTest {
// disappearing, to verify we don't count backwards.
incrementCurrentTime(HOUR_IN_MILLIS);
expectDefaultSettings();
- expectNetworkState(buildMobile3gState(IMSI_2));
+ states = new NetworkState[] {buildMobile3gState(IMSI_2)};
expectNetworkStatsSummary(new NetworkStats(getElapsedRealtime(), 1)
.addIfaceValues(TEST_IFACE, 2048L, 16L, 512L, 4L));
expectNetworkStatsUidDetail(new NetworkStats(getElapsedRealtime(), 3)
@@ -446,7 +442,7 @@ public class NetworkStatsServiceTest {
.addValues(TEST_IFACE, UID_BLUE, SET_DEFAULT, TAG_NONE, 512L, 4L, 0L, 0L, 0L));
expectBandwidthControlCheck();
- mService.forceUpdateIfaces(NETWORKS_MOBILE);
+ mService.forceUpdateIfaces(NETWORKS_MOBILE, new VpnInfo[0], states, getActiveIface(states));
forcePollAndWaitForIdle();
@@ -481,12 +477,12 @@ public class NetworkStatsServiceTest {
public void testUidRemovedIsMoved() throws Exception {
// pretend that network comes online
expectDefaultSettings();
- expectNetworkState(buildWifiState());
+ NetworkState[] states = new NetworkState[] {buildWifiState()};
expectNetworkStatsSummary(buildEmptyStats());
expectNetworkStatsUidDetail(buildEmptyStats());
expectBandwidthControlCheck();
- mService.forceUpdateIfaces(NETWORKS_WIFI);
+ mService.forceUpdateIfaces(NETWORKS_WIFI, new VpnInfo[0], states, getActiveIface(states));
// create some traffic
@@ -540,12 +536,12 @@ public class NetworkStatsServiceTest {
public void testUid3g4gCombinedByTemplate() throws Exception {
// pretend that network comes online
expectDefaultSettings();
- expectNetworkState(buildMobile3gState(IMSI_1));
+ NetworkState[] states = new NetworkState[] {buildMobile3gState(IMSI_1)};
expectNetworkStatsSummary(buildEmptyStats());
expectNetworkStatsUidDetail(buildEmptyStats());
expectBandwidthControlCheck();
- mService.forceUpdateIfaces(NETWORKS_MOBILE);
+ mService.forceUpdateIfaces(NETWORKS_MOBILE, new VpnInfo[0], states, getActiveIface(states));
// create some traffic
@@ -566,14 +562,14 @@ public class NetworkStatsServiceTest {
// now switch over to 4g network
incrementCurrentTime(HOUR_IN_MILLIS);
expectDefaultSettings();
- expectNetworkState(buildMobile4gState(TEST_IFACE2));
+ states = new NetworkState[] {buildMobile4gState(TEST_IFACE2)};
expectNetworkStatsSummary(buildEmptyStats());
expectNetworkStatsUidDetail(new NetworkStats(getElapsedRealtime(), 1)
.addValues(TEST_IFACE, UID_RED, SET_DEFAULT, TAG_NONE, 1024L, 8L, 1024L, 8L, 0L)
.addValues(TEST_IFACE, UID_RED, SET_DEFAULT, 0xF00D, 512L, 4L, 512L, 4L, 0L));
expectBandwidthControlCheck();
- mService.forceUpdateIfaces(NETWORKS_MOBILE);
+ mService.forceUpdateIfaces(NETWORKS_MOBILE, new VpnInfo[0], states, getActiveIface(states));
forcePollAndWaitForIdle();
@@ -598,12 +594,12 @@ public class NetworkStatsServiceTest {
public void testSummaryForAllUid() throws Exception {
// pretend that network comes online
expectDefaultSettings();
- expectNetworkState(buildWifiState());
+ NetworkState[] states = new NetworkState[] {buildWifiState()};
expectNetworkStatsSummary(buildEmptyStats());
expectNetworkStatsUidDetail(buildEmptyStats());
expectBandwidthControlCheck();
- mService.forceUpdateIfaces(NETWORKS_WIFI);
+ mService.forceUpdateIfaces(NETWORKS_WIFI, new VpnInfo[0], states, getActiveIface(states));
// create some traffic for two apps
@@ -657,12 +653,12 @@ public class NetworkStatsServiceTest {
public void testDetailedUidStats() throws Exception {
// pretend that network comes online
expectDefaultSettings();
- expectNetworkState(buildWifiState());
+ NetworkState[] states = new NetworkState[] {buildWifiState()};
expectNetworkStatsSummary(buildEmptyStats());
expectNetworkStatsUidDetail(buildEmptyStats());
expectBandwidthControlCheck();
- mService.forceUpdateIfaces(NETWORKS_WIFI);
+ mService.forceUpdateIfaces(NETWORKS_WIFI, new VpnInfo[0], states, getActiveIface(states));
NetworkStats.Entry entry1 = new NetworkStats.Entry(
TEST_IFACE, UID_RED, SET_DEFAULT, TAG_NONE, 50L, 5L, 50L, 5L, 0L);
@@ -700,13 +696,13 @@ public class NetworkStatsServiceTest {
stackedProp.setInterfaceName(stackedIface);
final NetworkState wifiState = buildWifiState();
wifiState.linkProperties.addStackedLink(stackedProp);
- expectNetworkState(wifiState);
+ NetworkState[] states = new NetworkState[] {wifiState};
expectNetworkStatsSummary(buildEmptyStats());
expectNetworkStatsUidDetail(buildEmptyStats());
expectBandwidthControlCheck();
- mService.forceUpdateIfaces(NETWORKS_WIFI);
+ mService.forceUpdateIfaces(NETWORKS_WIFI, new VpnInfo[0], states, getActiveIface(states));
NetworkStats.Entry uidStats = new NetworkStats.Entry(
TEST_IFACE, UID_BLUE, SET_DEFAULT, 0xF00D, 1024L, 8L, 512L, 4L, 0L);
@@ -745,12 +741,12 @@ public class NetworkStatsServiceTest {
public void testForegroundBackground() throws Exception {
// pretend that network comes online
expectDefaultSettings();
- expectNetworkState(buildWifiState());
+ NetworkState[] states = new NetworkState[] {buildWifiState()};
expectNetworkStatsSummary(buildEmptyStats());
expectNetworkStatsUidDetail(buildEmptyStats());
expectBandwidthControlCheck();
- mService.forceUpdateIfaces(NETWORKS_WIFI);
+ mService.forceUpdateIfaces(NETWORKS_WIFI, new VpnInfo[0], states, getActiveIface(states));
// create some initial traffic
@@ -803,12 +799,12 @@ public class NetworkStatsServiceTest {
public void testMetered() throws Exception {
// pretend that network comes online
expectDefaultSettings();
- expectNetworkState(buildWifiState(true /* isMetered */));
+ NetworkState[] states = new NetworkState[] {buildWifiState(true /* isMetered */)};
expectNetworkStatsSummary(buildEmptyStats());
expectNetworkStatsUidDetail(buildEmptyStats());
expectBandwidthControlCheck();
- mService.forceUpdateIfaces(NETWORKS_WIFI);
+ mService.forceUpdateIfaces(NETWORKS_WIFI, new VpnInfo[0], states, getActiveIface(states));
// create some initial traffic
@@ -843,12 +839,13 @@ public class NetworkStatsServiceTest {
public void testRoaming() throws Exception {
// pretend that network comes online
expectDefaultSettings();
- expectNetworkState(buildMobile3gState(IMSI_1, true /* isRoaming */));
+ NetworkState[] states =
+ new NetworkState[] {buildMobile3gState(IMSI_1, true /* isRoaming */)};
expectNetworkStatsSummary(buildEmptyStats());
expectNetworkStatsUidDetail(buildEmptyStats());
expectBandwidthControlCheck();
- mService.forceUpdateIfaces(NETWORKS_MOBILE);
+ mService.forceUpdateIfaces(NETWORKS_MOBILE, new VpnInfo[0], states, getActiveIface(states));
// Create some traffic
@@ -882,12 +879,12 @@ public class NetworkStatsServiceTest {
public void testTethering() throws Exception {
// pretend first mobile network comes online
expectDefaultSettings();
- expectNetworkState(buildMobile3gState(IMSI_1));
+ NetworkState[] states = new NetworkState[] {buildMobile3gState(IMSI_1)};
expectNetworkStatsSummary(buildEmptyStats());
expectNetworkStatsUidDetail(buildEmptyStats());
expectBandwidthControlCheck();
- mService.forceUpdateIfaces(NETWORKS_MOBILE);
+ mService.forceUpdateIfaces(NETWORKS_MOBILE, new VpnInfo[0], states, getActiveIface(states));
// create some tethering traffic
@@ -925,12 +922,12 @@ public class NetworkStatsServiceTest {
// pretend that wifi network comes online; service should ask about full
// network state, and poll any existing interfaces before updating.
expectDefaultSettings();
- expectNetworkState(buildWifiState());
+ NetworkState[] states = new NetworkState[] {buildWifiState()};
expectNetworkStatsSummary(buildEmptyStats());
expectNetworkStatsUidDetail(buildEmptyStats());
expectBandwidthControlCheck();
- mService.forceUpdateIfaces(NETWORKS_WIFI);
+ mService.forceUpdateIfaces(NETWORKS_WIFI, new VpnInfo[0], states, getActiveIface(states));
// verify service has empty history for wifi
assertNetworkTotal(sTemplateWifi, 0L, 0L, 0L, 0L, 0);
@@ -1077,11 +1074,11 @@ public class NetworkStatsServiceTest {
expectBandwidthControlCheck();
}
- private void expectNetworkState(NetworkState... state) throws Exception {
- when(mConnManager.getAllNetworkState()).thenReturn(state);
-
- final LinkProperties linkProp = state.length > 0 ? state[0].linkProperties : null;
- when(mConnManager.getActiveLinkProperties()).thenReturn(linkProp);
+ private String getActiveIface(NetworkState... states) throws Exception {
+ if (states == null || states.length == 0 || states[0].linkProperties == null) {
+ return null;
+ }
+ return states[0].linkProperties.getInterfaceName();
}
private void expectNetworkStatsSummary(NetworkStats summary) throws Exception {
@@ -1090,8 +1087,6 @@ public class NetworkStatsServiceTest {
private void expectNetworkStatsSummary(NetworkStats summary, NetworkStats tetherStats)
throws Exception {
- when(mConnManager.getAllVpnInfo()).thenReturn(new VpnInfo[0]);
-
expectNetworkStatsTethering(STATS_PER_IFACE, tetherStats);
expectNetworkStatsSummaryDev(summary.clone());
expectNetworkStatsSummaryXt(summary.clone());
diff --git a/tools/apilint/apilint.py b/tools/apilint/apilint.py
index 4c02d94542d0..295e3de544ee 100644
--- a/tools/apilint/apilint.py
+++ b/tools/apilint/apilint.py
@@ -79,6 +79,7 @@ class Field():
self.value = raw[3].strip(';"')
else:
self.value = None
+ self.annotations = []
self.ident = "-".join((self.typ, self.name, self.value or ""))
@@ -88,6 +89,18 @@ class Field():
def __repr__(self):
return self.raw
+
+class Argument(object):
+
+ __slots__ = ["type", "annotations", "name", "default"]
+
+ def __init__(self, type):
+ self.type = type
+ self.annotations = []
+ self.name = None
+ self.default = None
+
+
class Method():
def __init__(self, clazz, line, raw, blame, sig_format = 1):
self.clazz = clazz
@@ -118,21 +131,24 @@ class Method():
self.name = raw[1]
# parse args
- self.args = []
+ self.detailed_args = []
for arg in re.split(",\s*", raw_args):
arg = re.split("\s", arg)
# ignore annotations for now
arg = [ a for a in arg if not a.startswith("@") ]
if len(arg[0]) > 0:
- self.args.append(arg[0])
+ self.detailed_args.append(Argument(arg[0]))
# parse throws
self.throws = []
for throw in re.split(",\s*", raw_throws):
self.throws.append(throw)
+
+ self.annotations = []
else:
raise ValueError("Unknown signature format: " + sig_format)
+ self.args = map(lambda a: a.type, self.detailed_args)
self.ident = "-".join((self.typ, self.name, "-".join(self.args)))
def sig_matches(self, typ, name, args):
@@ -312,10 +328,10 @@ class V2LineParser(object):
method.split = []
kind = self.parse_one_of("ctor", "method")
method.split.append(kind)
- annotations = self.parse_annotations()
+ method.annotations = self.parse_annotations()
method.split.extend(self.parse_modifiers())
self.parse_matching_paren("<", ">")
- if "@Deprecated" in annotations:
+ if "@Deprecated" in method.annotations:
method.split.append("deprecated")
if kind == "ctor":
method.typ = "ctor"
@@ -325,7 +341,7 @@ class V2LineParser(object):
method.name = self.parse_name()
method.split.append(method.name)
self.parse_token("(")
- method.args = self.parse_args()
+ method.detailed_args = self.parse_args()
self.parse_token(")")
method.throws = self.parse_throws()
if "@interface" in method.clazz.split:
@@ -360,8 +376,8 @@ class V2LineParser(object):
def parse_into_field(self, field):
kind = self.parse_one_of(*V2LineParser.FIELD_KINDS)
field.split = [kind]
- annotations = self.parse_annotations()
- if "@Deprecated" in annotations:
+ field.annotations = self.parse_annotations()
+ if "@Deprecated" in field.annotations:
field.split.append("deprecated")
field.split.extend(self.parse_modifiers())
field.typ = self.parse_type()
@@ -488,15 +504,16 @@ class V2LineParser(object):
def parse_arg(self):
self.parse_if("vararg") # kotlin vararg
- self.parse_annotations()
- type = self.parse_arg_type()
+ annotations = self.parse_annotations()
+ arg = Argument(self.parse_arg_type())
+ arg.annotations = annotations
l = self.lookahead()
if l != "," and l != ")":
if self.lookahead() != '=':
- self.parse_token() # kotlin argument name
+ arg.name = self.parse_token() # kotlin argument name
if self.parse_if('='): # kotlin default value
- self.parse_expression()
- return type
+ arg.default = self.parse_expression()
+ return arg
def parse_expression(self):
while not self.lookahead() in [')', ',', ';']:
@@ -593,7 +610,7 @@ def _parse_stream_to_generator(f):
blame = None
sig_format = 1
- re_blame = re.compile("^([a-z0-9]{7,}) \(<([^>]+)>.+?\) (.+?)$")
+ re_blame = re.compile(r"^(\^?[a-z0-9]{7,}) \(<([^>]+)>.+?\) (.+?)$")
field_prefixes = map(lambda kind: " %s" % (kind,), V2LineParser.FIELD_KINDS)
def startsWithFieldPrefix(raw):
@@ -608,11 +625,13 @@ def _parse_stream_to_generator(f):
match = re_blame.match(raw)
if match is not None:
blame = match.groups()[0:2]
+ if blame[0].startswith("^"): # Outside of blame range
+ blame = None
raw = match.groups()[2]
else:
blame = None
- if line == 1 and raw.startswith("// Signature format: "):
+ if line == 1 and V2Tokenizer.SIGNATURE_PREFIX in raw:
sig_format_string = raw[len(V2Tokenizer.SIGNATURE_PREFIX):]
if sig_format_string in ["2.0", "3.0"]:
sig_format = 2
@@ -1109,6 +1128,9 @@ def verify_builder(clazz):
if not has_build:
warn(clazz, None, None, "Missing build() method")
+ if "final" not in clazz.split:
+ error(clazz, None, None, "Builder should be final")
+
def verify_aidl(clazz):
"""Catch people exposing raw AIDL."""
@@ -1868,6 +1890,35 @@ def verify_numbers(clazz):
if arg in discouraged:
warn(clazz, m, "FW12", "Should avoid odd sized primitives; use int instead")
+PRIMITIVES = {"void", "int", "float", "boolean", "short", "char", "byte", "long", "double"}
+
+def verify_nullability(clazz):
+ """Catches missing nullability annotations"""
+
+ for f in clazz.fields:
+ if f.value is not None and 'static' in f.split and 'final' in f.split:
+ continue # Nullability of constants can be inferred.
+ if f.typ not in PRIMITIVES and not has_nullability(f.annotations):
+ error(clazz, f, "M12", "Field must be marked either @NonNull or @Nullable")
+
+ for c in clazz.ctors:
+ verify_nullability_args(clazz, c)
+
+ for m in clazz.methods:
+ if m.name == "writeToParcel" or m.name == "onReceive":
+ continue # Parcelable.writeToParcel() and BroadcastReceiver.onReceive() are not yet annotated
+
+ if m.typ not in PRIMITIVES and not has_nullability(m.annotations):
+ error(clazz, m, "M12", "Return value must be marked either @NonNull or @Nullable")
+ verify_nullability_args(clazz, m)
+
+def verify_nullability_args(clazz, m):
+ for i, arg in enumerate(m.detailed_args):
+ if arg.type not in PRIMITIVES and not has_nullability(arg.annotations):
+ error(clazz, m, "M12", "Argument %d must be marked either @NonNull or @Nullable" % (i+1,))
+
+def has_nullability(annotations):
+ return "@NonNull" in annotations or "@Nullable" in annotations
def verify_singleton(clazz):
"""Catch singleton objects with constructors."""
@@ -1956,6 +2007,7 @@ def examine_clazz(clazz):
verify_pfd(clazz)
verify_numbers(clazz)
verify_singleton(clazz)
+ verify_nullability(clazz)
def examine_stream(stream, base_stream=None, in_classes_with_base=[], out_classes_with_base=None):
diff --git a/tools/apilint/apilint_test.py b/tools/apilint/apilint_test.py
index c10ef15d02ad..f34492d644ce 100644
--- a/tools/apilint/apilint_test.py
+++ b/tools/apilint/apilint_test.py
@@ -88,20 +88,22 @@ class UtilTests(unittest.TestCase):
faulty_current_txt = """
+// Signature format: 2.0
package android.app {
public final class Activity {
}
public final class WallpaperColors implements android.os.Parcelable {
- ctor public WallpaperColors(android.os.Parcel);
+ ctor public WallpaperColors(@NonNull android.os.Parcel);
method public int describeContents();
- method public void writeToParcel(android.os.Parcel, int);
- field public static final android.os.Parcelable.Creator<android.app.WallpaperColors> CREATOR;
+ method public void writeToParcel(@NonNull android.os.Parcel, int);
+ field @NonNull public static final android.os.Parcelable.Creator<android.app.WallpaperColors> CREATOR;
}
}
-""".split('\n')
+""".strip().split('\n')
ok_current_txt = """
+// Signature format: 2.0
package android.app {
public final class Activity {
}
@@ -109,19 +111,20 @@ package android.app {
public final class WallpaperColors implements android.os.Parcelable {
ctor public WallpaperColors();
method public int describeContents();
- method public void writeToParcel(android.os.Parcel, int);
- field public static final android.os.Parcelable.Creator<android.app.WallpaperColors> CREATOR;
+ method public void writeToParcel(@NonNull android.os.Parcel, int);
+ field @NonNull public static final android.os.Parcelable.Creator<android.app.WallpaperColors> CREATOR;
}
}
-""".split('\n')
+""".strip().split('\n')
system_current_txt = """
+// Signature format: 2.0
package android.app {
public final class WallpaperColors implements android.os.Parcelable {
method public int getSomething();
}
}
-""".split('\n')
+""".strip().split('\n')
diff --git a/tools/bit/main.cpp b/tools/bit/main.cpp
index 860094aef1f4..082ccf38299b 100644
--- a/tools/bit/main.cpp
+++ b/tools/bit/main.cpp
@@ -33,6 +33,8 @@
using namespace std;
+#define NATIVE_TESTS "NATIVE_TESTS"
+
/**
* An entry from the command line for something that will be built, installed,
* and/or tested.
@@ -132,6 +134,32 @@ InstallApk::InstallApk(const string& filename, bool always)
{
}
+struct PushedFile
+{
+ TrackedFile file;
+ string dest;
+
+ PushedFile();
+ PushedFile(const PushedFile& that);
+ PushedFile(const string& filename, const string& dest);
+ ~PushedFile() {};
+};
+
+PushedFile::PushedFile()
+{
+}
+
+PushedFile::PushedFile(const PushedFile& that)
+ :file(that.file),
+ dest(that.dest)
+{
+}
+
+PushedFile::PushedFile(const string& f, const string& d)
+ :file(f),
+ dest(d)
+{
+}
/**
* Record for an test that is going to be launched.
@@ -658,12 +686,14 @@ run_phases(vector<Target*> targets, const Options& options)
}
// Figure out whether we need to sync the system and which apks to install
- string systemPath = buildOut + "/target/product/" + buildDevice + "/system/";
- string dataPath = buildOut + "/target/product/" + buildDevice + "/data/";
+ string deviceTargetPath = buildOut + "/target/product/" + buildDevice;
+ string systemPath = deviceTargetPath + "/system/";
+ string dataPath = deviceTargetPath + "/data/";
bool syncSystem = false;
bool alwaysSyncSystem = false;
vector<string> systemFiles;
vector<InstallApk> installApks;
+ vector<PushedFile> pushedFiles;
for (size_t i=0; i<targets.size(); i++) {
Target* target = targets[i];
if (target->install) {
@@ -687,6 +717,11 @@ run_phases(vector<Target*> targets, const Options& options)
installApks.push_back(InstallApk(file, !target->build));
continue;
}
+ // If it's a native test module, push it.
+ if (target->module.HasClass(NATIVE_TESTS) && starts_with(file, dataPath)) {
+ string installedPath(file.c_str() + deviceTargetPath.length());
+ pushedFiles.push_back(PushedFile(file, installedPath));
+ }
}
}
}
@@ -701,6 +736,13 @@ run_phases(vector<Target*> targets, const Options& options)
printf(" %s\n", systemFiles[i].c_str());
}
}
+ if (pushedFiles.size() > 0){
+ print_info("Files to push:");
+ for (size_t i=0; i<pushedFiles.size(); i++) {
+ printf(" %s\n", pushedFiles[i].file.filename.c_str());
+ printf(" --> %s\n", pushedFiles[i].dest.c_str());
+ }
+ }
if (installApks.size() > 0){
print_info("APKs to install:");
for (size_t i=0; i<installApks.size(); i++) {
@@ -784,6 +826,25 @@ run_phases(vector<Target*> targets, const Options& options)
}
}
+ // Push files
+ if (pushedFiles.size() > 0) {
+ print_status("Pushing files");
+ for (size_t i=0; i<pushedFiles.size(); i++) {
+ const PushedFile& pushed = pushedFiles[i];
+ string dir = dirname(pushed.dest);
+ if (dir.length() == 0 || dir == "/") {
+ // This isn't really a file inside the data directory. Just skip it.
+ continue;
+ }
+ // TODO: if (!apk.file.fileInfo.exists || apk.file.HasChanged())
+ err = run_adb("shell", "mkdir", "-p", dir.c_str(), NULL);
+ check_error(err);
+ err = run_adb("push", pushed.file.filename.c_str(), pushed.dest.c_str());
+ check_error(err);
+ // pushed.installed = true;
+ }
+ }
+
// Install APKs
if (installApks.size() > 0) {
print_status("Installing APKs");
@@ -804,6 +865,74 @@ run_phases(vector<Target*> targets, const Options& options)
// Actions
//
+ // Whether there have been any tests run, so we can print a summary.
+ bool testsRun = false;
+
+ // Run the native tests.
+ // TODO: We don't have a good way of running these and capturing the output of
+ // them live. It'll take some work. On the other hand, if they're gtest tests,
+ // the output of gtest is not completely insane like the text output of the
+ // instrumentation tests. So for now, we'll just live with that.
+ for (size_t i=0; i<targets.size(); i++) {
+ Target* target = targets[i];
+ if (target->test && target->module.HasClass(NATIVE_TESTS)) {
+ // We don't have a clear signal from the build system which of the installed
+ // files is actually the test, so we guess by looking for one with the same
+ // leaf name as the module that is executable.
+ for (size_t j=0; j<target->module.installed.size(); j++) {
+ string filename = target->module.installed[j];
+ if (!starts_with(filename, dataPath)) {
+ // Native tests go into the data directory.
+ continue;
+ }
+ if (leafname(filename) != target->module.name) {
+ // This isn't the test executable.
+ continue;
+ }
+ if (!is_executable(filename)) {
+ continue;
+ }
+ string installedPath(filename.c_str() + deviceTargetPath.length());
+ printf("the magic one is: %s\n", filename.c_str());
+ printf(" and it's installed at: %s\n", installedPath.c_str());
+
+ // Convert bit-style actions to gtest test filter arguments
+ if (target->actions.size() > 0) {
+ testsRun = true;
+ target->testActionCount++;
+ bool runAll = false;
+ string filterArg("--gtest_filter=");
+ for (size_t k=0; k<target->actions.size(); k++) {
+ string actionString = target->actions[k];
+ if (actionString == "*") {
+ runAll = true;
+ } else {
+ filterArg += actionString;
+ if (k != target->actions.size()-1) {
+ // We would otherwise have to worry about this condition
+ // being true, and appending an extra ':', but we know that
+ // if the extra action is "*", then we'll just run all and
+ // won't use filterArg anyway, so just keep this condition
+ // simple.
+ filterArg += ':';
+ }
+ }
+ }
+ if (runAll) {
+ err = run_adb("shell", installedPath.c_str(), NULL);
+ } else {
+ err = run_adb("shell", installedPath.c_str(), filterArg.c_str(), NULL);
+ }
+ if (err == 0) {
+ target->testPassCount++;
+ } else {
+ target->testFailCount++;
+ }
+ }
+ }
+ }
+ }
+
// Inspect the apks, and figure out what is an activity and what needs a test runner
bool printedInspecting = false;
vector<TestAction> testActions;
@@ -872,6 +1001,7 @@ run_phases(vector<Target*> targets, const Options& options)
TestResults testResults;
if (testActions.size() > 0) {
print_status("Running tests");
+ testsRun = true;
for (size_t i=0; i<testActions.size(); i++) {
TestAction& action = testActions[i];
testResults.SetCurrentAction(&action);
@@ -969,7 +1099,7 @@ run_phases(vector<Target*> targets, const Options& options)
// Tests
bool hasErrors = false;
- if (testActions.size() > 0) {
+ if (testsRun) {
printf("%sRan tests:%s\n", g_escapeBold, g_escapeEndColor);
size_t maxNameLength = 0;
for (size_t i=0; i<targets.size(); i++) {
diff --git a/tools/bit/make.cpp b/tools/bit/make.cpp
index 627091321b2e..df64a801e213 100644
--- a/tools/bit/make.cpp
+++ b/tools/bit/make.cpp
@@ -51,6 +51,18 @@ make_cache_filename(const string& outDir)
return filename + "/.bit_cache";
}
+bool
+Module::HasClass(const string& cl)
+{
+ for (vector<string>::const_iterator c = classes.begin(); c != classes.end(); c++) {
+ if (*c == cl) {
+ return true;
+ }
+ }
+ return false;
+}
+
+
BuildVars::BuildVars(const string& outDir, const string& buildProduct,
const string& buildVariant, const string& buildType)
:m_filename(),
diff --git a/tools/bit/make.h b/tools/bit/make.h
index db0b69f88a0e..785912a6594d 100644
--- a/tools/bit/make.h
+++ b/tools/bit/make.h
@@ -29,6 +29,8 @@ struct Module
vector<string> classes;
vector<string> paths;
vector<string> installed;
+
+ bool HasClass(const string& cl);
};
/**
diff --git a/tools/bit/util.cpp b/tools/bit/util.cpp
index a502a9dbe736..63399d69a166 100644
--- a/tools/bit/util.cpp
+++ b/tools/bit/util.cpp
@@ -254,4 +254,42 @@ read_file(const string& filename)
return result;
}
+bool
+is_executable(const string& filename)
+{
+ int err;
+ struct stat st;
+
+ err = stat(filename.c_str(), &st);
+ if (err != 0) {
+ return false;
+ }
+
+ return (st.st_mode & S_IXUSR) != 0;
+}
+
+string
+dirname(const string& filename)
+{
+ size_t slash = filename.rfind('/');
+ if (slash == string::npos) {
+ return "";
+ } else if (slash == 0) {
+ return "/";
+ } else {
+ return string(filename, 0, slash);
+ }
+}
+string
+leafname(const string& filename)
+{
+ size_t slash = filename.rfind('/');
+ if (slash == string::npos) {
+ return filename;
+ } else if (slash == filename.length() - 1) {
+ return "";
+ } else {
+ return string(filename, slash + 1);
+ }
+}
diff --git a/tools/bit/util.h b/tools/bit/util.h
index 718f1474a969..7ccdab103d9a 100644
--- a/tools/bit/util.h
+++ b/tools/bit/util.h
@@ -79,5 +79,10 @@ void split_lines(vector<string>* result, const string& str);
string read_file(const string& filename);
+bool is_executable(const string& filename);
+
+string dirname(const string& filename);
+string leafname(const string& filename);
+
#endif // UTIL_H
diff --git a/wifi/java/android/net/wifi/IWifiManager.aidl b/wifi/java/android/net/wifi/IWifiManager.aidl
index d5497990aefd..17948e7e1bc0 100644
--- a/wifi/java/android/net/wifi/IWifiManager.aidl
+++ b/wifi/java/android/net/wifi/IWifiManager.aidl
@@ -147,8 +147,10 @@ interface IWifiManager
void stopWatchLocalOnlyHotspot();
+ @UnsupportedAppUsage
int getWifiApEnabledState();
+ @UnsupportedAppUsage
WifiConfiguration getWifiApConfiguration();
boolean setWifiApConfiguration(in WifiConfiguration wifiConfig, String packageName);
@@ -173,6 +175,7 @@ interface IWifiManager
void factoryReset(String packageName);
+ @UnsupportedAppUsage
Network getCurrentNetwork();
byte[] retrieveBackupData();
diff --git a/wifi/java/android/net/wifi/WifiManager.java b/wifi/java/android/net/wifi/WifiManager.java
index 6c645fc8ce5d..5ca30fcbf0db 100644
--- a/wifi/java/android/net/wifi/WifiManager.java
+++ b/wifi/java/android/net/wifi/WifiManager.java
@@ -4575,7 +4575,8 @@ public class WifiManager {
public static final int DEVICE_MOBILITY_STATE_UNKNOWN = 0;
/**
- * High movement device mobility state
+ * High movement device mobility state.
+ * e.g. on a bike, in a motor vehicle
*
* @see #setDeviceMobilityState(int)
*
@@ -4585,7 +4586,8 @@ public class WifiManager {
public static final int DEVICE_MOBILITY_STATE_HIGH_MVMT = 1;
/**
- * Low movement device mobility state
+ * Low movement device mobility state.
+ * e.g. walking, running
*
* @see #setDeviceMobilityState(int)
*
@@ -4607,6 +4609,8 @@ public class WifiManager {
/**
* Updates the device mobility state. Wifi uses this information to adjust the interval between
* Wifi scans in order to balance power consumption with scan accuracy.
+ * The default mobility state when the device boots is {@link #DEVICE_MOBILITY_STATE_UNKNOWN}.
+ * This API should be called whenever there is a change in the mobility state.
* @param state the updated device mobility state
* @hide
*/