summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Android.bp51
-rw-r--r--apex/jobscheduler/framework/java/android/app/DeviceIdleFrameworkInitializer.java21
-rw-r--r--apex/jobscheduler/framework/java/android/app/job/JobParameters.java20
-rw-r--r--apex/jobscheduler/framework/java/android/app/job/JobSchedulerFrameworkInitializer.java9
-rw-r--r--apex/jobscheduler/framework/java/android/os/DeviceIdleManager.java13
-rw-r--r--apex/jobscheduler/service/java/com/android/server/job/JobSchedulerService.java3
-rw-r--r--apex/jobscheduler/service/java/com/android/server/job/controllers/QuotaController.java2
-rw-r--r--apex/statsd/service/java/com/android/server/stats/StatsCompanionService.java6
-rw-r--r--api/current.txt238
-rw-r--r--api/system-current.txt145
-rw-r--r--api/system-lint-baseline.txt6
-rw-r--r--api/test-current.txt23
-rw-r--r--api/test-lint-baseline.txt2249
-rw-r--r--cmds/incidentd/src/Section.cpp31
-rw-r--r--cmds/incidentd/src/Section.h6
-rw-r--r--cmds/statsd/src/StatsLogProcessor.h8
-rw-r--r--cmds/statsd/src/metrics/ValueMetricProducer.cpp1
-rw-r--r--config/preloaded-classes1
-rw-r--r--config/preloaded-classes-extra4
-rw-r--r--core/java/android/app/ActivityManager.java100
-rw-r--r--core/java/android/app/AppOpsManager.java51
-rw-r--r--core/java/android/app/ContextImpl.java14
-rw-r--r--core/java/android/app/IActivityTaskManager.aidl2
-rw-r--r--core/java/android/app/IUidObserver.aidl3
-rw-r--r--core/java/android/app/PendingIntent.java6
-rw-r--r--core/java/android/app/SystemServiceRegistry.java6
-rw-r--r--core/java/android/app/WindowConfiguration.java28
-rw-r--r--core/java/android/content/Context.java38
-rw-r--r--core/java/android/content/ContextWrapper.java45
-rw-r--r--core/java/android/content/PermissionChecker.java37
-rw-r--r--core/java/android/content/res/Configuration.java74
-rw-r--r--core/java/android/hardware/camera2/CameraCharacteristics.java31
-rw-r--r--core/java/android/hardware/camera2/CameraMetadata.java28
-rw-r--r--core/java/android/hardware/camera2/CaptureRequest.java48
-rw-r--r--core/java/android/hardware/camera2/CaptureResult.java48
-rw-r--r--core/java/android/hardware/camera2/impl/CameraMetadataNative.java31
-rw-r--r--core/java/android/hardware/camera2/marshal/impl/MarshalQueryableCapabilityAndMaxSize.java77
-rw-r--r--core/java/android/hardware/camera2/params/CapabilityAndMaxSize.java126
-rw-r--r--core/java/android/net/util/SocketUtils.java14
-rw-r--r--core/java/android/os/BatteryStats.java50
-rw-r--r--core/java/android/os/BinderProxy.java59
-rw-r--r--core/java/android/os/PowerManager.java22
-rw-r--r--core/java/android/os/UserManager.java33
-rw-r--r--core/java/android/provider/DeviceConfig.java2
-rw-r--r--core/java/android/provider/FontsContract.java13
-rw-r--r--core/java/android/provider/MediaStore.java11
-rw-r--r--core/java/android/provider/Settings.java1
-rw-r--r--core/java/android/provider/SettingsStringUtil.java2
-rw-r--r--core/java/android/service/carrier/CarrierMessagingServiceWrapper.java389
-rw-r--r--core/java/android/speech/IRecognitionService.aidl13
-rw-r--r--core/java/android/speech/RecognitionService.java38
-rw-r--r--core/java/android/speech/SpeechRecognizer.java10
-rw-r--r--core/java/android/util/StatsEvent.java720
-rw-r--r--core/java/android/view/GestureDetector.java10
-rw-r--r--core/java/android/view/HapticFeedbackConstants.java2
-rw-r--r--core/java/android/view/IWindowContainer.aidl32
-rw-r--r--core/java/android/view/ViewDebug.java101
-rw-r--r--core/java/android/view/WindowContainerTransaction.aidl19
-rw-r--r--core/java/android/view/WindowContainerTransaction.java173
-rw-r--r--core/java/android/widget/Editor.java53
-rw-r--r--core/java/android/widget/SimpleMonthView.java9
-rw-r--r--core/java/android/widget/TextView.java25
-rw-r--r--core/java/com/android/internal/app/DumpHeapActivity.java151
-rw-r--r--core/java/com/android/internal/app/procstats/ProcessState.java1
-rw-r--r--core/java/com/android/internal/compat/CompatibilityChangeConfig.java12
-rw-r--r--core/java/com/android/internal/compat/CompatibilityChangeInfo.aidl19
-rw-r--r--core/java/com/android/internal/compat/CompatibilityChangeInfo.java92
-rw-r--r--core/java/com/android/internal/compat/IPlatformCompat.aidl19
-rw-r--r--core/java/com/android/internal/config/sysui/SystemUiDeviceConfigFlags.java8
-rw-r--r--core/java/com/android/internal/os/KernelCpuUidTimeReader.java23
-rw-r--r--core/java/com/android/internal/statusbar/IStatusBarService.aidl4
-rw-r--r--core/java/com/android/server/SystemConfig.java6
-rw-r--r--core/jni/android_graphics_Picture.cpp25
-rw-r--r--core/proto/OWNERS2
-rw-r--r--core/proto/android/os/incident.proto71
-rw-r--r--core/proto/android/server/activitymanagerservice.proto3
-rw-r--r--core/proto/android/server/windowmanagerservice.proto2
-rw-r--r--core/proto/android/service/dropbox.proto34
-rw-r--r--core/res/AndroidManifest.xml14
-rw-r--r--core/res/res/values-as/strings.xml9
-rw-r--r--core/res/res/values-el/strings.xml4
-rw-r--r--core/res/res/values-fr-rCA/strings.xml2
-rw-r--r--core/res/res/values-hy/strings.xml4
-rw-r--r--core/res/res/values-iw/strings.xml13
-rw-r--r--core/res/res/values-kn/strings.xml13
-rw-r--r--core/res/res/values-ky/strings.xml2
-rw-r--r--core/res/res/values-ml/strings.xml8
-rw-r--r--core/res/res/values-mr/strings.xml9
-rw-r--r--core/res/res/values-or/strings.xml9
-rw-r--r--core/res/res/values-pl/strings.xml9
-rw-r--r--core/res/res/values-ro/strings.xml4
-rw-r--r--core/res/res/values-sk/strings.xml2
-rw-r--r--core/res/res/values-th/strings.xml2
-rw-r--r--core/res/res/values-ur/strings.xml9
-rw-r--r--core/tests/coretests/src/android/content/res/ConfigurationTest.java44
-rw-r--r--data/etc/services.core.protolog.json102
-rw-r--r--graphics/java/android/graphics/drawable/DrawableWrapper.java7
-rw-r--r--graphics/java/android/graphics/drawable/GradientDrawable.java4
-rw-r--r--libs/hwui/HardwareBitmapUploader.cpp1
-rw-r--r--libs/hwui/TreeInfo.cpp1
-rw-r--r--libs/hwui/renderthread/CanvasContext.cpp3
-rw-r--r--libs/hwui/renderthread/CanvasContext.h1
-rw-r--r--location/java/android/location/ILocationListener.aidl6
-rw-r--r--location/java/android/location/LocationManager.java96
-rw-r--r--location/lib/Android.bp2
-rw-r--r--media/java/android/media/AudioManager.java1
-rw-r--r--media/java/android/media/IMediaRouter2Client.aidl6
-rw-r--r--media/java/android/media/ImageWriter.java8
-rw-r--r--media/java/android/media/MediaMetadataRetriever.java13
-rw-r--r--media/java/android/media/MediaRoute2Info.java2
-rw-r--r--media/java/android/media/MediaRouter2.java214
-rw-r--r--media/java/android/media/MediaRouter2Manager.java4
-rw-r--r--media/jni/Android.bp7
-rw-r--r--media/lib/signer/Android.bp2
-rw-r--r--media/tests/MediaRouter/src/com/android/mediaroutertest/MediaRouterManagerTest.java66
-rw-r--r--packages/CarSystemUI/res/values/config.xml1
-rw-r--r--packages/CarSystemUI/res/values/integers_car.xml3
-rw-r--r--packages/CarSystemUI/src/com/android/systemui/CarComponentBinder.java2
-rw-r--r--packages/CarSystemUI/src/com/android/systemui/CarSystemUIBinder.java262
-rw-r--r--packages/CarSystemUI/src/com/android/systemui/navigationbar/car/CarNavigationBarView.java4
-rw-r--r--packages/CarSystemUI/src/com/android/systemui/statusbar/car/CarStatusBar.java17
-rw-r--r--packages/CarSystemUI/src/com/android/systemui/statusbar/car/UserGridRecyclerView.java8
-rw-r--r--packages/CarSystemUI/src/com/android/systemui/volume/CarVolumeDialogImpl.java120
-rw-r--r--packages/PackageInstaller/src/com/android/packageinstaller/handheld/UninstallAlertDialogFragment.java30
-rw-r--r--packages/SettingsLib/res/values-af/strings.xml4
-rw-r--r--packages/SettingsLib/res/values-am/strings.xml4
-rw-r--r--packages/SettingsLib/res/values-ar/strings.xml4
-rw-r--r--packages/SettingsLib/res/values-as/strings.xml7
-rw-r--r--packages/SettingsLib/res/values-az/strings.xml4
-rw-r--r--packages/SettingsLib/res/values-b+sr+Latn/strings.xml4
-rw-r--r--packages/SettingsLib/res/values-be/strings.xml4
-rw-r--r--packages/SettingsLib/res/values-bg/strings.xml4
-rw-r--r--packages/SettingsLib/res/values-bn/strings.xml4
-rw-r--r--packages/SettingsLib/res/values-bs/strings.xml4
-rw-r--r--packages/SettingsLib/res/values-ca/strings.xml4
-rw-r--r--packages/SettingsLib/res/values-cs/strings.xml4
-rw-r--r--packages/SettingsLib/res/values-da/strings.xml4
-rw-r--r--packages/SettingsLib/res/values-de/strings.xml4
-rw-r--r--packages/SettingsLib/res/values-el/strings.xml4
-rw-r--r--packages/SettingsLib/res/values-en-rAU/strings.xml4
-rw-r--r--packages/SettingsLib/res/values-en-rCA/strings.xml4
-rw-r--r--packages/SettingsLib/res/values-en-rGB/strings.xml4
-rw-r--r--packages/SettingsLib/res/values-en-rIN/strings.xml4
-rw-r--r--packages/SettingsLib/res/values-en-rXC/strings.xml2
-rw-r--r--packages/SettingsLib/res/values-es-rUS/strings.xml4
-rw-r--r--packages/SettingsLib/res/values-es/strings.xml4
-rw-r--r--packages/SettingsLib/res/values-et/strings.xml4
-rw-r--r--packages/SettingsLib/res/values-eu/strings.xml4
-rw-r--r--packages/SettingsLib/res/values-fa/strings.xml4
-rw-r--r--packages/SettingsLib/res/values-fi/strings.xml4
-rw-r--r--packages/SettingsLib/res/values-fr-rCA/strings.xml4
-rw-r--r--packages/SettingsLib/res/values-fr/strings.xml4
-rw-r--r--packages/SettingsLib/res/values-gl/strings.xml4
-rw-r--r--packages/SettingsLib/res/values-gu/strings.xml4
-rw-r--r--packages/SettingsLib/res/values-hi/strings.xml4
-rw-r--r--packages/SettingsLib/res/values-hr/strings.xml4
-rw-r--r--packages/SettingsLib/res/values-hu/strings.xml4
-rw-r--r--packages/SettingsLib/res/values-hy/strings.xml4
-rw-r--r--packages/SettingsLib/res/values-in/strings.xml4
-rw-r--r--packages/SettingsLib/res/values-is/strings.xml4
-rw-r--r--packages/SettingsLib/res/values-it/strings.xml4
-rw-r--r--packages/SettingsLib/res/values-iw/strings.xml7
-rw-r--r--packages/SettingsLib/res/values-ja/strings.xml4
-rw-r--r--packages/SettingsLib/res/values-ka/strings.xml4
-rw-r--r--packages/SettingsLib/res/values-kk/strings.xml4
-rw-r--r--packages/SettingsLib/res/values-km/strings.xml4
-rw-r--r--packages/SettingsLib/res/values-kn/strings.xml7
-rw-r--r--packages/SettingsLib/res/values-ko/strings.xml4
-rw-r--r--packages/SettingsLib/res/values-ky/strings.xml4
-rw-r--r--packages/SettingsLib/res/values-lo/strings.xml4
-rw-r--r--packages/SettingsLib/res/values-lt/strings.xml4
-rw-r--r--packages/SettingsLib/res/values-lv/strings.xml4
-rw-r--r--packages/SettingsLib/res/values-mk/strings.xml4
-rw-r--r--packages/SettingsLib/res/values-ml/strings.xml4
-rw-r--r--packages/SettingsLib/res/values-mn/strings.xml4
-rw-r--r--packages/SettingsLib/res/values-mr/strings.xml7
-rw-r--r--packages/SettingsLib/res/values-ms/strings.xml4
-rw-r--r--packages/SettingsLib/res/values-my/strings.xml4
-rw-r--r--packages/SettingsLib/res/values-nb/strings.xml4
-rw-r--r--packages/SettingsLib/res/values-ne/strings.xml4
-rw-r--r--packages/SettingsLib/res/values-nl/strings.xml4
-rw-r--r--packages/SettingsLib/res/values-or/strings.xml7
-rw-r--r--packages/SettingsLib/res/values-pa/strings.xml4
-rw-r--r--packages/SettingsLib/res/values-pl/strings.xml7
-rw-r--r--packages/SettingsLib/res/values-pt-rBR/strings.xml4
-rw-r--r--packages/SettingsLib/res/values-pt-rPT/strings.xml4
-rw-r--r--packages/SettingsLib/res/values-pt/strings.xml4
-rw-r--r--packages/SettingsLib/res/values-ro/strings.xml4
-rw-r--r--packages/SettingsLib/res/values-ru/strings.xml4
-rw-r--r--packages/SettingsLib/res/values-si/strings.xml4
-rw-r--r--packages/SettingsLib/res/values-sk/strings.xml4
-rw-r--r--packages/SettingsLib/res/values-sl/strings.xml4
-rw-r--r--packages/SettingsLib/res/values-sq/strings.xml4
-rw-r--r--packages/SettingsLib/res/values-sr/strings.xml4
-rw-r--r--packages/SettingsLib/res/values-sv/strings.xml4
-rw-r--r--packages/SettingsLib/res/values-sw/strings.xml4
-rw-r--r--packages/SettingsLib/res/values-ta/strings.xml4
-rw-r--r--packages/SettingsLib/res/values-te/strings.xml4
-rw-r--r--packages/SettingsLib/res/values-th/strings.xml4
-rw-r--r--packages/SettingsLib/res/values-tl/strings.xml4
-rw-r--r--packages/SettingsLib/res/values-tr/strings.xml4
-rw-r--r--packages/SettingsLib/res/values-uk/strings.xml4
-rw-r--r--packages/SettingsLib/res/values-ur/strings.xml7
-rw-r--r--packages/SettingsLib/res/values-uz/strings.xml4
-rw-r--r--packages/SettingsLib/res/values-vi/strings.xml4
-rw-r--r--packages/SettingsLib/res/values-zh-rCN/strings.xml4
-rw-r--r--packages/SettingsLib/res/values-zh-rHK/strings.xml4
-rw-r--r--packages/SettingsLib/res/values-zh-rTW/strings.xml4
-rw-r--r--packages/SettingsLib/res/values-zu/strings.xml4
-rw-r--r--packages/SettingsLib/res/values/strings.xml3
-rw-r--r--packages/SettingsLib/search/src/com/android/settingslib/search/Indexable.java10
-rw-r--r--packages/SettingsLib/src/com/android/settingslib/bluetooth/CachedBluetoothDevice.java86
-rw-r--r--packages/SettingsLib/src/com/android/settingslib/utils/ThreadUtils.java23
-rw-r--r--packages/SettingsLib/src/com/android/settingslib/wifi/WifiUtils.java2
-rw-r--r--packages/SettingsLib/tests/robotests/src/com/android/settingslib/bluetooth/CachedBluetoothDeviceTest.java15
-rw-r--r--packages/SettingsProvider/src/com/android/providers/settings/SettingsProtoDumpUtil.java2
-rw-r--r--packages/Shell/AndroidManifest.xml27
-rw-r--r--packages/Shell/src/com/android/shell/BugreportProgressService.java2
-rw-r--r--packages/Shell/src/com/android/shell/HeapDumpActivity.java142
-rw-r--r--packages/Shell/src/com/android/shell/HeapDumpProvider.java101
-rw-r--r--packages/Shell/src/com/android/shell/HeapDumpReceiver.java188
-rw-r--r--packages/SystemUI/README.md5
-rw-r--r--packages/SystemUI/docs/broadcasts.md89
-rw-r--r--packages/SystemUI/plugin/ExamplePlugin/AndroidManifest.xml6
-rw-r--r--packages/SystemUI/res/layout/home_controls.xml2
-rw-r--r--packages/SystemUI/res/layout/status_bar_expanded_plugin_frame.xml2
-rw-r--r--packages/SystemUI/res/values/config.xml4
-rw-r--r--packages/SystemUI/shared/src/com/android/systemui/shared/system/TaskStackChangeListener.java8
-rw-r--r--packages/SystemUI/shared/src/com/android/systemui/shared/system/TaskStackChangeListeners.java13
-rw-r--r--packages/SystemUI/src/com/android/keyguard/EmergencyButton.java18
-rw-r--r--packages/SystemUI/src/com/android/keyguard/KeyguardSecurityModel.java1
-rw-r--r--packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java19
-rw-r--r--packages/SystemUI/src/com/android/keyguard/clock/ClockManager.java5
-rw-r--r--packages/SystemUI/src/com/android/systemui/BatteryMeterView.java12
-rw-r--r--packages/SystemUI/src/com/android/systemui/Dependency.java3
-rw-r--r--packages/SystemUI/src/com/android/systemui/DumpController.kt16
-rw-r--r--packages/SystemUI/src/com/android/systemui/Dumpable.java17
-rw-r--r--packages/SystemUI/src/com/android/systemui/GuestResumeSessionReceiver.java11
-rw-r--r--packages/SystemUI/src/com/android/systemui/LatencyTester.java8
-rw-r--r--packages/SystemUI/src/com/android/systemui/ScreenDecorations.java19
-rw-r--r--packages/SystemUI/src/com/android/systemui/SizeCompatModeActivityController.java16
-rw-r--r--packages/SystemUI/src/com/android/systemui/SliceBroadcastRelayHandler.java13
-rw-r--r--packages/SystemUI/src/com/android/systemui/SystemUIAppComponentFactory.java20
-rw-r--r--packages/SystemUI/src/com/android/systemui/SystemUIApplication.java68
-rw-r--r--packages/SystemUI/src/com/android/systemui/assist/AssistHandleReminderExpBehavior.java9
-rw-r--r--packages/SystemUI/src/com/android/systemui/assist/AssistManager.java12
-rw-r--r--packages/SystemUI/src/com/android/systemui/assist/PhoneStateMonitor.java5
-rw-r--r--packages/SystemUI/src/com/android/systemui/biometrics/AuthController.java15
-rw-r--r--packages/SystemUI/src/com/android/systemui/broadcast/BroadcastDispatcher.kt6
-rw-r--r--packages/SystemUI/src/com/android/systemui/broadcast/UserBroadcastDispatcher.kt29
-rw-r--r--packages/SystemUI/src/com/android/systemui/dagger/ContextComponentHelper.java8
-rw-r--r--packages/SystemUI/src/com/android/systemui/dagger/ContextComponentResolver.java29
-rw-r--r--packages/SystemUI/src/com/android/systemui/dagger/DefaultActivityBinder.java29
-rw-r--r--packages/SystemUI/src/com/android/systemui/dagger/DefaultBroadcastReceiverBinder.java39
-rw-r--r--packages/SystemUI/src/com/android/systemui/dagger/DefaultComponentBinder.java5
-rw-r--r--packages/SystemUI/src/com/android/systemui/dagger/DefaultServiceBinder.java7
-rw-r--r--packages/SystemUI/src/com/android/systemui/dagger/DependencyProvider.java26
-rw-r--r--packages/SystemUI/src/com/android/systemui/dagger/SystemUIBinder.java267
-rw-r--r--packages/SystemUI/src/com/android/systemui/dagger/SystemUIModule.java11
-rw-r--r--packages/SystemUI/src/com/android/systemui/doze/DozeFactory.java12
-rw-r--r--packages/SystemUI/src/com/android/systemui/doze/DozeScreenBrightness.java17
-rw-r--r--packages/SystemUI/src/com/android/systemui/doze/DozeTriggers.java17
-rw-r--r--packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsComponent.java17
-rw-r--r--packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsDialog.java12
-rw-r--r--packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsImpl.java38
-rw-r--r--packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java12
-rw-r--r--packages/SystemUI/src/com/android/systemui/keyguard/WorkLockActivity.java16
-rw-r--r--packages/SystemUI/src/com/android/systemui/pip/BasePipManager.java4
-rw-r--r--packages/SystemUI/src/com/android/systemui/pip/PipUI.java12
-rw-r--r--packages/SystemUI/src/com/android/systemui/pip/phone/PipManager.java5
-rw-r--r--packages/SystemUI/src/com/android/systemui/pip/phone/PipMediaController.java6
-rw-r--r--packages/SystemUI/src/com/android/systemui/pip/tv/PipManager.java9
-rw-r--r--packages/SystemUI/src/com/android/systemui/pip/tv/PipNotification.java5
-rw-r--r--packages/SystemUI/src/com/android/systemui/privacy/PrivacyItemController.kt38
-rw-r--r--packages/SystemUI/src/com/android/systemui/qs/QSAnimator.java6
-rw-r--r--packages/SystemUI/src/com/android/systemui/qs/QSDetail.java7
-rw-r--r--packages/SystemUI/src/com/android/systemui/qs/QSFragment.java6
-rw-r--r--packages/SystemUI/src/com/android/systemui/qs/QSPanel.java15
-rw-r--r--packages/SystemUI/src/com/android/systemui/qs/QSTileHost.java11
-rw-r--r--packages/SystemUI/src/com/android/systemui/qs/QuickQSPanel.java5
-rw-r--r--packages/SystemUI/src/com/android/systemui/qs/QuickStatusBarHeader.java19
-rw-r--r--packages/SystemUI/src/com/android/systemui/qs/external/TileLifecycleManager.java15
-rw-r--r--packages/SystemUI/src/com/android/systemui/qs/external/TileServiceManager.java5
-rw-r--r--packages/SystemUI/src/com/android/systemui/qs/external/TileServices.java18
-rw-r--r--packages/SystemUI/src/com/android/systemui/qs/tiles/AirplaneModeTile.java10
-rw-r--r--packages/SystemUI/src/com/android/systemui/qs/tiles/DndTile.java9
-rw-r--r--packages/SystemUI/src/com/android/systemui/qs/tiles/NfcTile.java9
-rw-r--r--packages/SystemUI/src/com/android/systemui/recents/OverviewProxyRecentsImpl.java22
-rw-r--r--packages/SystemUI/src/com/android/systemui/recents/Recents.java8
-rw-r--r--packages/SystemUI/src/com/android/systemui/recents/RecentsImplementation.java5
-rw-r--r--packages/SystemUI/src/com/android/systemui/recents/RecentsModule.java44
-rw-r--r--packages/SystemUI/src/com/android/systemui/screenshot/GlobalScreenshot.java253
-rw-r--r--packages/SystemUI/src/com/android/systemui/screenshot/TakeScreenshotService.java19
-rw-r--r--packages/SystemUI/src/com/android/systemui/settings/BrightnessController.java6
-rw-r--r--packages/SystemUI/src/com/android/systemui/settings/BrightnessDialog.java12
-rw-r--r--packages/SystemUI/src/com/android/systemui/settings/CurrentUserObservable.java8
-rw-r--r--packages/SystemUI/src/com/android/systemui/settings/CurrentUserTracker.java19
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/CommandQueue.java19
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/NavigationBarController.java10
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/NotificationLockscreenUserManagerImpl.java12
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/NotificationRemoteInputManager.java8
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/NotificationViewHierarchyManager.java6
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/RemoteInputController.java16
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/notification/InstantAppNotifier.java12
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/notification/row/wrapper/NotificationMediaTemplateViewWrapper.java5
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/BiometricUnlockController.java11
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/CollapsedStatusBarFragment.java5
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/DarkIconDispatcherImpl.java5
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/HeadsUpAppearanceController.java11
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBypassController.kt27
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardLiftController.kt17
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardStatusBarView.java4
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/LightBarTransitionsController.java12
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/ManagedProfileControllerImpl.java11
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarFragment.java7
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarTransitions.java6
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarView.java3
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java9
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarPolicy.java9
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarView.java3
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimController.java5
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java103
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarIconController.java13
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarIconControllerImpl.java6
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarNotificationPresenter.java6
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarRemoteInputCallback.java6
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarWindowViewController.java15
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/policy/BatteryControllerImpl.java15
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/policy/Clock.java34
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/policy/DateView.java7
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/policy/DeviceProvisionedControllerImpl.java6
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/policy/LocationControllerImpl.java8
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkControllerImpl.java16
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/policy/RemoteInputQuickSettingsDisabler.java7
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/policy/RemoteInputUriController.java84
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/policy/RemoteInputView.java7
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/policy/SecurityControllerImpl.java13
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/policy/UserSwitcherController.java12
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/policy/ZenModeControllerImpl.java6
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/tv/TvStatusBar.java15
-rw-r--r--packages/SystemUI/src/com/android/systemui/theme/ThemeOverlayController.java14
-rw-r--r--packages/SystemUI/src/com/android/systemui/tuner/TunerServiceImpl.java5
-rw-r--r--packages/SystemUI/src/com/android/systemui/usb/UsbDebuggingActivity.java17
-rw-r--r--packages/SystemUI/src/com/android/systemui/usb/UsbDebuggingSecondaryUserActivity.java13
-rw-r--r--packages/SystemUI/src/com/android/systemui/util/EmergencyDialerConstants.java5
-rw-r--r--packages/SystemUI/src/com/android/systemui/util/InjectionInflationController.java6
-rw-r--r--packages/SystemUI/src/com/android/systemui/util/Utils.java21
-rw-r--r--packages/SystemUI/tests/src/com/android/keyguard/KeyguardUpdateMonitorTest.java26
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/DependencyTest.java7
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/ScreenDecorationsTest.java14
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/SizeCompatModeActivityControllerTest.java4
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/SliceBroadcastRelayHandlerTest.java20
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/biometrics/AuthControllerTest.java8
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/doze/DozeScreenBrightnessTest.java7
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/doze/DozeTriggersTest.java5
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/keyguard/KeyguardViewMediatorTest.java5
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/keyguard/WorkLockActivityTest.java8
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/privacy/PrivacyItemControllerTest.kt18
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/qs/QSFragmentTest.java12
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/qs/QSTileHostTest.java10
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/qs/external/TileLifecycleManagerTest.java6
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/qs/external/TileServicesTest.java41
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/settings/CurrentUserTrackerTest.java8
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/statusbar/NavigationBarControllerTest.java4
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationLockscreenUserManagerTest.java4
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationRemoteInputManagerTest.java11
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/statusbar/SmartReplyControllerTest.java5
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/BiometricsUnlockControllerTest.java5
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/HeadsUpAppearanceControllerTest.java5
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/LightBarTransitionsControllerTest.java5
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NavigationBarFragmentTest.java7
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NavigationBarTransitionsTest.java3
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NotificationPanelViewTest.java4
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarIconControllerTest.java13
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarNotificationPresenterTest.java4
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarRemoteInputCallbackTest.java3
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarTest.java21
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarWindowViewTest.java4
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/BatteryControllerTest.java5
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/LocationControllerImplTest.java4
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerBaseTest.java7
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerDataTest.java2
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerSignalTest.java4
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/RemoteInputQuickSettingsDisablerTest.java7
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/SecurityControllerTest.java3
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/ZenModeControllerImplTest.java6
-rw-r--r--packages/Tethering/Android.bp2
-rw-r--r--packages/Tethering/AndroidManifestBase.xml3
-rw-r--r--packages/Tethering/src/android/net/util/PrefixUtils.java (renamed from services/net/java/android/net/util/PrefixUtils.java)5
-rw-r--r--packages/Tethering/src/com/android/server/connectivity/tethering/UpstreamNetworkMonitor.java (renamed from services/core/java/com/android/server/connectivity/tethering/UpstreamNetworkMonitor.java)39
-rw-r--r--packages/Tethering/tests/unit/Android.bp1
-rw-r--r--packages/Tethering/tests/unit/src/com/android/server/connectivity/tethering/UpstreamNetworkMonitorTest.java (renamed from tests/net/java/com/android/server/connectivity/tethering/UpstreamNetworkMonitorTest.java)74
-rw-r--r--services/Android.bp5
-rw-r--r--services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java26
-rw-r--r--services/core/Android.bp1
-rw-r--r--services/core/java/android/os/BatteryStatsInternal.java (renamed from core/java/android/os/BatteryStatsInternal.java)0
-rw-r--r--services/core/java/com/android/server/AlarmManagerService.java133
-rw-r--r--services/core/java/com/android/server/AppStateTracker.java2
-rw-r--r--services/core/java/com/android/server/DropBoxManagerService.java76
-rw-r--r--services/core/java/com/android/server/LocationManagerService.java43
-rw-r--r--services/core/java/com/android/server/PinnerService.java4
-rw-r--r--services/core/java/com/android/server/VibratorService.java3
-rw-r--r--services/core/java/com/android/server/accounts/AccountManagerService.java2
-rw-r--r--services/core/java/com/android/server/am/ActivityManagerService.java247
-rw-r--r--services/core/java/com/android/server/am/ActivityManagerShellCommand.java7
-rw-r--r--services/core/java/com/android/server/am/AppErrors.java6
-rw-r--r--services/core/java/com/android/server/am/DumpHeapProvider.java89
-rw-r--r--services/core/java/com/android/server/am/OomAdjuster.java94
-rw-r--r--services/core/java/com/android/server/am/ProcessList.java12
-rw-r--r--services/core/java/com/android/server/am/ProcessRecord.java9
-rw-r--r--services/core/java/com/android/server/am/UidRecord.java5
-rw-r--r--services/core/java/com/android/server/appop/AppOpsService.java65
-rw-r--r--services/core/java/com/android/server/appop/TEST_MAPPING3
-rw-r--r--services/core/java/com/android/server/audio/AudioService.java4
-rw-r--r--services/core/java/com/android/server/compat/CompatChange.java45
-rw-r--r--services/core/java/com/android/server/compat/CompatConfig.java47
-rw-r--r--services/core/java/com/android/server/compat/PlatformCompat.java11
-rw-r--r--services/core/java/com/android/server/input/InputManagerService.java12
-rw-r--r--services/core/java/com/android/server/integrity/parser/RuleBinaryParser.java37
-rw-r--r--services/core/java/com/android/server/integrity/parser/RuleParser.java31
-rw-r--r--services/core/java/com/android/server/integrity/parser/RuleXmlParser.java37
-rw-r--r--services/core/java/com/android/server/integrity/serializer/RuleBinarySerializer.java36
-rw-r--r--services/core/java/com/android/server/integrity/serializer/RuleSerializer.java31
-rw-r--r--services/core/java/com/android/server/integrity/serializer/RuleXmlSerializer.java36
-rw-r--r--services/core/java/com/android/server/location/GnssLocationProvider.java19
-rw-r--r--services/core/java/com/android/server/media/MediaRoute2ProviderProxy.java7
-rw-r--r--services/core/java/com/android/server/media/MediaRouter2ServiceImpl.java175
-rw-r--r--services/core/java/com/android/server/net/NetworkPolicyManagerService.java3
-rw-r--r--services/core/java/com/android/server/notification/InlineReplyUriRecord.java97
-rw-r--r--services/core/java/com/android/server/notification/NotificationDelegate.java9
-rwxr-xr-xservices/core/java/com/android/server/notification/NotificationManagerService.java106
-rw-r--r--services/core/java/com/android/server/pm/PackageManagerService.java57
-rw-r--r--services/core/java/com/android/server/pm/Settings.java2
-rw-r--r--services/core/java/com/android/server/pm/ShortcutService.java2
-rw-r--r--services/core/java/com/android/server/pm/UserManagerService.java13
-rw-r--r--services/core/java/com/android/server/pm/UserSystemPackageInstaller.java11
-rw-r--r--services/core/java/com/android/server/pm/dex/DexManager.java21
-rw-r--r--services/core/java/com/android/server/rollback/RollbackManagerServiceImpl.java48
-rw-r--r--services/core/java/com/android/server/statusbar/StatusBarManagerService.java18
-rw-r--r--services/core/java/com/android/server/updates/EmergencyNumberDbInstallReceiver.java8
-rw-r--r--services/core/java/com/android/server/wm/AccessibilityController.java23
-rw-r--r--services/core/java/com/android/server/wm/ActivityMetricsLogger.java60
-rw-r--r--services/core/java/com/android/server/wm/ActivityRecord.java374
-rw-r--r--services/core/java/com/android/server/wm/ActivityStackSupervisor.java25
-rw-r--r--services/core/java/com/android/server/wm/ActivityStarter.java5
-rw-r--r--services/core/java/com/android/server/wm/ActivityTaskManagerService.java43
-rw-r--r--services/core/java/com/android/server/wm/AppTransition.java63
-rw-r--r--services/core/java/com/android/server/wm/AppTransitionController.java2
-rw-r--r--services/core/java/com/android/server/wm/ConfigurationContainer.java42
-rw-r--r--services/core/java/com/android/server/wm/DisplayContent.java17
-rw-r--r--services/core/java/com/android/server/wm/InputManagerCallback.java11
-rw-r--r--services/core/java/com/android/server/wm/RefreshRatePolicy.java5
-rw-r--r--services/core/java/com/android/server/wm/RemoteAnimationController.java66
-rw-r--r--services/core/java/com/android/server/wm/RootActivityContainer.java2
-rw-r--r--services/core/java/com/android/server/wm/RootWindowContainer.java2
-rw-r--r--services/core/java/com/android/server/wm/Task.java45
-rw-r--r--services/core/java/com/android/server/wm/TaskRecord.java2
-rw-r--r--services/core/java/com/android/server/wm/TaskStack.java25
-rw-r--r--services/core/java/com/android/server/wm/WallpaperController.java18
-rw-r--r--services/core/java/com/android/server/wm/WindowAnimator.java4
-rw-r--r--services/core/java/com/android/server/wm/WindowContainer.java381
-rw-r--r--services/core/java/com/android/server/wm/WindowManagerService.java9
-rw-r--r--services/core/java/com/android/server/wm/WindowState.java85
-rw-r--r--services/core/java/com/android/server/wm/WindowStateAnimator.java10
-rw-r--r--services/core/java/com/android/server/wm/WindowToken.java16
-rw-r--r--services/core/jni/Android.bp1
-rw-r--r--services/core/jni/com_android_server_VibratorService.cpp144
-rw-r--r--services/core/jni/com_android_server_input_InputManagerService.cpp21
-rw-r--r--services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java15
-rw-r--r--services/java/com/android/server/SystemServer.java21
-rw-r--r--services/tests/mockingservicestests/src/com/android/server/AlarmManagerServiceTest.java87
-rw-r--r--services/tests/mockingservicestests/src/com/android/server/AppStateTrackerTest.java12
-rw-r--r--services/tests/mockingservicestests/src/com/android/server/am/MockingOomAdjusterTests.java19
-rw-r--r--services/tests/mockingservicestests/src/com/android/server/appop/AppOpsServiceTest.java57
-rw-r--r--services/tests/mockingservicestests/src/com/android/server/job/controllers/QuotaControllerTest.java3
-rw-r--r--services/tests/servicestests/src/com/android/server/am/ActivityManagerServiceTest.java12
-rw-r--r--services/tests/servicestests/src/com/android/server/am/OomAdjusterTests.java2
-rw-r--r--services/tests/servicestests/src/com/android/server/devicepolicy/DevicePolicyManagerTest.java35
-rw-r--r--services/tests/servicestests/src/com/android/server/net/NetworkPolicyManagerServiceTest.java3
-rw-r--r--services/tests/servicestests/src/com/android/server/pm/BaseShortcutManagerTest.java6
-rw-r--r--services/tests/servicestests/src/com/android/server/pm/ShortcutManagerTest2.java24
-rw-r--r--services/tests/servicestests/src/com/android/server/pm/dex/DexManagerTests.java62
-rwxr-xr-xservices/tests/uiservicestests/src/com/android/server/notification/NotificationManagerServiceTest.java96
-rw-r--r--services/tests/wmtests/src/com/android/server/wm/ActivityMetricsLaunchObserverTests.java56
-rw-r--r--services/tests/wmtests/src/com/android/server/wm/ActivityRecordTests.java39
-rw-r--r--services/tests/wmtests/src/com/android/server/wm/ActivityTaskManagerServiceTests.java18
-rw-r--r--services/tests/wmtests/src/com/android/server/wm/ActivityTestsBase.java11
-rw-r--r--services/tests/wmtests/src/com/android/server/wm/AnimatingActivityRegistryTest.java9
-rw-r--r--services/tests/wmtests/src/com/android/server/wm/AppTransitionTests.java8
-rw-r--r--services/tests/wmtests/src/com/android/server/wm/TaskStackTests.java5
-rw-r--r--services/tests/wmtests/src/com/android/server/wm/WindowConfigurationTests.java31
-rw-r--r--services/tests/wmtests/src/com/android/server/wm/WindowContainerTests.java104
-rw-r--r--services/usage/java/com/android/server/usage/UsageStatsService.java5
-rw-r--r--telecomm/java/android/telecom/Connection.java6
-rwxr-xr-x[-rw-r--r--]telephony/java/android/telephony/CarrierConfigManager.java19
-rw-r--r--telephony/java/android/telephony/CellBroadcastService.java66
-rw-r--r--telephony/java/android/telephony/CellSignalStrengthNr.java14
-rw-r--r--telephony/java/android/telephony/ICellBroadcastService.aidl7
-rw-r--r--telephony/java/android/telephony/ImsiEncryptionInfo.java29
-rw-r--r--telephony/java/android/telephony/LocationAccessPolicy.java26
-rw-r--r--telephony/java/android/telephony/SmsManager.java70
-rw-r--r--telephony/java/android/telephony/TelephonyManager.java136
-rw-r--r--telephony/java/android/telephony/TelephonyScanManager.java8
-rw-r--r--telephony/java/android/telephony/cdma/CdmaSmsCbProgramData.aidl21
-rw-r--r--telephony/java/android/telephony/ims/ImsSsInfo.java27
-rw-r--r--telephony/java/android/telephony/ims/ImsUtListener.java79
-rw-r--r--telephony/java/android/telephony/ims/compat/stub/ImsUtListenerImplBase.java10
-rw-r--r--telephony/java/com/android/ims/internal/IImsUtListener.aidl1
-rw-r--r--telephony/java/com/android/internal/telephony/ISms.aidl19
-rw-r--r--telephony/java/com/android/internal/telephony/ISmsImplBase.java11
-rw-r--r--telephony/java/com/android/internal/telephony/ITelephony.aidl31
-rw-r--r--test-mock/Android.bp10
-rw-r--r--test-mock/src/android/test/mock/MockContext.java7
-rwxr-xr-xtests/Codegen/runTest.sh1
-rw-r--r--tests/Codegen/src/com/android/codegentest/HierrarchicalDataClassBase.java10
-rw-r--r--tests/Codegen/src/com/android/codegentest/HierrarchicalDataClassChild.java10
-rw-r--r--tests/Codegen/src/com/android/codegentest/ParcelAllTheThingsDataClass.java12
-rw-r--r--tests/Codegen/src/com/android/codegentest/SampleDataClass.java14
-rw-r--r--tests/Codegen/src/com/android/codegentest/SampleDataClassTest.java20
-rw-r--r--tests/Codegen/src/com/android/codegentest/SampleWithCustomBuilder.java12
-rw-r--r--tests/Codegen/src/com/android/codegentest/SampleWithNestedDataClasses.java390
-rw-r--r--tests/Codegen/src/com/android/codegentest/StaleDataclassDetectorFalsePositivesTest.java10
-rw-r--r--tests/RollbackTest/RollbackTest/src/com/android/tests/rollback/StagedRollbackTest.java29
-rw-r--r--tests/RollbackTest/StagedRollbackTest/src/com/android/tests/rollback/host/StagedRollbackTest.java60
-rw-r--r--tests/TouchLatency/app/src/main/java/com/prefabulated/touchlatency/TouchLatencyActivity.java9
-rw-r--r--tools/codegen/src/com/android/codegen/ClassInfo.kt40
-rw-r--r--tools/codegen/src/com/android/codegen/ClassPrinter.kt282
-rw-r--r--tools/codegen/src/com/android/codegen/FieldInfo.kt12
-rw-r--r--tools/codegen/src/com/android/codegen/FileInfo.kt289
-rw-r--r--tools/codegen/src/com/android/codegen/Generators.kt6
-rw-r--r--tools/codegen/src/com/android/codegen/ImportsProvider.kt91
-rwxr-xr-xtools/codegen/src/com/android/codegen/Main.kt77
-rw-r--r--tools/codegen/src/com/android/codegen/Printer.kt186
-rw-r--r--tools/codegen/src/com/android/codegen/SharedConstants.kt2
-rw-r--r--tools/codegen/src/com/android/codegen/Utils.kt52
-rw-r--r--tools/incident_section_gen/main.cpp4
-rw-r--r--tools/processors/staledataclass/src/android/processor/staledataclass/StaleDataclassProcessor.kt11
-rw-r--r--tools/protologtool/src/com/android/protolog/tool/ProtoLogTool.kt78
-rw-r--r--tools/protologtool/src/com/android/protolog/tool/SourceTransformer.kt15
-rw-r--r--tools/protologtool/src/com/android/protolog/tool/ViewerConfigBuilder.kt12
-rw-r--r--tools/protologtool/tests/com/android/protolog/tool/EndToEndTest.kt144
-rw-r--r--tools/protologtool/tests/com/android/protolog/tool/SourceTransformerTest.kt16
-rw-r--r--wifi/java/android/net/wifi/ScanResult.java106
-rw-r--r--wifi/java/android/net/wifi/WifiInfo.java65
-rw-r--r--wifi/java/android/net/wifi/WifiManager.java10
-rw-r--r--wifi/java/android/net/wifi/WifiScanner.java21
-rw-r--r--wifi/tests/src/android/net/wifi/ScanResultTest.java55
-rw-r--r--wifi/tests/src/android/net/wifi/WifiInfoTest.java6
548 files changed, 13480 insertions, 4058 deletions
diff --git a/Android.bp b/Android.bp
index 9497085a82ca..67b088c2dc00 100644
--- a/Android.bp
+++ b/Android.bp
@@ -34,6 +34,27 @@ filegroup {
path: "core/java",
}
+// These are subset of framework-core-sources that are needed by the
+// android.test.mock library. Ideally, the library should use public APIs only,
+// but unfortunately its API signature has some references to these private APIs.
+filegroup {
+ name: "framework-core-sources-for-test-mock",
+ srcs: [
+ "core/java/android/app/IApplicationThread.aidl",
+ "core/java/android/app/IServiceConnection.aidl",
+ "core/java/android/content/IContentProvider.java",
+ "core/java/android/content/pm/IPackageDataObserver.aidl",
+ "core/java/android/content/pm/InstantAppInfo.java",
+ "core/java/android/content/pm/KeySet.java",
+ "core/java/android/content/pm/PackageManager.java",
+ "core/java/android/content/pm/VerifierDeviceIdentity.java",
+ "core/java/android/content/res/Resources.java",
+ "core/java/android/os/storage/VolumeInfo.java",
+ "core/java/android/view/DisplayAdjustments.java",
+ ],
+ path: "core/java",
+}
+
filegroup {
name: "framework-drm-sources",
srcs: [
@@ -1424,8 +1445,6 @@ droidstubs {
name: "hiddenapi-mappings",
defaults: ["metalava-api-stubs-default"],
srcs: [
- ":non_openjdk_java_files",
- ":openjdk_java_files",
":opt-telephony-common-srcs",
],
@@ -1441,29 +1460,6 @@ droidstubs {
" --show-annotation android.annotation.TestApi ",
}
-filegroup {
- name: "apache-http-stubs-sources",
- srcs: [
- "core/java/org/apache/http/conn/ConnectTimeoutException.java",
- "core/java/org/apache/http/conn/scheme/HostNameResolver.java",
- "core/java/org/apache/http/conn/scheme/LayeredSocketFactory.java",
- "core/java/org/apache/http/conn/scheme/SocketFactory.java",
- "core/java/org/apache/http/conn/ssl/AbstractVerifier.java",
- "core/java/org/apache/http/conn/ssl/AllowAllHostnameVerifier.java",
- "core/java/org/apache/http/conn/ssl/AndroidDistinguishedNameParser.java",
- "core/java/org/apache/http/conn/ssl/BrowserCompatHostnameVerifier.java",
- "core/java/org/apache/http/conn/ssl/SSLSocketFactory.java",
- "core/java/org/apache/http/conn/ssl/StrictHostnameVerifier.java",
- "core/java/org/apache/http/conn/ssl/X509HostnameVerifier.java",
- "core/java/org/apache/http/params/CoreConnectionPNames.java",
- "core/java/org/apache/http/params/HttpConnectionParams.java",
- "core/java/org/apache/http/params/HttpParams.java",
- "core/java/android/net/http/SslCertificate.java",
- "core/java/android/net/http/SslError.java",
- "core/java/com/android/internal/util/HexDump.java",
- ],
-}
-
droidstubs {
name: "api-stubs-docs",
defaults: ["metalava-api-stubs-default"],
@@ -1539,6 +1535,10 @@ droidstubs {
api_file: "api/test-current.txt",
removed_api_file: "api/test-removed.txt",
},
+ api_lint: {
+ enabled: true,
+ baseline_file: "api/test-lint-baseline.txt",
+ },
},
}
@@ -1623,7 +1623,6 @@ filegroup {
filegroup {
name: "framework-ims-common-shared-srcs",
srcs: [
- "core/java/android/os/AsyncResult.java",
"core/java/android/os/RegistrantList.java",
"core/java/android/os/Registrant.java",
"core/java/com/android/internal/os/SomeArgs.java",
diff --git a/apex/jobscheduler/framework/java/android/app/DeviceIdleFrameworkInitializer.java b/apex/jobscheduler/framework/java/android/app/DeviceIdleFrameworkInitializer.java
index 5b1405628b49..c264531c3947 100644
--- a/apex/jobscheduler/framework/java/android/app/DeviceIdleFrameworkInitializer.java
+++ b/apex/jobscheduler/framework/java/android/app/DeviceIdleFrameworkInitializer.java
@@ -19,36 +19,17 @@ package android.app;
import android.content.Context;
import android.os.DeviceIdleManager;
import android.os.IDeviceIdleController;
-import android.os.PowerManager;
-import android.os.RemoteException;
-import android.os.ServiceManager;
/**
- * This class needs to be pre-loaded by zygote. This is where the device idle manager wrapper
- * is registered.
- *
* @hide
*/
public class DeviceIdleFrameworkInitializer {
private static IDeviceIdleController sIDeviceIdleController;
- static {
+ public static void initialize() {
SystemServiceRegistry.registerCachedService(
Context.DEVICE_IDLE_CONTROLLER, DeviceIdleManager.class,
(context, b) -> new DeviceIdleManager(
context, IDeviceIdleController.Stub.asInterface(b)));
- PowerManager.setIsIgnoringBatteryOptimizationsCallback((packageName) -> {
- // No need for synchronization on sIDeviceIdleController; worst case
- // we just initialize it twice.
- if (sIDeviceIdleController == null) {
- sIDeviceIdleController = IDeviceIdleController.Stub.asInterface(
- ServiceManager.getService(Context.DEVICE_IDLE_CONTROLLER));
- }
- try {
- return sIDeviceIdleController.isPowerSaveWhitelistApp(packageName);
- } catch (RemoteException e) {
- throw e.rethrowFromSystemServer();
- }
- });
}
}
diff --git a/apex/jobscheduler/framework/java/android/app/job/JobParameters.java b/apex/jobscheduler/framework/java/android/app/job/JobParameters.java
index 150cdbc3cacf..42cf17b1264e 100644
--- a/apex/jobscheduler/framework/java/android/app/job/JobParameters.java
+++ b/apex/jobscheduler/framework/java/android/app/job/JobParameters.java
@@ -68,7 +68,11 @@ public class JobParameters implements Parcelable {
REASON_DEVICE_THERMAL,
};
- /** @hide */
+ /**
+ * @hide
+ * @deprecated use {@link #getReasonCodeDescription(int)}
+ */
+ @Deprecated
public static String getReasonName(int reason) {
switch (reason) {
case REASON_CANCELED: return "canceled";
@@ -81,6 +85,20 @@ public class JobParameters implements Parcelable {
}
}
+ /** @hide */
+ // @SystemApi TODO make it a system api for mainline
+ @NonNull
+ public static int[] getJobStopReasonCodes() {
+ return JOB_STOP_REASON_CODES;
+ }
+
+ /** @hide */
+ // @SystemApi TODO make it a system api for mainline
+ @NonNull
+ public static String getReasonCodeDescription(int reasonCode) {
+ return getReasonName(reasonCode);
+ }
+
@UnsupportedAppUsage
private final int jobId;
private final PersistableBundle extras;
diff --git a/apex/jobscheduler/framework/java/android/app/job/JobSchedulerFrameworkInitializer.java b/apex/jobscheduler/framework/java/android/app/job/JobSchedulerFrameworkInitializer.java
index c90b8728bf4a..175e5f23f761 100644
--- a/apex/jobscheduler/framework/java/android/app/job/JobSchedulerFrameworkInitializer.java
+++ b/apex/jobscheduler/framework/java/android/app/job/JobSchedulerFrameworkInitializer.java
@@ -19,21 +19,14 @@ package android.app.job;
import android.app.JobSchedulerImpl;
import android.app.SystemServiceRegistry;
import android.content.Context;
-import android.os.BatteryStats;
/**
- * This class needs to be pre-loaded by zygote. This is where the job scheduler service wrapper
- * is registered.
- *
* @hide
*/
public class JobSchedulerFrameworkInitializer {
- static {
+ public static void initialize() {
SystemServiceRegistry.registerStaticService(
Context.JOB_SCHEDULER_SERVICE, JobScheduler.class,
(b) -> new JobSchedulerImpl(IJobScheduler.Stub.asInterface(b)));
-
- BatteryStats.setJobStopReasons(JobParameters.JOB_STOP_REASON_CODES,
- JobParameters::getReasonName);
}
}
diff --git a/apex/jobscheduler/framework/java/android/os/DeviceIdleManager.java b/apex/jobscheduler/framework/java/android/os/DeviceIdleManager.java
index e27670c34fb2..0568beb34e08 100644
--- a/apex/jobscheduler/framework/java/android/os/DeviceIdleManager.java
+++ b/apex/jobscheduler/framework/java/android/os/DeviceIdleManager.java
@@ -84,4 +84,17 @@ public class DeviceIdleManager {
return 0;
}
}
+
+ /**
+ * Return whether a given package is in the power-save whitelist or not.
+ * @hide
+ */
+ public boolean isApplicationWhitelisted(@NonNull String packageName) {
+ try {
+ return mService.isPowerSaveWhitelistApp(packageName);
+ } catch (RemoteException e) {
+ e.rethrowFromSystemServer();
+ return false;
+ }
+ }
}
diff --git a/apex/jobscheduler/service/java/com/android/server/job/JobSchedulerService.java b/apex/jobscheduler/service/java/com/android/server/job/JobSchedulerService.java
index a1734d8d25d5..eb22d0907525 100644
--- a/apex/jobscheduler/service/java/com/android/server/job/JobSchedulerService.java
+++ b/apex/jobscheduler/service/java/com/android/server/job/JobSchedulerService.java
@@ -899,7 +899,8 @@ public class JobSchedulerService extends com.android.server.SystemService
}
final private IUidObserver mUidObserver = new IUidObserver.Stub() {
- @Override public void onUidStateChanged(int uid, int procState, long procStateSeq) {
+ @Override public void onUidStateChanged(int uid, int procState, long procStateSeq,
+ int capability) {
mHandler.obtainMessage(MSG_UID_STATE_CHANGED, uid, procState).sendToTarget();
}
diff --git a/apex/jobscheduler/service/java/com/android/server/job/controllers/QuotaController.java b/apex/jobscheduler/service/java/com/android/server/job/controllers/QuotaController.java
index cda524418664..3aef5d1d59e3 100644
--- a/apex/jobscheduler/service/java/com/android/server/job/controllers/QuotaController.java
+++ b/apex/jobscheduler/service/java/com/android/server/job/controllers/QuotaController.java
@@ -466,7 +466,7 @@ public final class QuotaController extends StateController {
private final IUidObserver mUidObserver = new IUidObserver.Stub() {
@Override
- public void onUidStateChanged(int uid, int procState, long procStateSeq) {
+ public void onUidStateChanged(int uid, int procState, long procStateSeq, int capability) {
mHandler.obtainMessage(MSG_UID_PROCESS_STATE_CHANGED, uid, procState).sendToTarget();
}
diff --git a/apex/statsd/service/java/com/android/server/stats/StatsCompanionService.java b/apex/statsd/service/java/com/android/server/stats/StatsCompanionService.java
index 5e5a04b1af3b..518a29c2017a 100644
--- a/apex/statsd/service/java/com/android/server/stats/StatsCompanionService.java
+++ b/apex/statsd/service/java/com/android/server/stats/StatsCompanionService.java
@@ -583,7 +583,11 @@ public class StatsCompanionService extends IStatsCompanionService.Stub {
} catch (IllegalArgumentException e) {
installer = "";
}
- sStatsd.informOnePackage(app, uid, pi.getLongVersionCode(), pi.versionName,
+ sStatsd.informOnePackage(
+ app,
+ uid,
+ pi.getLongVersionCode(),
+ pi.versionName == null ? "" : pi.versionName,
installer == null ? "" : installer);
}
} catch (Exception e) {
diff --git a/api/current.txt b/api/current.txt
index 6278179bc120..55983c86ee4b 100644
--- a/api/current.txt
+++ b/api/current.txt
@@ -2827,7 +2827,7 @@ package android.accessibilityservice {
method public android.view.accessibility.AccessibilityNodeInfo findFocus(int);
method @NonNull public final android.accessibilityservice.AccessibilityButtonController getAccessibilityButtonController();
method @NonNull public final android.accessibilityservice.AccessibilityButtonController getAccessibilityButtonController(int);
- method @RequiresPermission(android.Manifest.permission.USE_FINGERPRINT) @NonNull public final android.accessibilityservice.FingerprintGestureController getFingerprintGestureController();
+ method @NonNull @RequiresPermission(android.Manifest.permission.USE_FINGERPRINT) public final android.accessibilityservice.FingerprintGestureController getFingerprintGestureController();
method @NonNull public final android.accessibilityservice.AccessibilityService.MagnificationController getMagnificationController();
method public android.view.accessibility.AccessibilityNodeInfo getRootInActiveWindow();
method public final android.accessibilityservice.AccessibilityServiceInfo getServiceInfo();
@@ -3541,11 +3541,11 @@ package android.animation {
package android.annotation {
- @java.lang.annotation.Target({java.lang.annotation.ElementType.TYPE, java.lang.annotation.ElementType.FIELD, java.lang.annotation.ElementType.METHOD, java.lang.annotation.ElementType.PARAMETER, java.lang.annotation.ElementType.CONSTRUCTOR, java.lang.annotation.ElementType.LOCAL_VARIABLE}) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) public @interface SuppressLint {
+ @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target({java.lang.annotation.ElementType.TYPE, java.lang.annotation.ElementType.FIELD, java.lang.annotation.ElementType.METHOD, java.lang.annotation.ElementType.PARAMETER, java.lang.annotation.ElementType.CONSTRUCTOR, java.lang.annotation.ElementType.LOCAL_VARIABLE}) public @interface SuppressLint {
method public abstract String[] value();
}
- @java.lang.annotation.Target({java.lang.annotation.ElementType.TYPE, java.lang.annotation.ElementType.METHOD, java.lang.annotation.ElementType.CONSTRUCTOR, java.lang.annotation.ElementType.FIELD}) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) public @interface TargetApi {
+ @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target({java.lang.annotation.ElementType.TYPE, java.lang.annotation.ElementType.METHOD, java.lang.annotation.ElementType.CONSTRUCTOR, java.lang.annotation.ElementType.FIELD}) public @interface TargetApi {
method public abstract int value();
}
@@ -3758,7 +3758,7 @@ package android.app {
method public void onContentChanged();
method public boolean onContextItemSelected(@NonNull android.view.MenuItem);
method public void onContextMenuClosed(@NonNull android.view.Menu);
- method @MainThread @CallSuper protected void onCreate(@Nullable android.os.Bundle);
+ method @CallSuper @MainThread protected void onCreate(@Nullable android.os.Bundle);
method public void onCreate(@Nullable android.os.Bundle, @Nullable android.os.PersistableBundle);
method public void onCreateContextMenu(android.view.ContextMenu, android.view.View, android.view.ContextMenu.ContextMenuInfo);
method @Nullable public CharSequence onCreateDescription();
@@ -3901,8 +3901,8 @@ package android.app {
method @Deprecated public void startActivityFromChild(@NonNull android.app.Activity, @RequiresPermission android.content.Intent, int, @Nullable android.os.Bundle);
method @Deprecated public void startActivityFromFragment(@NonNull android.app.Fragment, @RequiresPermission android.content.Intent, int);
method @Deprecated public void startActivityFromFragment(@NonNull android.app.Fragment, @RequiresPermission android.content.Intent, int, @Nullable android.os.Bundle);
- method public boolean startActivityIfNeeded(@RequiresPermission @NonNull android.content.Intent, int);
- method public boolean startActivityIfNeeded(@RequiresPermission @NonNull android.content.Intent, int, @Nullable android.os.Bundle);
+ method public boolean startActivityIfNeeded(@NonNull @RequiresPermission android.content.Intent, int);
+ method public boolean startActivityIfNeeded(@NonNull @RequiresPermission android.content.Intent, int, @Nullable android.os.Bundle);
method public void startIntentSenderForResult(android.content.IntentSender, int, @Nullable android.content.Intent, int, int, int) throws android.content.IntentSender.SendIntentException;
method public void startIntentSenderForResult(android.content.IntentSender, int, @Nullable android.content.Intent, int, int, int, android.os.Bundle) throws android.content.IntentSender.SendIntentException;
method @Deprecated public void startIntentSenderFromChild(android.app.Activity, android.content.IntentSender, int, android.content.Intent, int, int, int) throws android.content.IntentSender.SendIntentException;
@@ -3910,8 +3910,8 @@ package android.app {
method public void startLocalVoiceInteraction(android.os.Bundle);
method public void startLockTask();
method @Deprecated public void startManagingCursor(android.database.Cursor);
- method public boolean startNextMatchingActivity(@RequiresPermission @NonNull android.content.Intent);
- method public boolean startNextMatchingActivity(@RequiresPermission @NonNull android.content.Intent, @Nullable android.os.Bundle);
+ method public boolean startNextMatchingActivity(@NonNull @RequiresPermission android.content.Intent);
+ method public boolean startNextMatchingActivity(@NonNull @RequiresPermission android.content.Intent, @Nullable android.os.Bundle);
method public void startPostponedEnterTransition();
method public void startSearch(@Nullable String, boolean, @Nullable android.os.Bundle, boolean);
method public void stopLocalVoiceInteraction();
@@ -6714,7 +6714,7 @@ package android.app.admin {
method @NonNull public java.util.Set<java.lang.String> getAffiliationIds(@NonNull android.content.ComponentName);
method @Nullable public java.util.Set<java.lang.String> getAlwaysOnVpnLockdownWhitelist(@NonNull android.content.ComponentName);
method @Nullable public String getAlwaysOnVpnPackage(@NonNull android.content.ComponentName);
- method @WorkerThread @NonNull public android.os.Bundle getApplicationRestrictions(@Nullable android.content.ComponentName, String);
+ method @NonNull @WorkerThread public android.os.Bundle getApplicationRestrictions(@Nullable android.content.ComponentName, String);
method @Deprecated @Nullable public String getApplicationRestrictionsManagingPackage(@NonNull android.content.ComponentName);
method public boolean getAutoTimeRequired();
method @NonNull public java.util.List<android.os.UserHandle> getBindDeviceAdminTargetUsers(@NonNull android.content.ComponentName);
@@ -7640,7 +7640,7 @@ package android.app.slice {
method public int checkSlicePermission(@NonNull android.net.Uri, int, int);
method @NonNull public java.util.List<android.net.Uri> getPinnedSlices();
method @NonNull public java.util.Set<android.app.slice.SliceSpec> getPinnedSpecs(android.net.Uri);
- method @WorkerThread @NonNull public java.util.Collection<android.net.Uri> getSliceDescendants(@NonNull android.net.Uri);
+ method @NonNull @WorkerThread public java.util.Collection<android.net.Uri> getSliceDescendants(@NonNull android.net.Uri);
method public void grantSlicePermission(@NonNull String, @NonNull android.net.Uri);
method @Nullable public android.net.Uri mapIntentToUri(@NonNull android.content.Intent);
method public void pinSlice(@NonNull android.net.Uri, @NonNull java.util.Set<android.app.slice.SliceSpec>);
@@ -7796,10 +7796,10 @@ package android.app.usage {
public class StorageStatsManager {
method @WorkerThread public long getFreeBytes(@NonNull java.util.UUID) throws java.io.IOException;
method @WorkerThread public long getTotalBytes(@NonNull java.util.UUID) throws java.io.IOException;
- method @WorkerThread @NonNull public android.app.usage.ExternalStorageStats queryExternalStatsForUser(@NonNull java.util.UUID, @NonNull android.os.UserHandle) throws java.io.IOException;
- method @WorkerThread @NonNull public android.app.usage.StorageStats queryStatsForPackage(@NonNull java.util.UUID, @NonNull String, @NonNull android.os.UserHandle) throws java.io.IOException, android.content.pm.PackageManager.NameNotFoundException;
- method @WorkerThread @NonNull public android.app.usage.StorageStats queryStatsForUid(@NonNull java.util.UUID, int) throws java.io.IOException;
- method @WorkerThread @NonNull public android.app.usage.StorageStats queryStatsForUser(@NonNull java.util.UUID, @NonNull android.os.UserHandle) throws java.io.IOException;
+ method @NonNull @WorkerThread public android.app.usage.ExternalStorageStats queryExternalStatsForUser(@NonNull java.util.UUID, @NonNull android.os.UserHandle) throws java.io.IOException;
+ method @NonNull @WorkerThread public android.app.usage.StorageStats queryStatsForPackage(@NonNull java.util.UUID, @NonNull String, @NonNull android.os.UserHandle) throws java.io.IOException, android.content.pm.PackageManager.NameNotFoundException;
+ method @NonNull @WorkerThread public android.app.usage.StorageStats queryStatsForUid(@NonNull java.util.UUID, int) throws java.io.IOException;
+ method @NonNull @WorkerThread public android.app.usage.StorageStats queryStatsForUser(@NonNull java.util.UUID, @NonNull android.os.UserHandle) throws java.io.IOException;
}
public final class UsageEvents implements android.os.Parcelable {
@@ -8059,9 +8059,9 @@ package android.bluetooth {
method public boolean isMultipleAdvertisementSupported();
method public boolean isOffloadedFilteringSupported();
method public boolean isOffloadedScanBatchingSupported();
- method @RequiresPermission(android.Manifest.permission.BLUETOOTH) @NonNull public android.bluetooth.BluetoothServerSocket listenUsingInsecureL2capChannel() throws java.io.IOException;
+ method @NonNull @RequiresPermission(android.Manifest.permission.BLUETOOTH) public android.bluetooth.BluetoothServerSocket listenUsingInsecureL2capChannel() throws java.io.IOException;
method @RequiresPermission(android.Manifest.permission.BLUETOOTH) public android.bluetooth.BluetoothServerSocket listenUsingInsecureRfcommWithServiceRecord(String, java.util.UUID) throws java.io.IOException;
- method @RequiresPermission(android.Manifest.permission.BLUETOOTH) @NonNull public android.bluetooth.BluetoothServerSocket listenUsingL2capChannel() throws java.io.IOException;
+ method @NonNull @RequiresPermission(android.Manifest.permission.BLUETOOTH) public android.bluetooth.BluetoothServerSocket listenUsingL2capChannel() throws java.io.IOException;
method @RequiresPermission(android.Manifest.permission.BLUETOOTH) public android.bluetooth.BluetoothServerSocket listenUsingRfcommWithServiceRecord(String, java.util.UUID) throws java.io.IOException;
method @RequiresPermission(android.Manifest.permission.BLUETOOTH_ADMIN) public boolean setName(String);
method @RequiresPermission(android.Manifest.permission.BLUETOOTH_ADMIN) public boolean startDiscovery();
@@ -8429,9 +8429,9 @@ package android.bluetooth {
method public android.bluetooth.BluetoothGatt connectGatt(android.content.Context, boolean, android.bluetooth.BluetoothGattCallback, int, int);
method public android.bluetooth.BluetoothGatt connectGatt(android.content.Context, boolean, android.bluetooth.BluetoothGattCallback, int, int, android.os.Handler);
method @RequiresPermission(android.Manifest.permission.BLUETOOTH_ADMIN) public boolean createBond();
- method @RequiresPermission(android.Manifest.permission.BLUETOOTH) @NonNull public android.bluetooth.BluetoothSocket createInsecureL2capChannel(int) throws java.io.IOException;
+ method @NonNull @RequiresPermission(android.Manifest.permission.BLUETOOTH) public android.bluetooth.BluetoothSocket createInsecureL2capChannel(int) throws java.io.IOException;
method @RequiresPermission(android.Manifest.permission.BLUETOOTH) public android.bluetooth.BluetoothSocket createInsecureRfcommSocketToServiceRecord(java.util.UUID) throws java.io.IOException;
- method @RequiresPermission(android.Manifest.permission.BLUETOOTH) @NonNull public android.bluetooth.BluetoothSocket createL2capChannel(int) throws java.io.IOException;
+ method @NonNull @RequiresPermission(android.Manifest.permission.BLUETOOTH) public android.bluetooth.BluetoothSocket createL2capChannel(int) throws java.io.IOException;
method @RequiresPermission(android.Manifest.permission.BLUETOOTH) public android.bluetooth.BluetoothSocket createRfcommSocketToServiceRecord(java.util.UUID) throws java.io.IOException;
method public int describeContents();
method @RequiresPermission(android.Manifest.permission.BLUETOOTH) public boolean fetchUuidsWithSdp();
@@ -9616,14 +9616,14 @@ package android.content {
method public static void addPeriodicSync(android.accounts.Account, String, android.os.Bundle, long);
method public static Object addStatusChangeListener(int, android.content.SyncStatusObserver);
method @NonNull public android.content.ContentProviderResult[] applyBatch(@NonNull String, @NonNull java.util.ArrayList<android.content.ContentProviderOperation>) throws android.content.OperationApplicationException, android.os.RemoteException;
- method public final int bulkInsert(@RequiresPermission.Write @NonNull android.net.Uri, @NonNull android.content.ContentValues[]);
+ method public final int bulkInsert(@NonNull @RequiresPermission.Write android.net.Uri, @NonNull android.content.ContentValues[]);
method @Nullable public final android.os.Bundle call(@NonNull android.net.Uri, @NonNull String, @Nullable String, @Nullable android.os.Bundle);
method @Nullable public final android.os.Bundle call(@NonNull String, @NonNull String, @Nullable String, @Nullable android.os.Bundle);
method @Deprecated public void cancelSync(android.net.Uri);
method public static void cancelSync(android.accounts.Account, String);
method public static void cancelSync(android.content.SyncRequest);
method @Nullable public final android.net.Uri canonicalize(@NonNull android.net.Uri);
- method public final int delete(@RequiresPermission.Write @NonNull android.net.Uri, @Nullable String, @Nullable String[]);
+ method public final int delete(@NonNull @RequiresPermission.Write android.net.Uri, @Nullable String, @Nullable String[]);
method @Deprecated public static android.content.SyncInfo getCurrentSync();
method public static java.util.List<android.content.SyncInfo> getCurrentSyncs();
method public static int getIsSyncable(android.accounts.Account, String);
@@ -9636,7 +9636,7 @@ package android.content {
method public static boolean getSyncAutomatically(android.accounts.Account, String);
method @Nullable public final String getType(@NonNull android.net.Uri);
method @NonNull public final android.content.ContentResolver.MimeTypeInfo getTypeInfo(@NonNull String);
- method @Nullable public final android.net.Uri insert(@RequiresPermission.Write @NonNull android.net.Uri, @Nullable android.content.ContentValues);
+ method @Nullable public final android.net.Uri insert(@NonNull @RequiresPermission.Write android.net.Uri, @Nullable android.content.ContentValues);
method public static boolean isSyncActive(android.accounts.Account, String);
method public static boolean isSyncPending(android.accounts.Account, String);
method @NonNull public android.graphics.Bitmap loadThumbnail(@NonNull android.net.Uri, @NonNull android.util.Size, @Nullable android.os.CancellationSignal) throws java.io.IOException;
@@ -9655,9 +9655,9 @@ package android.content {
method @Nullable public final android.content.res.AssetFileDescriptor openTypedAssetFile(@NonNull android.net.Uri, @NonNull String, @Nullable android.os.Bundle, @Nullable android.os.CancellationSignal) throws java.io.FileNotFoundException;
method @Nullable public final android.content.res.AssetFileDescriptor openTypedAssetFileDescriptor(@NonNull android.net.Uri, @NonNull String, @Nullable android.os.Bundle) throws java.io.FileNotFoundException;
method @Nullable public final android.content.res.AssetFileDescriptor openTypedAssetFileDescriptor(@NonNull android.net.Uri, @NonNull String, @Nullable android.os.Bundle, @Nullable android.os.CancellationSignal) throws java.io.FileNotFoundException;
- method @Nullable public final android.database.Cursor query(@RequiresPermission.Read @NonNull android.net.Uri, @Nullable String[], @Nullable String, @Nullable String[], @Nullable String);
- method @Nullable public final android.database.Cursor query(@RequiresPermission.Read @NonNull android.net.Uri, @Nullable String[], @Nullable String, @Nullable String[], @Nullable String, @Nullable android.os.CancellationSignal);
- method @Nullable public final android.database.Cursor query(@RequiresPermission.Read @NonNull android.net.Uri, @Nullable String[], @Nullable android.os.Bundle, @Nullable android.os.CancellationSignal);
+ method @Nullable public final android.database.Cursor query(@NonNull @RequiresPermission.Read android.net.Uri, @Nullable String[], @Nullable String, @Nullable String[], @Nullable String);
+ method @Nullable public final android.database.Cursor query(@NonNull @RequiresPermission.Read android.net.Uri, @Nullable String[], @Nullable String, @Nullable String[], @Nullable String, @Nullable android.os.CancellationSignal);
+ method @Nullable public final android.database.Cursor query(@NonNull @RequiresPermission.Read android.net.Uri, @Nullable String[], @Nullable android.os.Bundle, @Nullable android.os.CancellationSignal);
method public final boolean refresh(@NonNull android.net.Uri, @Nullable android.os.Bundle, @Nullable android.os.CancellationSignal);
method public final void registerContentObserver(@NonNull android.net.Uri, boolean, @NonNull android.database.ContentObserver);
method public void releasePersistableUriPermission(@NonNull android.net.Uri, int);
@@ -9672,7 +9672,7 @@ package android.content {
method public void takePersistableUriPermission(@NonNull android.net.Uri, int);
method @Nullable public final android.net.Uri uncanonicalize(@NonNull android.net.Uri);
method public final void unregisterContentObserver(@NonNull android.database.ContentObserver);
- method public final int update(@RequiresPermission.Write @NonNull android.net.Uri, @Nullable android.content.ContentValues, @Nullable String, @Nullable String[]);
+ method public final int update(@NonNull @RequiresPermission.Write android.net.Uri, @Nullable android.content.ContentValues, @Nullable String, @Nullable String[]);
method public static void validateSyncExtrasBundle(android.os.Bundle);
method @NonNull public static android.content.ContentResolver wrap(@NonNull android.content.ContentProvider);
method @NonNull public static android.content.ContentResolver wrap(@NonNull android.content.ContentProviderClient);
@@ -9770,9 +9770,9 @@ package android.content {
public abstract class Context {
ctor public Context();
- method public boolean bindIsolatedService(@RequiresPermission @NonNull android.content.Intent, int, @NonNull String, @NonNull java.util.concurrent.Executor, @NonNull android.content.ServiceConnection);
+ method public boolean bindIsolatedService(@NonNull @RequiresPermission android.content.Intent, int, @NonNull String, @NonNull java.util.concurrent.Executor, @NonNull android.content.ServiceConnection);
method public abstract boolean bindService(@RequiresPermission android.content.Intent, @NonNull android.content.ServiceConnection, int);
- method public boolean bindService(@RequiresPermission @NonNull android.content.Intent, int, @NonNull java.util.concurrent.Executor, @NonNull android.content.ServiceConnection);
+ method public boolean bindService(@NonNull @RequiresPermission android.content.Intent, int, @NonNull java.util.concurrent.Executor, @NonNull android.content.ServiceConnection);
method @CheckResult(suggest="#enforceCallingOrSelfPermission(String,String)") public abstract int checkCallingOrSelfPermission(@NonNull String);
method @CheckResult(suggest="#enforceCallingOrSelfUriPermission(Uri,int,String)") public abstract int checkCallingOrSelfUriPermission(android.net.Uri, int);
method @CheckResult(suggest="#enforceCallingPermission(String,String)") public abstract int checkCallingPermission(@NonNull String);
@@ -9871,7 +9871,8 @@ package android.content {
method @RequiresPermission("android.permission.INTERACT_ACROSS_USERS") public abstract void sendBroadcastAsUser(@RequiresPermission android.content.Intent, android.os.UserHandle);
method @RequiresPermission("android.permission.INTERACT_ACROSS_USERS") public abstract void sendBroadcastAsUser(@RequiresPermission android.content.Intent, android.os.UserHandle, @Nullable String);
method public abstract void sendOrderedBroadcast(@RequiresPermission android.content.Intent, @Nullable String);
- method public abstract void sendOrderedBroadcast(@RequiresPermission @NonNull android.content.Intent, @Nullable String, @Nullable android.content.BroadcastReceiver, @Nullable android.os.Handler, int, @Nullable String, @Nullable android.os.Bundle);
+ method public abstract void sendOrderedBroadcast(@NonNull @RequiresPermission android.content.Intent, @Nullable String, @Nullable android.content.BroadcastReceiver, @Nullable android.os.Handler, int, @Nullable String, @Nullable android.os.Bundle);
+ method public void sendOrderedBroadcast(@NonNull @RequiresPermission android.content.Intent, @Nullable String, @Nullable String, @Nullable android.content.BroadcastReceiver, @Nullable android.os.Handler, int, @Nullable String, @Nullable android.os.Bundle);
method @RequiresPermission("android.permission.INTERACT_ACROSS_USERS") public abstract void sendOrderedBroadcastAsUser(@RequiresPermission android.content.Intent, android.os.UserHandle, @Nullable String, android.content.BroadcastReceiver, @Nullable android.os.Handler, int, @Nullable String, @Nullable android.os.Bundle);
method @Deprecated @RequiresPermission(android.Manifest.permission.BROADCAST_STICKY) public abstract void sendStickyBroadcast(@RequiresPermission android.content.Intent);
method @Deprecated @RequiresPermission(allOf={"android.permission.INTERACT_ACROSS_USERS", android.Manifest.permission.BROADCAST_STICKY}) public abstract void sendStickyBroadcastAsUser(@RequiresPermission android.content.Intent, android.os.UserHandle);
@@ -11725,7 +11726,7 @@ package android.content.pm {
method @NonNull public abstract android.graphics.drawable.Drawable getUserBadgedDrawableForDensity(@NonNull android.graphics.drawable.Drawable, @NonNull android.os.UserHandle, @Nullable android.graphics.Rect, int);
method @NonNull public abstract android.graphics.drawable.Drawable getUserBadgedIcon(@NonNull android.graphics.drawable.Drawable, @NonNull android.os.UserHandle);
method @NonNull public abstract CharSequence getUserBadgedLabel(@NonNull CharSequence, @NonNull android.os.UserHandle);
- method @RequiresPermission(value="android.permission.WHITELIST_RESTRICTED_PERMISSIONS", conditional=true) @NonNull public java.util.Set<java.lang.String> getWhitelistedRestrictedPermissions(@NonNull String, int);
+ method @NonNull @RequiresPermission(value="android.permission.WHITELIST_RESTRICTED_PERMISSIONS", conditional=true) public java.util.Set<java.lang.String> getWhitelistedRestrictedPermissions(@NonNull String, int);
method @Nullable public abstract android.content.res.XmlResourceParser getXml(@NonNull String, @XmlRes int, @Nullable android.content.pm.ApplicationInfo);
method public boolean hasSigningCertificate(@NonNull String, @NonNull byte[], int);
method public boolean hasSigningCertificate(int, @NonNull byte[], int);
@@ -12419,7 +12420,7 @@ package android.content.res {
method public int addLoader(@NonNull android.content.res.loader.ResourceLoader, @NonNull android.content.res.loader.ResourcesProvider);
method public final void finishPreloading();
method public final void flushLayoutCache();
- method @NonNull public android.content.res.XmlResourceParser getAnimation(@AnimatorRes @AnimRes int) throws android.content.res.Resources.NotFoundException;
+ method @NonNull public android.content.res.XmlResourceParser getAnimation(@AnimRes @AnimatorRes int) throws android.content.res.Resources.NotFoundException;
method public final android.content.res.AssetManager getAssets();
method @AnyRes public static int getAttributeSetSourceResId(@Nullable android.util.AttributeSet);
method public boolean getBoolean(@BoolRes int) throws android.content.res.Resources.NotFoundException;
@@ -13725,10 +13726,10 @@ package android.graphics {
method public static android.graphics.Bitmap createBitmap(int, int, @NonNull android.graphics.Bitmap.Config, boolean, @NonNull android.graphics.ColorSpace);
method public static android.graphics.Bitmap createBitmap(@Nullable android.util.DisplayMetrics, int, int, @NonNull android.graphics.Bitmap.Config, boolean);
method public static android.graphics.Bitmap createBitmap(@Nullable android.util.DisplayMetrics, int, int, @NonNull android.graphics.Bitmap.Config, boolean, @NonNull android.graphics.ColorSpace);
- method public static android.graphics.Bitmap createBitmap(@NonNull @ColorInt int[], int, int, int, int, @NonNull android.graphics.Bitmap.Config);
- method public static android.graphics.Bitmap createBitmap(@NonNull android.util.DisplayMetrics, @NonNull @ColorInt int[], int, int, int, int, @NonNull android.graphics.Bitmap.Config);
- method public static android.graphics.Bitmap createBitmap(@NonNull @ColorInt int[], int, int, android.graphics.Bitmap.Config);
- method public static android.graphics.Bitmap createBitmap(@Nullable android.util.DisplayMetrics, @NonNull @ColorInt int[], int, int, @NonNull android.graphics.Bitmap.Config);
+ method public static android.graphics.Bitmap createBitmap(@ColorInt @NonNull int[], int, int, int, int, @NonNull android.graphics.Bitmap.Config);
+ method public static android.graphics.Bitmap createBitmap(@NonNull android.util.DisplayMetrics, @ColorInt @NonNull int[], int, int, int, int, @NonNull android.graphics.Bitmap.Config);
+ method public static android.graphics.Bitmap createBitmap(@ColorInt @NonNull int[], int, int, android.graphics.Bitmap.Config);
+ method public static android.graphics.Bitmap createBitmap(@Nullable android.util.DisplayMetrics, @ColorInt @NonNull int[], int, int, @NonNull android.graphics.Bitmap.Config);
method @NonNull public static android.graphics.Bitmap createBitmap(@NonNull android.graphics.Picture);
method @NonNull public static android.graphics.Bitmap createBitmap(@NonNull android.graphics.Picture, int, int, @NonNull android.graphics.Bitmap.Config);
method public static android.graphics.Bitmap createScaledBitmap(@NonNull android.graphics.Bitmap, int, int, boolean);
@@ -13961,8 +13962,8 @@ package android.graphics {
method public void drawDoubleRoundRect(@NonNull android.graphics.RectF, float, float, @NonNull android.graphics.RectF, float, float, @NonNull android.graphics.Paint);
method public void drawDoubleRoundRect(@NonNull android.graphics.RectF, @NonNull float[], @NonNull android.graphics.RectF, @NonNull float[], @NonNull android.graphics.Paint);
method public void drawLine(float, float, float, float, @NonNull android.graphics.Paint);
- method public void drawLines(@Size(multiple=4) @NonNull float[], int, int, @NonNull android.graphics.Paint);
- method public void drawLines(@Size(multiple=4) @NonNull float[], @NonNull android.graphics.Paint);
+ method public void drawLines(@NonNull @Size(multiple=4) float[], int, int, @NonNull android.graphics.Paint);
+ method public void drawLines(@NonNull @Size(multiple=4) float[], @NonNull android.graphics.Paint);
method public void drawOval(@NonNull android.graphics.RectF, @NonNull android.graphics.Paint);
method public void drawOval(float, float, float, float, @NonNull android.graphics.Paint);
method public void drawPaint(@NonNull android.graphics.Paint);
@@ -13972,7 +13973,7 @@ package android.graphics {
method public void drawPicture(@NonNull android.graphics.Picture, @NonNull android.graphics.Rect);
method public void drawPoint(float, float, @NonNull android.graphics.Paint);
method public void drawPoints(@Size(multiple=2) float[], int, int, @NonNull android.graphics.Paint);
- method public void drawPoints(@Size(multiple=2) @NonNull float[], @NonNull android.graphics.Paint);
+ method public void drawPoints(@NonNull @Size(multiple=2) float[], @NonNull android.graphics.Paint);
method @Deprecated public void drawPosText(@NonNull char[], int, int, @NonNull @Size(multiple=2) float[], @NonNull android.graphics.Paint);
method @Deprecated public void drawPosText(@NonNull String, @NonNull @Size(multiple=2) float[], @NonNull android.graphics.Paint);
method public void drawRGB(int, int, int);
@@ -14333,10 +14334,10 @@ package android.graphics {
method @AnyThread @NonNull public static android.graphics.ImageDecoder.Source createSource(@NonNull java.nio.ByteBuffer);
method @AnyThread @NonNull public static android.graphics.ImageDecoder.Source createSource(@NonNull java.io.File);
method @AnyThread @NonNull public static android.graphics.ImageDecoder.Source createSource(@NonNull java.util.concurrent.Callable<android.content.res.AssetFileDescriptor>);
- method @WorkerThread @NonNull public static android.graphics.Bitmap decodeBitmap(@NonNull android.graphics.ImageDecoder.Source, @NonNull android.graphics.ImageDecoder.OnHeaderDecodedListener) throws java.io.IOException;
- method @WorkerThread @NonNull public static android.graphics.Bitmap decodeBitmap(@NonNull android.graphics.ImageDecoder.Source) throws java.io.IOException;
- method @WorkerThread @NonNull public static android.graphics.drawable.Drawable decodeDrawable(@NonNull android.graphics.ImageDecoder.Source, @NonNull android.graphics.ImageDecoder.OnHeaderDecodedListener) throws java.io.IOException;
- method @WorkerThread @NonNull public static android.graphics.drawable.Drawable decodeDrawable(@NonNull android.graphics.ImageDecoder.Source) throws java.io.IOException;
+ method @NonNull @WorkerThread public static android.graphics.Bitmap decodeBitmap(@NonNull android.graphics.ImageDecoder.Source, @NonNull android.graphics.ImageDecoder.OnHeaderDecodedListener) throws java.io.IOException;
+ method @NonNull @WorkerThread public static android.graphics.Bitmap decodeBitmap(@NonNull android.graphics.ImageDecoder.Source) throws java.io.IOException;
+ method @NonNull @WorkerThread public static android.graphics.drawable.Drawable decodeDrawable(@NonNull android.graphics.ImageDecoder.Source, @NonNull android.graphics.ImageDecoder.OnHeaderDecodedListener) throws java.io.IOException;
+ method @NonNull @WorkerThread public static android.graphics.drawable.Drawable decodeDrawable(@NonNull android.graphics.ImageDecoder.Source) throws java.io.IOException;
method public int getAllocator();
method @Nullable public android.graphics.Rect getCrop();
method public int getMemorySizePolicy();
@@ -14355,7 +14356,7 @@ package android.graphics {
method public void setPostProcessor(@Nullable android.graphics.PostProcessor);
method public void setTargetColorSpace(android.graphics.ColorSpace);
method public void setTargetSampleSize(@IntRange(from=1) int);
- method public void setTargetSize(@Px @IntRange(from=1) int, @Px @IntRange(from=1) int);
+ method public void setTargetSize(@IntRange(from=1) @Px int, @IntRange(from=1) @Px int);
method public void setUnpremultipliedRequired(boolean);
field public static final int ALLOCATOR_DEFAULT = 0; // 0x0
field public static final int ALLOCATOR_HARDWARE = 3; // 0x3
@@ -14462,8 +14463,8 @@ package android.graphics {
}
public class LinearGradient extends android.graphics.Shader {
- ctor public LinearGradient(float, float, float, float, @NonNull @ColorInt int[], @Nullable float[], @NonNull android.graphics.Shader.TileMode);
- ctor public LinearGradient(float, float, float, float, @NonNull @ColorLong long[], @Nullable float[], @NonNull android.graphics.Shader.TileMode);
+ ctor public LinearGradient(float, float, float, float, @ColorInt @NonNull int[], @Nullable float[], @NonNull android.graphics.Shader.TileMode);
+ ctor public LinearGradient(float, float, float, float, @ColorLong @NonNull long[], @Nullable float[], @NonNull android.graphics.Shader.TileMode);
ctor public LinearGradient(float, float, float, float, @ColorInt int, @ColorInt int, @NonNull android.graphics.Shader.TileMode);
ctor public LinearGradient(float, float, float, float, @ColorLong long, @ColorLong long, @NonNull android.graphics.Shader.TileMode);
}
@@ -15006,8 +15007,8 @@ package android.graphics {
}
public class RadialGradient extends android.graphics.Shader {
- ctor public RadialGradient(float, float, float, @NonNull @ColorInt int[], @Nullable float[], @NonNull android.graphics.Shader.TileMode);
- ctor public RadialGradient(float, float, float, @NonNull @ColorLong long[], @Nullable float[], @NonNull android.graphics.Shader.TileMode);
+ ctor public RadialGradient(float, float, float, @ColorInt @NonNull int[], @Nullable float[], @NonNull android.graphics.Shader.TileMode);
+ ctor public RadialGradient(float, float, float, @ColorLong @NonNull long[], @Nullable float[], @NonNull android.graphics.Shader.TileMode);
ctor public RadialGradient(float, float, float, @ColorInt int, @ColorInt int, @NonNull android.graphics.Shader.TileMode);
ctor public RadialGradient(float, float, float, @ColorLong long, @ColorLong long, @NonNull android.graphics.Shader.TileMode);
}
@@ -15265,8 +15266,8 @@ package android.graphics {
}
public class SweepGradient extends android.graphics.Shader {
- ctor public SweepGradient(float, float, @NonNull @ColorInt int[], @Nullable float[]);
- ctor public SweepGradient(float, float, @NonNull @ColorLong long[], @Nullable float[]);
+ ctor public SweepGradient(float, float, @ColorInt @NonNull int[], @Nullable float[]);
+ ctor public SweepGradient(float, float, @ColorLong @NonNull long[], @Nullable float[]);
ctor public SweepGradient(float, float, @ColorInt int, @ColorInt int);
ctor public SweepGradient(float, float, @ColorLong long, @ColorLong long);
}
@@ -15659,8 +15660,8 @@ package android.graphics.drawable {
method public void setColor(@ColorInt int);
method public void setColor(@Nullable android.content.res.ColorStateList);
method public void setColorFilter(@Nullable android.graphics.ColorFilter);
- method public void setColors(@Nullable @ColorInt int[]);
- method public void setColors(@Nullable @ColorInt int[], @Nullable float[]);
+ method public void setColors(@ColorInt @Nullable int[]);
+ method public void setColors(@ColorInt @Nullable int[], @Nullable float[]);
method public void setCornerRadii(@Nullable float[]);
method public void setCornerRadius(float);
method public void setDither(boolean);
@@ -16108,14 +16109,14 @@ package android.graphics.text {
public static class LineBreaker.ParagraphConstraints {
ctor public LineBreaker.ParagraphConstraints();
- method @Px @FloatRange(from=0) public float getDefaultTabStop();
- method @Px @FloatRange(from=0.0f) public float getFirstWidth();
- method @Px @IntRange(from=0) public int getFirstWidthLineCount();
+ method @FloatRange(from=0) @Px public float getDefaultTabStop();
+ method @FloatRange(from=0.0f) @Px public float getFirstWidth();
+ method @IntRange(from=0) @Px public int getFirstWidthLineCount();
method @Nullable public float[] getTabStops();
- method @Px @FloatRange(from=0.0f) public float getWidth();
- method public void setIndent(@Px @FloatRange(from=0.0f) float, @Px @IntRange(from=0) int);
- method public void setTabStops(@Nullable float[], @Px @FloatRange(from=0) float);
- method public void setWidth(@Px @FloatRange(from=0.0f) float);
+ method @FloatRange(from=0.0f) @Px public float getWidth();
+ method public void setIndent(@FloatRange(from=0.0f) @Px float, @IntRange(from=0) @Px int);
+ method public void setTabStops(@Nullable float[], @FloatRange(from=0) @Px float);
+ method public void setWidth(@FloatRange(from=0.0f) @Px float);
}
public static class LineBreaker.Result {
@@ -16138,7 +16139,7 @@ package android.graphics.text {
public static final class MeasuredText.Builder {
ctor public MeasuredText.Builder(@NonNull char[]);
ctor public MeasuredText.Builder(@NonNull android.graphics.text.MeasuredText);
- method @NonNull public android.graphics.text.MeasuredText.Builder appendReplacementRun(@NonNull android.graphics.Paint, @IntRange(from=0) int, @Px @FloatRange(from=0) float);
+ method @NonNull public android.graphics.text.MeasuredText.Builder appendReplacementRun(@NonNull android.graphics.Paint, @IntRange(from=0) int, @FloatRange(from=0) @Px float);
method @NonNull public android.graphics.text.MeasuredText.Builder appendStyleRun(@NonNull android.graphics.Paint, @IntRange(from=0) int, boolean);
method @NonNull public android.graphics.text.MeasuredText build();
method @NonNull public android.graphics.text.MeasuredText.Builder setComputeHyphenation(boolean);
@@ -16859,6 +16860,7 @@ package android.hardware.camera2 {
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<android.hardware.camera2.params.CapabilityAndMaxSize[]> CONTROL_AVAILABLE_BOKEH_CAPABILITIES;
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;
@@ -17074,6 +17076,9 @@ package android.hardware.camera2 {
field public static final int CONTROL_AWB_STATE_INACTIVE = 0; // 0x0
field public static final int CONTROL_AWB_STATE_LOCKED = 3; // 0x3
field public static final int CONTROL_AWB_STATE_SEARCHING = 1; // 0x1
+ field public static final int CONTROL_BOKEH_MODE_CONTINUOUS = 2; // 0x2
+ field public static final int CONTROL_BOKEH_MODE_OFF = 0; // 0x0
+ field public static final int CONTROL_BOKEH_MODE_STILL_CAPTURE = 1; // 0x1
field public static final int CONTROL_CAPTURE_INTENT_CUSTOM = 0; // 0x0
field public static final int CONTROL_CAPTURE_INTENT_MANUAL = 6; // 0x6
field public static final int CONTROL_CAPTURE_INTENT_MOTION_TRACKING = 7; // 0x7
@@ -17269,6 +17274,7 @@ package android.hardware.camera2 {
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_BOKEH_MODE;
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;
@@ -17354,6 +17360,7 @@ package android.hardware.camera2 {
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_BOKEH_MODE;
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;
@@ -17450,6 +17457,11 @@ package android.hardware.camera2.params {
field public static final int COUNT = 4; // 0x4
}
+ public final class CapabilityAndMaxSize {
+ method @NonNull public android.util.Size getMaxStreamingSize();
+ method public int getMode();
+ }
+
public final class ColorSpaceTransform {
ctor public ColorSpaceTransform(android.util.Rational[]);
ctor public ColorSpaceTransform(int[]);
@@ -23157,7 +23169,7 @@ package android.location {
method @Nullable public String getGnssHardwareModelName();
method public int getGnssYearOfHardware();
method @Deprecated @Nullable @RequiresPermission(android.Manifest.permission.ACCESS_FINE_LOCATION) public android.location.GpsStatus getGpsStatus(@Nullable android.location.GpsStatus);
- method @RequiresPermission(anyOf={android.Manifest.permission.ACCESS_COARSE_LOCATION, android.Manifest.permission.ACCESS_FINE_LOCATION}) @Nullable public android.location.Location getLastKnownLocation(@NonNull String);
+ method @Nullable @RequiresPermission(anyOf={android.Manifest.permission.ACCESS_COARSE_LOCATION, android.Manifest.permission.ACCESS_FINE_LOCATION}) public android.location.Location getLastKnownLocation(@NonNull String);
method @Nullable public android.location.LocationProvider getProvider(@NonNull String);
method @NonNull public java.util.List<java.lang.String> getProviders(boolean);
method @NonNull public java.util.List<java.lang.String> getProviders(@NonNull android.location.Criteria, boolean);
@@ -28628,17 +28640,17 @@ package android.net {
method public void addDefaultNetworkActiveListener(android.net.ConnectivityManager.OnNetworkActiveListener);
method public boolean bindProcessToNetwork(@Nullable android.net.Network);
method @NonNull public android.net.SocketKeepalive createSocketKeepalive(@NonNull android.net.Network, @NonNull android.net.IpSecManager.UdpEncapsulationSocket, @NonNull java.net.InetAddress, @NonNull java.net.InetAddress, @NonNull java.util.concurrent.Executor, @NonNull android.net.SocketKeepalive.Callback);
- method @RequiresPermission(android.Manifest.permission.ACCESS_NETWORK_STATE) @Nullable public android.net.Network getActiveNetwork();
+ method @Nullable @RequiresPermission(android.Manifest.permission.ACCESS_NETWORK_STATE) public android.net.Network getActiveNetwork();
method @Deprecated @Nullable @RequiresPermission(android.Manifest.permission.ACCESS_NETWORK_STATE) public android.net.NetworkInfo getActiveNetworkInfo();
method @Deprecated @NonNull @RequiresPermission(android.Manifest.permission.ACCESS_NETWORK_STATE) public android.net.NetworkInfo[] getAllNetworkInfo();
- method @RequiresPermission(android.Manifest.permission.ACCESS_NETWORK_STATE) @NonNull public android.net.Network[] getAllNetworks();
+ method @NonNull @RequiresPermission(android.Manifest.permission.ACCESS_NETWORK_STATE) public android.net.Network[] getAllNetworks();
method @Deprecated public boolean getBackgroundDataSetting();
method @Nullable public android.net.Network getBoundNetworkForProcess();
method public int getConnectionOwnerUid(int, @NonNull java.net.InetSocketAddress, @NonNull java.net.InetSocketAddress);
method @Nullable public android.net.ProxyInfo getDefaultProxy();
- method @RequiresPermission(android.Manifest.permission.ACCESS_NETWORK_STATE) @Nullable public android.net.LinkProperties getLinkProperties(@Nullable android.net.Network);
+ method @Nullable @RequiresPermission(android.Manifest.permission.ACCESS_NETWORK_STATE) public android.net.LinkProperties getLinkProperties(@Nullable android.net.Network);
method @RequiresPermission(android.Manifest.permission.ACCESS_NETWORK_STATE) public int getMultipathPreference(@Nullable android.net.Network);
- method @RequiresPermission(android.Manifest.permission.ACCESS_NETWORK_STATE) @Nullable public android.net.NetworkCapabilities getNetworkCapabilities(@Nullable android.net.Network);
+ method @Nullable @RequiresPermission(android.Manifest.permission.ACCESS_NETWORK_STATE) public android.net.NetworkCapabilities getNetworkCapabilities(@Nullable android.net.Network);
method @Deprecated @Nullable @RequiresPermission(android.Manifest.permission.ACCESS_NETWORK_STATE) public android.net.NetworkInfo getNetworkInfo(int);
method @Deprecated @Nullable @RequiresPermission(android.Manifest.permission.ACCESS_NETWORK_STATE) public android.net.NetworkInfo getNetworkInfo(@Nullable android.net.Network);
method @Deprecated @RequiresPermission(android.Manifest.permission.ACCESS_NETWORK_STATE) public int getNetworkPreference();
@@ -29774,6 +29786,7 @@ package android.net.wifi {
public class ScanResult implements android.os.Parcelable {
method public int describeContents();
+ method public int getWifiStandard();
method public boolean is80211mcResponder();
method public boolean isPasspointNetwork();
method public void writeToParcel(android.os.Parcel, int);
@@ -29784,6 +29797,11 @@ package android.net.wifi {
field public static final int CHANNEL_WIDTH_80MHZ = 2; // 0x2
field public static final int CHANNEL_WIDTH_80MHZ_PLUS_MHZ = 4; // 0x4
field public String SSID;
+ field public static final int WIFI_STANDARD_11AC = 5; // 0x5
+ field public static final int WIFI_STANDARD_11AX = 6; // 0x6
+ field public static final int WIFI_STANDARD_11N = 4; // 0x4
+ field public static final int WIFI_STANDARD_LEGACY = 1; // 0x1
+ field public static final int WIFI_STANDARD_UNKNOWN = 0; // 0x0
field public String capabilities;
field public int centerFreq0;
field public int centerFreq1;
@@ -29980,16 +29998,11 @@ package android.net.wifi {
method public String getSSID();
method public android.net.wifi.SupplicantState getSupplicantState();
method @IntRange(from=0xffffffff) public int getTxLinkSpeedMbps();
- method public int getWifiTechnology();
+ method public int getWifiStandard();
method public void writeToParcel(android.os.Parcel, int);
field public static final String FREQUENCY_UNITS = "MHz";
field public static final String LINK_SPEED_UNITS = "Mbps";
field public static final int LINK_SPEED_UNKNOWN = -1; // 0xffffffff
- field public static final int WIFI_TECHNOLOGY_11AC = 5; // 0x5
- field public static final int WIFI_TECHNOLOGY_11AX = 6; // 0x6
- field public static final int WIFI_TECHNOLOGY_11N = 4; // 0x4
- field public static final int WIFI_TECHNOLOGY_LEGACY = 1; // 0x1
- field public static final int WIFI_TECHNOLOGY_UNKNOWN = 0; // 0x0
}
public class WifiManager {
@@ -30010,7 +30023,7 @@ package android.net.wifi {
method public android.net.wifi.WifiInfo getConnectionInfo();
method public android.net.DhcpInfo getDhcpInfo();
method public int getMaxNumberOfNetworkSuggestionsPerApp();
- method @RequiresPermission(android.Manifest.permission.ACCESS_WIFI_STATE) @NonNull public java.util.List<android.net.wifi.WifiNetworkSuggestion> getNetworkSuggestions();
+ method @NonNull @RequiresPermission(android.Manifest.permission.ACCESS_WIFI_STATE) public java.util.List<android.net.wifi.WifiNetworkSuggestion> getNetworkSuggestions();
method @Deprecated @RequiresPermission(anyOf={"android.permission.NETWORK_SETTINGS", "android.permission.NETWORK_SETUP_WIZARD"}) public java.util.List<android.net.wifi.hotspot2.PasspointConfiguration> getPasspointConfigurations();
method public java.util.List<android.net.wifi.ScanResult> getScanResults();
method public int getWifiState();
@@ -30961,10 +30974,10 @@ package android.nfc.cardemulation {
method public boolean isDefaultServiceForCategory(android.content.ComponentName, String);
method public boolean registerAidsForService(android.content.ComponentName, String, java.util.List<java.lang.String>);
method public boolean removeAidsForService(android.content.ComponentName, String);
- method @RequiresPermission(android.Manifest.permission.NFC) @NonNull public boolean setOffHostForService(@NonNull android.content.ComponentName, @NonNull String);
+ method @NonNull @RequiresPermission(android.Manifest.permission.NFC) public boolean setOffHostForService(@NonNull android.content.ComponentName, @NonNull String);
method public boolean setPreferredService(android.app.Activity, android.content.ComponentName);
method public boolean supportsAidPrefixRegistration();
- method @RequiresPermission(android.Manifest.permission.NFC) @NonNull public boolean unsetOffHostForService(@NonNull android.content.ComponentName);
+ method @NonNull @RequiresPermission(android.Manifest.permission.NFC) public boolean unsetOffHostForService(@NonNull android.content.ComponentName);
method public boolean unsetPreferredService(android.app.Activity);
field public static final String ACTION_CHANGE_DEFAULT = "android.nfc.cardemulation.action.ACTION_CHANGE_DEFAULT";
field public static final String CATEGORY_OTHER = "other";
@@ -34620,7 +34633,7 @@ package android.os {
method public void addData(String, byte[], int);
method public void addFile(String, java.io.File, int) throws java.io.IOException;
method public void addText(String, String);
- method @RequiresPermission(allOf={android.Manifest.permission.READ_LOGS, android.Manifest.permission.PACKAGE_USAGE_STATS}) @Nullable public android.os.DropBoxManager.Entry getNextEntry(String, long);
+ method @Nullable @RequiresPermission(allOf={android.Manifest.permission.READ_LOGS, android.Manifest.permission.PACKAGE_USAGE_STATS}) public android.os.DropBoxManager.Entry getNextEntry(String, long);
method public boolean isTagEnabled(String);
field public static final String ACTION_DROPBOX_ENTRY_ADDED = "android.intent.action.DROPBOX_ENTRY_ADDED";
field public static final String EXTRA_DROPPED_COUNT = "android.os.extra.DROPPED_COUNT";
@@ -35506,7 +35519,7 @@ package android.os {
method public String getUserName();
method public java.util.List<android.os.UserHandle> getUserProfiles();
method public android.os.Bundle getUserRestrictions();
- method public android.os.Bundle getUserRestrictions(android.os.UserHandle);
+ method @RequiresPermission(anyOf={"android.permission.MANAGE_USERS", "android.permission.INTERACT_ACROSS_USERS"}, conditional=true) public android.os.Bundle getUserRestrictions(android.os.UserHandle);
method public boolean hasUserRestriction(String);
method public boolean isDemoUser();
method public boolean isQuietModeEnabled(android.os.UserHandle);
@@ -44037,7 +44050,7 @@ package android.telecom {
method @RequiresPermission(android.Manifest.permission.READ_PHONE_STATE) public java.util.List<android.telecom.PhoneAccountHandle> getSelfManagedPhoneAccounts();
method public android.telecom.PhoneAccountHandle getSimCallManager();
method @Nullable public String getSystemDialerPackage();
- method @RequiresPermission(android.Manifest.permission.READ_PHONE_STATE) @Nullable public android.telecom.PhoneAccountHandle getUserSelectedOutgoingPhoneAccount();
+ method @Nullable @RequiresPermission(android.Manifest.permission.READ_PHONE_STATE) public android.telecom.PhoneAccountHandle getUserSelectedOutgoingPhoneAccount();
method @RequiresPermission(android.Manifest.permission.READ_PHONE_STATE) public String getVoiceMailNumber(android.telecom.PhoneAccountHandle);
method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public boolean handleMmi(String);
method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public boolean handleMmi(String, android.telecom.PhoneAccountHandle);
@@ -44966,6 +44979,7 @@ package android.telephony {
method public static int getDefaultSmsSubscriptionId();
method public static android.telephony.SmsManager getSmsManagerForSubscriptionId(int);
method @RequiresPermission(android.Manifest.permission.SMS_FINANCIAL_TRANSACTIONS) public void getSmsMessagesForFinancialApp(android.os.Bundle, @NonNull java.util.concurrent.Executor, @NonNull android.telephony.SmsManager.FinancialSmsCallback);
+ method @Nullable @RequiresPermission("android.permission.READ_PRIVILEGED_PHONE_STATE") public String getSmscAddress();
method public int getSubscriptionId();
method public void injectSmsPdu(byte[], String, android.app.PendingIntent);
method public void sendDataMessage(String, String, short, byte[], android.app.PendingIntent, android.app.PendingIntent);
@@ -44973,6 +44987,7 @@ package android.telephony {
method public void sendMultipartTextMessage(String, String, java.util.ArrayList<java.lang.String>, java.util.ArrayList<android.app.PendingIntent>, java.util.ArrayList<android.app.PendingIntent>);
method public void sendTextMessage(String, String, String, android.app.PendingIntent, android.app.PendingIntent);
method @RequiresPermission(allOf={android.Manifest.permission.MODIFY_PHONE_STATE, android.Manifest.permission.SEND_SMS}) public void sendTextMessageWithoutPersisting(String, String, String, android.app.PendingIntent, android.app.PendingIntent);
+ method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public boolean setSmscAddress(@NonNull String);
field public static final String EXTRA_MMS_DATA = "android.telephony.extra.MMS_DATA";
field public static final String EXTRA_MMS_HTTP_STATUS = "android.telephony.extra.MMS_HTTP_STATUS";
field public static final String MMS_CONFIG_ALIAS_ENABLED = "aliasEnabled";
@@ -45273,9 +45288,9 @@ package android.telephony {
method public int getDataState();
method @Deprecated @RequiresPermission("android.permission.READ_PRIVILEGED_PHONE_STATE") public String getDeviceId();
method @Deprecated @RequiresPermission("android.permission.READ_PRIVILEGED_PHONE_STATE") public String getDeviceId(int);
- method @RequiresPermission(android.Manifest.permission.READ_PHONE_STATE) @Nullable public String getDeviceSoftwareVersion();
- method @RequiresPermission(android.Manifest.permission.READ_PHONE_STATE) @NonNull public java.util.Map<java.lang.Integer,java.util.List<android.telephony.emergency.EmergencyNumber>> getEmergencyNumberList();
- method @RequiresPermission(android.Manifest.permission.READ_PHONE_STATE) @NonNull public java.util.Map<java.lang.Integer,java.util.List<android.telephony.emergency.EmergencyNumber>> getEmergencyNumberList(int);
+ method @Nullable @RequiresPermission(android.Manifest.permission.READ_PHONE_STATE) public String getDeviceSoftwareVersion();
+ method @NonNull @RequiresPermission(android.Manifest.permission.READ_PHONE_STATE) public java.util.Map<java.lang.Integer,java.util.List<android.telephony.emergency.EmergencyNumber>> getEmergencyNumberList();
+ method @NonNull @RequiresPermission(android.Manifest.permission.READ_PHONE_STATE) public java.util.Map<java.lang.Integer,java.util.List<android.telephony.emergency.EmergencyNumber>> getEmergencyNumberList(int);
method @RequiresPermission(android.Manifest.permission.READ_PHONE_STATE) public String[] getForbiddenPlmns();
method @RequiresPermission(android.Manifest.permission.READ_PHONE_STATE) public String getGroupIdLevel1();
method public String getIccAuthentication(int, int, String);
@@ -45309,11 +45324,12 @@ package android.telephony {
method @Nullable public CharSequence getSimSpecificCarrierIdName();
method public int getSimState();
method public int getSimState(int);
+ method @RequiresPermission(android.Manifest.permission.READ_PHONE_STATE) public int getSubIdForPhoneAccountHandle(@NonNull android.telecom.PhoneAccountHandle);
method @RequiresPermission("android.permission.READ_PRIVILEGED_PHONE_STATE") public String getSubscriberId();
method public int getSupportedModemCount();
method @Nullable public String getTypeAllocationCode();
method @Nullable public String getTypeAllocationCode(int);
- method @RequiresPermission("android.permission.READ_PRIVILEGED_PHONE_STATE") @NonNull public java.util.List<android.telephony.UiccCardInfo> getUiccCardsInfo();
+ method @NonNull @RequiresPermission("android.permission.READ_PRIVILEGED_PHONE_STATE") 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();
@@ -47247,7 +47263,7 @@ package android.text.style {
}
public static class LineHeightSpan.Standard implements android.text.style.LineHeightSpan android.text.ParcelableSpan {
- ctor public LineHeightSpan.Standard(@Px @IntRange(from=1) int);
+ ctor public LineHeightSpan.Standard(@IntRange(from=1) @Px int);
ctor public LineHeightSpan.Standard(@NonNull android.os.Parcel);
method public void chooseHeight(@NonNull CharSequence, int, int, int, int, @NonNull android.graphics.Paint.FontMetricsInt);
method public int describeContents();
@@ -49178,6 +49194,7 @@ package android.view {
public class HapticFeedbackConstants {
field public static final int CLOCK_TICK = 4; // 0x4
+ field public static final int CONFIRM = 16; // 0x10
field public static final int CONTEXT_CLICK = 6; // 0x6
field public static final int FLAG_IGNORE_GLOBAL_SETTING = 2; // 0x2
field public static final int FLAG_IGNORE_VIEW_SETTING = 1; // 0x1
@@ -49185,6 +49202,7 @@ package android.view {
field public static final int KEYBOARD_RELEASE = 7; // 0x7
field public static final int KEYBOARD_TAP = 3; // 0x3
field public static final int LONG_PRESS = 0; // 0x0
+ field public static final int REJECT = 17; // 0x11
field public static final int TEXT_HANDLE_MOVE = 9; // 0x9
field public static final int VIRTUAL_KEY = 1; // 0x1
field public static final int VIRTUAL_KEY_RELEASE = 8; // 0x8
@@ -51393,11 +51411,11 @@ package android.view {
field @Deprecated public static final boolean TRACE_RECYCLER = false;
}
- @java.lang.annotation.Target({java.lang.annotation.ElementType.FIELD, java.lang.annotation.ElementType.METHOD}) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.RUNTIME) public static @interface ViewDebug.CapturedViewProperty {
+ @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.RUNTIME) @java.lang.annotation.Target({java.lang.annotation.ElementType.FIELD, java.lang.annotation.ElementType.METHOD}) public static @interface ViewDebug.CapturedViewProperty {
method public abstract boolean retrieveReturn() default false;
}
- @java.lang.annotation.Target({java.lang.annotation.ElementType.FIELD, java.lang.annotation.ElementType.METHOD}) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.RUNTIME) public static @interface ViewDebug.ExportedProperty {
+ @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.RUNTIME) @java.lang.annotation.Target({java.lang.annotation.ElementType.FIELD, java.lang.annotation.ElementType.METHOD}) public static @interface ViewDebug.ExportedProperty {
method public abstract String category() default "";
method public abstract boolean deepExport() default false;
method public abstract android.view.ViewDebug.FlagToString[] flagMapping() default {};
@@ -51409,7 +51427,7 @@ package android.view {
method public abstract boolean resolveId() default false;
}
- @java.lang.annotation.Target({java.lang.annotation.ElementType.TYPE}) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.RUNTIME) public static @interface ViewDebug.FlagToString {
+ @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.RUNTIME) @java.lang.annotation.Target({java.lang.annotation.ElementType.TYPE}) public static @interface ViewDebug.FlagToString {
method public abstract int equals();
method public abstract int mask();
method public abstract String name();
@@ -51427,7 +51445,7 @@ package android.view {
enum_constant @Deprecated public static final android.view.ViewDebug.HierarchyTraceType REQUEST_LAYOUT;
}
- @java.lang.annotation.Target({java.lang.annotation.ElementType.TYPE}) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.RUNTIME) public static @interface ViewDebug.IntToString {
+ @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.RUNTIME) @java.lang.annotation.Target({java.lang.annotation.ElementType.TYPE}) public static @interface ViewDebug.IntToString {
method public abstract int from();
method public abstract String to();
}
@@ -53985,18 +54003,18 @@ package android.view.textclassifier {
}
public interface TextClassifier {
- method @WorkerThread @NonNull public default android.view.textclassifier.TextClassification classifyText(@NonNull android.view.textclassifier.TextClassification.Request);
- method @WorkerThread @NonNull public default android.view.textclassifier.TextClassification classifyText(@NonNull CharSequence, @IntRange(from=0) int, @IntRange(from=0) int, @Nullable android.os.LocaleList);
+ method @NonNull @WorkerThread public default android.view.textclassifier.TextClassification classifyText(@NonNull android.view.textclassifier.TextClassification.Request);
+ method @NonNull @WorkerThread public default android.view.textclassifier.TextClassification classifyText(@NonNull CharSequence, @IntRange(from=0) int, @IntRange(from=0) int, @Nullable android.os.LocaleList);
method public default void destroy();
- method @WorkerThread @NonNull public default android.view.textclassifier.TextLanguage detectLanguage(@NonNull android.view.textclassifier.TextLanguage.Request);
- method @WorkerThread @NonNull public default android.view.textclassifier.TextLinks generateLinks(@NonNull android.view.textclassifier.TextLinks.Request);
+ method @NonNull @WorkerThread public default android.view.textclassifier.TextLanguage detectLanguage(@NonNull android.view.textclassifier.TextLanguage.Request);
+ method @NonNull @WorkerThread public default android.view.textclassifier.TextLinks generateLinks(@NonNull android.view.textclassifier.TextLinks.Request);
method @WorkerThread public default int getMaxGenerateLinksTextLength();
method public default boolean isDestroyed();
method public default void onSelectionEvent(@NonNull android.view.textclassifier.SelectionEvent);
method public default void onTextClassifierEvent(@NonNull android.view.textclassifier.TextClassifierEvent);
- method @WorkerThread @NonNull public default android.view.textclassifier.ConversationActions suggestConversationActions(@NonNull android.view.textclassifier.ConversationActions.Request);
- method @WorkerThread @NonNull public default android.view.textclassifier.TextSelection suggestSelection(@NonNull android.view.textclassifier.TextSelection.Request);
- method @WorkerThread @NonNull public default android.view.textclassifier.TextSelection suggestSelection(@NonNull CharSequence, @IntRange(from=0) int, @IntRange(from=0) int, @Nullable android.os.LocaleList);
+ method @NonNull @WorkerThread public default android.view.textclassifier.ConversationActions suggestConversationActions(@NonNull android.view.textclassifier.ConversationActions.Request);
+ method @NonNull @WorkerThread public default android.view.textclassifier.TextSelection suggestSelection(@NonNull android.view.textclassifier.TextSelection.Request);
+ method @NonNull @WorkerThread public default android.view.textclassifier.TextSelection suggestSelection(@NonNull CharSequence, @IntRange(from=0) int, @IntRange(from=0) int, @Nullable android.os.LocaleList);
field public static final String EXTRA_FROM_TEXT_CLASSIFIER = "android.view.textclassifier.extra.FROM_TEXT_CLASSIFIER";
field public static final String HINT_TEXT_IS_EDITABLE = "android.text_is_editable";
field public static final String HINT_TEXT_IS_NOT_EDITABLE = "android.text_is_not_editable";
@@ -56460,12 +56478,12 @@ package android.widget {
ctor public Magnifier.Builder(@NonNull android.view.View);
method @NonNull public android.widget.Magnifier build();
method @NonNull public android.widget.Magnifier.Builder setClippingEnabled(boolean);
- method @NonNull public android.widget.Magnifier.Builder setCornerRadius(@Px @FloatRange(from=0) float);
+ method @NonNull public android.widget.Magnifier.Builder setCornerRadius(@FloatRange(from=0) @Px float);
method @NonNull public android.widget.Magnifier.Builder setDefaultSourceToMagnifierOffset(@Px int, @Px int);
- method @NonNull public android.widget.Magnifier.Builder setElevation(@Px @FloatRange(from=0) float);
+ method @NonNull public android.widget.Magnifier.Builder setElevation(@FloatRange(from=0) @Px float);
method @NonNull public android.widget.Magnifier.Builder setInitialZoom(@FloatRange(from=0.0f) float);
method @NonNull public android.widget.Magnifier.Builder setOverlay(@Nullable android.graphics.drawable.Drawable);
- method @NonNull public android.widget.Magnifier.Builder setSize(@Px @IntRange(from=0) int, @Px @IntRange(from=0) int);
+ method @NonNull public android.widget.Magnifier.Builder setSize(@IntRange(from=0) @Px int, @IntRange(from=0) @Px int);
method @NonNull public android.widget.Magnifier.Builder setSourceBounds(int, int, int, int);
}
@@ -56959,7 +56977,7 @@ package android.widget {
method @NonNull public static android.widget.RemoteViews.RemoteResponse fromPendingIntent(@NonNull android.app.PendingIntent);
}
- @java.lang.annotation.Target({java.lang.annotation.ElementType.TYPE}) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.RUNTIME) public static @interface RemoteViews.RemoteView {
+ @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.RUNTIME) @java.lang.annotation.Target({java.lang.annotation.ElementType.TYPE}) public static @interface RemoteViews.RemoteView {
}
public abstract class RemoteViewsService extends android.app.Service {
@@ -57636,7 +57654,7 @@ package android.widget {
method public void setExtractedText(android.view.inputmethod.ExtractedText);
method public void setFallbackLineSpacing(boolean);
method public void setFilters(android.text.InputFilter[]);
- method public void setFirstBaselineToTopHeight(@Px @IntRange(from=0) int);
+ method public void setFirstBaselineToTopHeight(@IntRange(from=0) @Px int);
method public void setFontFeatureSettings(@Nullable String);
method public boolean setFontVariationSettings(@Nullable String);
method protected boolean setFrame(int, int, int, int);
@@ -57658,9 +57676,9 @@ package android.widget {
method public void setInputType(int);
method public void setJustificationMode(int);
method public void setKeyListener(android.text.method.KeyListener);
- method public void setLastBaselineToBottomHeight(@Px @IntRange(from=0) int);
+ method public void setLastBaselineToBottomHeight(@IntRange(from=0) @Px int);
method public void setLetterSpacing(float);
- method public void setLineHeight(@Px @IntRange(from=0) int);
+ method public void setLineHeight(@IntRange(from=0) @Px int);
method public void setLineSpacing(float, float);
method public void setLines(int);
method public final void setLinkTextColor(@ColorInt int);
@@ -60715,7 +60733,7 @@ package java.lang {
ctor public OutOfMemoryError(String);
}
- @java.lang.annotation.Target(java.lang.annotation.ElementType.METHOD) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) public @interface Override {
+ @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) @java.lang.annotation.Target(java.lang.annotation.ElementType.METHOD) public @interface Override {
}
public class Package implements java.lang.reflect.AnnotatedElement {
@@ -61207,9 +61225,9 @@ package java.lang {
method @NonNull public StringBuilder reverse();
method public void setCharAt(int, char);
method public void setLength(int);
- method public CharSequence subSequence(int, int);
- method public String substring(int);
- method public String substring(int, int);
+ method @NonNull public CharSequence subSequence(int, int);
+ method @NonNull public String substring(int);
+ method @NonNull public String substring(int, int);
method public void trimToSize();
}
@@ -61219,7 +61237,7 @@ package java.lang {
ctor public StringIndexOutOfBoundsException(int);
}
- @java.lang.annotation.Target({java.lang.annotation.ElementType.TYPE, java.lang.annotation.ElementType.FIELD, java.lang.annotation.ElementType.METHOD, java.lang.annotation.ElementType.PARAMETER, java.lang.annotation.ElementType.CONSTRUCTOR, java.lang.annotation.ElementType.LOCAL_VARIABLE}) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) public @interface SuppressWarnings {
+ @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) @java.lang.annotation.Target({java.lang.annotation.ElementType.TYPE, java.lang.annotation.ElementType.FIELD, java.lang.annotation.ElementType.METHOD, java.lang.annotation.ElementType.PARAMETER, java.lang.annotation.ElementType.CONSTRUCTOR, java.lang.annotation.ElementType.LOCAL_VARIABLE}) public @interface SuppressWarnings {
method public abstract String[] value();
}
@@ -71542,20 +71560,20 @@ package java.util.concurrent {
method public boolean addAll(@NonNull java.util.Collection<? extends K>);
method public final void clear();
method public boolean contains(@NonNull Object);
- method public final boolean containsAll(java.util.Collection<?>);
+ method public final boolean containsAll(@NonNull java.util.Collection<?>);
method public void forEach(@NonNull java.util.function.Consumer<? super K>);
- method public java.util.concurrent.ConcurrentHashMap<K,V> getMap();
+ method @NonNull public java.util.concurrent.ConcurrentHashMap<K,V> getMap();
method @Nullable public V getMappedValue();
method public final boolean isEmpty();
method @NonNull public java.util.Iterator<K> iterator();
method public boolean remove(@NonNull Object);
- method public final boolean removeAll(java.util.Collection<?>);
- method public final boolean retainAll(java.util.Collection<?>);
+ method public final boolean removeAll(@NonNull java.util.Collection<?>);
+ method public final boolean retainAll(@NonNull java.util.Collection<?>);
method public final int size();
method @NonNull public java.util.Spliterator<K> spliterator();
- method public final Object[] toArray();
- method public final <T> T[] toArray(T[]);
- method public final String toString();
+ method @NonNull public final Object[] toArray();
+ method @NonNull public final <T> T[] toArray(@NonNull T[]);
+ method @NonNull public final String toString();
}
public class ConcurrentLinkedDeque<E> extends java.util.AbstractCollection<E> implements java.util.Deque<E> java.io.Serializable {
diff --git a/api/system-current.txt b/api/system-current.txt
index 487bd685718b..0b1839374298 100644
--- a/api/system-current.txt
+++ b/api/system-current.txt
@@ -391,7 +391,7 @@ package android.app {
field public static final int UID_STATE_CACHED = 700; // 0x2bc
field public static final int UID_STATE_FOREGROUND = 500; // 0x1f4
field public static final int UID_STATE_FOREGROUND_SERVICE = 400; // 0x190
- field public static final int UID_STATE_FOREGROUND_SERVICE_LOCATION = 300; // 0x12c
+ field @Deprecated public static final int UID_STATE_FOREGROUND_SERVICE_LOCATION = 300; // 0x12c
field public static final int UID_STATE_PERSISTENT = 100; // 0x64
field public static final int UID_STATE_TOP = 200; // 0xc8
}
@@ -602,7 +602,7 @@ package android.app {
method @RequiresPermission(allOf={android.Manifest.permission.DUMP, android.Manifest.permission.PACKAGE_USAGE_STATS}) public byte[] getStatsMetadata() throws android.app.StatsManager.StatsUnavailableException;
method @RequiresPermission(allOf={android.Manifest.permission.DUMP, android.Manifest.permission.PACKAGE_USAGE_STATS}) public void removeConfig(long) throws android.app.StatsManager.StatsUnavailableException;
method @Deprecated @RequiresPermission(allOf={android.Manifest.permission.DUMP, android.Manifest.permission.PACKAGE_USAGE_STATS}) public boolean removeConfiguration(long);
- method @RequiresPermission(allOf={android.Manifest.permission.DUMP, android.Manifest.permission.PACKAGE_USAGE_STATS}) @NonNull public long[] setActiveConfigsChangedOperation(@Nullable android.app.PendingIntent) throws android.app.StatsManager.StatsUnavailableException;
+ method @NonNull @RequiresPermission(allOf={android.Manifest.permission.DUMP, android.Manifest.permission.PACKAGE_USAGE_STATS}) public long[] setActiveConfigsChangedOperation(@Nullable android.app.PendingIntent) throws android.app.StatsManager.StatsUnavailableException;
method @RequiresPermission(allOf={android.Manifest.permission.DUMP, android.Manifest.permission.PACKAGE_USAGE_STATS}) public void setBroadcastSubscriber(android.app.PendingIntent, long, long) throws android.app.StatsManager.StatsUnavailableException;
method @Deprecated @RequiresPermission(allOf={android.Manifest.permission.DUMP, android.Manifest.permission.PACKAGE_USAGE_STATS}) public boolean setBroadcastSubscriber(long, long, android.app.PendingIntent);
method @Deprecated @RequiresPermission(allOf={android.Manifest.permission.DUMP, android.Manifest.permission.PACKAGE_USAGE_STATS}) public boolean setDataFetchOperation(long, android.app.PendingIntent);
@@ -1391,7 +1391,7 @@ package android.content {
method public abstract void sendBroadcast(android.content.Intent, @Nullable String, @Nullable android.os.Bundle);
method @RequiresPermission(android.Manifest.permission.INTERACT_ACROSS_USERS) public abstract void sendBroadcastAsUser(@RequiresPermission android.content.Intent, android.os.UserHandle, @Nullable String, @Nullable android.os.Bundle);
method public abstract void sendOrderedBroadcast(@NonNull android.content.Intent, @Nullable String, @Nullable android.os.Bundle, @Nullable android.content.BroadcastReceiver, @Nullable android.os.Handler, int, @Nullable String, @Nullable android.os.Bundle);
- method @RequiresPermission(android.Manifest.permission.INTERACT_ACROSS_USERS_FULL) public void startActivityAsUser(@RequiresPermission @NonNull android.content.Intent, @NonNull android.os.UserHandle);
+ method @RequiresPermission(android.Manifest.permission.INTERACT_ACROSS_USERS_FULL) public void startActivityAsUser(@NonNull @RequiresPermission android.content.Intent, @NonNull android.os.UserHandle);
field public static final String APP_PREDICTION_SERVICE = "app_prediction";
field public static final String BACKUP_SERVICE = "backup";
field public static final String BATTERY_STATS_SERVICE = "batterystats";
@@ -1884,8 +1884,8 @@ package android.content.rollback {
public final class RollbackManager {
method @RequiresPermission(anyOf={android.Manifest.permission.MANAGE_ROLLBACKS, "android.permission.TEST_MANAGE_ROLLBACKS"}) public void commitRollback(int, @NonNull java.util.List<android.content.pm.VersionedPackage>, @NonNull android.content.IntentSender);
- method @RequiresPermission(anyOf={android.Manifest.permission.MANAGE_ROLLBACKS, "android.permission.TEST_MANAGE_ROLLBACKS"}) @NonNull public java.util.List<android.content.rollback.RollbackInfo> getAvailableRollbacks();
- method @RequiresPermission(anyOf={android.Manifest.permission.MANAGE_ROLLBACKS, "android.permission.TEST_MANAGE_ROLLBACKS"}) @NonNull public java.util.List<android.content.rollback.RollbackInfo> getRecentlyCommittedRollbacks();
+ method @NonNull @RequiresPermission(anyOf={android.Manifest.permission.MANAGE_ROLLBACKS, "android.permission.TEST_MANAGE_ROLLBACKS"}) public java.util.List<android.content.rollback.RollbackInfo> getAvailableRollbacks();
+ method @NonNull @RequiresPermission(anyOf={android.Manifest.permission.MANAGE_ROLLBACKS, "android.permission.TEST_MANAGE_ROLLBACKS"}) public java.util.List<android.content.rollback.RollbackInfo> getRecentlyCommittedRollbacks();
field public static final String EXTRA_STATUS = "android.content.rollback.extra.STATUS";
field public static final String EXTRA_STATUS_MESSAGE = "android.content.rollback.extra.STATUS_MESSAGE";
field public static final int STATUS_FAILURE = 1; // 0x1
@@ -2396,24 +2396,24 @@ package android.hardware.location {
}
public final class ContextHubManager {
- method @RequiresPermission(android.Manifest.permission.LOCATION_HARDWARE) @NonNull public android.hardware.location.ContextHubClient createClient(@NonNull android.hardware.location.ContextHubInfo, @NonNull android.hardware.location.ContextHubClientCallback, @NonNull java.util.concurrent.Executor);
- method @RequiresPermission(android.Manifest.permission.LOCATION_HARDWARE) @NonNull public android.hardware.location.ContextHubClient createClient(@NonNull android.hardware.location.ContextHubInfo, @NonNull android.hardware.location.ContextHubClientCallback);
- method @RequiresPermission(android.Manifest.permission.LOCATION_HARDWARE) @NonNull public android.hardware.location.ContextHubClient createClient(@NonNull android.hardware.location.ContextHubInfo, @NonNull android.app.PendingIntent, long);
- method @RequiresPermission(android.Manifest.permission.LOCATION_HARDWARE) @NonNull public android.hardware.location.ContextHubTransaction<java.lang.Void> disableNanoApp(@NonNull android.hardware.location.ContextHubInfo, long);
- method @RequiresPermission(android.Manifest.permission.LOCATION_HARDWARE) @NonNull public android.hardware.location.ContextHubTransaction<java.lang.Void> enableNanoApp(@NonNull android.hardware.location.ContextHubInfo, long);
+ method @NonNull @RequiresPermission(android.Manifest.permission.LOCATION_HARDWARE) public android.hardware.location.ContextHubClient createClient(@NonNull android.hardware.location.ContextHubInfo, @NonNull android.hardware.location.ContextHubClientCallback, @NonNull java.util.concurrent.Executor);
+ method @NonNull @RequiresPermission(android.Manifest.permission.LOCATION_HARDWARE) public android.hardware.location.ContextHubClient createClient(@NonNull android.hardware.location.ContextHubInfo, @NonNull android.hardware.location.ContextHubClientCallback);
+ method @NonNull @RequiresPermission(android.Manifest.permission.LOCATION_HARDWARE) public android.hardware.location.ContextHubClient createClient(@NonNull android.hardware.location.ContextHubInfo, @NonNull android.app.PendingIntent, long);
+ method @NonNull @RequiresPermission(android.Manifest.permission.LOCATION_HARDWARE) public android.hardware.location.ContextHubTransaction<java.lang.Void> disableNanoApp(@NonNull android.hardware.location.ContextHubInfo, long);
+ method @NonNull @RequiresPermission(android.Manifest.permission.LOCATION_HARDWARE) public android.hardware.location.ContextHubTransaction<java.lang.Void> enableNanoApp(@NonNull android.hardware.location.ContextHubInfo, long);
method @Deprecated @NonNull @RequiresPermission(android.Manifest.permission.LOCATION_HARDWARE) public int[] findNanoAppOnHub(int, @NonNull android.hardware.location.NanoAppFilter);
method @Deprecated @RequiresPermission(android.Manifest.permission.LOCATION_HARDWARE) public int[] getContextHubHandles();
method @Deprecated @RequiresPermission(android.Manifest.permission.LOCATION_HARDWARE) public android.hardware.location.ContextHubInfo getContextHubInfo(int);
- method @RequiresPermission(android.Manifest.permission.LOCATION_HARDWARE) @NonNull public java.util.List<android.hardware.location.ContextHubInfo> getContextHubs();
+ method @NonNull @RequiresPermission(android.Manifest.permission.LOCATION_HARDWARE) public java.util.List<android.hardware.location.ContextHubInfo> getContextHubs();
method @Deprecated @Nullable @RequiresPermission(android.Manifest.permission.LOCATION_HARDWARE) public android.hardware.location.NanoAppInstanceInfo getNanoAppInstanceInfo(int);
method @Deprecated @RequiresPermission(android.Manifest.permission.LOCATION_HARDWARE) public int loadNanoApp(int, @NonNull android.hardware.location.NanoApp);
- method @RequiresPermission(android.Manifest.permission.LOCATION_HARDWARE) @NonNull public android.hardware.location.ContextHubTransaction<java.lang.Void> loadNanoApp(@NonNull android.hardware.location.ContextHubInfo, @NonNull android.hardware.location.NanoAppBinary);
- method @RequiresPermission(android.Manifest.permission.LOCATION_HARDWARE) @NonNull public android.hardware.location.ContextHubTransaction<java.util.List<android.hardware.location.NanoAppState>> queryNanoApps(@NonNull android.hardware.location.ContextHubInfo);
+ method @NonNull @RequiresPermission(android.Manifest.permission.LOCATION_HARDWARE) public android.hardware.location.ContextHubTransaction<java.lang.Void> loadNanoApp(@NonNull android.hardware.location.ContextHubInfo, @NonNull android.hardware.location.NanoAppBinary);
+ method @NonNull @RequiresPermission(android.Manifest.permission.LOCATION_HARDWARE) public android.hardware.location.ContextHubTransaction<java.util.List<android.hardware.location.NanoAppState>> queryNanoApps(@NonNull android.hardware.location.ContextHubInfo);
method @Deprecated public int registerCallback(@NonNull android.hardware.location.ContextHubManager.Callback);
method @Deprecated public int registerCallback(android.hardware.location.ContextHubManager.Callback, android.os.Handler);
method @Deprecated @RequiresPermission(android.Manifest.permission.LOCATION_HARDWARE) public int sendMessage(int, int, @NonNull android.hardware.location.ContextHubMessage);
method @Deprecated @RequiresPermission(android.Manifest.permission.LOCATION_HARDWARE) public int unloadNanoApp(int);
- method @RequiresPermission(android.Manifest.permission.LOCATION_HARDWARE) @NonNull public android.hardware.location.ContextHubTransaction<java.lang.Void> unloadNanoApp(@NonNull android.hardware.location.ContextHubInfo, long);
+ method @NonNull @RequiresPermission(android.Manifest.permission.LOCATION_HARDWARE) public android.hardware.location.ContextHubTransaction<java.lang.Void> unloadNanoApp(@NonNull android.hardware.location.ContextHubInfo, long);
method @Deprecated public int unregisterCallback(@NonNull android.hardware.location.ContextHubManager.Callback);
field public static final int EVENT_HUB_RESET = 6; // 0x6
field public static final int EVENT_NANOAPP_ABORTED = 4; // 0x4
@@ -3099,7 +3099,7 @@ package android.hardware.usb {
}
public final class UsbPort {
- method @RequiresPermission(android.Manifest.permission.MANAGE_USB) @Nullable public android.hardware.usb.UsbPortStatus getStatus();
+ method @Nullable @RequiresPermission(android.Manifest.permission.MANAGE_USB) public android.hardware.usb.UsbPortStatus getStatus();
method @RequiresPermission(android.Manifest.permission.MANAGE_USB) public void setRoles(int, int);
}
@@ -3497,7 +3497,7 @@ package android.location {
method @NonNull public android.location.LocationRequest setFastestInterval(long);
method public void setHideFromAppOps(boolean);
method @NonNull public android.location.LocationRequest setInterval(long);
- method @RequiresPermission(android.Manifest.permission.WRITE_SECURE_SETTINGS) @NonNull public android.location.LocationRequest setLocationSettingsIgnored(boolean);
+ method @NonNull @RequiresPermission(android.Manifest.permission.WRITE_SECURE_SETTINGS) public android.location.LocationRequest setLocationSettingsIgnored(boolean);
method @NonNull public android.location.LocationRequest setLowPowerMode(boolean);
method @NonNull public android.location.LocationRequest setNumUpdates(int);
method @NonNull public android.location.LocationRequest setProvider(@NonNull String);
@@ -3828,7 +3828,7 @@ package android.media.soundtrigger {
method @RequiresPermission(android.Manifest.permission.MANAGE_SOUND_TRIGGER) public void deleteModel(java.util.UUID);
method public int getDetectionServiceOperationsTimeout();
method @RequiresPermission(android.Manifest.permission.MANAGE_SOUND_TRIGGER) public android.media.soundtrigger.SoundTriggerManager.Model getModel(java.util.UUID);
- method @RequiresPermission(android.Manifest.permission.MANAGE_SOUND_TRIGGER) @Nullable public android.hardware.soundtrigger.SoundTrigger.ModuleProperties getModuleProperties();
+ method @Nullable @RequiresPermission(android.Manifest.permission.MANAGE_SOUND_TRIGGER) public android.hardware.soundtrigger.SoundTrigger.ModuleProperties getModuleProperties();
method @RequiresPermission(android.Manifest.permission.MANAGE_SOUND_TRIGGER) public void updateModel(android.media.soundtrigger.SoundTriggerManager.Model);
}
@@ -4516,7 +4516,8 @@ package android.net.util {
method public static void closeSocket(@Nullable java.io.FileDescriptor) throws java.io.IOException;
method @NonNull public static java.net.SocketAddress makeNetlinkSocketAddress(int, int);
method @NonNull public static java.net.SocketAddress makePacketSocketAddress(int, int);
- method @NonNull public static java.net.SocketAddress makePacketSocketAddress(int, @NonNull byte[]);
+ method @Deprecated @NonNull public static java.net.SocketAddress makePacketSocketAddress(int, @NonNull byte[]);
+ method @NonNull public static java.net.SocketAddress makePacketSocketAddress(int, int, @NonNull byte[]);
}
}
@@ -4880,7 +4881,7 @@ package android.net.wifi {
public class WifiScanner {
method @Deprecated public void configureWifiChange(int, int, int, int, int, android.net.wifi.WifiScanner.BssidInfo[]);
method @Deprecated public void configureWifiChange(android.net.wifi.WifiScanner.WifiChangeSettings);
- method @Nullable @RequiresPermission(android.Manifest.permission.LOCATION_HARDWARE) public java.util.List<java.lang.Integer> getAvailableChannels(int);
+ method @NonNull @RequiresPermission(android.Manifest.permission.LOCATION_HARDWARE) public java.util.List<java.lang.Integer> getAvailableChannels(int);
method @RequiresPermission(android.Manifest.permission.LOCATION_HARDWARE) public boolean getScanResults();
method @RequiresPermission(android.Manifest.permission.LOCATION_HARDWARE) public void startBackgroundScan(android.net.wifi.WifiScanner.ScanSettings, android.net.wifi.WifiScanner.ScanListener);
method @RequiresPermission(android.Manifest.permission.LOCATION_HARDWARE) public void startBackgroundScan(android.net.wifi.WifiScanner.ScanSettings, android.net.wifi.WifiScanner.ScanListener, android.os.WorkSource);
@@ -5239,7 +5240,7 @@ package android.os {
}
public class BatteryStatsManager {
- method @RequiresPermission(android.Manifest.permission.UPDATE_DEVICE_STATS) @NonNull public android.os.connectivity.WifiBatteryStats getWifiBatteryStats();
+ method @NonNull @RequiresPermission(android.Manifest.permission.UPDATE_DEVICE_STATS) public android.os.connectivity.WifiBatteryStats getWifiBatteryStats();
method @RequiresPermission(android.Manifest.permission.UPDATE_DEVICE_STATS) public void noteFullWifiLockAcquiredFromSource(@NonNull android.os.WorkSource);
method @RequiresPermission(android.Manifest.permission.UPDATE_DEVICE_STATS) public void noteFullWifiLockReleasedFromSource(@NonNull android.os.WorkSource);
method @RequiresPermission(android.Manifest.permission.UPDATE_DEVICE_STATS) public void noteWifiBatchedScanStartedFromSource(@NonNull android.os.WorkSource, @IntRange(from=0) int);
@@ -5459,8 +5460,8 @@ package android.os {
method @RequiresPermission("android.permission.REQUEST_INCIDENT_REPORT_APPROVAL") public void cancelAuthorization(android.os.IncidentManager.AuthListener);
method @RequiresPermission(allOf={android.Manifest.permission.DUMP, android.Manifest.permission.PACKAGE_USAGE_STATS}) public void deleteIncidentReports(android.net.Uri);
method @RequiresPermission(android.Manifest.permission.APPROVE_INCIDENT_REPORTS) public void denyReport(android.net.Uri);
- method @RequiresPermission(allOf={android.Manifest.permission.DUMP, android.Manifest.permission.PACKAGE_USAGE_STATS}) @Nullable public android.os.IncidentManager.IncidentReport getIncidentReport(android.net.Uri);
- method @RequiresPermission(allOf={android.Manifest.permission.DUMP, android.Manifest.permission.PACKAGE_USAGE_STATS}) @NonNull public java.util.List<android.net.Uri> getIncidentReportList(String);
+ method @Nullable @RequiresPermission(allOf={android.Manifest.permission.DUMP, android.Manifest.permission.PACKAGE_USAGE_STATS}) public android.os.IncidentManager.IncidentReport getIncidentReport(android.net.Uri);
+ method @NonNull @RequiresPermission(allOf={android.Manifest.permission.DUMP, android.Manifest.permission.PACKAGE_USAGE_STATS}) public java.util.List<android.net.Uri> getIncidentReportList(String);
method @RequiresPermission(android.Manifest.permission.APPROVE_INCIDENT_REPORTS) public java.util.List<android.os.IncidentManager.PendingReport> getPendingReports();
method @RequiresPermission(allOf={android.Manifest.permission.DUMP, android.Manifest.permission.PACKAGE_USAGE_STATS}) public void reportIncident(android.os.IncidentReportArgs);
method @RequiresPermission("android.permission.REQUEST_INCIDENT_REPORT_APPROVAL") public void requestAuthorization(int, String, int, android.os.IncidentManager.AuthListener);
@@ -5691,6 +5692,7 @@ package android.os {
method @RequiresPermission(android.Manifest.permission.MANAGE_USERS) public java.util.List<android.os.UserManager.EnforcingUser> getUserRestrictionSources(String, android.os.UserHandle);
method @RequiresPermission(allOf={android.Manifest.permission.READ_PHONE_STATE, android.Manifest.permission.MANAGE_USERS, android.Manifest.permission.INTERACT_ACROSS_USERS}, conditional=true) public int getUserSwitchability();
method public boolean hasRestrictedProfiles();
+ method @RequiresPermission(anyOf={android.Manifest.permission.MANAGE_USERS, android.Manifest.permission.INTERACT_ACROSS_USERS}, conditional=true) public boolean hasUserRestrictionForUser(@NonNull String, @NonNull android.os.UserHandle);
method @RequiresPermission(android.Manifest.permission.MANAGE_USERS) public boolean isAdminUser();
method @RequiresPermission(android.Manifest.permission.MANAGE_USERS) public boolean isGuestUser();
method @RequiresPermission(android.Manifest.permission.MANAGE_USERS) public boolean isManagedProfile();
@@ -6010,7 +6012,7 @@ package android.provider {
field public static final String NAMESPACE_AUTOFILL = "autofill";
field public static final String NAMESPACE_CONNECTIVITY = "connectivity";
field public static final String NAMESPACE_CONTENT_CAPTURE = "content_capture";
- field public static final String NAMESPACE_DEX_BOOT = "dex_boot";
+ field @Deprecated public static final String NAMESPACE_DEX_BOOT = "dex_boot";
field public static final String NAMESPACE_DISPLAY_MANAGER = "display_manager";
field public static final String NAMESPACE_GAME_DRIVER = "game_driver";
field public static final String NAMESPACE_INPUT_NATIVE_BOOT = "input_native_boot";
@@ -6278,7 +6280,7 @@ package android.provider {
field public static final String MESSAGE_BODY = "body";
field public static final String MESSAGE_BROADCASTED = "message_broadcasted";
field public static final String MESSAGE_FORMAT = "format";
- field @RequiresPermission(android.Manifest.permission.READ_CELL_BROADCASTS) @NonNull public static final android.net.Uri MESSAGE_HISTORY_URI;
+ field @NonNull @RequiresPermission(android.Manifest.permission.READ_CELL_BROADCASTS) public static final android.net.Uri MESSAGE_HISTORY_URI;
field public static final String MESSAGE_PRIORITY = "priority";
field public static final String MESSAGE_READ = "read";
field public static final String PLMN = "plmn";
@@ -6309,7 +6311,7 @@ package android.provider {
package android.security.keystore {
public abstract class AttestationUtils {
- method @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) @NonNull public static java.security.cert.X509Certificate[] attestDeviceIds(android.content.Context, @NonNull int[], @NonNull byte[]) throws android.security.keystore.DeviceIdAttestationException;
+ method @NonNull @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public static java.security.cert.X509Certificate[] attestDeviceIds(android.content.Context, @NonNull int[], @NonNull byte[]) throws android.security.keystore.DeviceIdAttestationException;
field public static final int ID_TYPE_IMEI = 2; // 0x2
field public static final int ID_TYPE_MEID = 3; // 0x3
field public static final int ID_TYPE_SERIAL = 1; // 0x1
@@ -6390,18 +6392,18 @@ package android.security.keystore.recovery {
}
public class RecoveryController {
- method @RequiresPermission(android.Manifest.permission.RECOVER_KEYSTORE) @NonNull public android.security.keystore.recovery.RecoverySession createRecoverySession();
+ method @NonNull @RequiresPermission(android.Manifest.permission.RECOVER_KEYSTORE) public android.security.keystore.recovery.RecoverySession createRecoverySession();
method @Deprecated @NonNull @RequiresPermission(android.Manifest.permission.RECOVER_KEYSTORE) public java.security.Key generateKey(@NonNull String) throws android.security.keystore.recovery.InternalRecoveryServiceException, android.security.keystore.recovery.LockScreenRequiredException;
- method @RequiresPermission(android.Manifest.permission.RECOVER_KEYSTORE) @NonNull public java.security.Key generateKey(@NonNull String, @Nullable byte[]) throws android.security.keystore.recovery.InternalRecoveryServiceException, android.security.keystore.recovery.LockScreenRequiredException;
- method @RequiresPermission(android.Manifest.permission.RECOVER_KEYSTORE) @NonNull public java.util.List<java.lang.String> getAliases() throws android.security.keystore.recovery.InternalRecoveryServiceException;
- method @RequiresPermission(android.Manifest.permission.RECOVER_KEYSTORE) @NonNull public static android.security.keystore.recovery.RecoveryController getInstance(@NonNull android.content.Context);
- method @RequiresPermission(android.Manifest.permission.RECOVER_KEYSTORE) @Nullable public java.security.Key getKey(@NonNull String) throws android.security.keystore.recovery.InternalRecoveryServiceException, java.security.UnrecoverableKeyException;
- method @RequiresPermission(android.Manifest.permission.RECOVER_KEYSTORE) @Nullable public android.security.keystore.recovery.KeyChainSnapshot getKeyChainSnapshot() throws android.security.keystore.recovery.InternalRecoveryServiceException;
+ method @NonNull @RequiresPermission(android.Manifest.permission.RECOVER_KEYSTORE) public java.security.Key generateKey(@NonNull String, @Nullable byte[]) throws android.security.keystore.recovery.InternalRecoveryServiceException, android.security.keystore.recovery.LockScreenRequiredException;
+ method @NonNull @RequiresPermission(android.Manifest.permission.RECOVER_KEYSTORE) public java.util.List<java.lang.String> getAliases() throws android.security.keystore.recovery.InternalRecoveryServiceException;
+ method @NonNull @RequiresPermission(android.Manifest.permission.RECOVER_KEYSTORE) public static android.security.keystore.recovery.RecoveryController getInstance(@NonNull android.content.Context);
+ method @Nullable @RequiresPermission(android.Manifest.permission.RECOVER_KEYSTORE) public java.security.Key getKey(@NonNull String) throws android.security.keystore.recovery.InternalRecoveryServiceException, java.security.UnrecoverableKeyException;
+ method @Nullable @RequiresPermission(android.Manifest.permission.RECOVER_KEYSTORE) public android.security.keystore.recovery.KeyChainSnapshot getKeyChainSnapshot() throws android.security.keystore.recovery.InternalRecoveryServiceException;
method @NonNull @RequiresPermission(android.Manifest.permission.RECOVER_KEYSTORE) public int[] getRecoverySecretTypes() throws android.security.keystore.recovery.InternalRecoveryServiceException;
method @RequiresPermission(android.Manifest.permission.RECOVER_KEYSTORE) public int getRecoveryStatus(@NonNull String) throws android.security.keystore.recovery.InternalRecoveryServiceException;
- method @RequiresPermission(android.Manifest.permission.RECOVER_KEYSTORE) @NonNull public java.util.Map<java.lang.String,java.security.cert.X509Certificate> getRootCertificates();
+ method @NonNull @RequiresPermission(android.Manifest.permission.RECOVER_KEYSTORE) public java.util.Map<java.lang.String,java.security.cert.X509Certificate> getRootCertificates();
method @Deprecated @NonNull @RequiresPermission(android.Manifest.permission.RECOVER_KEYSTORE) public java.security.Key importKey(@NonNull String, @NonNull byte[]) throws android.security.keystore.recovery.InternalRecoveryServiceException, android.security.keystore.recovery.LockScreenRequiredException;
- method @RequiresPermission(android.Manifest.permission.RECOVER_KEYSTORE) @NonNull public java.security.Key importKey(@NonNull String, @NonNull byte[], @Nullable byte[]) throws android.security.keystore.recovery.InternalRecoveryServiceException, android.security.keystore.recovery.LockScreenRequiredException;
+ method @NonNull @RequiresPermission(android.Manifest.permission.RECOVER_KEYSTORE) public java.security.Key importKey(@NonNull String, @NonNull byte[], @Nullable byte[]) throws android.security.keystore.recovery.InternalRecoveryServiceException, android.security.keystore.recovery.LockScreenRequiredException;
method @RequiresPermission(android.Manifest.permission.RECOVER_KEYSTORE) public void initRecoveryService(@NonNull String, @NonNull byte[], @NonNull byte[]) throws java.security.cert.CertificateException, android.security.keystore.recovery.InternalRecoveryServiceException;
method @RequiresPermission(android.Manifest.permission.RECOVER_KEYSTORE) public static boolean isRecoverableKeyStoreEnabled(@NonNull android.content.Context);
method @RequiresPermission(android.Manifest.permission.RECOVER_KEYSTORE) public void removeKey(@NonNull String) throws android.security.keystore.recovery.InternalRecoveryServiceException;
@@ -6416,8 +6418,8 @@ package android.security.keystore.recovery {
public class RecoverySession implements java.lang.AutoCloseable {
method @RequiresPermission(android.Manifest.permission.RECOVER_KEYSTORE) public void close();
- method @RequiresPermission(android.Manifest.permission.RECOVER_KEYSTORE) @NonNull public java.util.Map<java.lang.String,java.security.Key> recoverKeyChainSnapshot(@NonNull byte[], @NonNull java.util.List<android.security.keystore.recovery.WrappedApplicationKey>) throws android.security.keystore.recovery.DecryptionFailedException, android.security.keystore.recovery.InternalRecoveryServiceException, android.security.keystore.recovery.SessionExpiredException;
- method @RequiresPermission(android.Manifest.permission.RECOVER_KEYSTORE) @NonNull public byte[] start(@NonNull String, @NonNull java.security.cert.CertPath, @NonNull byte[], @NonNull byte[], @NonNull java.util.List<android.security.keystore.recovery.KeyChainProtectionParams>) throws java.security.cert.CertificateException, android.security.keystore.recovery.InternalRecoveryServiceException;
+ method @NonNull @RequiresPermission(android.Manifest.permission.RECOVER_KEYSTORE) public java.util.Map<java.lang.String,java.security.Key> recoverKeyChainSnapshot(@NonNull byte[], @NonNull java.util.List<android.security.keystore.recovery.WrappedApplicationKey>) throws android.security.keystore.recovery.DecryptionFailedException, android.security.keystore.recovery.InternalRecoveryServiceException, android.security.keystore.recovery.SessionExpiredException;
+ method @NonNull @RequiresPermission(android.Manifest.permission.RECOVER_KEYSTORE) public byte[] start(@NonNull String, @NonNull java.security.cert.CertPath, @NonNull byte[], @NonNull byte[], @NonNull java.util.List<android.security.keystore.recovery.KeyChainProtectionParams>) throws java.security.cert.CertificateException, android.security.keystore.recovery.InternalRecoveryServiceException;
}
public class SessionExpiredException extends java.security.GeneralSecurityException {
@@ -6560,7 +6562,29 @@ package android.service.carrier {
public abstract class ApnService extends android.app.Service {
ctor public ApnService();
method @NonNull public android.os.IBinder onBind(@Nullable android.content.Intent);
- method @WorkerThread @NonNull public abstract java.util.List<android.content.ContentValues> onRestoreApns(int);
+ method @NonNull @WorkerThread public abstract java.util.List<android.content.ContentValues> onRestoreApns(int);
+ }
+
+ public abstract class CarrierMessagingServiceWrapper {
+ ctor public CarrierMessagingServiceWrapper();
+ method public boolean bindToCarrierMessagingService(@NonNull android.content.Context, @NonNull String);
+ method public void disposeConnection(@NonNull android.content.Context);
+ method public void downloadMms(@NonNull android.net.Uri, int, @NonNull android.net.Uri, @NonNull android.service.carrier.CarrierMessagingServiceWrapper.CarrierMessagingCallbackWrapper);
+ method public void filterSms(@NonNull android.service.carrier.MessagePdu, @NonNull String, int, int, @NonNull android.service.carrier.CarrierMessagingServiceWrapper.CarrierMessagingCallbackWrapper);
+ method public abstract void onServiceReady();
+ method public void sendDataSms(@NonNull byte[], int, @NonNull String, int, int, @NonNull android.service.carrier.CarrierMessagingServiceWrapper.CarrierMessagingCallbackWrapper);
+ method public void sendMms(@NonNull android.net.Uri, int, @NonNull android.net.Uri, @NonNull android.service.carrier.CarrierMessagingServiceWrapper.CarrierMessagingCallbackWrapper);
+ method public void sendMultipartTextSms(@NonNull java.util.List<java.lang.String>, int, @NonNull String, int, @NonNull android.service.carrier.CarrierMessagingServiceWrapper.CarrierMessagingCallbackWrapper);
+ method public void sendTextSms(@NonNull String, int, @NonNull String, int, @NonNull android.service.carrier.CarrierMessagingServiceWrapper.CarrierMessagingCallbackWrapper);
+ }
+
+ public abstract static class CarrierMessagingServiceWrapper.CarrierMessagingCallbackWrapper {
+ ctor public CarrierMessagingServiceWrapper.CarrierMessagingCallbackWrapper();
+ method public void onDownloadMmsComplete(int);
+ method public void onFilterComplete(int);
+ method public void onSendMmsComplete(int, @Nullable byte[]);
+ method public void onSendMultipartSmsComplete(int, @Nullable int[]);
+ method public void onSendSmsComplete(int, int);
}
}
@@ -6672,13 +6696,13 @@ package android.service.euicc {
method public android.service.euicc.EuiccProfileInfo.Builder setUiccAccessRule(@Nullable java.util.List<android.telephony.UiccAccessRule>);
}
- @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) @IntDef(flag=true, prefix={"POLICY_RULE_"}, value={android.service.euicc.EuiccProfileInfo.POLICY_RULE_DO_NOT_DISABLE, android.service.euicc.EuiccProfileInfo.POLICY_RULE_DO_NOT_DELETE, android.service.euicc.EuiccProfileInfo.POLICY_RULE_DELETE_AFTER_DISABLING}) public static @interface EuiccProfileInfo.PolicyRule {
+ @IntDef(flag=true, prefix={"POLICY_RULE_"}, value={android.service.euicc.EuiccProfileInfo.POLICY_RULE_DO_NOT_DISABLE, android.service.euicc.EuiccProfileInfo.POLICY_RULE_DO_NOT_DELETE, android.service.euicc.EuiccProfileInfo.POLICY_RULE_DELETE_AFTER_DISABLING}) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) public static @interface EuiccProfileInfo.PolicyRule {
}
- @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) @IntDef(prefix={"PROFILE_CLASS_"}, value={android.service.euicc.EuiccProfileInfo.PROFILE_CLASS_TESTING, android.service.euicc.EuiccProfileInfo.PROFILE_CLASS_PROVISIONING, android.service.euicc.EuiccProfileInfo.PROFILE_CLASS_OPERATIONAL, 0xffffffff}) public static @interface EuiccProfileInfo.ProfileClass {
+ @IntDef(prefix={"PROFILE_CLASS_"}, value={android.service.euicc.EuiccProfileInfo.PROFILE_CLASS_TESTING, android.service.euicc.EuiccProfileInfo.PROFILE_CLASS_PROVISIONING, android.service.euicc.EuiccProfileInfo.PROFILE_CLASS_OPERATIONAL, 0xffffffff}) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) public static @interface EuiccProfileInfo.ProfileClass {
}
- @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) @IntDef(prefix={"PROFILE_STATE_"}, value={android.service.euicc.EuiccProfileInfo.PROFILE_STATE_DISABLED, android.service.euicc.EuiccProfileInfo.PROFILE_STATE_ENABLED, 0xffffffff}) public static @interface EuiccProfileInfo.ProfileState {
+ @IntDef(prefix={"PROFILE_STATE_"}, value={android.service.euicc.EuiccProfileInfo.PROFILE_STATE_DISABLED, android.service.euicc.EuiccProfileInfo.PROFILE_STATE_ENABLED, 0xffffffff}) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) public static @interface EuiccProfileInfo.ProfileState {
}
public abstract class EuiccService extends android.app.Service {
@@ -6857,7 +6881,7 @@ package android.service.notification {
package android.service.oemlock {
public class OemLockManager {
- method @RequiresPermission(android.Manifest.permission.MANAGE_CARRIER_OEM_UNLOCK_STATE) @Nullable public String getLockName();
+ method @Nullable @RequiresPermission(android.Manifest.permission.MANAGE_CARRIER_OEM_UNLOCK_STATE) public String getLockName();
method @RequiresPermission(android.Manifest.permission.MANAGE_CARRIER_OEM_UNLOCK_STATE) public boolean isOemUnlockAllowedByCarrier();
method @RequiresPermission(android.Manifest.permission.MANAGE_USER_OEM_UNLOCK_STATE) public boolean isOemUnlockAllowedByUser();
method @RequiresPermission(android.Manifest.permission.MANAGE_CARRIER_OEM_UNLOCK_STATE) public void setOemUnlockAllowedByCarrier(boolean, @Nullable byte[]);
@@ -6870,7 +6894,7 @@ package android.service.persistentdata {
public class PersistentDataBlockManager {
method @RequiresPermission("android.permission.ACCESS_PDB_STATE") public int getDataBlockSize();
- method @RequiresPermission(anyOf={android.Manifest.permission.READ_OEM_UNLOCK_STATE, "android.permission.OEM_UNLOCK_STATE"}) @android.service.persistentdata.PersistentDataBlockManager.FlashLockState public int getFlashLockState();
+ method @android.service.persistentdata.PersistentDataBlockManager.FlashLockState @RequiresPermission(anyOf={android.Manifest.permission.READ_OEM_UNLOCK_STATE, "android.permission.OEM_UNLOCK_STATE"}) public int getFlashLockState();
method public long getMaximumDataBlockSize();
method @Deprecated @RequiresPermission(anyOf={android.Manifest.permission.READ_OEM_UNLOCK_STATE, "android.permission.OEM_UNLOCK_STATE"}) public boolean getOemUnlockEnabled();
method public byte[] read();
@@ -7460,9 +7484,10 @@ package android.telephony {
public abstract class CellBroadcastService extends android.app.Service {
ctor public CellBroadcastService();
- method @CallSuper public android.os.IBinder onBind(android.content.Intent);
- method public abstract void onCdmaCellBroadcastSms(int, byte[], int);
- method public abstract void onGsmCellBroadcastSms(int, byte[]);
+ method @CallSuper public android.os.IBinder onBind(@Nullable android.content.Intent);
+ method public abstract void onCdmaCellBroadcastSms(int, @NonNull byte[], int);
+ method public abstract void onCdmaScpMessage(int, @NonNull java.util.List<android.telephony.cdma.CdmaSmsCbProgramData>, @NonNull String, @NonNull java.util.function.Consumer<android.os.Bundle>);
+ method public abstract void onGsmCellBroadcastSms(int, @NonNull byte[]);
field public static final String CELL_BROADCAST_SERVICE_INTERFACE = "android.telephony.CellBroadcastService";
}
@@ -7893,6 +7918,14 @@ package android.telephony {
field public static final int WIFI_LOST = 59; // 0x3b
}
+ public final class ImsiEncryptionInfo implements android.os.Parcelable {
+ method public int describeContents();
+ method @Nullable public String getKeyIdentifier();
+ method @Nullable public java.security.PublicKey getPublicKey();
+ method public void writeToParcel(@NonNull android.os.Parcel, int);
+ field @NonNull public static final android.os.Parcelable.Creator<android.telephony.ImsiEncryptionInfo> CREATOR;
+ }
+
public final class LteVopsSupportInfo implements android.os.Parcelable {
ctor public LteVopsSupportInfo(int, int);
method public int describeContents();
@@ -8377,6 +8410,7 @@ package android.telephony {
method @RequiresPermission(android.Manifest.permission.CONNECTIVITY_INTERNAL) public void factoryReset(int);
method @Nullable @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public String getAidForAppType(int);
method @Deprecated @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public java.util.List<android.service.carrier.CarrierIdentifier> getAllowedCarriers(int);
+ method @Nullable @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public android.telephony.ImsiEncryptionInfo getCarrierInfoForImsiEncryption(int);
method public java.util.List<java.lang.String> getCarrierPackageNamesForIntent(android.content.Intent);
method public java.util.List<java.lang.String> getCarrierPackageNamesForIntentAndPhone(android.content.Intent, int);
method @Nullable @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public android.telephony.CarrierRestrictionRules getCarrierRestrictionRules();
@@ -8430,6 +8464,7 @@ package android.telephony {
method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public boolean rebootRadio();
method @RequiresPermission(allOf={android.Manifest.permission.ACCESS_FINE_LOCATION, android.Manifest.permission.MODIFY_PHONE_STATE}) public void requestCellInfoUpdate(@NonNull android.os.WorkSource, @NonNull java.util.concurrent.Executor, @NonNull android.telephony.TelephonyManager.CellInfoCallback);
method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void requestNumberVerification(@NonNull android.telephony.PhoneNumberRange, long, @NonNull java.util.concurrent.Executor, @NonNull android.telephony.NumberVerificationCallback);
+ method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void resetCarrierKeysForImsiEncryption();
method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public boolean resetRadioConfig();
method @Deprecated @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public int setAllowedCarriers(int, java.util.List<android.service.carrier.CarrierIdentifier>);
method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void setCarrierDataEnabled(boolean);
@@ -8453,6 +8488,7 @@ package android.telephony {
method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void toggleRadioOnOff();
method public void updateServiceLocation();
field @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public static final String ACTION_ANOMALY_REPORTED = "android.telephony.action.ANOMALY_REPORTED";
+ field @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public static final String ACTION_OTA_EMERGENCY_NUMBER_DB_INSTALLED = "android.telephony.action.OTA_EMERGENCY_NUMBER_DB_INSTALLED";
field public static final String ACTION_SIM_APPLICATION_STATE_CHANGED = "android.telephony.action.SIM_APPLICATION_STATE_CHANGED";
field public static final String ACTION_SIM_CARD_STATE_CHANGED = "android.telephony.action.SIM_CARD_STATE_CHANGED";
field public static final String ACTION_SIM_SLOT_STATUS_CHANGED = "android.telephony.action.SIM_SLOT_STATUS_CHANGED";
@@ -8465,6 +8501,8 @@ package android.telephony {
field public static final String EXTRA_SIM_STATE = "android.telephony.extra.SIM_STATE";
field public static final String EXTRA_VISUAL_VOICEMAIL_ENABLED_BY_USER_BOOL = "android.telephony.extra.VISUAL_VOICEMAIL_ENABLED_BY_USER_BOOL";
field public static final String EXTRA_VOICEMAIL_SCRAMBLED_PIN_STRING = "android.telephony.extra.VOICEMAIL_SCRAMBLED_PIN_STRING";
+ field public static final int KEY_TYPE_EPDG = 1; // 0x1
+ field public static final int KEY_TYPE_WLAN = 2; // 0x2
field public static final long NETWORK_TYPE_BITMASK_1xRTT = 64L; // 0x40L
field public static final long NETWORK_TYPE_BITMASK_CDMA = 8L; // 0x8L
field public static final long NETWORK_TYPE_BITMASK_EDGE = 2L; // 0x2L
@@ -8756,10 +8794,10 @@ package android.telephony.euicc {
field public static final int RESULT_UNKNOWN_ERROR = -1; // 0xffffffff
}
- @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) @IntDef(prefix={"CANCEL_REASON_"}, value={android.telephony.euicc.EuiccCardManager.CANCEL_REASON_END_USER_REJECTED, android.telephony.euicc.EuiccCardManager.CANCEL_REASON_POSTPONED, android.telephony.euicc.EuiccCardManager.CANCEL_REASON_TIMEOUT, android.telephony.euicc.EuiccCardManager.CANCEL_REASON_PPR_NOT_ALLOWED}) public static @interface EuiccCardManager.CancelReason {
+ @IntDef(prefix={"CANCEL_REASON_"}, value={android.telephony.euicc.EuiccCardManager.CANCEL_REASON_END_USER_REJECTED, android.telephony.euicc.EuiccCardManager.CANCEL_REASON_POSTPONED, android.telephony.euicc.EuiccCardManager.CANCEL_REASON_TIMEOUT, android.telephony.euicc.EuiccCardManager.CANCEL_REASON_PPR_NOT_ALLOWED}) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) public static @interface EuiccCardManager.CancelReason {
}
- @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) @IntDef(flag=true, prefix={"RESET_OPTION_"}, value={android.telephony.euicc.EuiccCardManager.RESET_OPTION_DELETE_OPERATIONAL_PROFILES, android.telephony.euicc.EuiccCardManager.RESET_OPTION_DELETE_FIELD_LOADED_TEST_PROFILES, android.telephony.euicc.EuiccCardManager.RESET_OPTION_RESET_DEFAULT_SMDP_ADDRESS}) public static @interface EuiccCardManager.ResetOption {
+ @IntDef(flag=true, prefix={"RESET_OPTION_"}, value={android.telephony.euicc.EuiccCardManager.RESET_OPTION_DELETE_OPERATIONAL_PROFILES, android.telephony.euicc.EuiccCardManager.RESET_OPTION_DELETE_FIELD_LOADED_TEST_PROFILES, android.telephony.euicc.EuiccCardManager.RESET_OPTION_RESET_DEFAULT_SMDP_ADDRESS}) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) public static @interface EuiccCardManager.ResetOption {
}
public static interface EuiccCardManager.ResultCallback<T> {
@@ -8815,7 +8853,7 @@ package android.telephony.euicc {
field public static final int EVENT_INSTALL = 1; // 0x1
}
- @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) @IntDef(flag=true, prefix={"EVENT_"}, value={android.telephony.euicc.EuiccNotification.EVENT_INSTALL, android.telephony.euicc.EuiccNotification.EVENT_ENABLE, android.telephony.euicc.EuiccNotification.EVENT_DISABLE, android.telephony.euicc.EuiccNotification.EVENT_DELETE}) public static @interface EuiccNotification.Event {
+ @IntDef(flag=true, prefix={"EVENT_"}, value={android.telephony.euicc.EuiccNotification.EVENT_INSTALL, android.telephony.euicc.EuiccNotification.EVENT_ENABLE, android.telephony.euicc.EuiccNotification.EVENT_DISABLE, android.telephony.euicc.EuiccNotification.EVENT_DELETE}) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) public static @interface EuiccNotification.Event {
}
public final class EuiccRulesAuthTable implements android.os.Parcelable {
@@ -8833,7 +8871,7 @@ package android.telephony.euicc {
method public android.telephony.euicc.EuiccRulesAuthTable build();
}
- @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) @IntDef(flag=true, prefix={"POLICY_RULE_FLAG_"}, value={android.telephony.euicc.EuiccRulesAuthTable.POLICY_RULE_FLAG_CONSENT_REQUIRED}) public static @interface EuiccRulesAuthTable.PolicyRuleFlag {
+ @IntDef(flag=true, prefix={"POLICY_RULE_FLAG_"}, value={android.telephony.euicc.EuiccRulesAuthTable.POLICY_RULE_FLAG_CONSENT_REQUIRED}) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) public static @interface EuiccRulesAuthTable.PolicyRuleFlag {
}
}
@@ -9458,14 +9496,17 @@ package android.telephony.ims {
}
public class ImsUtListener {
+ method public void onLineIdentificationSupplementaryServiceResponse(int, @NonNull android.telephony.ims.ImsSsInfo);
method public void onSupplementaryServiceIndication(android.telephony.ims.ImsSsData);
method public void onUtConfigurationCallBarringQueried(int, android.telephony.ims.ImsSsInfo[]);
method public void onUtConfigurationCallForwardQueried(int, android.telephony.ims.ImsCallForwardInfo[]);
method public void onUtConfigurationCallWaitingQueried(int, android.telephony.ims.ImsSsInfo[]);
- method public void onUtConfigurationQueried(int, android.os.Bundle);
+ method @Deprecated public void onUtConfigurationQueried(int, android.os.Bundle);
method public void onUtConfigurationQueryFailed(int, android.telephony.ims.ImsReasonInfo);
method public void onUtConfigurationUpdateFailed(int, android.telephony.ims.ImsReasonInfo);
method public void onUtConfigurationUpdated(int);
+ field @Deprecated public static final String BUNDLE_KEY_CLIR = "queryClir";
+ field @Deprecated public static final String BUNDLE_KEY_SSINFO = "imsSsInfo";
}
public abstract class ImsVideoCallProvider {
@@ -9492,12 +9533,12 @@ package android.telephony.ims {
public class ProvisioningManager {
method @NonNull public static android.telephony.ims.ProvisioningManager createForSubscriptionId(int);
- method @WorkerThread @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public int getProvisioningIntValue(int);
- method @WorkerThread @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public boolean getProvisioningStatusForCapability(@android.telephony.ims.feature.MmTelFeature.MmTelCapabilities.MmTelCapability int, int);
+ method @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) @WorkerThread public int getProvisioningIntValue(int);
+ method @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) @WorkerThread public boolean getProvisioningStatusForCapability(@android.telephony.ims.feature.MmTelFeature.MmTelCapabilities.MmTelCapability int, int);
method @Nullable @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) @WorkerThread public String getProvisioningStringValue(int);
method @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public void registerProvisioningChangedCallback(@NonNull java.util.concurrent.Executor, @NonNull android.telephony.ims.ProvisioningManager.Callback) throws android.telephony.ims.ImsException;
method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) @WorkerThread public int setProvisioningIntValue(int, int);
- method @WorkerThread @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void setProvisioningStatusForCapability(@android.telephony.ims.feature.MmTelFeature.MmTelCapabilities.MmTelCapability int, int, boolean);
+ method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) @WorkerThread public void setProvisioningStatusForCapability(@android.telephony.ims.feature.MmTelFeature.MmTelCapabilities.MmTelCapability int, int, boolean);
method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) @WorkerThread public int setProvisioningStringValue(int, @NonNull String);
method @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public void unregisterProvisioningChangedCallback(@NonNull android.telephony.ims.ProvisioningManager.Callback);
field public static final int KEY_VOICE_OVER_WIFI_MODE_OVERRIDE = 27; // 0x1b
diff --git a/api/system-lint-baseline.txt b/api/system-lint-baseline.txt
index a907fa64d9ce..21526d007dc5 100644
--- a/api/system-lint-baseline.txt
+++ b/api/system-lint-baseline.txt
@@ -135,6 +135,12 @@ MissingNullability: android.telephony.mbms.DownloadRequest.Builder#setServiceId(
+MutableBareField: android.net.wifi.WifiConfiguration#allowAutojoin:
+
+MutableBareField: android.net.wifi.WifiConfiguration#carrierId:
+
+
+
NoClone: android.service.contentcapture.ContentCaptureService#dump(java.io.FileDescriptor, java.io.PrintWriter, String[]) parameter #0:
diff --git a/api/test-current.txt b/api/test-current.txt
index 5b167432373f..495e57af1990 100644
--- a/api/test-current.txt
+++ b/api/test-current.txt
@@ -71,6 +71,9 @@ package android.app {
method @RequiresPermission(android.Manifest.permission.PACKAGE_USAGE_STATS) public void removeOnUidImportanceListener(android.app.ActivityManager.OnUidImportanceListener);
method public static void resumeAppSwitches() throws android.os.RemoteException;
method @RequiresPermission(android.Manifest.permission.CHANGE_CONFIGURATION) public void scheduleApplicationInfoChanged(java.util.List<java.lang.String>, int);
+ field public static final int PROCESS_CAPABILITY_ALL = 1; // 0x1
+ field public static final int PROCESS_CAPABILITY_FOREGROUND_LOCATION = 1; // 0x1
+ field public static final int PROCESS_CAPABILITY_NONE = 0; // 0x0
}
public static interface ActivityManager.OnUidImportanceListener {
@@ -233,7 +236,7 @@ package android.app {
field public static final int UID_STATE_CACHED = 700; // 0x2bc
field public static final int UID_STATE_FOREGROUND = 500; // 0x1f4
field public static final int UID_STATE_FOREGROUND_SERVICE = 400; // 0x190
- field public static final int UID_STATE_FOREGROUND_SERVICE_LOCATION = 300; // 0x12c
+ field @Deprecated public static final int UID_STATE_FOREGROUND_SERVICE_LOCATION = 300; // 0x12c
field public static final int UID_STATE_PERSISTENT = 100; // 0x64
field public static final int UID_STATE_TOP = 200; // 0xc8
}
@@ -852,8 +855,8 @@ package android.content.rollback {
method @RequiresPermission(android.Manifest.permission.TEST_MANAGE_ROLLBACKS) public void blockRollbackManager(long);
method @RequiresPermission(anyOf={android.Manifest.permission.MANAGE_ROLLBACKS, android.Manifest.permission.TEST_MANAGE_ROLLBACKS}) public void commitRollback(int, @NonNull java.util.List<android.content.pm.VersionedPackage>, @NonNull android.content.IntentSender);
method @RequiresPermission(android.Manifest.permission.TEST_MANAGE_ROLLBACKS) public void expireRollbackForPackage(@NonNull String);
- method @RequiresPermission(anyOf={android.Manifest.permission.MANAGE_ROLLBACKS, android.Manifest.permission.TEST_MANAGE_ROLLBACKS}) @NonNull public java.util.List<android.content.rollback.RollbackInfo> getAvailableRollbacks();
- method @RequiresPermission(anyOf={android.Manifest.permission.MANAGE_ROLLBACKS, android.Manifest.permission.TEST_MANAGE_ROLLBACKS}) @NonNull public java.util.List<android.content.rollback.RollbackInfo> getRecentlyCommittedRollbacks();
+ method @NonNull @RequiresPermission(anyOf={android.Manifest.permission.MANAGE_ROLLBACKS, android.Manifest.permission.TEST_MANAGE_ROLLBACKS}) public java.util.List<android.content.rollback.RollbackInfo> getAvailableRollbacks();
+ method @NonNull @RequiresPermission(anyOf={android.Manifest.permission.MANAGE_ROLLBACKS, android.Manifest.permission.TEST_MANAGE_ROLLBACKS}) public java.util.List<android.content.rollback.RollbackInfo> getRecentlyCommittedRollbacks();
method @RequiresPermission(android.Manifest.permission.TEST_MANAGE_ROLLBACKS) public void reloadPersistedData();
field public static final String EXTRA_STATUS = "android.content.rollback.extra.STATUS";
field public static final String EXTRA_STATUS_MESSAGE = "android.content.rollback.extra.STATUS_MESSAGE";
@@ -1148,7 +1151,7 @@ package android.location {
method @NonNull public android.location.LocationRequest setExpireIn(long);
method @NonNull public android.location.LocationRequest setFastestInterval(long);
method @NonNull public android.location.LocationRequest setInterval(long);
- method @RequiresPermission(android.Manifest.permission.WRITE_SECURE_SETTINGS) @NonNull public android.location.LocationRequest setLocationSettingsIgnored(boolean);
+ method @NonNull @RequiresPermission(android.Manifest.permission.WRITE_SECURE_SETTINGS) public android.location.LocationRequest setLocationSettingsIgnored(boolean);
method @NonNull public android.location.LocationRequest setLowPowerMode(boolean);
method @NonNull public android.location.LocationRequest setNumUpdates(int);
method @NonNull public android.location.LocationRequest setProvider(@NonNull String);
@@ -1725,7 +1728,8 @@ package android.net.util {
method public static void closeSocket(@Nullable java.io.FileDescriptor) throws java.io.IOException;
method @NonNull public static java.net.SocketAddress makeNetlinkSocketAddress(int, int);
method @NonNull public static java.net.SocketAddress makePacketSocketAddress(int, int);
- method @NonNull public static java.net.SocketAddress makePacketSocketAddress(int, @NonNull byte[]);
+ method @Deprecated @NonNull public static java.net.SocketAddress makePacketSocketAddress(int, @NonNull byte[]);
+ method @NonNull public static java.net.SocketAddress makePacketSocketAddress(int, int, @NonNull byte[]);
}
}
@@ -1923,8 +1927,8 @@ package android.os {
method @RequiresPermission("android.permission.REQUEST_INCIDENT_REPORT_APPROVAL") public void cancelAuthorization(android.os.IncidentManager.AuthListener);
method @RequiresPermission(allOf={android.Manifest.permission.DUMP, android.Manifest.permission.PACKAGE_USAGE_STATS}) public void deleteIncidentReports(android.net.Uri);
method @RequiresPermission(android.Manifest.permission.APPROVE_INCIDENT_REPORTS) public void denyReport(android.net.Uri);
- method @RequiresPermission(allOf={android.Manifest.permission.DUMP, android.Manifest.permission.PACKAGE_USAGE_STATS}) @Nullable public android.os.IncidentManager.IncidentReport getIncidentReport(android.net.Uri);
- method @RequiresPermission(allOf={android.Manifest.permission.DUMP, android.Manifest.permission.PACKAGE_USAGE_STATS}) @NonNull public java.util.List<android.net.Uri> getIncidentReportList(String);
+ method @Nullable @RequiresPermission(allOf={android.Manifest.permission.DUMP, android.Manifest.permission.PACKAGE_USAGE_STATS}) public android.os.IncidentManager.IncidentReport getIncidentReport(android.net.Uri);
+ method @NonNull @RequiresPermission(allOf={android.Manifest.permission.DUMP, android.Manifest.permission.PACKAGE_USAGE_STATS}) public java.util.List<android.net.Uri> getIncidentReportList(String);
method @RequiresPermission(android.Manifest.permission.APPROVE_INCIDENT_REPORTS) public java.util.List<android.os.IncidentManager.PendingReport> getPendingReports();
method @RequiresPermission(allOf={android.Manifest.permission.DUMP, android.Manifest.permission.PACKAGE_USAGE_STATS}) public void reportIncident(android.os.IncidentReportArgs);
method @RequiresPermission("android.permission.REQUEST_INCIDENT_REPORT_APPROVAL") public void requestAuthorization(int, String, int, android.os.IncidentManager.AuthListener);
@@ -2422,6 +2426,7 @@ package android.provider {
}
public static final class Settings.Global extends android.provider.Settings.NameValueTable {
+ field public static final String APP_OPS_CONSTANTS = "app_ops_constants";
field public static final String AUTOFILL_COMPAT_MODE_ALLOWED_PACKAGES = "autofill_compat_mode_allowed_packages";
field public static final String AUTOMATIC_POWER_SAVE_MODE = "automatic_power_save_mode";
field public static final String BATTERY_SAVER_CONSTANTS = "battery_saver_constants";
@@ -2481,7 +2486,7 @@ package android.provider {
field public static final String MESSAGE_BODY = "body";
field public static final String MESSAGE_BROADCASTED = "message_broadcasted";
field public static final String MESSAGE_FORMAT = "format";
- field @RequiresPermission(android.Manifest.permission.READ_CELL_BROADCASTS) @NonNull public static final android.net.Uri MESSAGE_HISTORY_URI;
+ field @NonNull @RequiresPermission(android.Manifest.permission.READ_CELL_BROADCASTS) public static final android.net.Uri MESSAGE_HISTORY_URI;
field public static final String MESSAGE_PRIORITY = "priority";
field public static final String MESSAGE_READ = "read";
field public static final String PLMN = "plmn";
@@ -2513,7 +2518,7 @@ package android.security {
package android.security.keystore {
public abstract class AttestationUtils {
- method @RequiresPermission("android.permission.READ_PRIVILEGED_PHONE_STATE") @NonNull public static java.security.cert.X509Certificate[] attestDeviceIds(android.content.Context, @NonNull int[], @NonNull byte[]) throws android.security.keystore.DeviceIdAttestationException;
+ method @NonNull @RequiresPermission("android.permission.READ_PRIVILEGED_PHONE_STATE") public static java.security.cert.X509Certificate[] attestDeviceIds(android.content.Context, @NonNull int[], @NonNull byte[]) throws android.security.keystore.DeviceIdAttestationException;
field public static final int ID_TYPE_IMEI = 2; // 0x2
field public static final int ID_TYPE_MEID = 3; // 0x3
field public static final int ID_TYPE_SERIAL = 1; // 0x1
diff --git a/api/test-lint-baseline.txt b/api/test-lint-baseline.txt
new file mode 100644
index 000000000000..9606413ff7cd
--- /dev/null
+++ b/api/test-lint-baseline.txt
@@ -0,0 +1,2249 @@
+// Baseline format: 1.0
+AcronymName: android.app.NotificationChannel#isImportanceLockedByOEM():
+
+AcronymName: android.app.NotificationChannel#setImportanceLockedByOEM(boolean):
+
+
+
+ActionValue: android.location.Location#EXTRA_NO_GPS_LOCATION:
+
+ActionValue: android.telephony.mbms.vendor.VendorUtils#ACTION_CLEANUP:
+
+ActionValue: android.telephony.mbms.vendor.VendorUtils#ACTION_DOWNLOAD_RESULT_INTERNAL:
+
+ActionValue: android.telephony.mbms.vendor.VendorUtils#ACTION_FILE_DESCRIPTOR_REQUEST:
+
+ActionValue: android.telephony.mbms.vendor.VendorUtils#EXTRA_FD_COUNT:
+
+ActionValue: android.telephony.mbms.vendor.VendorUtils#EXTRA_FINAL_URI:
+
+ActionValue: android.telephony.mbms.vendor.VendorUtils#EXTRA_FREE_URI_LIST:
+
+ActionValue: android.telephony.mbms.vendor.VendorUtils#EXTRA_PAUSED_LIST:
+
+ActionValue: android.telephony.mbms.vendor.VendorUtils#EXTRA_PAUSED_URI_LIST:
+
+ActionValue: android.telephony.mbms.vendor.VendorUtils#EXTRA_SERVICE_ID:
+
+ActionValue: android.telephony.mbms.vendor.VendorUtils#EXTRA_TEMP_FILES_IN_USE:
+
+ActionValue: android.telephony.mbms.vendor.VendorUtils#EXTRA_TEMP_FILE_ROOT:
+
+ActionValue: android.telephony.mbms.vendor.VendorUtils#EXTRA_TEMP_LIST:
+
+
+
+ArrayReturn: android.app.UiAutomation#executeShellCommandRw(String):
+
+ArrayReturn: android.location.GnssMeasurementsEvent#GnssMeasurementsEvent(android.location.GnssClock, android.location.GnssMeasurement[]) parameter #1:
+
+ArrayReturn: android.media.AudioRecordingConfiguration#AudioRecordingConfiguration(int, int, int, android.media.AudioFormat, android.media.AudioFormat, int, String, int, boolean, int, android.media.audiofx.AudioEffect.Descriptor[], android.media.audiofx.AudioEffect.Descriptor[]) parameter #10:
+
+ArrayReturn: android.media.AudioRecordingConfiguration#AudioRecordingConfiguration(int, int, int, android.media.AudioFormat, android.media.AudioFormat, int, String, int, boolean, int, android.media.audiofx.AudioEffect.Descriptor[], android.media.audiofx.AudioEffect.Descriptor[]) parameter #11:
+
+ArrayReturn: android.metrics.LogMaker#LogMaker(Object[]) parameter #0:
+
+ArrayReturn: android.metrics.LogMaker#deserialize(Object[]) parameter #0:
+
+ArrayReturn: android.metrics.LogMaker#serialize():
+
+ArrayReturn: android.net.TestNetworkManager#createTunInterface(android.net.LinkAddress[]) parameter #0:
+
+ArrayReturn: android.os.HwBlob#wrapArray(boolean[]):
+
+ArrayReturn: android.os.HwBlob#wrapArray(byte[]):
+
+ArrayReturn: android.os.HwBlob#wrapArray(double[]):
+
+ArrayReturn: android.os.HwBlob#wrapArray(float[]):
+
+ArrayReturn: android.os.HwBlob#wrapArray(int[]):
+
+ArrayReturn: android.os.HwBlob#wrapArray(long[]):
+
+ArrayReturn: android.os.HwBlob#wrapArray(short[]):
+
+ArrayReturn: android.os.NativeHandle#NativeHandle(java.io.FileDescriptor[], int[], boolean) parameter #0:
+
+ArrayReturn: android.os.NativeHandle#getFileDescriptors():
+
+ArrayReturn: android.security.keystore.AttestationUtils#attestDeviceIds(android.content.Context, int[], byte[]):
+
+ArrayReturn: android.view.FocusFinder#sort(android.view.View[], int, int, android.view.ViewGroup, boolean) parameter #0:
+
+ArrayReturn: android.view.contentcapture.ViewNode#getAutofillOptions():
+
+ArrayReturn: android.view.contentcapture.ViewNode.ViewStructureImpl#setAutofillOptions(CharSequence[]) parameter #0:
+
+ArrayReturn: android.view.inspector.InspectableProperty#enumMapping():
+
+ArrayReturn: android.view.inspector.InspectableProperty#flagMapping():
+
+
+
+AutoBoxing: android.os.HwBlob#wrapArray(byte[]):
+
+AutoBoxing: android.os.HwBlob#wrapArray(double[]):
+
+AutoBoxing: android.os.HwBlob#wrapArray(float[]):
+
+AutoBoxing: android.os.HwBlob#wrapArray(int[]):
+
+AutoBoxing: android.os.HwBlob#wrapArray(long[]):
+
+AutoBoxing: android.os.HwBlob#wrapArray(short[]):
+
+AutoBoxing: android.os.VintfObject#getTargetFrameworkCompatibilityMatrixVersion():
+
+
+
+BannedThrow: android.app.ActivityTaskManager#removeStacksInWindowingModes(int[]):
+
+BannedThrow: android.app.ActivityTaskManager#removeStacksWithActivityTypes(int[]):
+
+BannedThrow: android.app.ActivityTaskManager#setTaskWindowingMode(int, int, boolean):
+
+BannedThrow: android.app.ActivityTaskManager#setTaskWindowingModeSplitScreenPrimary(int, int, boolean, boolean, android.graphics.Rect, boolean):
+
+BannedThrow: android.media.audiofx.AudioEffect#getParameter(byte[], byte[]):
+
+BannedThrow: android.media.audiofx.AudioEffect#getParameter(int, byte[]):
+
+BannedThrow: android.media.audiofx.AudioEffect#getParameter(int, int[]):
+
+BannedThrow: android.media.audiofx.AudioEffect#getParameter(int, short[]):
+
+BannedThrow: android.media.audiofx.AudioEffect#getParameter(int[], short[]):
+
+BannedThrow: android.media.audiofx.AudioEffect#setParameter(byte[], byte[]):
+
+BannedThrow: android.media.audiofx.AudioEffect#setParameter(int, byte[]):
+
+BannedThrow: android.media.audiofx.AudioEffect#setParameter(int, int):
+
+BannedThrow: android.media.audiofx.AudioEffect#setParameter(int, short):
+
+BannedThrow: android.media.audiofx.AudioEffect#setParameter(int[], byte[]):
+
+BannedThrow: android.media.audiofx.AudioEffect#setParameter(int[], int[]):
+
+BannedThrow: android.media.audiopolicy.AudioMix.Builder#Builder(android.media.audiopolicy.AudioMixingRule):
+
+BannedThrow: android.media.audiopolicy.AudioMix.Builder#build():
+
+BannedThrow: android.media.audiopolicy.AudioMix.Builder#setDevice(android.media.AudioDeviceInfo):
+
+BannedThrow: android.media.audiopolicy.AudioMix.Builder#setFormat(android.media.AudioFormat):
+
+BannedThrow: android.media.audiopolicy.AudioMix.Builder#setRouteFlags(int):
+
+BannedThrow: android.media.audiopolicy.AudioMixingRule.Builder#addMixRule(int, Object):
+
+BannedThrow: android.media.audiopolicy.AudioMixingRule.Builder#addRule(android.media.AudioAttributes, int):
+
+BannedThrow: android.media.audiopolicy.AudioMixingRule.Builder#excludeMixRule(int, Object):
+
+BannedThrow: android.media.audiopolicy.AudioMixingRule.Builder#excludeRule(android.media.AudioAttributes, int):
+
+BannedThrow: android.media.audiopolicy.AudioPolicy#createAudioRecordSink(android.media.audiopolicy.AudioMix):
+
+BannedThrow: android.media.audiopolicy.AudioPolicy#createAudioTrackSource(android.media.audiopolicy.AudioMix):
+
+BannedThrow: android.media.audiopolicy.AudioPolicy#setFocusDuckingBehavior(int):
+
+BannedThrow: android.media.audiopolicy.AudioPolicy.Builder#addMix(android.media.audiopolicy.AudioMix):
+
+BannedThrow: android.media.audiopolicy.AudioPolicy.Builder#setLooper(android.os.Looper):
+
+BannedThrow: android.os.HwBinder#getService(String, String):
+
+BannedThrow: android.os.HwBinder#getService(String, String, boolean):
+
+BannedThrow: android.os.Process#getThreadScheduler(int):
+
+
+
+CallbackInterface: android.app.prediction.AppPredictor.Callback:
+
+CallbackInterface: android.permission.PermissionControllerManager.OnGetAppPermissionResultCallback:
+
+CallbackInterface: android.widget.Magnifier.Callback:
+
+
+
+CallbackMethodName: android.os.RemoteCallback:
+
+
+
+ConcreteCollection: android.content.AutofillOptions#disabledActivities:
+
+ConcreteCollection: android.content.AutofillOptions#whitelistedActivitiesForAugmentedAutofill:
+
+ConcreteCollection: android.content.ContentCaptureOptions#ContentCaptureOptions(int, int, int, int, int, android.util.ArraySet<android.content.ComponentName>) parameter #5:
+
+ConcreteCollection: android.content.ContentCaptureOptions#whitelistedComponents:
+
+ConcreteCollection: android.database.sqlite.SQLiteDebug.PagerStats#dbStats:
+
+ConcreteCollection: android.os.HwParcel#readBoolVector():
+
+ConcreteCollection: android.os.HwParcel#readDoubleVector():
+
+ConcreteCollection: android.os.HwParcel#readFloatVector():
+
+ConcreteCollection: android.os.HwParcel#readInt16Vector():
+
+ConcreteCollection: android.os.HwParcel#readInt32Vector():
+
+ConcreteCollection: android.os.HwParcel#readInt64Vector():
+
+ConcreteCollection: android.os.HwParcel#readInt8Vector():
+
+ConcreteCollection: android.os.HwParcel#readNativeHandleVector():
+
+ConcreteCollection: android.os.HwParcel#readStringVector():
+
+ConcreteCollection: android.os.HwParcel#writeBoolVector(java.util.ArrayList<java.lang.Boolean>) parameter #0:
+
+ConcreteCollection: android.os.HwParcel#writeDoubleVector(java.util.ArrayList<java.lang.Double>) parameter #0:
+
+ConcreteCollection: android.os.HwParcel#writeFloatVector(java.util.ArrayList<java.lang.Float>) parameter #0:
+
+ConcreteCollection: android.os.HwParcel#writeInt16Vector(java.util.ArrayList<java.lang.Short>) parameter #0:
+
+ConcreteCollection: android.os.HwParcel#writeInt32Vector(java.util.ArrayList<java.lang.Integer>) parameter #0:
+
+ConcreteCollection: android.os.HwParcel#writeInt64Vector(java.util.ArrayList<java.lang.Long>) parameter #0:
+
+ConcreteCollection: android.os.HwParcel#writeInt8Vector(java.util.ArrayList<java.lang.Byte>) parameter #0:
+
+ConcreteCollection: android.os.HwParcel#writeNativeHandleVector(java.util.ArrayList<android.os.NativeHandle>) parameter #0:
+
+ConcreteCollection: android.os.HwParcel#writeStringVector(java.util.ArrayList<java.lang.String>) parameter #0:
+
+ConcreteCollection: android.service.autofill.CompositeUserData#getFieldClassificationAlgorithms():
+
+ConcreteCollection: android.service.autofill.CompositeUserData#getFieldClassificationArgs():
+
+ConcreteCollection: android.service.autofill.InternalTransformation#batchApply(android.service.autofill.ValueFinder, android.widget.RemoteViews, java.util.ArrayList<android.util.Pair<java.lang.Integer,android.service.autofill.InternalTransformation>>) parameter #2:
+
+ConcreteCollection: android.service.autofill.UserData#getFieldClassificationAlgorithms():
+
+
+
+ContextFirst: android.os.VibrationEffect#get(android.net.Uri, android.content.Context) parameter #1:
+
+
+
+ContextNameSuffix: android.telephony.mbms.vendor.MbmsGroupCallServiceBase:
+
+
+
+EndsWithImpl: android.view.contentcapture.ViewNode.ViewStructureImpl:
+
+
+
+Enum: android.view.inspector.InspectableProperty.ValueType:
+
+
+
+EqualsAndHashCode: android.app.prediction.AppPredictionContext#equals(Object):
+
+EqualsAndHashCode: android.app.prediction.AppTarget#equals(Object):
+
+EqualsAndHashCode: android.app.prediction.AppTargetEvent#equals(Object):
+
+EqualsAndHashCode: android.net.apf.ApfCapabilities#equals(Object):
+
+EqualsAndHashCode: android.net.metrics.ApfProgramEvent#equals(Object):
+
+EqualsAndHashCode: android.net.metrics.ApfStats#equals(Object):
+
+EqualsAndHashCode: android.net.metrics.DhcpClientEvent#equals(Object):
+
+EqualsAndHashCode: android.net.metrics.IpManagerEvent#equals(Object):
+
+EqualsAndHashCode: android.net.metrics.IpReachabilityEvent#equals(Object):
+
+EqualsAndHashCode: android.net.metrics.NetworkEvent#equals(Object):
+
+EqualsAndHashCode: android.net.metrics.RaEvent#equals(Object):
+
+EqualsAndHashCode: android.net.metrics.ValidationProbeEvent#equals(Object):
+
+EqualsAndHashCode: android.os.IncidentManager.PendingReport#equals(Object):
+
+EqualsAndHashCode: android.os.StrictMode.ViolationInfo#hashCode():
+
+
+
+ExecutorRegistration: android.content.pm.PackageManager#addOnPermissionsChangeListener(android.content.pm.PackageManager.OnPermissionsChangedListener):
+
+ExecutorRegistration: android.hardware.camera2.CameraDevice#createCustomCaptureSession(android.hardware.camera2.params.InputConfiguration, java.util.List<android.hardware.camera2.params.OutputConfiguration>, int, android.hardware.camera2.CameraCaptureSession.StateCallback, android.os.Handler):
+
+ExecutorRegistration: android.media.audiofx.AudioEffect#setParameterListener(android.media.audiofx.AudioEffect.OnParameterChangeListener):
+
+ExecutorRegistration: android.media.audiopolicy.AudioPolicy.Builder#setAudioPolicyFocusListener(android.media.audiopolicy.AudioPolicy.AudioPolicyFocusListener):
+
+ExecutorRegistration: android.media.audiopolicy.AudioPolicy.Builder#setAudioPolicyStatusListener(android.media.audiopolicy.AudioPolicy.AudioPolicyStatusListener):
+
+ExecutorRegistration: android.media.audiopolicy.AudioPolicy.Builder#setAudioPolicyVolumeCallback(android.media.audiopolicy.AudioPolicy.AudioPolicyVolumeCallback):
+
+ExecutorRegistration: android.os.IncidentManager#cancelAuthorization(android.os.IncidentManager.AuthListener):
+
+ExecutorRegistration: android.os.IncidentManager#requestAuthorization(int, String, int, android.os.IncidentManager.AuthListener):
+
+ExecutorRegistration: android.os.RemoteCallback#RemoteCallback(android.os.RemoteCallback.OnResultListener, android.os.Handler):
+
+ExecutorRegistration: android.permission.PermissionControllerManager#getAppPermissions(String, android.permission.PermissionControllerManager.OnGetAppPermissionResultCallback, android.os.Handler):
+
+ExecutorRegistration: android.telephony.mbms.vendor.MbmsDownloadServiceBase#addProgressListener(android.telephony.mbms.DownloadRequest, android.telephony.mbms.DownloadProgressListener):
+
+ExecutorRegistration: android.telephony.mbms.vendor.MbmsDownloadServiceBase#addStatusListener(android.telephony.mbms.DownloadRequest, android.telephony.mbms.DownloadStatusListener):
+
+ExecutorRegistration: android.telephony.mbms.vendor.MbmsDownloadServiceBase#initialize(int, android.telephony.mbms.MbmsDownloadSessionCallback):
+
+ExecutorRegistration: android.telephony.mbms.vendor.MbmsGroupCallServiceBase#initialize(android.telephony.mbms.MbmsGroupCallSessionCallback, int):
+
+ExecutorRegistration: android.telephony.mbms.vendor.MbmsGroupCallServiceBase#startGroupCall(int, long, java.util.List<java.lang.Integer>, java.util.List<java.lang.Integer>, android.telephony.mbms.GroupCallCallback):
+
+ExecutorRegistration: android.telephony.mbms.vendor.MbmsStreamingServiceBase#initialize(android.telephony.mbms.MbmsStreamingSessionCallback, int):
+
+ExecutorRegistration: android.telephony.mbms.vendor.MbmsStreamingServiceBase#startStreaming(int, String, android.telephony.mbms.StreamingServiceCallback):
+
+
+
+ForbiddenSuperClass: android.app.AppDetailsActivity:
+
+
+
+GenericException: android.app.ActivityView#finalize():
+
+GenericException: android.app.prediction.AppPredictor#finalize():
+
+GenericException: android.service.autofill.CharSequenceTransformation#apply(android.service.autofill.ValueFinder, android.widget.RemoteViews, int):
+
+GenericException: android.service.autofill.DateTransformation#apply(android.service.autofill.ValueFinder, android.widget.RemoteViews, int):
+
+GenericException: android.service.autofill.ImageTransformation#apply(android.service.autofill.ValueFinder, android.widget.RemoteViews, int):
+
+GenericException: android.service.autofill.augmented.FillWindow#finalize():
+
+
+
+GetterSetterNames: android.app.NotificationChannel#isBlockableSystem():
+
+GetterSetterNames: android.app.NotificationChannel#isImportanceLockedByCriticalDeviceFunction():
+
+GetterSetterNames: android.app.NotificationChannel#isImportanceLockedByOEM():
+
+GetterSetterNames: android.location.GnssClock#setBiasNanos(double):
+
+GetterSetterNames: android.location.GnssClock#setBiasUncertaintyNanos(double):
+
+GetterSetterNames: android.location.GnssClock#setDriftNanosPerSecond(double):
+
+GetterSetterNames: android.location.GnssClock#setDriftUncertaintyNanosPerSecond(double):
+
+GetterSetterNames: android.location.GnssClock#setElapsedRealtimeNanos(long):
+
+GetterSetterNames: android.location.GnssClock#setElapsedRealtimeUncertaintyNanos(double):
+
+GetterSetterNames: android.location.GnssClock#setFullBiasNanos(long):
+
+GetterSetterNames: android.location.GnssClock#setLeapSecond(int):
+
+GetterSetterNames: android.location.GnssClock#setTimeUncertaintyNanos(double):
+
+GetterSetterNames: android.location.GnssMeasurement#setCarrierFrequencyHz(float):
+
+GetterSetterNames: android.location.GnssMeasurement#setCodeType(String):
+
+GetterSetterNames: android.location.GnssMeasurement#setSnrInDb(double):
+
+GetterSetterNames: android.location.LocationRequest#isLocationSettingsIgnored():
+
+GetterSetterNames: android.location.LocationRequest#isLowPowerMode():
+
+GetterSetterNames: android.os.IncidentReportArgs#isAll():
+
+GetterSetterNames: android.service.notification.NotificationStats#setDirectReplied():
+
+GetterSetterNames: android.service.notification.NotificationStats#setExpanded():
+
+GetterSetterNames: android.service.notification.NotificationStats#setSeen():
+
+GetterSetterNames: android.service.notification.NotificationStats#setSnoozed():
+
+GetterSetterNames: android.service.notification.NotificationStats#setViewedSettings():
+
+GetterSetterNames: android.view.View#isAutofilled():
+
+GetterSetterNames: android.view.View#isDefaultFocusHighlightEnabled():
+
+
+
+IllegalStateException: android.media.audiopolicy.AudioMix.Builder#build():
+
+
+
+IntentBuilderName: android.app.backup.BackupManager#getConfigurationIntent(String):
+
+IntentBuilderName: android.app.backup.BackupManager#getDataManagementIntent(String):
+
+
+
+IntentName: android.provider.Settings.Secure#VOICE_INTERACTION_SERVICE:
+
+IntentName: android.provider.Telephony.Sms.Intents#SMS_CARRIER_PROVISION_ACTION:
+
+IntentName: android.service.notification.Adjustment#KEY_CONTEXTUAL_ACTIONS:
+
+
+
+InterfaceConstant: android.service.autofill.AutofillFieldClassificationService#SERVICE_INTERFACE:
+
+InterfaceConstant: android.service.autofill.augmented.AugmentedAutofillService#SERVICE_INTERFACE:
+
+InterfaceConstant: android.service.contentcapture.ContentCaptureService#SERVICE_INTERFACE:
+
+InterfaceConstant: android.service.notification.NotificationAssistantService#SERVICE_INTERFACE:
+
+InterfaceConstant: android.telecom.PhoneAccountSuggestionService#SERVICE_INTERFACE:
+
+
+
+KotlinOperator: android.os.WorkSource#get(int):
+
+
+
+ListenerInterface: android.media.audiopolicy.AudioPolicy.AudioPolicyFocusListener:
+
+ListenerInterface: android.media.audiopolicy.AudioPolicy.AudioPolicyStatusListener:
+
+ListenerInterface: android.os.IncidentManager.AuthListener:
+
+
+
+ListenerLast: android.hardware.camera2.CameraDevice#createCustomCaptureSession(android.hardware.camera2.params.InputConfiguration, java.util.List<android.hardware.camera2.params.OutputConfiguration>, int, android.hardware.camera2.CameraCaptureSession.StateCallback, android.os.Handler) parameter #4:
+
+ListenerLast: android.location.LocationManager#requestLocationUpdates(android.location.LocationRequest, android.location.LocationListener, android.os.Looper) parameter #2:
+
+ListenerLast: android.permission.PermissionControllerManager#getAppPermissions(String, android.permission.PermissionControllerManager.OnGetAppPermissionResultCallback, android.os.Handler) parameter #2:
+
+ListenerLast: android.telephony.mbms.vendor.MbmsGroupCallServiceBase#initialize(android.telephony.mbms.MbmsGroupCallSessionCallback, int) parameter #1:
+
+ListenerLast: android.telephony.mbms.vendor.MbmsStreamingServiceBase#initialize(android.telephony.mbms.MbmsStreamingSessionCallback, int) parameter #1:
+
+
+
+ManagerConstructor: android.content.pm.ShortcutManager#ShortcutManager(android.content.Context):
+
+
+
+MinMaxConstant: android.os.UserHandle#MIN_SECONDARY_USER_ID:
+
+MinMaxConstant: android.view.autofill.AutofillManager#MAX_TEMP_AUGMENTED_SERVICE_DURATION_MS:
+
+
+
+MissingNullability: android.app.Activity#onMovedToDisplay(int, android.content.res.Configuration) parameter #1:
+
+MissingNullability: android.app.ActivityManager#addOnUidImportanceListener(android.app.ActivityManager.OnUidImportanceListener, int) parameter #0:
+
+MissingNullability: android.app.ActivityManager#alwaysShowUnsupportedCompileSdkWarning(android.content.ComponentName) parameter #0:
+
+MissingNullability: android.app.ActivityManager#forceStopPackage(String) parameter #0:
+
+MissingNullability: android.app.ActivityManager#getPackageImportance(String) parameter #0:
+
+MissingNullability: android.app.ActivityManager#removeOnUidImportanceListener(android.app.ActivityManager.OnUidImportanceListener) parameter #0:
+
+MissingNullability: android.app.ActivityManager#scheduleApplicationInfoChanged(java.util.List<java.lang.String>, int) parameter #0:
+
+MissingNullability: android.app.ActivityManager.TaskDescription#getIconFilename():
+
+MissingNullability: android.app.ActivityTaskManager#clearLaunchParamsForPackages(java.util.List<java.lang.String>) parameter #0:
+
+MissingNullability: android.app.ActivityTaskManager#listAllStacks():
+
+MissingNullability: android.app.ActivityTaskManager#moveTopActivityToPinnedStack(int, android.graphics.Rect) parameter #1:
+
+MissingNullability: android.app.ActivityTaskManager#removeStacksInWindowingModes(int[]) parameter #0:
+
+MissingNullability: android.app.ActivityTaskManager#removeStacksWithActivityTypes(int[]) parameter #0:
+
+MissingNullability: android.app.ActivityTaskManager#resizeDockedStack(android.graphics.Rect, android.graphics.Rect) parameter #0:
+
+MissingNullability: android.app.ActivityTaskManager#resizeDockedStack(android.graphics.Rect, android.graphics.Rect) parameter #1:
+
+MissingNullability: android.app.ActivityTaskManager#resizePinnedStack(int, android.graphics.Rect, boolean) parameter #1:
+
+MissingNullability: android.app.ActivityTaskManager#resizeTask(int, android.graphics.Rect) parameter #1:
+
+MissingNullability: android.app.ActivityTaskManager#setTaskWindowingModeSplitScreenPrimary(int, int, boolean, boolean, android.graphics.Rect, boolean) parameter #4:
+
+MissingNullability: android.app.ActivityTaskManager#supportsMultiWindow(android.content.Context) parameter #0:
+
+MissingNullability: android.app.ActivityTaskManager#supportsSplitScreenMultiWindow(android.content.Context) parameter #0:
+
+MissingNullability: android.app.ActivityView#ActivityView(android.content.Context) parameter #0:
+
+MissingNullability: android.app.ActivityView#ActivityView(android.content.Context, android.util.AttributeSet) parameter #0:
+
+MissingNullability: android.app.ActivityView#ActivityView(android.content.Context, android.util.AttributeSet) parameter #1:
+
+MissingNullability: android.app.ActivityView#ActivityView(android.content.Context, android.util.AttributeSet, int) parameter #0:
+
+MissingNullability: android.app.ActivityView#ActivityView(android.content.Context, android.util.AttributeSet, int) parameter #1:
+
+MissingNullability: android.app.ActivityView#ActivityView(android.content.Context, android.util.AttributeSet, int, boolean) parameter #0:
+
+MissingNullability: android.app.ActivityView#ActivityView(android.content.Context, android.util.AttributeSet, int, boolean) parameter #1:
+
+MissingNullability: android.app.ActivityView#gatherTransparentRegion(android.graphics.Region) parameter #0:
+
+MissingNullability: android.app.ActivityView#onVisibilityChanged(android.view.View, int) parameter #0:
+
+MissingNullability: android.app.ActivityView#setCallback(android.app.ActivityView.StateCallback) parameter #0:
+
+MissingNullability: android.app.ActivityView#setForwardedInsets(android.graphics.Insets) parameter #0:
+
+MissingNullability: android.app.ActivityView#startActivity(android.content.Intent, android.os.UserHandle) parameter #1:
+
+MissingNullability: android.app.ActivityView.StateCallback#onActivityViewDestroyed(android.app.ActivityView) parameter #0:
+
+MissingNullability: android.app.ActivityView.StateCallback#onActivityViewReady(android.app.ActivityView) parameter #0:
+
+MissingNullability: android.app.ActivityView.StateCallback#onTaskCreated(int, android.content.ComponentName) parameter #1:
+
+MissingNullability: android.app.AppDetailsActivity#onCreate(android.os.Bundle) parameter #0:
+
+MissingNullability: android.app.AppOpsManager#getOpStrs():
+
+MissingNullability: android.app.AppOpsManager#isOperationActive(int, int, String) parameter #2:
+
+MissingNullability: android.app.AppOpsManager#opToPermission(int):
+
+MissingNullability: android.app.AppOpsManager#permissionToOpCode(String) parameter #0:
+
+MissingNullability: android.app.AppOpsManager#setMode(String, int, String, int) parameter #0:
+
+MissingNullability: android.app.AppOpsManager#setMode(String, int, String, int) parameter #2:
+
+MissingNullability: android.app.AppOpsManager#setMode(int, int, String, int) parameter #2:
+
+MissingNullability: android.app.AppOpsManager#setUidMode(String, int, int) parameter #0:
+
+MissingNullability: android.app.AppOpsManager.HistoricalOp#writeToParcel(android.os.Parcel, int) parameter #0:
+
+MissingNullability: android.app.AppOpsManager.HistoricalOps#writeToParcel(android.os.Parcel, int) parameter #0:
+
+MissingNullability: android.app.AppOpsManager.HistoricalUidOps#writeToParcel(android.os.Parcel, int) parameter #0:
+
+MissingNullability: android.app.AppOpsManager.OpEntry#writeToParcel(android.os.Parcel, int) parameter #0:
+
+MissingNullability: android.app.NotificationManager#allowAssistantAdjustment(String) parameter #0:
+
+MissingNullability: android.app.NotificationManager#disallowAssistantAdjustment(String) parameter #0:
+
+MissingNullability: android.app.NotificationManager#getEffectsSuppressor():
+
+MissingNullability: android.app.NotificationManager#matchesCallFilter(android.os.Bundle) parameter #0:
+
+MissingNullability: android.app.PictureInPictureParams#getActions():
+
+MissingNullability: android.app.PictureInPictureParams#getSourceRectHint():
+
+MissingNullability: android.app.TimePickerDialog#getTimePicker():
+
+MissingNullability: android.app.UiAutomation#executeShellCommandRw(String):
+
+MissingNullability: android.app.UiAutomation#executeShellCommandRw(String) parameter #0:
+
+MissingNullability: android.app.UiAutomation#grantRuntimePermission(String, String, android.os.UserHandle) parameter #0:
+
+MissingNullability: android.app.UiAutomation#grantRuntimePermission(String, String, android.os.UserHandle) parameter #1:
+
+MissingNullability: android.app.UiAutomation#grantRuntimePermission(String, String, android.os.UserHandle) parameter #2:
+
+MissingNullability: android.app.UiAutomation#revokeRuntimePermission(String, String, android.os.UserHandle) parameter #0:
+
+MissingNullability: android.app.UiAutomation#revokeRuntimePermission(String, String, android.os.UserHandle) parameter #1:
+
+MissingNullability: android.app.UiAutomation#revokeRuntimePermission(String, String, android.os.UserHandle) parameter #2:
+
+MissingNullability: android.app.WallpaperManager#setWallpaperComponent(android.content.ComponentName) parameter #0:
+
+MissingNullability: android.app.WindowConfiguration#compareTo(android.app.WindowConfiguration) parameter #0:
+
+MissingNullability: android.app.WindowConfiguration#getAppBounds():
+
+MissingNullability: android.app.WindowConfiguration#getBounds():
+
+MissingNullability: android.app.WindowConfiguration#setAppBounds(android.graphics.Rect) parameter #0:
+
+MissingNullability: android.app.WindowConfiguration#setBounds(android.graphics.Rect) parameter #0:
+
+MissingNullability: android.app.WindowConfiguration#setTo(android.app.WindowConfiguration) parameter #0:
+
+MissingNullability: android.app.WindowConfiguration#writeToParcel(android.os.Parcel, int) parameter #0:
+
+MissingNullability: android.app.admin.DevicePolicyManager#getOwnerInstalledCaCerts(android.os.UserHandle):
+
+MissingNullability: android.app.admin.SecurityLog.SecurityEvent#SecurityEvent(long, byte[]) parameter #1:
+
+MissingNullability: android.app.backup.BackupManager#getConfigurationIntent(String):
+
+MissingNullability: android.app.backup.BackupManager#getConfigurationIntent(String) parameter #0:
+
+MissingNullability: android.app.backup.BackupManager#getDataManagementIntent(String):
+
+MissingNullability: android.app.backup.BackupManager#getDataManagementIntent(String) parameter #0:
+
+MissingNullability: android.app.backup.BackupManager#getDestinationString(String):
+
+MissingNullability: android.app.backup.BackupManager#getDestinationString(String) parameter #0:
+
+MissingNullability: android.app.prediction.AppPredictionSessionId#writeToParcel(android.os.Parcel, int) parameter #0:
+
+MissingNullability: android.app.prediction.AppPredictor#getSessionId():
+
+MissingNullability: android.app.prediction.AppTarget#writeToParcel(android.os.Parcel, int) parameter #0:
+
+MissingNullability: android.app.prediction.AppTargetEvent#writeToParcel(android.os.Parcel, int) parameter #0:
+
+MissingNullability: android.app.prediction.AppTargetId#writeToParcel(android.os.Parcel, int) parameter #0:
+
+MissingNullability: android.content.AutofillOptions#forWhitelistingItself():
+
+MissingNullability: android.content.AutofillOptions#writeToParcel(android.os.Parcel, int) parameter #0:
+
+MissingNullability: android.content.ContentCaptureOptions#forWhitelistingItself():
+
+MissingNullability: android.content.ContentCaptureOptions#writeToParcel(android.os.Parcel, int) parameter #0:
+
+MissingNullability: android.content.ContentResolver#getSyncAdapterPackagesForAuthorityAsUser(String, int):
+
+MissingNullability: android.content.ContentResolver#getSyncAdapterPackagesForAuthorityAsUser(String, int) parameter #0:
+
+MissingNullability: android.content.Context#getDisplay():
+
+MissingNullability: android.content.Context#getUser():
+
+MissingNullability: android.content.ContextWrapper#getDisplay():
+
+MissingNullability: android.content.ContextWrapper#setContentCaptureOptions(android.content.ContentCaptureOptions) parameter #0:
+
+MissingNullability: android.content.pm.ActivityInfo#isTranslucentOrFloating(android.content.res.TypedArray) parameter #0:
+
+MissingNullability: android.content.pm.LauncherApps#LauncherApps(android.content.Context) parameter #0:
+
+MissingNullability: android.content.pm.PackageInstaller.SessionParams#setGrantedRuntimePermissions(String[]) parameter #0:
+
+MissingNullability: android.content.pm.PackageManager#getNamesForUids(int[]) parameter #0:
+
+MissingNullability: android.content.pm.ShortcutManager#ShortcutManager(android.content.Context) parameter #0:
+
+MissingNullability: android.content.res.AssetManager#getOverlayablesToString(String) parameter #0:
+
+MissingNullability: android.content.res.Configuration#windowConfiguration:
+
+MissingNullability: android.content.rollback.PackageRollbackInfo#writeToParcel(android.os.Parcel, int) parameter #0:
+
+MissingNullability: android.content.rollback.RollbackInfo#writeToParcel(android.os.Parcel, int) parameter #0:
+
+MissingNullability: android.database.sqlite.SQLiteDebug#dump(android.util.Printer, String[]) parameter #0:
+
+MissingNullability: android.database.sqlite.SQLiteDebug#dump(android.util.Printer, String[]) parameter #1:
+
+MissingNullability: android.database.sqlite.SQLiteDebug#getDatabaseInfo():
+
+MissingNullability: android.database.sqlite.SQLiteDebug.DbStats#DbStats(String, long, long, int, int, int, int) parameter #0:
+
+MissingNullability: android.database.sqlite.SQLiteDebug.DbStats#cache:
+
+MissingNullability: android.database.sqlite.SQLiteDebug.DbStats#dbName:
+
+MissingNullability: android.database.sqlite.SQLiteDebug.PagerStats#dbStats:
+
+MissingNullability: android.database.sqlite.SQLiteDirectCursorDriver#SQLiteDirectCursorDriver(android.database.sqlite.SQLiteDatabase, String, String, android.os.CancellationSignal) parameter #0:
+
+MissingNullability: android.database.sqlite.SQLiteDirectCursorDriver#SQLiteDirectCursorDriver(android.database.sqlite.SQLiteDatabase, String, String, android.os.CancellationSignal) parameter #1:
+
+MissingNullability: android.database.sqlite.SQLiteDirectCursorDriver#SQLiteDirectCursorDriver(android.database.sqlite.SQLiteDatabase, String, String, android.os.CancellationSignal) parameter #2:
+
+MissingNullability: android.database.sqlite.SQLiteDirectCursorDriver#SQLiteDirectCursorDriver(android.database.sqlite.SQLiteDatabase, String, String, android.os.CancellationSignal) parameter #3:
+
+MissingNullability: android.database.sqlite.SQLiteDirectCursorDriver#cursorRequeried(android.database.Cursor) parameter #0:
+
+MissingNullability: android.database.sqlite.SQLiteDirectCursorDriver#query(android.database.sqlite.SQLiteDatabase.CursorFactory, String[]):
+
+MissingNullability: android.database.sqlite.SQLiteDirectCursorDriver#query(android.database.sqlite.SQLiteDatabase.CursorFactory, String[]) parameter #0:
+
+MissingNullability: android.database.sqlite.SQLiteDirectCursorDriver#query(android.database.sqlite.SQLiteDatabase.CursorFactory, String[]) parameter #1:
+
+MissingNullability: android.database.sqlite.SQLiteDirectCursorDriver#setBindArguments(String[]) parameter #0:
+
+MissingNullability: android.database.sqlite.SQLiteGlobal#getDefaultJournalMode():
+
+MissingNullability: android.database.sqlite.SQLiteGlobal#getDefaultSyncMode():
+
+MissingNullability: android.database.sqlite.SQLiteGlobal#getWALSyncMode():
+
+MissingNullability: android.graphics.ImageDecoder#createSource(android.content.res.Resources, java.io.InputStream, int) parameter #0:
+
+MissingNullability: android.graphics.ImageDecoder#createSource(android.content.res.Resources, java.io.InputStream, int) parameter #1:
+
+MissingNullability: android.graphics.drawable.AdaptiveIconDrawable#getSafeZone():
+
+MissingNullability: android.graphics.drawable.ColorDrawable#getXfermode():
+
+MissingNullability: android.hardware.camera2.CameraDevice#createCustomCaptureSession(android.hardware.camera2.params.InputConfiguration, java.util.List<android.hardware.camera2.params.OutputConfiguration>, int, android.hardware.camera2.CameraCaptureSession.StateCallback, android.os.Handler) parameter #0:
+
+MissingNullability: android.hardware.camera2.CameraManager#getCameraIdListNoLazy():
+
+MissingNullability: android.hardware.display.AmbientBrightnessDayStats#getBucketBoundaries():
+
+MissingNullability: android.hardware.display.AmbientBrightnessDayStats#getLocalDate():
+
+MissingNullability: android.hardware.display.AmbientBrightnessDayStats#getStats():
+
+MissingNullability: android.hardware.display.AmbientBrightnessDayStats#writeToParcel(android.os.Parcel, int) parameter #0:
+
+MissingNullability: android.hardware.display.AmbientDisplayConfiguration#AmbientDisplayConfiguration(android.content.Context) parameter #0:
+
+MissingNullability: android.hardware.display.BrightnessChangeEvent#luxTimestamps:
+
+MissingNullability: android.hardware.display.BrightnessChangeEvent#luxValues:
+
+MissingNullability: android.hardware.display.BrightnessChangeEvent#packageName:
+
+MissingNullability: android.hardware.display.BrightnessChangeEvent#writeToParcel(android.os.Parcel, int) parameter #0:
+
+MissingNullability: android.hardware.display.BrightnessConfiguration#getCurve():
+
+MissingNullability: android.hardware.display.BrightnessConfiguration#writeToParcel(android.os.Parcel, int) parameter #0:
+
+MissingNullability: android.hardware.display.BrightnessConfiguration.Builder#Builder(float[], float[]) parameter #0:
+
+MissingNullability: android.hardware.display.BrightnessConfiguration.Builder#Builder(float[], float[]) parameter #1:
+
+MissingNullability: android.hardware.display.BrightnessCorrection#writeToParcel(android.os.Parcel, int) parameter #0:
+
+MissingNullability: android.hardware.display.DisplayManager#getAmbientBrightnessStats():
+
+MissingNullability: android.hardware.display.DisplayManager#getBrightnessConfiguration():
+
+MissingNullability: android.hardware.display.DisplayManager#getBrightnessEvents():
+
+MissingNullability: android.hardware.display.DisplayManager#getStableDisplaySize():
+
+MissingNullability: android.hardware.display.DisplayManager#setBrightnessConfiguration(android.hardware.display.BrightnessConfiguration) parameter #0:
+
+MissingNullability: android.location.GnssClock#set(android.location.GnssClock) parameter #0:
+
+MissingNullability: android.location.GnssMeasurement#set(android.location.GnssMeasurement) parameter #0:
+
+MissingNullability: android.location.GnssMeasurementsEvent#GnssMeasurementsEvent(android.location.GnssClock, android.location.GnssMeasurement[]) parameter #0:
+
+MissingNullability: android.location.GnssMeasurementsEvent#GnssMeasurementsEvent(android.location.GnssClock, android.location.GnssMeasurement[]) parameter #1:
+
+MissingNullability: android.location.GnssNavigationMessage#set(android.location.GnssNavigationMessage) parameter #0:
+
+MissingNullability: android.location.GnssNavigationMessage#setData(byte[]) parameter #0:
+
+MissingNullability: android.location.LocationManager#getTestProviderCurrentRequests(String) parameter #0:
+
+MissingNullability: android.location.LocationRequest#writeToParcel(android.os.Parcel, int) parameter #0:
+
+MissingNullability: android.media.AudioFocusInfo#writeToParcel(android.os.Parcel, int) parameter #0:
+
+MissingNullability: android.media.AudioRecordingConfiguration#AudioRecordingConfiguration(int, int, int, android.media.AudioFormat, android.media.AudioFormat, int, String) parameter #3:
+
+MissingNullability: android.media.AudioRecordingConfiguration#AudioRecordingConfiguration(int, int, int, android.media.AudioFormat, android.media.AudioFormat, int, String) parameter #4:
+
+MissingNullability: android.media.AudioRecordingConfiguration#AudioRecordingConfiguration(int, int, int, android.media.AudioFormat, android.media.AudioFormat, int, String) parameter #6:
+
+MissingNullability: android.media.AudioRecordingConfiguration#AudioRecordingConfiguration(int, int, int, android.media.AudioFormat, android.media.AudioFormat, int, String, int, boolean, int, android.media.audiofx.AudioEffect.Descriptor[], android.media.audiofx.AudioEffect.Descriptor[]) parameter #10:
+
+MissingNullability: android.media.AudioRecordingConfiguration#AudioRecordingConfiguration(int, int, int, android.media.AudioFormat, android.media.AudioFormat, int, String, int, boolean, int, android.media.audiofx.AudioEffect.Descriptor[], android.media.audiofx.AudioEffect.Descriptor[]) parameter #11:
+
+MissingNullability: android.media.AudioRecordingConfiguration#AudioRecordingConfiguration(int, int, int, android.media.AudioFormat, android.media.AudioFormat, int, String, int, boolean, int, android.media.audiofx.AudioEffect.Descriptor[], android.media.audiofx.AudioEffect.Descriptor[]) parameter #3:
+
+MissingNullability: android.media.AudioRecordingConfiguration#AudioRecordingConfiguration(int, int, int, android.media.AudioFormat, android.media.AudioFormat, int, String, int, boolean, int, android.media.audiofx.AudioEffect.Descriptor[], android.media.audiofx.AudioEffect.Descriptor[]) parameter #4:
+
+MissingNullability: android.media.AudioRecordingConfiguration#AudioRecordingConfiguration(int, int, int, android.media.AudioFormat, android.media.AudioFormat, int, String, int, boolean, int, android.media.audiofx.AudioEffect.Descriptor[], android.media.audiofx.AudioEffect.Descriptor[]) parameter #6:
+
+MissingNullability: android.media.PlaybackParams#setAudioStretchMode(int):
+
+MissingNullability: android.media.audiofx.AudioEffect#EFFECT_TYPE_NULL:
+
+MissingNullability: android.media.audiofx.AudioEffect#byteArrayToInt(byte[]) parameter #0:
+
+MissingNullability: android.media.audiofx.AudioEffect#byteArrayToShort(byte[]) parameter #0:
+
+MissingNullability: android.media.audiofx.AudioEffect#getParameter(byte[], byte[]) parameter #0:
+
+MissingNullability: android.media.audiofx.AudioEffect#getParameter(byte[], byte[]) parameter #1:
+
+MissingNullability: android.media.audiofx.AudioEffect#getParameter(int, byte[]) parameter #1:
+
+MissingNullability: android.media.audiofx.AudioEffect#getParameter(int, int[]) parameter #1:
+
+MissingNullability: android.media.audiofx.AudioEffect#getParameter(int, short[]) parameter #1:
+
+MissingNullability: android.media.audiofx.AudioEffect#getParameter(int[], short[]) parameter #0:
+
+MissingNullability: android.media.audiofx.AudioEffect#getParameter(int[], short[]) parameter #1:
+
+MissingNullability: android.media.audiofx.AudioEffect#intToByteArray(int):
+
+MissingNullability: android.media.audiofx.AudioEffect#isEffectTypeAvailable(java.util.UUID) parameter #0:
+
+MissingNullability: android.media.audiofx.AudioEffect#setParameter(byte[], byte[]) parameter #0:
+
+MissingNullability: android.media.audiofx.AudioEffect#setParameter(byte[], byte[]) parameter #1:
+
+MissingNullability: android.media.audiofx.AudioEffect#setParameter(int, byte[]) parameter #1:
+
+MissingNullability: android.media.audiofx.AudioEffect#setParameter(int[], byte[]) parameter #0:
+
+MissingNullability: android.media.audiofx.AudioEffect#setParameter(int[], byte[]) parameter #1:
+
+MissingNullability: android.media.audiofx.AudioEffect#setParameter(int[], int[]) parameter #0:
+
+MissingNullability: android.media.audiofx.AudioEffect#setParameter(int[], int[]) parameter #1:
+
+MissingNullability: android.media.audiofx.AudioEffect#setParameterListener(android.media.audiofx.AudioEffect.OnParameterChangeListener) parameter #0:
+
+MissingNullability: android.media.audiofx.AudioEffect#shortToByteArray(short):
+
+MissingNullability: android.media.audiofx.AudioEffect.Descriptor#Descriptor(android.os.Parcel) parameter #0:
+
+MissingNullability: android.media.audiofx.AudioEffect.Descriptor#writeToParcel(android.os.Parcel) parameter #0:
+
+MissingNullability: android.media.audiofx.AudioEffect.OnParameterChangeListener#onParameterChange(android.media.audiofx.AudioEffect, int, byte[], byte[]) parameter #0:
+
+MissingNullability: android.media.audiofx.AudioEffect.OnParameterChangeListener#onParameterChange(android.media.audiofx.AudioEffect, int, byte[], byte[]) parameter #2:
+
+MissingNullability: android.media.audiofx.AudioEffect.OnParameterChangeListener#onParameterChange(android.media.audiofx.AudioEffect, int, byte[], byte[]) parameter #3:
+
+MissingNullability: android.media.audiopolicy.AudioMix.Builder#Builder(android.media.audiopolicy.AudioMixingRule) parameter #0:
+
+MissingNullability: android.media.audiopolicy.AudioMix.Builder#build():
+
+MissingNullability: android.media.audiopolicy.AudioMix.Builder#setDevice(android.media.AudioDeviceInfo):
+
+MissingNullability: android.media.audiopolicy.AudioMix.Builder#setFormat(android.media.AudioFormat):
+
+MissingNullability: android.media.audiopolicy.AudioMix.Builder#setFormat(android.media.AudioFormat) parameter #0:
+
+MissingNullability: android.media.audiopolicy.AudioMix.Builder#setRouteFlags(int):
+
+MissingNullability: android.media.audiopolicy.AudioMixingRule.Builder#addMixRule(int, Object):
+
+MissingNullability: android.media.audiopolicy.AudioMixingRule.Builder#addMixRule(int, Object) parameter #1:
+
+MissingNullability: android.media.audiopolicy.AudioMixingRule.Builder#addRule(android.media.AudioAttributes, int):
+
+MissingNullability: android.media.audiopolicy.AudioMixingRule.Builder#addRule(android.media.AudioAttributes, int) parameter #0:
+
+MissingNullability: android.media.audiopolicy.AudioMixingRule.Builder#build():
+
+MissingNullability: android.media.audiopolicy.AudioMixingRule.Builder#excludeMixRule(int, Object):
+
+MissingNullability: android.media.audiopolicy.AudioMixingRule.Builder#excludeMixRule(int, Object) parameter #1:
+
+MissingNullability: android.media.audiopolicy.AudioMixingRule.Builder#excludeRule(android.media.AudioAttributes, int):
+
+MissingNullability: android.media.audiopolicy.AudioMixingRule.Builder#excludeRule(android.media.AudioAttributes, int) parameter #0:
+
+MissingNullability: android.media.audiopolicy.AudioPolicy#createAudioRecordSink(android.media.audiopolicy.AudioMix):
+
+MissingNullability: android.media.audiopolicy.AudioPolicy#createAudioRecordSink(android.media.audiopolicy.AudioMix) parameter #0:
+
+MissingNullability: android.media.audiopolicy.AudioPolicy#createAudioTrackSource(android.media.audiopolicy.AudioMix):
+
+MissingNullability: android.media.audiopolicy.AudioPolicy#createAudioTrackSource(android.media.audiopolicy.AudioMix) parameter #0:
+
+MissingNullability: android.media.audiopolicy.AudioPolicy#setRegistration(String) parameter #0:
+
+MissingNullability: android.media.audiopolicy.AudioPolicy#toLogFriendlyString():
+
+MissingNullability: android.media.audiopolicy.AudioPolicy.AudioPolicyFocusListener#onAudioFocusAbandon(android.media.AudioFocusInfo) parameter #0:
+
+MissingNullability: android.media.audiopolicy.AudioPolicy.AudioPolicyFocusListener#onAudioFocusGrant(android.media.AudioFocusInfo, int) parameter #0:
+
+MissingNullability: android.media.audiopolicy.AudioPolicy.AudioPolicyFocusListener#onAudioFocusLoss(android.media.AudioFocusInfo, boolean) parameter #0:
+
+MissingNullability: android.media.audiopolicy.AudioPolicy.AudioPolicyFocusListener#onAudioFocusRequest(android.media.AudioFocusInfo, int) parameter #0:
+
+MissingNullability: android.media.audiopolicy.AudioPolicy.AudioPolicyStatusListener#onMixStateUpdate(android.media.audiopolicy.AudioMix) parameter #0:
+
+MissingNullability: android.media.audiopolicy.AudioPolicy.Builder#Builder(android.content.Context) parameter #0:
+
+MissingNullability: android.media.audiopolicy.AudioPolicy.Builder#setAudioPolicyFocusListener(android.media.audiopolicy.AudioPolicy.AudioPolicyFocusListener) parameter #0:
+
+MissingNullability: android.media.audiopolicy.AudioPolicy.Builder#setAudioPolicyStatusListener(android.media.audiopolicy.AudioPolicy.AudioPolicyStatusListener) parameter #0:
+
+MissingNullability: android.metrics.LogMaker#LogMaker(Object[]) parameter #0:
+
+MissingNullability: android.metrics.LogMaker#addTaggedData(int, Object):
+
+MissingNullability: android.metrics.LogMaker#addTaggedData(int, Object) parameter #1:
+
+MissingNullability: android.metrics.LogMaker#clearCategory():
+
+MissingNullability: android.metrics.LogMaker#clearPackageName():
+
+MissingNullability: android.metrics.LogMaker#clearSubtype():
+
+MissingNullability: android.metrics.LogMaker#clearTaggedData(int):
+
+MissingNullability: android.metrics.LogMaker#clearType():
+
+MissingNullability: android.metrics.LogMaker#deserialize(Object[]) parameter #0:
+
+MissingNullability: android.metrics.LogMaker#getCounterName():
+
+MissingNullability: android.metrics.LogMaker#getPackageName():
+
+MissingNullability: android.metrics.LogMaker#getTaggedData(int):
+
+MissingNullability: android.metrics.LogMaker#isSubsetOf(android.metrics.LogMaker) parameter #0:
+
+MissingNullability: android.metrics.LogMaker#isValidValue(Object) parameter #0:
+
+MissingNullability: android.metrics.LogMaker#serialize():
+
+MissingNullability: android.metrics.LogMaker#setCategory(int):
+
+MissingNullability: android.metrics.LogMaker#setPackageName(String):
+
+MissingNullability: android.metrics.LogMaker#setPackageName(String) parameter #0:
+
+MissingNullability: android.metrics.LogMaker#setSubtype(int):
+
+MissingNullability: android.metrics.LogMaker#setType(int):
+
+MissingNullability: android.metrics.MetricsReader#next():
+
+MissingNullability: android.net.NetworkCapabilities#getCapabilities():
+
+MissingNullability: android.net.StaticIpConfiguration#writeToParcel(android.os.Parcel, int) parameter #0:
+
+MissingNullability: android.net.TestNetworkInterface#CREATOR:
+
+MissingNullability: android.net.TestNetworkInterface#TestNetworkInterface(android.os.ParcelFileDescriptor, String) parameter #0:
+
+MissingNullability: android.net.TestNetworkInterface#TestNetworkInterface(android.os.ParcelFileDescriptor, String) parameter #1:
+
+MissingNullability: android.net.TestNetworkInterface#getFileDescriptor():
+
+MissingNullability: android.net.TestNetworkInterface#getInterfaceName():
+
+MissingNullability: android.net.TestNetworkInterface#writeToParcel(android.os.Parcel, int) parameter #0:
+
+MissingNullability: android.net.TestNetworkManager#createTapInterface():
+
+MissingNullability: android.net.TestNetworkManager#createTunInterface(android.net.LinkAddress[]):
+
+MissingNullability: android.net.apf.ApfCapabilities#CREATOR:
+
+MissingNullability: android.net.apf.ApfCapabilities#writeToParcel(android.os.Parcel, int) parameter #0:
+
+MissingNullability: android.net.metrics.DhcpClientEvent.Builder#setMsg(String) parameter #0:
+
+MissingNullability: android.os.Build#is64BitAbi(String) parameter #0:
+
+MissingNullability: android.os.Build.VERSION#ACTIVE_CODENAMES:
+
+MissingNullability: android.os.Environment#buildPath(java.io.File, java.lang.String...):
+
+MissingNullability: android.os.Environment#buildPath(java.io.File, java.lang.String...) parameter #0:
+
+MissingNullability: android.os.Environment#buildPath(java.io.File, java.lang.String...) parameter #1:
+
+MissingNullability: android.os.FileUtils#contains(java.io.File, java.io.File) parameter #0:
+
+MissingNullability: android.os.FileUtils#contains(java.io.File, java.io.File) parameter #1:
+
+MissingNullability: android.os.HwBinder#getService(String, String):
+
+MissingNullability: android.os.HwBinder#getService(String, String) parameter #0:
+
+MissingNullability: android.os.HwBinder#getService(String, String) parameter #1:
+
+MissingNullability: android.os.HwBinder#getService(String, String, boolean):
+
+MissingNullability: android.os.HwBinder#getService(String, String, boolean) parameter #0:
+
+MissingNullability: android.os.HwBinder#getService(String, String, boolean) parameter #1:
+
+MissingNullability: android.os.HwBinder#onTransact(int, android.os.HwParcel, android.os.HwParcel, int) parameter #1:
+
+MissingNullability: android.os.HwBinder#onTransact(int, android.os.HwParcel, android.os.HwParcel, int) parameter #2:
+
+MissingNullability: android.os.HwBinder#registerService(String) parameter #0:
+
+MissingNullability: android.os.HwBinder#transact(int, android.os.HwParcel, android.os.HwParcel, int) parameter #1:
+
+MissingNullability: android.os.HwBinder#transact(int, android.os.HwParcel, android.os.HwParcel, int) parameter #2:
+
+MissingNullability: android.os.HwBlob#copyToBoolArray(long, boolean[], int) parameter #1:
+
+MissingNullability: android.os.HwBlob#copyToDoubleArray(long, double[], int) parameter #1:
+
+MissingNullability: android.os.HwBlob#copyToFloatArray(long, float[], int) parameter #1:
+
+MissingNullability: android.os.HwBlob#copyToInt16Array(long, short[], int) parameter #1:
+
+MissingNullability: android.os.HwBlob#copyToInt32Array(long, int[], int) parameter #1:
+
+MissingNullability: android.os.HwBlob#copyToInt64Array(long, long[], int) parameter #1:
+
+MissingNullability: android.os.HwBlob#copyToInt8Array(long, byte[], int) parameter #1:
+
+MissingNullability: android.os.HwBlob#getString(long):
+
+MissingNullability: android.os.HwBlob#putBlob(long, android.os.HwBlob) parameter #1:
+
+MissingNullability: android.os.HwBlob#putBoolArray(long, boolean[]) parameter #1:
+
+MissingNullability: android.os.HwBlob#putDoubleArray(long, double[]) parameter #1:
+
+MissingNullability: android.os.HwBlob#putFloatArray(long, float[]) parameter #1:
+
+MissingNullability: android.os.HwBlob#putInt16Array(long, short[]) parameter #1:
+
+MissingNullability: android.os.HwBlob#putInt32Array(long, int[]) parameter #1:
+
+MissingNullability: android.os.HwBlob#putInt64Array(long, long[]) parameter #1:
+
+MissingNullability: android.os.HwBlob#putInt8Array(long, byte[]) parameter #1:
+
+MissingNullability: android.os.HwBlob#putString(long, String) parameter #1:
+
+MissingNullability: android.os.HwBlob#wrapArray(boolean[]):
+
+MissingNullability: android.os.HwBlob#wrapArray(byte[]):
+
+MissingNullability: android.os.HwBlob#wrapArray(double[]):
+
+MissingNullability: android.os.HwBlob#wrapArray(float[]):
+
+MissingNullability: android.os.HwBlob#wrapArray(int[]):
+
+MissingNullability: android.os.HwBlob#wrapArray(long[]):
+
+MissingNullability: android.os.HwBlob#wrapArray(short[]):
+
+MissingNullability: android.os.HwParcel#enforceInterface(String) parameter #0:
+
+MissingNullability: android.os.HwParcel#readBoolVector():
+
+MissingNullability: android.os.HwParcel#readBuffer(long):
+
+MissingNullability: android.os.HwParcel#readDoubleVector():
+
+MissingNullability: android.os.HwParcel#readEmbeddedBuffer(long, long, long, boolean):
+
+MissingNullability: android.os.HwParcel#readFloatVector():
+
+MissingNullability: android.os.HwParcel#readInt16Vector():
+
+MissingNullability: android.os.HwParcel#readInt32Vector():
+
+MissingNullability: android.os.HwParcel#readInt64Vector():
+
+MissingNullability: android.os.HwParcel#readInt8Vector():
+
+MissingNullability: android.os.HwParcel#readString():
+
+MissingNullability: android.os.HwParcel#readStringVector():
+
+MissingNullability: android.os.HwParcel#readStrongBinder():
+
+MissingNullability: android.os.HwParcel#writeBoolVector(java.util.ArrayList<java.lang.Boolean>) parameter #0:
+
+MissingNullability: android.os.HwParcel#writeBuffer(android.os.HwBlob) parameter #0:
+
+MissingNullability: android.os.HwParcel#writeDoubleVector(java.util.ArrayList<java.lang.Double>) parameter #0:
+
+MissingNullability: android.os.HwParcel#writeFloatVector(java.util.ArrayList<java.lang.Float>) parameter #0:
+
+MissingNullability: android.os.HwParcel#writeInt16Vector(java.util.ArrayList<java.lang.Short>) parameter #0:
+
+MissingNullability: android.os.HwParcel#writeInt32Vector(java.util.ArrayList<java.lang.Integer>) parameter #0:
+
+MissingNullability: android.os.HwParcel#writeInt64Vector(java.util.ArrayList<java.lang.Long>) parameter #0:
+
+MissingNullability: android.os.HwParcel#writeInt8Vector(java.util.ArrayList<java.lang.Byte>) parameter #0:
+
+MissingNullability: android.os.HwParcel#writeInterfaceToken(String) parameter #0:
+
+MissingNullability: android.os.HwParcel#writeString(String) parameter #0:
+
+MissingNullability: android.os.HwParcel#writeStringVector(java.util.ArrayList<java.lang.String>) parameter #0:
+
+MissingNullability: android.os.HwParcel#writeStrongBinder(android.os.IHwBinder) parameter #0:
+
+MissingNullability: android.os.IHwBinder#linkToDeath(android.os.IHwBinder.DeathRecipient, long) parameter #0:
+
+MissingNullability: android.os.IHwBinder#queryLocalInterface(String):
+
+MissingNullability: android.os.IHwBinder#queryLocalInterface(String) parameter #0:
+
+MissingNullability: android.os.IHwBinder#transact(int, android.os.HwParcel, android.os.HwParcel, int) parameter #1:
+
+MissingNullability: android.os.IHwBinder#transact(int, android.os.HwParcel, android.os.HwParcel, int) parameter #2:
+
+MissingNullability: android.os.IHwBinder#unlinkToDeath(android.os.IHwBinder.DeathRecipient) parameter #0:
+
+MissingNullability: android.os.IHwInterface#asBinder():
+
+MissingNullability: android.os.IncidentManager#approveReport(android.net.Uri) parameter #0:
+
+MissingNullability: android.os.IncidentManager#cancelAuthorization(android.os.IncidentManager.AuthListener) parameter #0:
+
+MissingNullability: android.os.IncidentManager#deleteIncidentReports(android.net.Uri) parameter #0:
+
+MissingNullability: android.os.IncidentManager#denyReport(android.net.Uri) parameter #0:
+
+MissingNullability: android.os.IncidentManager#getIncidentReport(android.net.Uri) parameter #0:
+
+MissingNullability: android.os.IncidentManager#getIncidentReportList(String) parameter #0:
+
+MissingNullability: android.os.IncidentManager#getPendingReports():
+
+MissingNullability: android.os.IncidentManager#reportIncident(android.os.IncidentReportArgs) parameter #0:
+
+MissingNullability: android.os.IncidentManager#requestAuthorization(int, String, int, android.os.IncidentManager.AuthListener) parameter #1:
+
+MissingNullability: android.os.IncidentManager#requestAuthorization(int, String, int, android.os.IncidentManager.AuthListener) parameter #3:
+
+MissingNullability: android.os.IncidentManager.IncidentReport#IncidentReport(android.os.Parcel) parameter #0:
+
+MissingNullability: android.os.IncidentManager.IncidentReport#getInputStream():
+
+MissingNullability: android.os.IncidentManager.IncidentReport#writeToParcel(android.os.Parcel, int) parameter #0:
+
+MissingNullability: android.os.IncidentReportArgs#IncidentReportArgs(android.os.Parcel) parameter #0:
+
+MissingNullability: android.os.IncidentReportArgs#addHeader(byte[]) parameter #0:
+
+MissingNullability: android.os.IncidentReportArgs#readFromParcel(android.os.Parcel) parameter #0:
+
+MissingNullability: android.os.IncidentReportArgs#writeToParcel(android.os.Parcel, int) parameter #0:
+
+MissingNullability: android.os.ParcelFileDescriptor#getFile(java.io.FileDescriptor):
+
+MissingNullability: android.os.ParcelFileDescriptor#getFile(java.io.FileDescriptor) parameter #0:
+
+MissingNullability: android.os.RemoteCallback#RemoteCallback(android.os.RemoteCallback.OnResultListener) parameter #0:
+
+MissingNullability: android.os.RemoteCallback#writeToParcel(android.os.Parcel, int) parameter #0:
+
+MissingNullability: android.os.StrictMode#setViolationLogger(android.os.StrictMode.ViolationLogger) parameter #0:
+
+MissingNullability: android.os.StrictMode.ViolationInfo#ViolationInfo(android.os.Parcel) parameter #0:
+
+MissingNullability: android.os.StrictMode.ViolationInfo#ViolationInfo(android.os.Parcel, boolean) parameter #0:
+
+MissingNullability: android.os.StrictMode.ViolationInfo#broadcastIntentAction:
+
+MissingNullability: android.os.StrictMode.ViolationInfo#dump(android.util.Printer, String) parameter #0:
+
+MissingNullability: android.os.StrictMode.ViolationInfo#dump(android.util.Printer, String) parameter #1:
+
+MissingNullability: android.os.StrictMode.ViolationInfo#getStackTrace():
+
+MissingNullability: android.os.StrictMode.ViolationInfo#getViolationClass():
+
+MissingNullability: android.os.StrictMode.ViolationInfo#getViolationDetails():
+
+MissingNullability: android.os.StrictMode.ViolationInfo#tags:
+
+MissingNullability: android.os.StrictMode.ViolationInfo#writeToParcel(android.os.Parcel, int) parameter #0:
+
+MissingNullability: android.os.StrictMode.ViolationLogger#log(android.os.StrictMode.ViolationInfo) parameter #0:
+
+MissingNullability: android.os.UserHandle#of(int):
+
+MissingNullability: android.os.VibrationEffect#RINGTONES:
+
+MissingNullability: android.os.VibrationEffect#get(android.net.Uri, android.content.Context) parameter #0:
+
+MissingNullability: android.os.VibrationEffect#get(android.net.Uri, android.content.Context) parameter #1:
+
+MissingNullability: android.os.VibrationEffect#get(int):
+
+MissingNullability: android.os.VibrationEffect#get(int, boolean):
+
+MissingNullability: android.os.VibrationEffect.OneShot#OneShot(android.os.Parcel) parameter #0:
+
+MissingNullability: android.os.VibrationEffect.OneShot#scale(float, int):
+
+MissingNullability: android.os.VibrationEffect.OneShot#writeToParcel(android.os.Parcel, int) parameter #0:
+
+MissingNullability: android.os.VibrationEffect.Prebaked#Prebaked(android.os.Parcel) parameter #0:
+
+MissingNullability: android.os.VibrationEffect.Prebaked#writeToParcel(android.os.Parcel, int) parameter #0:
+
+MissingNullability: android.os.VibrationEffect.Waveform#Waveform(android.os.Parcel) parameter #0:
+
+MissingNullability: android.os.VibrationEffect.Waveform#Waveform(long[], int[], int) parameter #0:
+
+MissingNullability: android.os.VibrationEffect.Waveform#Waveform(long[], int[], int) parameter #1:
+
+MissingNullability: android.os.VibrationEffect.Waveform#getAmplitudes():
+
+MissingNullability: android.os.VibrationEffect.Waveform#getTimings():
+
+MissingNullability: android.os.VibrationEffect.Waveform#scale(float, int):
+
+MissingNullability: android.os.VibrationEffect.Waveform#writeToParcel(android.os.Parcel, int) parameter #0:
+
+MissingNullability: android.os.VintfObject#getHalNamesAndVersions():
+
+MissingNullability: android.os.VintfObject#getSepolicyVersion():
+
+MissingNullability: android.os.VintfObject#getTargetFrameworkCompatibilityMatrixVersion():
+
+MissingNullability: android.os.VintfObject#getVndkSnapshots():
+
+MissingNullability: android.os.VintfObject#report():
+
+MissingNullability: android.os.VintfRuntimeInfo#getCpuInfo():
+
+MissingNullability: android.os.VintfRuntimeInfo#getHardwareId():
+
+MissingNullability: android.os.VintfRuntimeInfo#getKernelVersion():
+
+MissingNullability: android.os.VintfRuntimeInfo#getNodeName():
+
+MissingNullability: android.os.VintfRuntimeInfo#getOsName():
+
+MissingNullability: android.os.VintfRuntimeInfo#getOsRelease():
+
+MissingNullability: android.os.VintfRuntimeInfo#getOsVersion():
+
+MissingNullability: android.os.WorkSource#add(int, String) parameter #1:
+
+MissingNullability: android.os.WorkSource#addReturningNewbs(android.os.WorkSource) parameter #0:
+
+MissingNullability: android.os.WorkSource#getName(int):
+
+MissingNullability: android.os.WorkSource#setReturningDiffs(android.os.WorkSource) parameter #0:
+
+MissingNullability: android.os.health.HealthKeys.Constants#Constants(Class) parameter #0:
+
+MissingNullability: android.os.health.HealthKeys.Constants#getDataType():
+
+MissingNullability: android.os.health.HealthKeys.Constants#getKeys(int):
+
+MissingNullability: android.os.health.HealthStats#HealthStats(android.os.Parcel) parameter #0:
+
+MissingNullability: android.os.health.HealthStatsParceler#HealthStatsParceler(android.os.Parcel) parameter #0:
+
+MissingNullability: android.os.health.HealthStatsParceler#HealthStatsParceler(android.os.health.HealthStatsWriter) parameter #0:
+
+MissingNullability: android.os.health.HealthStatsParceler#getHealthStats():
+
+MissingNullability: android.os.health.HealthStatsParceler#writeToParcel(android.os.Parcel, int) parameter #0:
+
+MissingNullability: android.os.health.HealthStatsWriter#HealthStatsWriter(android.os.health.HealthKeys.Constants) parameter #0:
+
+MissingNullability: android.os.health.HealthStatsWriter#addMeasurements(int, String, long) parameter #1:
+
+MissingNullability: android.os.health.HealthStatsWriter#addStats(int, String, android.os.health.HealthStatsWriter) parameter #1:
+
+MissingNullability: android.os.health.HealthStatsWriter#addStats(int, String, android.os.health.HealthStatsWriter) parameter #2:
+
+MissingNullability: android.os.health.HealthStatsWriter#addTimers(int, String, android.os.health.TimerStat) parameter #1:
+
+MissingNullability: android.os.health.HealthStatsWriter#addTimers(int, String, android.os.health.TimerStat) parameter #2:
+
+MissingNullability: android.os.health.HealthStatsWriter#flattenToParcel(android.os.Parcel) parameter #0:
+
+MissingNullability: android.os.storage.StorageVolume#getPath():
+
+MissingNullability: android.permission.RuntimePermissionPresentationInfo#writeToParcel(android.os.Parcel, int) parameter #0:
+
+MissingNullability: android.provider.CalendarContract.Calendars#SYNC_WRITABLE_COLUMNS:
+
+MissingNullability: android.provider.CalendarContract.Events#SYNC_WRITABLE_COLUMNS:
+
+MissingNullability: android.provider.ContactsContract.CommonDataKinds.Phone#ENTERPRISE_CONTENT_URI:
+
+MissingNullability: android.provider.ContactsContract.RawContactsEntity#CORP_CONTENT_URI:
+
+MissingNullability: android.provider.DeviceConfig#getProperty(String, String):
+
+MissingNullability: android.provider.DeviceConfig#getString(String, String, String):
+
+MissingNullability: android.provider.MediaStore#deleteContributedMedia(android.content.Context, String, android.os.UserHandle) parameter #0:
+
+MissingNullability: android.provider.MediaStore#deleteContributedMedia(android.content.Context, String, android.os.UserHandle) parameter #1:
+
+MissingNullability: android.provider.MediaStore#deleteContributedMedia(android.content.Context, String, android.os.UserHandle) parameter #2:
+
+MissingNullability: android.provider.MediaStore#getContributedMediaSize(android.content.Context, String, android.os.UserHandle) parameter #0:
+
+MissingNullability: android.provider.MediaStore#getContributedMediaSize(android.content.Context, String, android.os.UserHandle) parameter #1:
+
+MissingNullability: android.provider.MediaStore#getContributedMediaSize(android.content.Context, String, android.os.UserHandle) parameter #2:
+
+MissingNullability: android.provider.MediaStore#scanFile(android.content.Context, java.io.File):
+
+MissingNullability: android.provider.MediaStore#scanFile(android.content.Context, java.io.File) parameter #0:
+
+MissingNullability: android.provider.MediaStore#scanFile(android.content.Context, java.io.File) parameter #1:
+
+MissingNullability: android.provider.MediaStore#scanFileFromShell(android.content.Context, java.io.File):
+
+MissingNullability: android.provider.MediaStore#scanFileFromShell(android.content.Context, java.io.File) parameter #0:
+
+MissingNullability: android.provider.MediaStore#scanFileFromShell(android.content.Context, java.io.File) parameter #1:
+
+MissingNullability: android.provider.MediaStore#scanVolume(android.content.Context, java.io.File) parameter #0:
+
+MissingNullability: android.provider.MediaStore#scanVolume(android.content.Context, java.io.File) parameter #1:
+
+MissingNullability: android.provider.MediaStore#waitForIdle(android.content.Context) parameter #0:
+
+MissingNullability: android.security.KeyStoreException#KeyStoreException(int, String) parameter #1:
+
+MissingNullability: android.security.keystore.AttestationUtils#attestDeviceIds(android.content.Context, int[], byte[]) parameter #0:
+
+MissingNullability: android.security.keystore.KeyProtection.Builder#setBoundToSpecificSecureUserId(long):
+
+MissingNullability: android.service.autofill.AutofillFieldClassificationService#onBind(android.content.Intent):
+
+MissingNullability: android.service.autofill.AutofillFieldClassificationService#onBind(android.content.Intent) parameter #0:
+
+MissingNullability: android.service.autofill.CompositeUserData#getCategoryIds():
+
+MissingNullability: android.service.autofill.CompositeUserData#getDefaultFieldClassificationArgs():
+
+MissingNullability: android.service.autofill.CompositeUserData#getFieldClassificationAlgorithms():
+
+MissingNullability: android.service.autofill.CompositeUserData#getFieldClassificationArgs():
+
+MissingNullability: android.service.autofill.CompositeUserData#getValues():
+
+MissingNullability: android.service.autofill.CompositeUserData#writeToParcel(android.os.Parcel, int) parameter #0:
+
+MissingNullability: android.service.autofill.UserData#getFieldClassificationAlgorithms():
+
+MissingNullability: android.service.autofill.augmented.AugmentedAutofillService#dump(java.io.FileDescriptor, java.io.PrintWriter, String[]) parameter #0:
+
+MissingNullability: android.service.autofill.augmented.AugmentedAutofillService#dump(java.io.FileDescriptor, java.io.PrintWriter, String[]) parameter #1:
+
+MissingNullability: android.service.autofill.augmented.AugmentedAutofillService#dump(java.io.FileDescriptor, java.io.PrintWriter, String[]) parameter #2:
+
+MissingNullability: android.service.autofill.augmented.AugmentedAutofillService#onUnbind(android.content.Intent) parameter #0:
+
+MissingNullability: android.service.contentcapture.ContentCaptureService#dump(java.io.FileDescriptor, java.io.PrintWriter, String[]) parameter #0:
+
+MissingNullability: android.service.contentcapture.ContentCaptureService#dump(java.io.FileDescriptor, java.io.PrintWriter, String[]) parameter #1:
+
+MissingNullability: android.service.contentcapture.ContentCaptureService#dump(java.io.FileDescriptor, java.io.PrintWriter, String[]) parameter #2:
+
+MissingNullability: android.service.notification.Adjustment#Adjustment(String, String, android.os.Bundle, CharSequence, int) parameter #0:
+
+MissingNullability: android.service.notification.Adjustment#Adjustment(String, String, android.os.Bundle, CharSequence, int) parameter #1:
+
+MissingNullability: android.service.notification.Adjustment#Adjustment(String, String, android.os.Bundle, CharSequence, int) parameter #2:
+
+MissingNullability: android.service.notification.Adjustment#Adjustment(String, String, android.os.Bundle, CharSequence, int) parameter #3:
+
+MissingNullability: android.service.notification.Adjustment#writeToParcel(android.os.Parcel, int) parameter #0:
+
+MissingNullability: android.service.notification.NotificationAssistantService#attachBaseContext(android.content.Context) parameter #0:
+
+MissingNullability: android.service.notification.NotificationStats#writeToParcel(android.os.Parcel, int) parameter #0:
+
+MissingNullability: android.service.notification.SnoozeCriterion#SnoozeCriterion(String, CharSequence, CharSequence) parameter #0:
+
+MissingNullability: android.service.notification.SnoozeCriterion#SnoozeCriterion(String, CharSequence, CharSequence) parameter #1:
+
+MissingNullability: android.service.notification.SnoozeCriterion#SnoozeCriterion(String, CharSequence, CharSequence) parameter #2:
+
+MissingNullability: android.service.notification.SnoozeCriterion#SnoozeCriterion(android.os.Parcel) parameter #0:
+
+MissingNullability: android.service.notification.SnoozeCriterion#getConfirmation():
+
+MissingNullability: android.service.notification.SnoozeCriterion#getExplanation():
+
+MissingNullability: android.service.notification.SnoozeCriterion#getId():
+
+MissingNullability: android.service.notification.SnoozeCriterion#writeToParcel(android.os.Parcel, int) parameter #0:
+
+MissingNullability: android.telecom.Call.Details#getTelecomCallId():
+
+MissingNullability: android.telecom.CallScreeningService.CallResponse.Builder#setShouldScreenCallFurther(boolean):
+
+MissingNullability: android.telecom.Conference#getPrimaryConnection():
+
+MissingNullability: android.telecom.PhoneAccountSuggestionService#onBind(android.content.Intent):
+
+MissingNullability: android.telecom.PhoneAccountSuggestionService#onBind(android.content.Intent) parameter #0:
+
+MissingNullability: android.telephony.DataSpecificRegistrationInfo#writeToParcel(android.os.Parcel, int) parameter #0:
+
+MissingNullability: android.telephony.LteVopsSupportInfo#writeToParcel(android.os.Parcel, int) parameter #0:
+
+MissingNullability: android.telephony.NetworkRegistrationInfo#writeToParcel(android.os.Parcel, int) parameter #0:
+
+MissingNullability: android.telephony.ServiceState#addNetworkRegistrationInfo(android.telephony.NetworkRegistrationInfo) parameter #0:
+
+MissingNullability: android.telephony.ServiceState#setCellBandwidths(int[]) parameter #0:
+
+MissingNullability: android.telephony.SmsManager#checkSmsShortCodeDestination(String, String) parameter #0:
+
+MissingNullability: android.telephony.SmsManager#checkSmsShortCodeDestination(String, String) parameter #1:
+
+MissingNullability: android.telephony.TelephonyManager#checkCarrierPrivilegesForPackage(String) parameter #0:
+
+MissingNullability: android.telephony.TelephonyManager#getLine1AlphaTag():
+
+MissingNullability: android.telephony.TelephonyManager#getRadioHalVersion():
+
+MissingNullability: android.telephony.TelephonyManager#setCarrierTestOverride(String, String, String, String, String, String, String) parameter #0:
+
+MissingNullability: android.telephony.TelephonyManager#setCarrierTestOverride(String, String, String, String, String, String, String) parameter #1:
+
+MissingNullability: android.telephony.TelephonyManager#setCarrierTestOverride(String, String, String, String, String, String, String) parameter #2:
+
+MissingNullability: android.telephony.TelephonyManager#setCarrierTestOverride(String, String, String, String, String, String, String) parameter #3:
+
+MissingNullability: android.telephony.TelephonyManager#setCarrierTestOverride(String, String, String, String, String, String, String) parameter #4:
+
+MissingNullability: android.telephony.TelephonyManager#setCarrierTestOverride(String, String, String, String, String, String, String) parameter #5:
+
+MissingNullability: android.telephony.TelephonyManager#setCarrierTestOverride(String, String, String, String, String, String, String) parameter #6:
+
+MissingNullability: android.telephony.TelephonyManager#setCarrierTestOverride(String, String, String, String, String, String, String, String, String) parameter #0:
+
+MissingNullability: android.telephony.TelephonyManager#setCarrierTestOverride(String, String, String, String, String, String, String, String, String) parameter #1:
+
+MissingNullability: android.telephony.TelephonyManager#setCarrierTestOverride(String, String, String, String, String, String, String, String, String) parameter #2:
+
+MissingNullability: android.telephony.TelephonyManager#setCarrierTestOverride(String, String, String, String, String, String, String, String, String) parameter #3:
+
+MissingNullability: android.telephony.TelephonyManager#setCarrierTestOverride(String, String, String, String, String, String, String, String, String) parameter #4:
+
+MissingNullability: android.telephony.TelephonyManager#setCarrierTestOverride(String, String, String, String, String, String, String, String, String) parameter #5:
+
+MissingNullability: android.telephony.TelephonyManager#setCarrierTestOverride(String, String, String, String, String, String, String, String, String) parameter #6:
+
+MissingNullability: android.telephony.TelephonyManager#setCarrierTestOverride(String, String, String, String, String, String, String, String, String) parameter #7:
+
+MissingNullability: android.telephony.TelephonyManager#setCarrierTestOverride(String, String, String, String, String, String, String, String, String) parameter #8:
+
+MissingNullability: android.telephony.mbms.DownloadRequest.Builder#setServiceId(String):
+
+MissingNullability: android.telephony.mbms.DownloadRequest.Builder#setServiceId(String) parameter #0:
+
+MissingNullability: android.telephony.mbms.FileInfo#FileInfo(android.net.Uri, String) parameter #0:
+
+MissingNullability: android.telephony.mbms.FileInfo#FileInfo(android.net.Uri, String) parameter #1:
+
+MissingNullability: android.telephony.mbms.FileServiceInfo#FileServiceInfo(java.util.Map<java.util.Locale,java.lang.String>, String, java.util.List<java.util.Locale>, String, java.util.Date, java.util.Date, java.util.List<android.telephony.mbms.FileInfo>) parameter #0:
+
+MissingNullability: android.telephony.mbms.FileServiceInfo#FileServiceInfo(java.util.Map<java.util.Locale,java.lang.String>, String, java.util.List<java.util.Locale>, String, java.util.Date, java.util.Date, java.util.List<android.telephony.mbms.FileInfo>) parameter #1:
+
+MissingNullability: android.telephony.mbms.FileServiceInfo#FileServiceInfo(java.util.Map<java.util.Locale,java.lang.String>, String, java.util.List<java.util.Locale>, String, java.util.Date, java.util.Date, java.util.List<android.telephony.mbms.FileInfo>) parameter #2:
+
+MissingNullability: android.telephony.mbms.FileServiceInfo#FileServiceInfo(java.util.Map<java.util.Locale,java.lang.String>, String, java.util.List<java.util.Locale>, String, java.util.Date, java.util.Date, java.util.List<android.telephony.mbms.FileInfo>) parameter #3:
+
+MissingNullability: android.telephony.mbms.FileServiceInfo#FileServiceInfo(java.util.Map<java.util.Locale,java.lang.String>, String, java.util.List<java.util.Locale>, String, java.util.Date, java.util.Date, java.util.List<android.telephony.mbms.FileInfo>) parameter #4:
+
+MissingNullability: android.telephony.mbms.FileServiceInfo#FileServiceInfo(java.util.Map<java.util.Locale,java.lang.String>, String, java.util.List<java.util.Locale>, String, java.util.Date, java.util.Date, java.util.List<android.telephony.mbms.FileInfo>) parameter #5:
+
+MissingNullability: android.telephony.mbms.FileServiceInfo#FileServiceInfo(java.util.Map<java.util.Locale,java.lang.String>, String, java.util.List<java.util.Locale>, String, java.util.Date, java.util.Date, java.util.List<android.telephony.mbms.FileInfo>) parameter #6:
+
+MissingNullability: android.telephony.mbms.StreamingServiceInfo#StreamingServiceInfo(java.util.Map<java.util.Locale,java.lang.String>, String, java.util.List<java.util.Locale>, String, java.util.Date, java.util.Date) parameter #0:
+
+MissingNullability: android.telephony.mbms.StreamingServiceInfo#StreamingServiceInfo(java.util.Map<java.util.Locale,java.lang.String>, String, java.util.List<java.util.Locale>, String, java.util.Date, java.util.Date) parameter #1:
+
+MissingNullability: android.telephony.mbms.StreamingServiceInfo#StreamingServiceInfo(java.util.Map<java.util.Locale,java.lang.String>, String, java.util.List<java.util.Locale>, String, java.util.Date, java.util.Date) parameter #2:
+
+MissingNullability: android.telephony.mbms.StreamingServiceInfo#StreamingServiceInfo(java.util.Map<java.util.Locale,java.lang.String>, String, java.util.List<java.util.Locale>, String, java.util.Date, java.util.Date) parameter #3:
+
+MissingNullability: android.telephony.mbms.StreamingServiceInfo#StreamingServiceInfo(java.util.Map<java.util.Locale,java.lang.String>, String, java.util.List<java.util.Locale>, String, java.util.Date, java.util.Date) parameter #4:
+
+MissingNullability: android.telephony.mbms.StreamingServiceInfo#StreamingServiceInfo(java.util.Map<java.util.Locale,java.lang.String>, String, java.util.List<java.util.Locale>, String, java.util.Date, java.util.Date) parameter #5:
+
+MissingNullability: android.telephony.mbms.UriPathPair#getContentUri():
+
+MissingNullability: android.telephony.mbms.UriPathPair#getFilePathUri():
+
+MissingNullability: android.telephony.mbms.UriPathPair#writeToParcel(android.os.Parcel, int) parameter #0:
+
+MissingNullability: android.telephony.mbms.vendor.MbmsDownloadServiceBase#addProgressListener(android.telephony.mbms.DownloadRequest, android.telephony.mbms.DownloadProgressListener) parameter #0:
+
+MissingNullability: android.telephony.mbms.vendor.MbmsDownloadServiceBase#addProgressListener(android.telephony.mbms.DownloadRequest, android.telephony.mbms.DownloadProgressListener) parameter #1:
+
+MissingNullability: android.telephony.mbms.vendor.MbmsDownloadServiceBase#addStatusListener(android.telephony.mbms.DownloadRequest, android.telephony.mbms.DownloadStatusListener) parameter #0:
+
+MissingNullability: android.telephony.mbms.vendor.MbmsDownloadServiceBase#addStatusListener(android.telephony.mbms.DownloadRequest, android.telephony.mbms.DownloadStatusListener) parameter #1:
+
+MissingNullability: android.telephony.mbms.vendor.MbmsDownloadServiceBase#asBinder():
+
+MissingNullability: android.telephony.mbms.vendor.MbmsDownloadServiceBase#cancelDownload(android.telephony.mbms.DownloadRequest) parameter #0:
+
+MissingNullability: android.telephony.mbms.vendor.MbmsDownloadServiceBase#download(android.telephony.mbms.DownloadRequest) parameter #0:
+
+MissingNullability: android.telephony.mbms.vendor.MbmsDownloadServiceBase#initialize(int, android.telephony.mbms.MbmsDownloadSessionCallback) parameter #1:
+
+MissingNullability: android.telephony.mbms.vendor.MbmsDownloadServiceBase#onTransact(int, android.os.Parcel, android.os.Parcel, int) parameter #1:
+
+MissingNullability: android.telephony.mbms.vendor.MbmsDownloadServiceBase#onTransact(int, android.os.Parcel, android.os.Parcel, int) parameter #2:
+
+MissingNullability: android.telephony.mbms.vendor.MbmsDownloadServiceBase#removeProgressListener(android.telephony.mbms.DownloadRequest, android.telephony.mbms.DownloadProgressListener) parameter #0:
+
+MissingNullability: android.telephony.mbms.vendor.MbmsDownloadServiceBase#removeProgressListener(android.telephony.mbms.DownloadRequest, android.telephony.mbms.DownloadProgressListener) parameter #1:
+
+MissingNullability: android.telephony.mbms.vendor.MbmsDownloadServiceBase#removeStatusListener(android.telephony.mbms.DownloadRequest, android.telephony.mbms.DownloadStatusListener) parameter #0:
+
+MissingNullability: android.telephony.mbms.vendor.MbmsDownloadServiceBase#removeStatusListener(android.telephony.mbms.DownloadRequest, android.telephony.mbms.DownloadStatusListener) parameter #1:
+
+MissingNullability: android.telephony.mbms.vendor.MbmsDownloadServiceBase#requestDownloadState(android.telephony.mbms.DownloadRequest, android.telephony.mbms.FileInfo) parameter #0:
+
+MissingNullability: android.telephony.mbms.vendor.MbmsDownloadServiceBase#requestDownloadState(android.telephony.mbms.DownloadRequest, android.telephony.mbms.FileInfo) parameter #1:
+
+MissingNullability: android.telephony.mbms.vendor.MbmsDownloadServiceBase#requestUpdateFileServices(int, java.util.List<java.lang.String>) parameter #1:
+
+MissingNullability: android.telephony.mbms.vendor.MbmsDownloadServiceBase#resetDownloadKnowledge(android.telephony.mbms.DownloadRequest) parameter #0:
+
+MissingNullability: android.telephony.mbms.vendor.MbmsDownloadServiceBase#setTempFileRootDirectory(int, String) parameter #1:
+
+MissingNullability: android.telephony.mbms.vendor.MbmsGroupCallServiceBase#onBind(android.content.Intent):
+
+MissingNullability: android.telephony.mbms.vendor.MbmsGroupCallServiceBase#onBind(android.content.Intent) parameter #0:
+
+MissingNullability: android.telephony.mbms.vendor.MbmsStreamingServiceBase#asBinder():
+
+MissingNullability: android.telephony.mbms.vendor.MbmsStreamingServiceBase#getPlaybackUri(int, String) parameter #1:
+
+MissingNullability: android.telephony.mbms.vendor.MbmsStreamingServiceBase#initialize(android.telephony.mbms.MbmsStreamingSessionCallback, int) parameter #0:
+
+MissingNullability: android.telephony.mbms.vendor.MbmsStreamingServiceBase#onTransact(int, android.os.Parcel, android.os.Parcel, int) parameter #1:
+
+MissingNullability: android.telephony.mbms.vendor.MbmsStreamingServiceBase#onTransact(int, android.os.Parcel, android.os.Parcel, int) parameter #2:
+
+MissingNullability: android.telephony.mbms.vendor.MbmsStreamingServiceBase#requestUpdateStreamingServices(int, java.util.List<java.lang.String>) parameter #1:
+
+MissingNullability: android.telephony.mbms.vendor.MbmsStreamingServiceBase#startStreaming(int, String, android.telephony.mbms.StreamingServiceCallback) parameter #1:
+
+MissingNullability: android.telephony.mbms.vendor.MbmsStreamingServiceBase#startStreaming(int, String, android.telephony.mbms.StreamingServiceCallback) parameter #2:
+
+MissingNullability: android.telephony.mbms.vendor.MbmsStreamingServiceBase#stopStreaming(int, String) parameter #1:
+
+MissingNullability: android.telephony.mbms.vendor.VendorUtils#getAppReceiverFromPackageName(android.content.Context, String):
+
+MissingNullability: android.telephony.mbms.vendor.VendorUtils#getAppReceiverFromPackageName(android.content.Context, String) parameter #0:
+
+MissingNullability: android.telephony.mbms.vendor.VendorUtils#getAppReceiverFromPackageName(android.content.Context, String) parameter #1:
+
+MissingNullability: android.text.Selection.MemoryTextWatcher#afterTextChanged(android.text.Editable) parameter #0:
+
+MissingNullability: android.text.Selection.MemoryTextWatcher#beforeTextChanged(CharSequence, int, int, int) parameter #0:
+
+MissingNullability: android.text.Selection.MemoryTextWatcher#onTextChanged(CharSequence, int, int, int) parameter #0:
+
+MissingNullability: android.transition.TransitionManager#getTransition(android.transition.Scene):
+
+MissingNullability: android.transition.TransitionManager#getTransition(android.transition.Scene) parameter #0:
+
+MissingNullability: android.util.FeatureFlagUtils#getAllFeatureFlags():
+
+MissingNullability: android.util.FeatureFlagUtils#isEnabled(android.content.Context, String) parameter #0:
+
+MissingNullability: android.util.FeatureFlagUtils#isEnabled(android.content.Context, String) parameter #1:
+
+MissingNullability: android.util.FeatureFlagUtils#setEnabled(android.content.Context, String, boolean) parameter #0:
+
+MissingNullability: android.util.FeatureFlagUtils#setEnabled(android.content.Context, String, boolean) parameter #1:
+
+MissingNullability: android.util.TimeUtils#formatDuration(long):
+
+MissingNullability: android.util.proto.EncodedBuffer#dumpBuffers(String) parameter #0:
+
+MissingNullability: android.util.proto.EncodedBuffer#dumpByteString(String, String, byte[]) parameter #0:
+
+MissingNullability: android.util.proto.EncodedBuffer#dumpByteString(String, String, byte[]) parameter #1:
+
+MissingNullability: android.util.proto.EncodedBuffer#dumpByteString(String, String, byte[]) parameter #2:
+
+MissingNullability: android.util.proto.EncodedBuffer#getBytes(int):
+
+MissingNullability: android.util.proto.EncodedBuffer#getDebugString():
+
+MissingNullability: android.util.proto.EncodedBuffer#writeRawBuffer(byte[]) parameter #0:
+
+MissingNullability: android.util.proto.EncodedBuffer#writeRawBuffer(byte[], int, int) parameter #0:
+
+MissingNullability: android.util.proto.ProtoOutputStream#ProtoOutputStream(java.io.FileDescriptor) parameter #0:
+
+MissingNullability: android.util.proto.ProtoOutputStream#ProtoOutputStream(java.io.OutputStream) parameter #0:
+
+MissingNullability: android.util.proto.ProtoOutputStream#dump(String) parameter #0:
+
+MissingNullability: android.util.proto.ProtoOutputStream#getBytes():
+
+MissingNullability: android.util.proto.ProtoOutputStream#write(long, String) parameter #1:
+
+MissingNullability: android.util.proto.ProtoOutputStream#write(long, byte[]) parameter #1:
+
+MissingNullability: android.util.proto.ProtoOutputStream#writeBytes(long, byte[]) parameter #1:
+
+MissingNullability: android.util.proto.ProtoOutputStream#writeObject(long, byte[]) parameter #1:
+
+MissingNullability: android.util.proto.ProtoOutputStream#writePackedBool(long, boolean[]) parameter #1:
+
+MissingNullability: android.util.proto.ProtoOutputStream#writePackedDouble(long, double[]) parameter #1:
+
+MissingNullability: android.util.proto.ProtoOutputStream#writePackedEnum(long, int[]) parameter #1:
+
+MissingNullability: android.util.proto.ProtoOutputStream#writePackedFixed32(long, int[]) parameter #1:
+
+MissingNullability: android.util.proto.ProtoOutputStream#writePackedFixed64(long, long[]) parameter #1:
+
+MissingNullability: android.util.proto.ProtoOutputStream#writePackedFloat(long, float[]) parameter #1:
+
+MissingNullability: android.util.proto.ProtoOutputStream#writePackedInt32(long, int[]) parameter #1:
+
+MissingNullability: android.util.proto.ProtoOutputStream#writePackedInt64(long, long[]) parameter #1:
+
+MissingNullability: android.util.proto.ProtoOutputStream#writePackedSFixed32(long, int[]) parameter #1:
+
+MissingNullability: android.util.proto.ProtoOutputStream#writePackedSFixed64(long, long[]) parameter #1:
+
+MissingNullability: android.util.proto.ProtoOutputStream#writePackedSInt32(long, int[]) parameter #1:
+
+MissingNullability: android.util.proto.ProtoOutputStream#writePackedSInt64(long, long[]) parameter #1:
+
+MissingNullability: android.util.proto.ProtoOutputStream#writePackedUInt32(long, int[]) parameter #1:
+
+MissingNullability: android.util.proto.ProtoOutputStream#writePackedUInt64(long, long[]) parameter #1:
+
+MissingNullability: android.util.proto.ProtoOutputStream#writeRepeatedBytes(long, byte[]) parameter #1:
+
+MissingNullability: android.util.proto.ProtoOutputStream#writeRepeatedObject(long, byte[]) parameter #1:
+
+MissingNullability: android.util.proto.ProtoOutputStream#writeRepeatedString(long, String) parameter #1:
+
+MissingNullability: android.util.proto.ProtoOutputStream#writeString(long, String) parameter #1:
+
+MissingNullability: android.util.proto.ProtoParseException#ProtoParseException(String) parameter #0:
+
+MissingNullability: android.util.proto.ProtoStream#FIELD_TYPE_NAMES:
+
+MissingNullability: android.util.proto.ProtoStream#getFieldCountString(long):
+
+MissingNullability: android.util.proto.ProtoStream#getFieldIdString(long):
+
+MissingNullability: android.util.proto.ProtoStream#getFieldTypeString(long):
+
+MissingNullability: android.util.proto.ProtoStream#getWireTypeString(int):
+
+MissingNullability: android.util.proto.ProtoStream#token2String(long):
+
+MissingNullability: android.util.proto.WireTypeMismatchException#WireTypeMismatchException(String) parameter #0:
+
+MissingNullability: android.view.Choreographer#postCallback(int, Runnable, Object) parameter #1:
+
+MissingNullability: android.view.Choreographer#postCallback(int, Runnable, Object) parameter #2:
+
+MissingNullability: android.view.Choreographer#postCallbackDelayed(int, Runnable, Object, long) parameter #1:
+
+MissingNullability: android.view.Choreographer#postCallbackDelayed(int, Runnable, Object, long) parameter #2:
+
+MissingNullability: android.view.Choreographer#removeCallbacks(int, Runnable, Object) parameter #1:
+
+MissingNullability: android.view.Choreographer#removeCallbacks(int, Runnable, Object) parameter #2:
+
+MissingNullability: android.view.FocusFinder#sort(android.view.View[], int, int, android.view.ViewGroup, boolean) parameter #0:
+
+MissingNullability: android.view.FocusFinder#sort(android.view.View[], int, int, android.view.ViewGroup, boolean) parameter #3:
+
+MissingNullability: android.view.KeyEvent#actionToString(int):
+
+MissingNullability: android.view.View#getTooltipView():
+
+MissingNullability: android.view.View#isDefaultFocusHighlightNeeded(android.graphics.drawable.Drawable, android.graphics.drawable.Drawable) parameter #0:
+
+MissingNullability: android.view.View#isDefaultFocusHighlightNeeded(android.graphics.drawable.Drawable, android.graphics.drawable.Drawable) parameter #1:
+
+MissingNullability: android.view.ViewDebug#startRenderingCommandsCapture(android.view.View, java.util.concurrent.Executor, java.util.concurrent.Callable<java.io.OutputStream>) parameter #0:
+
+MissingNullability: android.view.ViewDebug#startRenderingCommandsCapture(android.view.View, java.util.concurrent.Executor, java.util.concurrent.Callable<java.io.OutputStream>) parameter #1:
+
+MissingNullability: android.view.ViewDebug#startRenderingCommandsCapture(android.view.View, java.util.concurrent.Executor, java.util.concurrent.Callable<java.io.OutputStream>) parameter #2:
+
+MissingNullability: android.view.ViewDebug#startRenderingCommandsCapture(android.view.View, java.util.concurrent.Executor, java.util.function.Function<android.graphics.Picture,java.lang.Boolean>) parameter #0:
+
+MissingNullability: android.view.ViewDebug#startRenderingCommandsCapture(android.view.View, java.util.concurrent.Executor, java.util.function.Function<android.graphics.Picture,java.lang.Boolean>) parameter #1:
+
+MissingNullability: android.view.ViewDebug#startRenderingCommandsCapture(android.view.View, java.util.concurrent.Executor, java.util.function.Function<android.graphics.Picture,java.lang.Boolean>) parameter #2:
+
+MissingNullability: android.view.WindowManager.LayoutParams#accessibilityTitle:
+
+MissingNullability: android.view.WindowlessViewRoot#WindowlessViewRoot(android.content.Context, android.view.Display, android.view.SurfaceControl) parameter #0:
+
+MissingNullability: android.view.WindowlessViewRoot#WindowlessViewRoot(android.content.Context, android.view.Display, android.view.SurfaceControl) parameter #1:
+
+MissingNullability: android.view.WindowlessViewRoot#WindowlessViewRoot(android.content.Context, android.view.Display, android.view.SurfaceControl) parameter #2:
+
+MissingNullability: android.view.WindowlessViewRoot#addView(android.view.View, android.view.WindowManager.LayoutParams) parameter #0:
+
+MissingNullability: android.view.WindowlessViewRoot#addView(android.view.View, android.view.WindowManager.LayoutParams) parameter #1:
+
+MissingNullability: android.view.WindowlessViewRoot#relayout(android.view.WindowManager.LayoutParams) parameter #0:
+
+MissingNullability: android.view.accessibility.AccessibilityManager.AccessibilityServicesStateChangeListener#onAccessibilityServicesStateChanged(android.view.accessibility.AccessibilityManager) parameter #0:
+
+MissingNullability: android.view.accessibility.AccessibilityNodeInfo#setNumInstancesInUseCounter(java.util.concurrent.atomic.AtomicInteger) parameter #0:
+
+MissingNullability: android.view.accessibility.AccessibilityNodeInfo#writeToParcelNoRecycle(android.os.Parcel, int) parameter #0:
+
+MissingNullability: android.view.accessibility.AccessibilityWindowInfo#setNumInstancesInUseCounter(java.util.concurrent.atomic.AtomicInteger) parameter #0:
+
+MissingNullability: android.view.contentcapture.ContentCaptureEvent#writeToParcel(android.os.Parcel, int) parameter #0:
+
+MissingNullability: android.view.contentcapture.ViewNode.ViewStructureImpl#asyncNewChild(int):
+
+MissingNullability: android.view.contentcapture.ViewNode.ViewStructureImpl#getAutofillId():
+
+MissingNullability: android.view.contentcapture.ViewNode.ViewStructureImpl#getExtras():
+
+MissingNullability: android.view.contentcapture.ViewNode.ViewStructureImpl#getHint():
+
+MissingNullability: android.view.contentcapture.ViewNode.ViewStructureImpl#getNode():
+
+MissingNullability: android.view.contentcapture.ViewNode.ViewStructureImpl#getTempRect():
+
+MissingNullability: android.view.contentcapture.ViewNode.ViewStructureImpl#getText():
+
+MissingNullability: android.view.contentcapture.ViewNode.ViewStructureImpl#newChild(int):
+
+MissingNullability: android.view.contentcapture.ViewNode.ViewStructureImpl#newHtmlInfoBuilder(String):
+
+MissingNullability: android.view.contentcapture.ViewNode.ViewStructureImpl#newHtmlInfoBuilder(String) parameter #0:
+
+MissingNullability: android.view.contentcapture.ViewNode.ViewStructureImpl#setAutofillHints(String[]) parameter #0:
+
+MissingNullability: android.view.contentcapture.ViewNode.ViewStructureImpl#setAutofillId(android.view.autofill.AutofillId) parameter #0:
+
+MissingNullability: android.view.contentcapture.ViewNode.ViewStructureImpl#setAutofillId(android.view.autofill.AutofillId, int) parameter #0:
+
+MissingNullability: android.view.contentcapture.ViewNode.ViewStructureImpl#setAutofillOptions(CharSequence[]) parameter #0:
+
+MissingNullability: android.view.contentcapture.ViewNode.ViewStructureImpl#setAutofillValue(android.view.autofill.AutofillValue) parameter #0:
+
+MissingNullability: android.view.contentcapture.ViewNode.ViewStructureImpl#setClassName(String) parameter #0:
+
+MissingNullability: android.view.contentcapture.ViewNode.ViewStructureImpl#setContentDescription(CharSequence) parameter #0:
+
+MissingNullability: android.view.contentcapture.ViewNode.ViewStructureImpl#setHint(CharSequence) parameter #0:
+
+MissingNullability: android.view.contentcapture.ViewNode.ViewStructureImpl#setHintIdEntry(String) parameter #0:
+
+MissingNullability: android.view.contentcapture.ViewNode.ViewStructureImpl#setHtmlInfo(android.view.ViewStructure.HtmlInfo) parameter #0:
+
+MissingNullability: android.view.contentcapture.ViewNode.ViewStructureImpl#setId(int, String, String, String) parameter #1:
+
+MissingNullability: android.view.contentcapture.ViewNode.ViewStructureImpl#setId(int, String, String, String) parameter #2:
+
+MissingNullability: android.view.contentcapture.ViewNode.ViewStructureImpl#setId(int, String, String, String) parameter #3:
+
+MissingNullability: android.view.contentcapture.ViewNode.ViewStructureImpl#setLocaleList(android.os.LocaleList) parameter #0:
+
+MissingNullability: android.view.contentcapture.ViewNode.ViewStructureImpl#setText(CharSequence) parameter #0:
+
+MissingNullability: android.view.contentcapture.ViewNode.ViewStructureImpl#setText(CharSequence, int, int) parameter #0:
+
+MissingNullability: android.view.contentcapture.ViewNode.ViewStructureImpl#setTextLines(int[], int[]) parameter #0:
+
+MissingNullability: android.view.contentcapture.ViewNode.ViewStructureImpl#setTextLines(int[], int[]) parameter #1:
+
+MissingNullability: android.view.contentcapture.ViewNode.ViewStructureImpl#setTransformation(android.graphics.Matrix) parameter #0:
+
+MissingNullability: android.view.contentcapture.ViewNode.ViewStructureImpl#setWebDomain(String) parameter #0:
+
+MissingNullability: android.widget.CalendarView#getBoundsForDate(long, android.graphics.Rect) parameter #1:
+
+MissingNullability: android.widget.ImageView#isDefaultFocusHighlightNeeded(android.graphics.drawable.Drawable, android.graphics.drawable.Drawable) parameter #0:
+
+MissingNullability: android.widget.ImageView#isDefaultFocusHighlightNeeded(android.graphics.drawable.Drawable, android.graphics.drawable.Drawable) parameter #1:
+
+MissingNullability: android.widget.Magnifier#getMagnifierDefaultSize():
+
+MissingNullability: android.widget.Magnifier#setOnOperationCompleteCallback(android.widget.Magnifier.Callback) parameter #0:
+
+MissingNullability: android.widget.NumberPicker#getDisplayedValueForCurrentSelection():
+
+MissingNullability: android.widget.PopupMenu#getMenuListView():
+
+MissingNullability: android.widget.TimePicker#getAmView():
+
+MissingNullability: android.widget.TimePicker#getHourView():
+
+MissingNullability: android.widget.TimePicker#getMinuteView():
+
+MissingNullability: android.widget.TimePicker#getPmView():
+
+
+
+MutableBareField: android.content.AutofillOptions#appDisabledExpiration:
+
+MutableBareField: android.content.AutofillOptions#augmentedAutofillEnabled:
+
+MutableBareField: android.content.AutofillOptions#disabledActivities:
+
+MutableBareField: android.content.AutofillOptions#whitelistedActivitiesForAugmentedAutofill:
+
+MutableBareField: android.database.sqlite.SQLiteDebug.DbStats#cache:
+
+MutableBareField: android.database.sqlite.SQLiteDebug.DbStats#dbName:
+
+MutableBareField: android.database.sqlite.SQLiteDebug.DbStats#dbSize:
+
+MutableBareField: android.database.sqlite.SQLiteDebug.DbStats#lookaside:
+
+MutableBareField: android.database.sqlite.SQLiteDebug.DbStats#pageSize:
+
+MutableBareField: android.database.sqlite.SQLiteDebug.PagerStats#dbStats:
+
+MutableBareField: android.database.sqlite.SQLiteDebug.PagerStats#largestMemAlloc:
+
+MutableBareField: android.database.sqlite.SQLiteDebug.PagerStats#memoryUsed:
+
+MutableBareField: android.database.sqlite.SQLiteDebug.PagerStats#pageCacheOverflow:
+
+MutableBareField: android.os.StrictMode.ViolationInfo#broadcastIntentAction:
+
+MutableBareField: android.os.StrictMode.ViolationInfo#durationMillis:
+
+MutableBareField: android.os.StrictMode.ViolationInfo#numAnimationsRunning:
+
+MutableBareField: android.os.StrictMode.ViolationInfo#numInstances:
+
+MutableBareField: android.os.StrictMode.ViolationInfo#tags:
+
+MutableBareField: android.os.StrictMode.ViolationInfo#violationNumThisLoop:
+
+MutableBareField: android.os.StrictMode.ViolationInfo#violationUptimeMillis:
+
+
+
+NoByteOrShort: android.media.audiofx.AudioEffect#byteArrayToShort(byte[]):
+
+NoByteOrShort: android.media.audiofx.AudioEffect#setParameter(int, short) parameter #1:
+
+NoByteOrShort: android.media.audiofx.AudioEffect#shortToByteArray(short) parameter #0:
+
+NoByteOrShort: android.os.HwBlob#getInt16(long):
+
+NoByteOrShort: android.os.HwBlob#getInt8(long):
+
+NoByteOrShort: android.os.HwBlob#putInt16(long, short) parameter #1:
+
+NoByteOrShort: android.os.HwBlob#putInt8(long, byte) parameter #1:
+
+NoByteOrShort: android.os.HwParcel#readInt16():
+
+NoByteOrShort: android.os.HwParcel#readInt8():
+
+NoByteOrShort: android.os.HwParcel#writeInt16(short) parameter #0:
+
+NoByteOrShort: android.os.HwParcel#writeInt8(byte) parameter #0:
+
+NoByteOrShort: android.util.proto.EncodedBuffer#readRawByte():
+
+NoByteOrShort: android.util.proto.EncodedBuffer#writeRawByte(byte) parameter #0:
+
+
+
+NoClone: android.net.util.SocketUtils#bindSocketToInterface(java.io.FileDescriptor, String) parameter #0:
+
+NoClone: android.net.util.SocketUtils#closeSocket(java.io.FileDescriptor) parameter #0:
+
+NoClone: android.os.NativeHandle#NativeHandle(java.io.FileDescriptor, boolean) parameter #0:
+
+NoClone: android.os.NativeHandle#getFileDescriptor():
+
+NoClone: android.os.ParcelFileDescriptor#getFile(java.io.FileDescriptor) parameter #0:
+
+NoClone: android.service.autofill.augmented.AugmentedAutofillService#dump(java.io.FileDescriptor, java.io.PrintWriter, String[]) parameter #0:
+
+NoClone: android.service.contentcapture.ContentCaptureService#dump(java.io.FileDescriptor, java.io.PrintWriter, String[]) parameter #0:
+
+NoClone: android.util.proto.ProtoOutputStream#ProtoOutputStream(java.io.FileDescriptor) parameter #0:
+
+
+
+NotCloseable: android.app.ActivityView:
+
+NotCloseable: android.app.prediction.AppPredictor:
+
+NotCloseable: android.os.HwParcel:
+
+
+
+OnNameExpected: android.service.autofill.augmented.AugmentedAutofillService#dump(java.io.PrintWriter, String[]):
+
+OnNameExpected: android.service.contentcapture.ContentCaptureService#dump(java.io.FileDescriptor, java.io.PrintWriter, String[]):
+
+OnNameExpected: android.service.notification.ConditionProviderService#isBound():
+
+OnNameExpected: android.service.notification.NotificationAssistantService#attachBaseContext(android.content.Context):
+
+OnNameExpected: android.service.quicksettings.TileService#isQuickSettingsSupported():
+
+OnNameExpected: android.telephony.mbms.vendor.MbmsGroupCallServiceBase#dispose(int):
+
+OnNameExpected: android.telephony.mbms.vendor.MbmsGroupCallServiceBase#initialize(android.telephony.mbms.MbmsGroupCallSessionCallback, int):
+
+OnNameExpected: android.telephony.mbms.vendor.MbmsGroupCallServiceBase#startGroupCall(int, long, java.util.List<java.lang.Integer>, java.util.List<java.lang.Integer>, android.telephony.mbms.GroupCallCallback):
+
+OnNameExpected: android.telephony.mbms.vendor.MbmsGroupCallServiceBase#stopGroupCall(int, long):
+
+OnNameExpected: android.telephony.mbms.vendor.MbmsGroupCallServiceBase#updateGroupCall(int, long, java.util.List<java.lang.Integer>, java.util.List<java.lang.Integer>):
+
+
+
+PackageLayering: android.util.FeatureFlagUtils:
+
+
+
+ParcelConstructor: android.os.IncidentManager.IncidentReport#IncidentReport(android.os.Parcel):
+
+ParcelConstructor: android.os.IncidentReportArgs#IncidentReportArgs(android.os.Parcel):
+
+ParcelConstructor: android.os.StrictMode.ViolationInfo#ViolationInfo(android.os.Parcel):
+
+ParcelConstructor: android.os.VibrationEffect.OneShot#OneShot(android.os.Parcel):
+
+ParcelConstructor: android.os.VibrationEffect.Prebaked#Prebaked(android.os.Parcel):
+
+ParcelConstructor: android.os.VibrationEffect.Waveform#Waveform(android.os.Parcel):
+
+ParcelConstructor: android.os.health.HealthStatsParceler#HealthStatsParceler(android.os.Parcel):
+
+ParcelConstructor: android.service.notification.SnoozeCriterion#SnoozeCriterion(android.os.Parcel):
+
+
+
+ParcelCreator: android.app.WindowConfiguration:
+
+ParcelCreator: android.net.metrics.ApfProgramEvent:
+
+ParcelCreator: android.net.metrics.ApfStats:
+
+ParcelCreator: android.net.metrics.DhcpClientEvent:
+
+ParcelCreator: android.net.metrics.DhcpErrorEvent:
+
+ParcelCreator: android.net.metrics.IpConnectivityLog.Event:
+
+ParcelCreator: android.net.metrics.IpManagerEvent:
+
+ParcelCreator: android.net.metrics.IpReachabilityEvent:
+
+ParcelCreator: android.net.metrics.NetworkEvent:
+
+ParcelCreator: android.net.metrics.RaEvent:
+
+ParcelCreator: android.net.metrics.ValidationProbeEvent:
+
+ParcelCreator: android.os.VibrationEffect.OneShot:
+
+ParcelCreator: android.os.VibrationEffect.Prebaked:
+
+ParcelCreator: android.os.VibrationEffect.Waveform:
+
+ParcelCreator: android.service.autofill.InternalOnClickAction:
+
+ParcelCreator: android.service.autofill.InternalSanitizer:
+
+ParcelCreator: android.service.autofill.InternalTransformation:
+
+ParcelCreator: android.service.autofill.InternalValidator:
+
+
+
+ParcelNotFinal: android.app.WindowConfiguration:
+
+ParcelNotFinal: android.net.metrics.IpConnectivityLog.Event:
+
+ParcelNotFinal: android.os.IncidentManager.IncidentReport:
+
+ParcelNotFinal: android.os.VibrationEffect.OneShot:
+
+ParcelNotFinal: android.os.VibrationEffect.Prebaked:
+
+ParcelNotFinal: android.os.VibrationEffect.Waveform:
+
+ParcelNotFinal: android.os.health.HealthStatsParceler:
+
+ParcelNotFinal: android.service.autofill.InternalOnClickAction:
+
+ParcelNotFinal: android.service.autofill.InternalSanitizer:
+
+ParcelNotFinal: android.service.autofill.InternalTransformation:
+
+ParcelNotFinal: android.service.autofill.InternalValidator:
+
+
+
+ProtectedMember: android.app.ActivityView#onVisibilityChanged(android.view.View, int):
+
+ProtectedMember: android.app.AppDetailsActivity#onCreate(android.os.Bundle):
+
+ProtectedMember: android.os.VibrationEffect#scale(int, float, int):
+
+ProtectedMember: android.service.autofill.augmented.AugmentedAutofillService#dump(java.io.FileDescriptor, java.io.PrintWriter, String[]):
+
+ProtectedMember: android.service.autofill.augmented.AugmentedAutofillService#dump(java.io.PrintWriter, String[]):
+
+ProtectedMember: android.service.contentcapture.ContentCaptureService#dump(java.io.FileDescriptor, java.io.PrintWriter, String[]):
+
+ProtectedMember: android.service.notification.NotificationAssistantService#attachBaseContext(android.content.Context):
+
+ProtectedMember: android.util.proto.ProtoStream#FIELD_TYPE_NAMES:
+
+ProtectedMember: android.view.View#resetResolvedDrawables():
+
+ProtectedMember: android.view.ViewGroup#resetResolvedDrawables():
+
+
+
+RawAidl: android.telephony.mbms.vendor.MbmsDownloadServiceBase:
+
+RawAidl: android.telephony.mbms.vendor.MbmsStreamingServiceBase:
+
+
+
+RethrowRemoteException: android.app.ActivityManager#resumeAppSwitches():
+
+RethrowRemoteException: android.os.HwBinder#getService(String, String):
+
+RethrowRemoteException: android.os.HwBinder#getService(String, String, boolean):
+
+RethrowRemoteException: android.os.HwBinder#onTransact(int, android.os.HwParcel, android.os.HwParcel, int):
+
+RethrowRemoteException: android.os.HwBinder#registerService(String):
+
+RethrowRemoteException: android.os.HwBinder#transact(int, android.os.HwParcel, android.os.HwParcel, int):
+
+RethrowRemoteException: android.os.IHwBinder#transact(int, android.os.HwParcel, android.os.HwParcel, int):
+
+RethrowRemoteException: android.telephony.mbms.vendor.MbmsDownloadServiceBase#addProgressListener(android.telephony.mbms.DownloadRequest, android.telephony.mbms.DownloadProgressListener):
+
+RethrowRemoteException: android.telephony.mbms.vendor.MbmsDownloadServiceBase#addStatusListener(android.telephony.mbms.DownloadRequest, android.telephony.mbms.DownloadStatusListener):
+
+RethrowRemoteException: android.telephony.mbms.vendor.MbmsDownloadServiceBase#cancelDownload(android.telephony.mbms.DownloadRequest):
+
+RethrowRemoteException: android.telephony.mbms.vendor.MbmsDownloadServiceBase#dispose(int):
+
+RethrowRemoteException: android.telephony.mbms.vendor.MbmsDownloadServiceBase#download(android.telephony.mbms.DownloadRequest):
+
+RethrowRemoteException: android.telephony.mbms.vendor.MbmsDownloadServiceBase#initialize(int, android.telephony.mbms.MbmsDownloadSessionCallback):
+
+RethrowRemoteException: android.telephony.mbms.vendor.MbmsDownloadServiceBase#listPendingDownloads(int):
+
+RethrowRemoteException: android.telephony.mbms.vendor.MbmsDownloadServiceBase#onTransact(int, android.os.Parcel, android.os.Parcel, int):
+
+RethrowRemoteException: android.telephony.mbms.vendor.MbmsDownloadServiceBase#removeProgressListener(android.telephony.mbms.DownloadRequest, android.telephony.mbms.DownloadProgressListener):
+
+RethrowRemoteException: android.telephony.mbms.vendor.MbmsDownloadServiceBase#removeStatusListener(android.telephony.mbms.DownloadRequest, android.telephony.mbms.DownloadStatusListener):
+
+RethrowRemoteException: android.telephony.mbms.vendor.MbmsDownloadServiceBase#requestDownloadState(android.telephony.mbms.DownloadRequest, android.telephony.mbms.FileInfo):
+
+RethrowRemoteException: android.telephony.mbms.vendor.MbmsDownloadServiceBase#requestUpdateFileServices(int, java.util.List<java.lang.String>):
+
+RethrowRemoteException: android.telephony.mbms.vendor.MbmsDownloadServiceBase#resetDownloadKnowledge(android.telephony.mbms.DownloadRequest):
+
+RethrowRemoteException: android.telephony.mbms.vendor.MbmsDownloadServiceBase#setTempFileRootDirectory(int, String):
+
+RethrowRemoteException: android.telephony.mbms.vendor.MbmsGroupCallServiceBase#dispose(int):
+
+RethrowRemoteException: android.telephony.mbms.vendor.MbmsGroupCallServiceBase#initialize(android.telephony.mbms.MbmsGroupCallSessionCallback, int):
+
+RethrowRemoteException: android.telephony.mbms.vendor.MbmsStreamingServiceBase#dispose(int):
+
+RethrowRemoteException: android.telephony.mbms.vendor.MbmsStreamingServiceBase#getPlaybackUri(int, String):
+
+RethrowRemoteException: android.telephony.mbms.vendor.MbmsStreamingServiceBase#initialize(android.telephony.mbms.MbmsStreamingSessionCallback, int):
+
+RethrowRemoteException: android.telephony.mbms.vendor.MbmsStreamingServiceBase#onTransact(int, android.os.Parcel, android.os.Parcel, int):
+
+RethrowRemoteException: android.telephony.mbms.vendor.MbmsStreamingServiceBase#requestUpdateStreamingServices(int, java.util.List<java.lang.String>):
+
+RethrowRemoteException: android.telephony.mbms.vendor.MbmsStreamingServiceBase#startStreaming(int, String, android.telephony.mbms.StreamingServiceCallback):
+
+RethrowRemoteException: android.telephony.mbms.vendor.MbmsStreamingServiceBase#stopStreaming(int, String):
+
+
+
+SamShouldBeLast: android.app.ActivityManager#addOnUidImportanceListener(android.app.ActivityManager.OnUidImportanceListener, int):
+
+SamShouldBeLast: android.app.role.RoleManager#addOnRoleHoldersChangedListenerAsUser(java.util.concurrent.Executor, android.app.role.OnRoleHoldersChangedListener, android.os.UserHandle):
+
+SamShouldBeLast: android.app.role.RoleManager#removeOnRoleHoldersChangedListenerAsUser(android.app.role.OnRoleHoldersChangedListener, android.os.UserHandle):
+
+SamShouldBeLast: android.database.sqlite.SQLiteDebug#dump(android.util.Printer, String[]):
+
+SamShouldBeLast: android.database.sqlite.SQLiteDirectCursorDriver#query(android.database.sqlite.SQLiteDatabase.CursorFactory, String[]):
+
+SamShouldBeLast: android.location.LocationManager#requestLocationUpdates(android.location.LocationRequest, java.util.concurrent.Executor, android.location.LocationListener):
+
+SamShouldBeLast: android.os.BugreportManager#startBugreport(android.os.ParcelFileDescriptor, android.os.ParcelFileDescriptor, android.os.BugreportParams, java.util.concurrent.Executor, android.os.BugreportManager.BugreportCallback):
+
+SamShouldBeLast: android.os.IHwBinder#linkToDeath(android.os.IHwBinder.DeathRecipient, long):
+
+SamShouldBeLast: android.os.StrictMode.ViolationInfo#dump(android.util.Printer, String):
+
+SamShouldBeLast: android.permission.PermissionControllerManager#getAppPermissions(String, android.permission.PermissionControllerManager.OnGetAppPermissionResultCallback, android.os.Handler):
+
+SamShouldBeLast: android.permission.PermissionControllerManager#revokeRuntimePermissions(java.util.Map<java.lang.String,java.util.List<java.lang.String>>, boolean, int, java.util.concurrent.Executor, android.permission.PermissionControllerManager.OnRevokeRuntimePermissionsCallback):
+
+SamShouldBeLast: android.service.autofill.CharSequenceTransformation#apply(android.service.autofill.ValueFinder, android.widget.RemoteViews, int):
+
+SamShouldBeLast: android.service.autofill.DateTransformation#apply(android.service.autofill.ValueFinder, android.widget.RemoteViews, int):
+
+SamShouldBeLast: android.service.autofill.ImageTransformation#apply(android.service.autofill.ValueFinder, android.widget.RemoteViews, int):
+
+SamShouldBeLast: android.service.autofill.InternalTransformation#batchApply(android.service.autofill.ValueFinder, android.widget.RemoteViews, java.util.ArrayList<android.util.Pair<java.lang.Integer,android.service.autofill.InternalTransformation>>):
+
+SamShouldBeLast: android.view.Choreographer#postCallback(int, Runnable, Object):
+
+SamShouldBeLast: android.view.Choreographer#postCallbackDelayed(int, Runnable, Object, long):
+
+SamShouldBeLast: android.view.Choreographer#removeCallbacks(int, Runnable, Object):
+
+SamShouldBeLast: android.view.ViewDebug#startRenderingCommandsCapture(android.view.View, java.util.concurrent.Executor, java.util.function.Function<android.graphics.Picture,java.lang.Boolean>):
+
+SamShouldBeLast: android.view.accessibility.AccessibilityManager#addAccessibilityServicesStateChangeListener(android.view.accessibility.AccessibilityManager.AccessibilityServicesStateChangeListener, android.os.Handler):
+
+
+
+ServiceName: android.Manifest.permission#BIND_CELL_BROADCAST_SERVICE:
+
+ServiceName: android.app.AppOpsManager#OPSTR_BIND_ACCESSIBILITY_SERVICE:
+
+ServiceName: android.provider.Settings.Secure#ACCESSIBILITY_SHORTCUT_TARGET_SERVICE:
+
+ServiceName: android.provider.Settings.Secure#AUTOFILL_SERVICE:
+
+ServiceName: android.provider.Settings.Secure#VOICE_INTERACTION_SERVICE:
+
+
+
+SetterReturnsThis: android.media.audiopolicy.AudioPolicy.Builder#setAudioPolicyFocusListener(android.media.audiopolicy.AudioPolicy.AudioPolicyFocusListener):
+
+SetterReturnsThis: android.media.audiopolicy.AudioPolicy.Builder#setAudioPolicyStatusListener(android.media.audiopolicy.AudioPolicy.AudioPolicyStatusListener):
+
+
+
+StaticUtils: android.os.health.HealthKeys:
+
+StaticUtils: android.service.autofill.InternalTransformation:
+
+StaticUtils: android.telephony.mbms.vendor.VendorUtils:
+
+StaticUtils: android.util.FeatureFlagUtils:
+
+StaticUtils: android.util.proto.ProtoStream:
+
+
+
+StreamFiles: android.os.Environment#buildPath(java.io.File, java.lang.String...):
+
+StreamFiles: android.os.FileUtils#contains(java.io.File, java.io.File):
+
+StreamFiles: android.provider.MediaStore#scanFile(android.content.Context, java.io.File):
+
+StreamFiles: android.provider.MediaStore#scanFileFromShell(android.content.Context, java.io.File):
+
+StreamFiles: android.provider.MediaStore#scanVolume(android.content.Context, java.io.File):
+
+
+
+UseParcelFileDescriptor: android.util.proto.ProtoOutputStream#ProtoOutputStream(java.io.FileDescriptor) parameter #0:
+
+
+
+UserHandle: android.app.admin.DevicePolicyManager#getOwnerInstalledCaCerts(android.os.UserHandle):
+
+UserHandle: android.app.role.RoleManager#addOnRoleHoldersChangedListenerAsUser(java.util.concurrent.Executor, android.app.role.OnRoleHoldersChangedListener, android.os.UserHandle):
+
+UserHandle: android.app.role.RoleManager#addRoleHolderAsUser(String, String, int, android.os.UserHandle, java.util.concurrent.Executor, java.util.function.Consumer<java.lang.Boolean>):
+
+UserHandle: android.app.role.RoleManager#clearRoleHoldersAsUser(String, int, android.os.UserHandle, java.util.concurrent.Executor, java.util.function.Consumer<java.lang.Boolean>):
+
+UserHandle: android.app.role.RoleManager#getRoleHoldersAsUser(String, android.os.UserHandle):
+
+UserHandle: android.app.role.RoleManager#removeOnRoleHoldersChangedListenerAsUser(android.app.role.OnRoleHoldersChangedListener, android.os.UserHandle):
+
+UserHandle: android.app.role.RoleManager#removeRoleHolderAsUser(String, String, int, android.os.UserHandle, java.util.concurrent.Executor, java.util.function.Consumer<java.lang.Boolean>):
+
+UserHandle: android.content.pm.PackageManager#getInstallReason(String, android.os.UserHandle):
+
+UserHandle: android.content.pm.PackageManager#getPermissionFlags(String, String, android.os.UserHandle):
+
+UserHandle: android.content.pm.PackageManager#grantRuntimePermission(String, String, android.os.UserHandle):
+
+UserHandle: android.content.pm.PackageManager#revokeRuntimePermission(String, String, android.os.UserHandle):
+
+UserHandle: android.content.pm.PackageManager#updatePermissionFlags(String, String, int, int, android.os.UserHandle):
+
+UserHandle: android.location.LocationManager#setLocationEnabledForUser(boolean, android.os.UserHandle):
+
+UserHandle: android.permission.PermissionControllerManager#applyStagedRuntimePermissionBackup(String, android.os.UserHandle, java.util.concurrent.Executor, java.util.function.Consumer<java.lang.Boolean>):
+
+UserHandle: android.permission.PermissionControllerManager#getRuntimePermissionBackup(android.os.UserHandle, java.util.concurrent.Executor, java.util.function.Consumer<byte[]>):
+
+UserHandle: android.permission.PermissionControllerManager#stageAndApplyRuntimePermissionsBackup(byte[], android.os.UserHandle):
+
+
+
+UserHandleName: android.app.ActivityView#startActivity(android.content.Intent, android.os.UserHandle):
+
+UserHandleName: android.content.AutofillOptions:
+
+UserHandleName: android.content.ContentCaptureOptions:
+
+UserHandleName: android.os.IncidentReportArgs:
+
+UserHandleName: android.provider.MediaStore#deleteContributedMedia(android.content.Context, String, android.os.UserHandle):
+
+UserHandleName: android.provider.MediaStore#getContributedMediaSize(android.content.Context, String, android.os.UserHandle):
+
+
+
+VisiblySynchronized: PsiClassObjectAccessExpression:
+
+VisiblySynchronized: PsiThisExpression:
+
+VisiblySynchronized: android.app.ActivityManager#addOnUidImportanceListener(android.app.ActivityManager.OnUidImportanceListener, int):
+
+VisiblySynchronized: android.app.ActivityManager#removeOnUidImportanceListener(android.app.ActivityManager.OnUidImportanceListener):
+
+VisiblySynchronized: android.content.ContentProviderClient#setDetectNotResponding(long):
+
+VisiblySynchronized: android.content.res.AssetManager#getApkPaths():
+
+VisiblySynchronized: android.content.res.AssetManager#getLastResourceResolution():
+
+VisiblySynchronized: android.content.res.AssetManager#getOverlayablesToString(String):
+
+VisiblySynchronized: android.content.res.AssetManager#setResourceResolutionLoggingEnabled(boolean):
+
+VisiblySynchronized: android.os.MessageQueue#removeSyncBarrier(int):
+
diff --git a/cmds/incidentd/src/Section.cpp b/cmds/incidentd/src/Section.cpp
index f476fcf91bd5..c9277a57bd07 100644
--- a/cmds/incidentd/src/Section.cpp
+++ b/cmds/incidentd/src/Section.cpp
@@ -476,10 +476,28 @@ status_t DumpsysSection::BlockingCall(int pipeWriteFd) const {
// initialization only once in Section.cpp.
map<log_id_t, log_time> LogSection::gLastLogsRetrieved;
-LogSection::LogSection(int id, log_id_t logID) : WorkerThreadSection(id), mLogID(logID) {
- name = "logcat ";
- name += android_log_id_to_name(logID);
- switch (logID) {
+LogSection::LogSection(int id, const char* logID, ...) : WorkerThreadSection(id), mLogMode(logModeBase) {
+ name = "logcat -b ";
+ name += logID;
+
+ va_list args;
+ va_start(args, logID);
+ mLogID = android_name_to_log_id(logID);
+ while(true) {
+ const char* arg = va_arg(args, const char*);
+ if (arg == NULL) {
+ break;
+ }
+ if (!strcmp(arg, "-L")) {
+ // Read from last logcat buffer
+ mLogMode = mLogMode | ANDROID_LOG_PSTORE;
+ }
+ name += " ";
+ name += arg;
+ }
+ va_end(args);
+
+ switch (mLogID) {
case LOG_ID_EVENTS:
case LOG_ID_STATS:
case LOG_ID_SECURITY:
@@ -512,9 +530,8 @@ status_t LogSection::BlockingCall(int pipeWriteFd) const {
// Open log buffer and getting logs since last retrieved time if any.
unique_ptr<logger_list, void (*)(logger_list*)> loggers(
gLastLogsRetrieved.find(mLogID) == gLastLogsRetrieved.end()
- ? android_logger_list_alloc(ANDROID_LOG_RDONLY | ANDROID_LOG_NONBLOCK, 0, 0)
- : android_logger_list_alloc_time(ANDROID_LOG_RDONLY | ANDROID_LOG_NONBLOCK,
- gLastLogsRetrieved[mLogID], 0),
+ ? android_logger_list_alloc(mLogMode, 0, 0)
+ : android_logger_list_alloc_time(mLogMode, gLastLogsRetrieved[mLogID], 0),
android_logger_list_free);
if (android_logger_open(loggers.get(), mLogID) == NULL) {
diff --git a/cmds/incidentd/src/Section.h b/cmds/incidentd/src/Section.h
index c9b80563a609..fcf12f7336fd 100644
--- a/cmds/incidentd/src/Section.h
+++ b/cmds/incidentd/src/Section.h
@@ -146,8 +146,11 @@ class LogSection : public WorkerThreadSection {
// global last log retrieved timestamp for each log_id_t.
static map<log_id_t, log_time> gLastLogsRetrieved;
+ // log mode: read only & non blocking.
+ const static int logModeBase = ANDROID_LOG_RDONLY | ANDROID_LOG_NONBLOCK;
+
public:
- LogSection(int id, log_id_t logID);
+ LogSection(int id, const char* logID, ...);
virtual ~LogSection();
virtual status_t BlockingCall(int pipeWriteFd) const;
@@ -155,6 +158,7 @@ public:
private:
log_id_t mLogID;
bool mBinary;
+ int mLogMode;
};
/**
diff --git a/cmds/statsd/src/StatsLogProcessor.h b/cmds/statsd/src/StatsLogProcessor.h
index 68b12189aa0e..17f27708bf5b 100644
--- a/cmds/statsd/src/StatsLogProcessor.h
+++ b/cmds/statsd/src/StatsLogProcessor.h
@@ -128,13 +128,13 @@ private:
std::unordered_map<ConfigKey, sp<MetricsManager>> mMetricsManagers;
- std::unordered_map<ConfigKey, long> mLastBroadcastTimes;
+ std::unordered_map<ConfigKey, int64_t> mLastBroadcastTimes;
// Last time we sent a broadcast to this uid that the active configs had changed.
- std::unordered_map<int, long> mLastActivationBroadcastTimes;
+ std::unordered_map<int, int64_t> mLastActivationBroadcastTimes;
// Tracks when we last checked the bytes consumed for each config key.
- std::unordered_map<ConfigKey, long> mLastByteSizeTimes;
+ std::unordered_map<ConfigKey, int64_t> mLastByteSizeTimes;
// Tracks which config keys has metric reports on disk
std::set<ConfigKey> mOnDiskDataConfigs;
@@ -206,7 +206,7 @@ private:
int64_t mLastTimestampSeen = 0;
- long mLastPullerCacheClearTimeSec = 0;
+ int64_t mLastPullerCacheClearTimeSec = 0;
// Last time we wrote data to disk.
int64_t mLastWriteTimeNs = 0;
diff --git a/cmds/statsd/src/metrics/ValueMetricProducer.cpp b/cmds/statsd/src/metrics/ValueMetricProducer.cpp
index 6fd03273a434..0ee156b07c55 100644
--- a/cmds/statsd/src/metrics/ValueMetricProducer.cpp
+++ b/cmds/statsd/src/metrics/ValueMetricProducer.cpp
@@ -650,6 +650,7 @@ bool getDoubleOrLong(const LogEvent& event, const Matcher& matcher, Value& ret)
ret.setDouble(value.mValue.double_value);
break;
default:
+ return false;
break;
}
return true;
diff --git a/config/preloaded-classes b/config/preloaded-classes
index 8d911443ce06..1b9898a3cd68 100644
--- a/config/preloaded-classes
+++ b/config/preloaded-classes
@@ -200,7 +200,6 @@ android.app.ContentProviderHolder
android.app.ContextImpl$1
android.app.ContextImpl$ApplicationContentResolver
android.app.ContextImpl
-android.app.DeviceIdleFrameworkInitializer
android.app.DexLoadReporter
android.app.Dialog$ListenersHandler
android.app.Dialog
diff --git a/config/preloaded-classes-extra b/config/preloaded-classes-extra
index 4bfa873f63f2..09f393ad4844 100644
--- a/config/preloaded-classes-extra
+++ b/config/preloaded-classes-extra
@@ -1,7 +1,3 @@
-# JobSchedulerFrameworkInitializer must always be preloaded because it registers the job scheduler
-# service wrapper to SystemServiceRegistry.
-android.app.DeviceIdleFrameworkInitializer
-android.app.job.JobSchedulerFrameworkInitializer
android.icu.impl.coll.CollationRoot
android.icu.impl.IDNA2003
android.icu.impl.number.Parse
diff --git a/core/java/android/app/ActivityManager.java b/core/java/android/app/ActivityManager.java
index 7f597fef807a..1e78fc143888 100644
--- a/core/java/android/app/ActivityManager.java
+++ b/core/java/android/app/ActivityManager.java
@@ -163,7 +163,7 @@ public class ActivityManager {
}
@Override
- public void onUidStateChanged(int uid, int procState, long procStateSeq) {
+ public void onUidStateChanged(int uid, int procState, long procStateSeq, int capability) {
mListener.onUidImportance(uid, RunningAppProcessInfo.procStateToImportanceForClient(
procState, mContext));
}
@@ -432,7 +432,6 @@ public class ActivityManager {
public static final int USER_OP_ERROR_RELATED_USERS_CANNOT_STOP = -4;
/**
- * @hide
* Process states, describing the kind of state a particular process is in.
* When updating these, make sure to also check all related references to the
* constant in code, and update these arrays:
@@ -443,7 +442,34 @@ public class ActivityManager {
* @see com.android.server.am.ProcessList#sSameAwakePssTimes
* @see com.android.server.am.ProcessList#sTestFirstPssTimes
* @see com.android.server.am.ProcessList#sTestSamePssTimes
+ * @hide
*/
+ @IntDef(flag = false, prefix = { "PROCESS_STATE_" }, value = {
+ PROCESS_STATE_UNKNOWN, // -1
+ PROCESS_STATE_PERSISTENT, // 0
+ PROCESS_STATE_PERSISTENT_UI,
+ PROCESS_STATE_TOP,
+ PROCESS_STATE_BOUND_TOP,
+ PROCESS_STATE_FOREGROUND_SERVICE,
+ PROCESS_STATE_BOUND_FOREGROUND_SERVICE,
+ PROCESS_STATE_IMPORTANT_FOREGROUND,
+ PROCESS_STATE_IMPORTANT_BACKGROUND,
+ PROCESS_STATE_TRANSIENT_BACKGROUND,
+ PROCESS_STATE_BACKUP,
+ PROCESS_STATE_SERVICE,
+ PROCESS_STATE_RECEIVER,
+ PROCESS_STATE_TOP_SLEEPING,
+ PROCESS_STATE_HEAVY_WEIGHT,
+ PROCESS_STATE_HOME,
+ PROCESS_STATE_LAST_ACTIVITY,
+ PROCESS_STATE_CACHED_ACTIVITY,
+ PROCESS_STATE_CACHED_ACTIVITY_CLIENT,
+ PROCESS_STATE_CACHED_RECENT,
+ PROCESS_STATE_CACHED_EMPTY,
+ })
+ @Retention(RetentionPolicy.SOURCE)
+ public @interface ProcessState {}
+
/** @hide Not a real process state. */
public static final int PROCESS_STATE_UNKNOWN = -1;
@@ -459,78 +485,98 @@ public class ActivityManager {
@UnsupportedAppUsage
public static final int PROCESS_STATE_TOP = 2;
- /** @hide Process is hosting a foreground service with location type. */
- public static final int PROCESS_STATE_FOREGROUND_SERVICE_LOCATION = 3;
-
/** @hide Process is bound to a TOP app. This is ranked below SERVICE_LOCATION so that
* it doesn't get the capability of location access while-in-use. */
- public static final int PROCESS_STATE_BOUND_TOP = 4;
+ public static final int PROCESS_STATE_BOUND_TOP = 3;
/** @hide Process is hosting a foreground service. */
@UnsupportedAppUsage
- public static final int PROCESS_STATE_FOREGROUND_SERVICE = 5;
+ public static final int PROCESS_STATE_FOREGROUND_SERVICE = 4;
/** @hide Process is hosting a foreground service due to a system binding. */
@UnsupportedAppUsage
- public static final int PROCESS_STATE_BOUND_FOREGROUND_SERVICE = 6;
+ public static final int PROCESS_STATE_BOUND_FOREGROUND_SERVICE = 5;
/** @hide Process is important to the user, and something they are aware of. */
- public static final int PROCESS_STATE_IMPORTANT_FOREGROUND = 7;
+ public static final int PROCESS_STATE_IMPORTANT_FOREGROUND = 6;
/** @hide Process is important to the user, but not something they are aware of. */
@UnsupportedAppUsage
- public static final int PROCESS_STATE_IMPORTANT_BACKGROUND = 8;
+ public static final int PROCESS_STATE_IMPORTANT_BACKGROUND = 7;
/** @hide Process is in the background transient so we will try to keep running. */
- public static final int PROCESS_STATE_TRANSIENT_BACKGROUND = 9;
+ public static final int PROCESS_STATE_TRANSIENT_BACKGROUND = 8;
/** @hide Process is in the background running a backup/restore operation. */
- public static final int PROCESS_STATE_BACKUP = 10;
+ public static final int PROCESS_STATE_BACKUP = 9;
/** @hide Process is in the background running a service. Unlike oom_adj, this level
* is used for both the normal running in background state and the executing
* operations state. */
@UnsupportedAppUsage
- public static final int PROCESS_STATE_SERVICE = 11;
+ public static final int PROCESS_STATE_SERVICE = 10;
/** @hide Process is in the background running a receiver. Note that from the
* perspective of oom_adj, receivers run at a higher foreground level, but for our
* prioritization here that is not necessary and putting them below services means
* many fewer changes in some process states as they receive broadcasts. */
@UnsupportedAppUsage
- public static final int PROCESS_STATE_RECEIVER = 12;
+ public static final int PROCESS_STATE_RECEIVER = 11;
/** @hide Same as {@link #PROCESS_STATE_TOP} but while device is sleeping. */
- public static final int PROCESS_STATE_TOP_SLEEPING = 13;
+ public static final int PROCESS_STATE_TOP_SLEEPING = 12;
/** @hide Process is in the background, but it can't restore its state so we want
* to try to avoid killing it. */
- public static final int PROCESS_STATE_HEAVY_WEIGHT = 14;
+ public static final int PROCESS_STATE_HEAVY_WEIGHT = 13;
/** @hide Process is in the background but hosts the home activity. */
@UnsupportedAppUsage
- public static final int PROCESS_STATE_HOME = 15;
+ public static final int PROCESS_STATE_HOME = 14;
/** @hide Process is in the background but hosts the last shown activity. */
- public static final int PROCESS_STATE_LAST_ACTIVITY = 16;
+ public static final int PROCESS_STATE_LAST_ACTIVITY = 15;
/** @hide Process is being cached for later use and contains activities. */
@UnsupportedAppUsage
- public static final int PROCESS_STATE_CACHED_ACTIVITY = 17;
+ public static final int PROCESS_STATE_CACHED_ACTIVITY = 16;
/** @hide Process is being cached for later use and is a client of another cached
* process that contains activities. */
- public static final int PROCESS_STATE_CACHED_ACTIVITY_CLIENT = 18;
+ public static final int PROCESS_STATE_CACHED_ACTIVITY_CLIENT = 17;
/** @hide Process is being cached for later use and has an activity that corresponds
* to an existing recent task. */
- public static final int PROCESS_STATE_CACHED_RECENT = 19;
+ public static final int PROCESS_STATE_CACHED_RECENT = 18;
/** @hide Process is being cached for later use and is empty. */
- public static final int PROCESS_STATE_CACHED_EMPTY = 20;
+ public static final int PROCESS_STATE_CACHED_EMPTY = 19;
/** @hide Process does not exist. */
- public static final int PROCESS_STATE_NONEXISTENT = 21;
+ public static final int PROCESS_STATE_NONEXISTENT = 20;
+
+ /**
+ * The set of flags for process capability.
+ * @hide
+ */
+ @IntDef(flag = true, prefix = { "PROCESS_CAPABILITY_" }, value = {
+ PROCESS_CAPABILITY_NONE,
+ PROCESS_CAPABILITY_FOREGROUND_LOCATION,
+ })
+ @Retention(RetentionPolicy.SOURCE)
+ public @interface ProcessCapability {}
+
+ /** @hide Process does not have any capability */
+ @TestApi
+ public static final int PROCESS_CAPABILITY_NONE = 0;
+
+ /** @hide Process can access location while in foreground */
+ @TestApi
+ public static final int PROCESS_CAPABILITY_FOREGROUND_LOCATION = 1 << 0;
+
+ /** @hide all capabilities, the ORing of all flags in {@link ProcessCapability}*/
+ @TestApi
+ public static final int PROCESS_CAPABILITY_ALL = PROCESS_CAPABILITY_FOREGROUND_LOCATION;
// NOTE: If PROCESS_STATEs are added, then new fields must be added
// to frameworks/base/core/proto/android/app/enums.proto and the following method must
@@ -557,7 +603,6 @@ public class ActivityManager {
return AppProtoEnums.PROCESS_STATE_TOP;
case PROCESS_STATE_BOUND_TOP:
return AppProtoEnums.PROCESS_STATE_BOUND_TOP;
- case PROCESS_STATE_FOREGROUND_SERVICE_LOCATION:
case PROCESS_STATE_FOREGROUND_SERVICE:
return AppProtoEnums.PROCESS_STATE_FOREGROUND_SERVICE;
case PROCESS_STATE_BOUND_FOREGROUND_SERVICE:
@@ -612,8 +657,7 @@ public class ActivityManager {
/** @hide Is this a foreground service type? */
public static boolean isForegroundService(int procState) {
- return procState == PROCESS_STATE_FOREGROUND_SERVICE_LOCATION
- || procState == PROCESS_STATE_FOREGROUND_SERVICE;
+ return procState == PROCESS_STATE_FOREGROUND_SERVICE;
}
/** @hide requestType for assist context: only basic information. */
@@ -2930,7 +2974,7 @@ public class ActivityManager {
return IMPORTANCE_PERCEPTIBLE;
} else if (procState >= PROCESS_STATE_IMPORTANT_FOREGROUND) {
return IMPORTANCE_VISIBLE;
- } else if (procState >= PROCESS_STATE_FOREGROUND_SERVICE_LOCATION) {
+ } else if (procState >= PROCESS_STATE_FOREGROUND_SERVICE) {
return IMPORTANCE_FOREGROUND_SERVICE;
} else {
return IMPORTANCE_FOREGROUND;
@@ -4087,7 +4131,7 @@ public class ActivityManager {
* Action an app can implement to handle reports from {@link #setWatchHeapLimit(long)}.
* If your package has an activity handling this action, it will be launched with the
* heap data provided to it the same way as {@link Intent#ACTION_SEND}. Note that to
- * match the activty must support this action and a MIME type of "*&#47;*".
+ * match, the activity must support this action and a MIME type of "*&#47;*".
*/
public static final String ACTION_REPORT_HEAP_LIMIT = "android.app.action.REPORT_HEAP_LIMIT";
diff --git a/core/java/android/app/AppOpsManager.java b/core/java/android/app/AppOpsManager.java
index 8bca87e69ecc..765c358748a3 100644
--- a/core/java/android/app/AppOpsManager.java
+++ b/core/java/android/app/AppOpsManager.java
@@ -282,10 +282,14 @@ public class AppOpsManager {
/**
* Uid state: The UID is running a foreground service of location type.
* The lower the UID state the more important the UID is for the user.
+ * This uid state is a counterpart to PROCESS_STATE_FOREGROUND_SERVICE_LOCATION which has been
+ * deprecated.
* @hide
+ * @deprecated
*/
@TestApi
@SystemApi
+ @Deprecated
public static final int UID_STATE_FOREGROUND_SERVICE_LOCATION = 300;
/**
@@ -298,13 +302,6 @@ public class AppOpsManager {
public static final int UID_STATE_FOREGROUND_SERVICE = 400;
/**
- * The max, which is min priority, UID state for which any app op
- * would be considered as performed in the foreground.
- * @hide
- */
- public static final int UID_STATE_MAX_LAST_NON_RESTRICTED = UID_STATE_FOREGROUND_SERVICE;
-
- /**
* Uid state: The UID is a foreground app. The lower the UID
* state the more important the UID is for the user.
* @hide
@@ -314,6 +311,13 @@ public class AppOpsManager {
public static final int UID_STATE_FOREGROUND = 500;
/**
+ * The max, which is min priority, UID state for which any app op
+ * would be considered as performed in the foreground.
+ * @hide
+ */
+ public static final int UID_STATE_MAX_LAST_NON_RESTRICTED = UID_STATE_FOREGROUND;
+
+ /**
* Uid state: The UID is a background app. The lower the UID
* state the more important the UID is for the user.
* @hide
@@ -344,47 +348,25 @@ public class AppOpsManager {
public static final int MIN_PRIORITY_UID_STATE = UID_STATE_CACHED;
/**
- * Resolves the first unrestricted state given an app op. Location is
- * special as we want to allow its access only if a dedicated location
- * foreground service is running. For other ops we consider any foreground
- * service as a foreground state.
- *
+ * Resolves the first unrestricted state given an app op.
* @param op The op to resolve.
* @return The last restricted UID state.
*
* @hide
*/
public static int resolveFirstUnrestrictedUidState(int op) {
- switch (op) {
- case OP_FINE_LOCATION:
- case OP_COARSE_LOCATION:
- case OP_MONITOR_LOCATION:
- case OP_MONITOR_HIGH_POWER_LOCATION: {
- return UID_STATE_FOREGROUND_SERVICE_LOCATION;
- }
- }
- return UID_STATE_FOREGROUND_SERVICE;
+ return UID_STATE_FOREGROUND;
}
/**
- * Resolves the last restricted state given an app op. Location is
- * special as we want to allow its access only if a dedicated location
- * foreground service is running. For other ops we consider any foreground
- * service as a foreground state.
- *
+ * Resolves the last restricted state given an app op.
* @param op The op to resolve.
* @return The last restricted UID state.
*
* @hide
*/
public static int resolveLastRestrictedUidState(int op) {
- switch (op) {
- case OP_FINE_LOCATION:
- case OP_COARSE_LOCATION: {
- return UID_STATE_FOREGROUND_SERVICE;
- }
- }
- return UID_STATE_FOREGROUND;
+ return UID_STATE_BACKGROUND;
}
/** @hide Note: Keep these sorted */
@@ -4603,7 +4585,6 @@ public class AppOpsManager {
*
* @param fromUidState The UID state from which to query. Could be one of
* {@link #UID_STATE_PERSISTENT}, {@link #UID_STATE_TOP},
- * {@link #UID_STATE_FOREGROUND_SERVICE_LOCATION},
* {@link #UID_STATE_FOREGROUND_SERVICE}, {@link #UID_STATE_FOREGROUND},
* {@link #UID_STATE_BACKGROUND}, {@link #UID_STATE_CACHED}.
* @param toUidState The UID state to which to query.
@@ -4664,7 +4645,6 @@ public class AppOpsManager {
*
* @param fromUidState The UID state from which to query. Could be one of
* {@link #UID_STATE_PERSISTENT}, {@link #UID_STATE_TOP},
- * {@link #UID_STATE_FOREGROUND_SERVICE_LOCATION},
* {@link #UID_STATE_FOREGROUND_SERVICE}, {@link #UID_STATE_FOREGROUND},
* {@link #UID_STATE_BACKGROUND}, {@link #UID_STATE_CACHED}.
* @param toUidState The UID state to which to query.
@@ -4728,7 +4708,6 @@ public class AppOpsManager {
*
* @param fromUidState The UID state from which to query. Could be one of
* {@link #UID_STATE_PERSISTENT}, {@link #UID_STATE_TOP},
- * {@link #UID_STATE_FOREGROUND_SERVICE_LOCATION},
* {@link #UID_STATE_FOREGROUND_SERVICE}, {@link #UID_STATE_FOREGROUND},
* {@link #UID_STATE_BACKGROUND}, {@link #UID_STATE_CACHED}.
* @param toUidState The UID state from which to query.
diff --git a/core/java/android/app/ContextImpl.java b/core/java/android/app/ContextImpl.java
index eb2b2bca8ca9..466c1a966857 100644
--- a/core/java/android/app/ContextImpl.java
+++ b/core/java/android/app/ContextImpl.java
@@ -73,6 +73,7 @@ import android.system.ErrnoException;
import android.system.Os;
import android.system.OsConstants;
import android.system.StructStat;
+import android.text.TextUtils;
import android.util.AndroidRuntimeException;
import android.util.ArrayMap;
import android.util.Log;
@@ -1341,6 +1342,19 @@ class ContextImpl extends Context {
}
@Override
+ public void sendOrderedBroadcast(Intent intent, String receiverPermission,
+ String receiverAppOp, BroadcastReceiver resultReceiver, Handler scheduler,
+ int initialCode, String initialData, @Nullable Bundle initialExtras) {
+ int intAppOp = AppOpsManager.OP_NONE;
+ if (!TextUtils.isEmpty(receiverAppOp)) {
+ intAppOp = AppOpsManager.strOpToOp(receiverAppOp);
+ }
+ sendOrderedBroadcastAsUser(intent, getUser(),
+ receiverPermission, intAppOp, resultReceiver, scheduler, initialCode, initialData,
+ initialExtras);
+ }
+
+ @Override
@Deprecated
public void sendStickyBroadcast(Intent intent) {
warnIfCallingFromSystemProcess();
diff --git a/core/java/android/app/IActivityTaskManager.aidl b/core/java/android/app/IActivityTaskManager.aidl
index f5914412663b..770e5f7ffe11 100644
--- a/core/java/android/app/IActivityTaskManager.aidl
+++ b/core/java/android/app/IActivityTaskManager.aidl
@@ -70,6 +70,7 @@ import android.service.voice.IVoiceInteractionSession;
import android.view.IRecentsAnimationRunner;
import android.view.RemoteAnimationDefinition;
import android.view.RemoteAnimationAdapter;
+import android.view.WindowContainerTransaction;
import com.android.internal.app.IVoiceInteractor;
import com.android.internal.os.IResultReceiver;
import com.android.internal.policy.IKeyguardDismissCallback;
@@ -220,6 +221,7 @@ interface IActivityTaskManager {
void setTaskResizeable(int taskId, int resizeableMode);
void toggleFreeformWindowingMode(in IBinder token);
void resizeTask(int taskId, in Rect bounds, int resizeMode);
+ void applyContainerTransaction(in WindowContainerTransaction t);
void moveStackToDisplay(int stackId, int displayId);
void removeStack(int stackId);
diff --git a/core/java/android/app/IUidObserver.aidl b/core/java/android/app/IUidObserver.aidl
index e116d989ca75..7713e25d5ecd 100644
--- a/core/java/android/app/IUidObserver.aidl
+++ b/core/java/android/app/IUidObserver.aidl
@@ -50,8 +50,9 @@ oneway interface IUidObserver {
* @param procState The updated process state for the uid.
* @param procStateSeq The sequence no. associated with process state change of the uid,
* see UidRecord.procStateSeq for details.
+ * @param capability the updated process capability for the uid.
*/
- void onUidStateChanged(int uid, int procState, long procStateSeq);
+ void onUidStateChanged(int uid, int procState, long procStateSeq, int capability);
// =============== End of transactions used on native side as well ============================
diff --git a/core/java/android/app/PendingIntent.java b/core/java/android/app/PendingIntent.java
index 4b4a071ecf72..3ad88829b812 100644
--- a/core/java/android/app/PendingIntent.java
+++ b/core/java/android/app/PendingIntent.java
@@ -94,6 +94,12 @@ import java.lang.annotation.RetentionPolicy;
* {@link #FLAG_CANCEL_CURRENT} or {@link #FLAG_UPDATE_CURRENT} to either
* cancel or modify whatever current PendingIntent is associated with the
* Intent you are supplying.
+ *
+ * <p>Also note that flags like {@link #FLAG_ONE_SHOT} or {@link #FLAG_IMMUTABLE} describe the
+ * PendingIntent instance and thus, are used to identify it. Any calls to retrieve or modify a
+ * PendingIntent created with these flags will also require these flags to be supplied in
+ * conjunction with others. E.g. To retrieve an existing PendingIntent created with
+ * FLAG_ONE_SHOT, <b>both</b> FLAG_ONE_SHOT and FLAG_NO_CREATE need to be supplied.
*/
public final class PendingIntent implements Parcelable {
private final IIntentSender mTarget;
diff --git a/core/java/android/app/SystemServiceRegistry.java b/core/java/android/app/SystemServiceRegistry.java
index 6a13499f0444..629c2bb19a7c 100644
--- a/core/java/android/app/SystemServiceRegistry.java
+++ b/core/java/android/app/SystemServiceRegistry.java
@@ -23,6 +23,7 @@ import android.app.admin.DevicePolicyManager;
import android.app.admin.IDevicePolicyManager;
import android.app.contentsuggestions.ContentSuggestionsManager;
import android.app.contentsuggestions.IContentSuggestionsManager;
+import android.app.job.JobSchedulerFrameworkInitializer;
import android.app.prediction.AppPredictionManager;
import android.app.role.RoleControllerManager;
import android.app.role.RoleManager;
@@ -153,7 +154,6 @@ import android.os.health.SystemHealthManager;
import android.os.image.DynamicSystemManager;
import android.os.image.IDynamicSystemService;
import android.os.storage.StorageManager;
-import android.telephony.TelephonyRegistryManager;
import android.permission.PermissionControllerManager;
import android.permission.PermissionManager;
import android.print.IPrintManager;
@@ -167,6 +167,7 @@ import android.telecom.TelecomManager;
import android.telephony.CarrierConfigManager;
import android.telephony.SubscriptionManager;
import android.telephony.TelephonyManager;
+import android.telephony.TelephonyRegistryManager;
import android.telephony.euicc.EuiccCardManager;
import android.telephony.euicc.EuiccManager;
import android.telephony.ims.RcsMessageManager;
@@ -1298,6 +1299,9 @@ public final class SystemServiceRegistry {
IBatteryStats.Stub.asInterface(b));
}});
//CHECKSTYLE:ON IndentationCheck
+
+ JobSchedulerFrameworkInitializer.initialize();
+ DeviceIdleFrameworkInitializer.initialize();
}
/**
diff --git a/core/java/android/app/WindowConfiguration.java b/core/java/android/app/WindowConfiguration.java
index c40031631a74..f4c6b50da714 100644
--- a/core/java/android/app/WindowConfiguration.java
+++ b/core/java/android/app/WindowConfiguration.java
@@ -440,6 +440,34 @@ public class WindowConfiguration implements Parcelable, Comparable<WindowConfigu
}
/**
+ * Copies the fields specified by mask from delta into this Configuration object.
+ * @hide
+ */
+ public void setTo(@NonNull WindowConfiguration delta, @WindowConfig int mask) {
+ if ((mask & WINDOW_CONFIG_BOUNDS) != 0) {
+ setBounds(delta.mBounds);
+ }
+ if ((mask & WINDOW_CONFIG_APP_BOUNDS) != 0) {
+ setAppBounds(delta.mAppBounds);
+ }
+ if ((mask & WINDOW_CONFIG_WINDOWING_MODE) != 0) {
+ setWindowingMode(delta.mWindowingMode);
+ }
+ if ((mask & WINDOW_CONFIG_ACTIVITY_TYPE) != 0) {
+ setActivityType(delta.mActivityType);
+ }
+ if ((mask & WINDOW_CONFIG_ALWAYS_ON_TOP) != 0) {
+ setAlwaysOnTop(delta.mAlwaysOnTop);
+ }
+ if ((mask & WINDOW_CONFIG_ROTATION) != 0) {
+ setRotation(delta.mRotation);
+ }
+ if ((mask & WINDOW_CONFIG_DISPLAY_WINDOWING_MODE) != 0) {
+ setDisplayWindowingMode(delta.mDisplayWindowingMode);
+ }
+ }
+
+ /**
* Return a bit mask of the differences between this Configuration object and the given one.
* Does not change the values of either. Any undefined fields in <var>other</var> are ignored.
* @param other The configuration to diff against.
diff --git a/core/java/android/content/Context.java b/core/java/android/content/Context.java
index fd061d0406d6..862ec5098d9a 100644
--- a/core/java/android/content/Context.java
+++ b/core/java/android/content/Context.java
@@ -2417,6 +2417,44 @@ public abstract class Context {
@Nullable String initialData, @Nullable Bundle initialExtras);
/**
+ * Version of
+ * {@link #sendOrderedBroadcast(Intent, String, BroadcastReceiver, Handler, int, String,
+ * Bundle)} that allows you to specify the App Op to enforce restrictions on which receivers
+ * the broadcast will be sent to.
+ *
+ * <p>See {@link BroadcastReceiver} for more information on Intent broadcasts.
+ *
+ * @param intent The Intent to broadcast; all receivers matching this
+ * Intent will receive the broadcast.
+ * @param receiverPermission String naming a permissions that
+ * a receiver must hold in order to receive your broadcast.
+ * If null, no permission is required.
+ * @param receiverAppOp The app op associated with the broadcast. If null, no appOp is
+ * required. If both receiverAppOp and receiverPermission are non-null,
+ * a receiver must have both of them to
+ * receive the broadcast
+ * @param resultReceiver Your own BroadcastReceiver to treat as the final
+ * receiver of the broadcast.
+ * @param scheduler A custom Handler with which to schedule the
+ * resultReceiver callback; if null it will be
+ * scheduled in the Context's main thread.
+ * @param initialCode An initial value for the result code. Often
+ * Activity.RESULT_OK.
+ * @param initialData An initial value for the result data. Often
+ * null.
+ * @param initialExtras An initial value for the result extras. Often
+ * null.
+ *
+ * @see #sendOrderedBroadcast(Intent, String, BroadcastReceiver, Handler, int, String, Bundle)
+ */
+ public void sendOrderedBroadcast(@RequiresPermission @NonNull Intent intent,
+ @Nullable String receiverPermission, @Nullable String receiverAppOp,
+ @Nullable BroadcastReceiver resultReceiver, @Nullable Handler scheduler,
+ int initialCode, @Nullable String initialData, @Nullable Bundle initialExtras) {
+ throw new RuntimeException("Not implemented. Must override in a subclass.");
+ }
+
+ /**
* <p>Perform a {@link #sendBroadcast(Intent)} that is "sticky," meaning the
* Intent you are sending stays around after the broadcast is complete,
* so that others can quickly retrieve that data through the return
diff --git a/core/java/android/content/ContextWrapper.java b/core/java/android/content/ContextWrapper.java
index d5d0dcea9438..617401826750 100644
--- a/core/java/android/content/ContextWrapper.java
+++ b/core/java/android/content/ContextWrapper.java
@@ -16,7 +16,9 @@
package android.content;
+import android.annotation.NonNull;
import android.annotation.Nullable;
+import android.annotation.RequiresPermission;
import android.annotation.SystemApi;
import android.annotation.TestApi;
import android.annotation.UnsupportedAppUsage;
@@ -62,12 +64,12 @@ public class ContextWrapper extends Context {
public ContextWrapper(Context base) {
mBase = base;
}
-
+
/**
* Set the base context for this ContextWrapper. All calls will then be
* delegated to the base context. Throws
* IllegalStateException if a base context has already been set.
- *
+ *
* @param base The new base context for this wrapper.
*/
protected void attachBaseContext(Context base) {
@@ -118,7 +120,7 @@ public class ContextWrapper extends Context {
public Context getApplicationContext() {
return mBase.getApplicationContext();
}
-
+
@Override
public void setTheme(int resid) {
mBase.setTheme(resid);
@@ -169,7 +171,7 @@ public class ContextWrapper extends Context {
public ApplicationInfo getApplicationInfo() {
return mBase.getApplicationInfo();
}
-
+
@Override
public String getPackageResourcePath() {
return mBase.getPackageResourcePath();
@@ -209,13 +211,13 @@ public class ContextWrapper extends Context {
@Override
public FileInputStream openFileInput(String name)
- throws FileNotFoundException {
+ throws FileNotFoundException {
return mBase.openFileInput(name);
}
@Override
public FileOutputStream openFileOutput(String name, int mode)
- throws FileNotFoundException {
+ throws FileNotFoundException {
return mBase.openFileOutput(name, mode);
}
@@ -449,7 +451,7 @@ public class ContextWrapper extends Context {
mBase.startIntentSender(intent, fillInIntent, flagsMask,
flagsValues, extraFlags, options);
}
-
+
@Override
public void sendBroadcast(Intent intent) {
mBase.sendBroadcast(intent);
@@ -494,9 +496,9 @@ public class ContextWrapper extends Context {
@Override
public void sendOrderedBroadcast(
- Intent intent, String receiverPermission, BroadcastReceiver resultReceiver,
- Handler scheduler, int initialCode, String initialData,
- Bundle initialExtras) {
+ Intent intent, String receiverPermission, BroadcastReceiver resultReceiver,
+ Handler scheduler, int initialCode, String initialData,
+ Bundle initialExtras) {
mBase.sendOrderedBroadcast(intent, receiverPermission,
resultReceiver, scheduler, initialCode,
initialData, initialExtras);
@@ -506,7 +508,8 @@ public class ContextWrapper extends Context {
@SystemApi
@Override
public void sendOrderedBroadcast(
- Intent intent, String receiverPermission, Bundle options, BroadcastReceiver resultReceiver,
+ Intent intent, String receiverPermission, Bundle options,
+ BroadcastReceiver resultReceiver,
Handler scheduler, int initialCode, String initialData,
Bundle initialExtras) {
mBase.sendOrderedBroadcast(intent, receiverPermission,
@@ -517,9 +520,9 @@ public class ContextWrapper extends Context {
/** @hide */
@Override
public void sendOrderedBroadcast(
- Intent intent, String receiverPermission, int appOp, BroadcastReceiver resultReceiver,
- Handler scheduler, int initialCode, String initialData,
- Bundle initialExtras) {
+ Intent intent, String receiverPermission, int appOp, BroadcastReceiver resultReceiver,
+ Handler scheduler, int initialCode, String initialData,
+ Bundle initialExtras) {
mBase.sendOrderedBroadcast(intent, receiverPermission, appOp,
resultReceiver, scheduler, initialCode,
initialData, initialExtras);
@@ -577,6 +580,15 @@ public class ContextWrapper extends Context {
}
@Override
+ public void sendOrderedBroadcast(@RequiresPermission @NonNull Intent intent,
+ @Nullable String receiverPermission, @Nullable String receiverAppOp,
+ @Nullable BroadcastReceiver resultReceiver, @Nullable Handler scheduler,
+ int initialCode, @Nullable String initialData, @Nullable Bundle initialExtras) {
+ mBase.sendOrderedBroadcast(intent, receiverPermission, receiverAppOp, resultReceiver,
+ scheduler, initialCode, initialData, initialExtras);
+ }
+
+ @Override
@Deprecated
public void sendStickyBroadcast(Intent intent) {
mBase.sendStickyBroadcast(intent);
@@ -928,6 +940,11 @@ public class ContextWrapper extends Context {
}
@Override
+ public @NonNull Context createFeatureContext(@Nullable String featureId) {
+ return mBase.createFeatureContext(featureId);
+ }
+
+ @Override
public boolean isRestricted() {
return mBase.isRestricted();
}
diff --git a/core/java/android/content/PermissionChecker.java b/core/java/android/content/PermissionChecker.java
index 85f96fc61681..6954b312f91c 100644
--- a/core/java/android/content/PermissionChecker.java
+++ b/core/java/android/content/PermissionChecker.java
@@ -114,6 +114,7 @@ public final class PermissionChecker {
* @param uid The uid for which to check.
* @param packageName The package name for which to check. If null the
* the first package for the calling UID will be used.
+ * @param featureId Feature in the package
* @return The permission check result which is either {@link #PERMISSION_GRANTED}
* or {@link #PERMISSION_DENIED} or {@link #PERMISSION_DENIED_APP_OP}.
* @param message A message describing the reason the permission was checked
@@ -123,8 +124,8 @@ public final class PermissionChecker {
@PermissionResult
public static int checkPermissionForDataDelivery(@NonNull Context context,
@NonNull String permission, int pid, int uid, @Nullable String packageName,
- @Nullable String message) {
- return checkPermissionCommon(context, permission, pid, uid, packageName, message,
+ @Nullable String featureId, @Nullable String message) {
+ return checkPermissionCommon(context, permission, pid, uid, packageName, featureId, message,
true /*forDataDelivery*/);
}
@@ -161,8 +162,8 @@ public final class PermissionChecker {
@PermissionResult
public static int checkPermissionForPreflight(@NonNull Context context,
@NonNull String permission, int pid, int uid, @Nullable String packageName) {
- return checkPermissionCommon(context, permission, pid, uid, packageName, null /*message*/,
- false /*forDataDelivery*/);
+ return checkPermissionCommon(context, permission, pid, uid, packageName, null /*featureId*/,
+ null /*message*/, false /*forDataDelivery*/);
}
/**
@@ -197,7 +198,7 @@ public final class PermissionChecker {
public static int checkSelfPermissionForDataDelivery(@NonNull Context context,
@NonNull String permission, @Nullable String message) {
return checkPermissionForDataDelivery(context, permission, Process.myPid(),
- Process.myUid(), context.getPackageName(), message);
+ Process.myUid(), context.getPackageName(), context.getFeatureId(), message);
}
/**
@@ -256,6 +257,7 @@ public final class PermissionChecker {
* @param permission The permission to check.
* @param packageName The package name making the IPC. If null the
* the first package for the calling UID will be used.
+ * @param featureId The feature inside of the app
* @return The permission check result which is either {@link #PERMISSION_GRANTED}
* or {@link #PERMISSION_DENIED} or {@link #PERMISSION_DENIED_APP_OP}.
* @param message A message describing the reason the permission was checked
@@ -264,12 +266,13 @@ public final class PermissionChecker {
*/
@PermissionResult
public static int checkCallingPermissionForDataDelivery(@NonNull Context context,
- @NonNull String permission, @Nullable String packageName, @Nullable String message) {
+ @NonNull String permission, @Nullable String packageName,
+ @Nullable String featureId, @Nullable String message) {
if (Binder.getCallingPid() == Process.myPid()) {
return PERMISSION_DENIED;
}
return checkPermissionForDataDelivery(context, permission, Binder.getCallingPid(),
- Binder.getCallingUid(), packageName, message);
+ Binder.getCallingUid(), packageName, featureId, message);
}
/**
@@ -331,17 +334,20 @@ public final class PermissionChecker {
* @param permission The permission to check.
* @return The permission check result which is either {@link #PERMISSION_GRANTED}
* or {@link #PERMISSION_DENIED} or {@link #PERMISSION_DENIED_APP_OP}.
+ * @param featureId feature Id of caller (if not self)
* @param message A message describing the reason the permission was checked
*
* @see #checkCallingOrSelfPermissionForPreflight(Context, String)
*/
@PermissionResult
public static int checkCallingOrSelfPermissionForDataDelivery(@NonNull Context context,
- @NonNull String permission, @Nullable String message) {
+ @NonNull String permission, @Nullable String featureId, @Nullable String message) {
String packageName = (Binder.getCallingPid() == Process.myPid())
? context.getPackageName() : null;
+ featureId = (Binder.getCallingPid() == Process.myPid())
+ ? context.getFeatureId() : featureId;
return checkPermissionForDataDelivery(context, permission, Binder.getCallingPid(),
- Binder.getCallingUid(), packageName, message);
+ Binder.getCallingUid(), packageName, featureId, message);
}
/**
@@ -360,15 +366,15 @@ public final class PermissionChecker {
* app's fg/gb state) and this check will not leave a trace that permission protected
* data was delivered. When you are about to deliver the location data to a registered
* listener you should use {@link #checkCallingOrSelfPermissionForDataDelivery(Context,
- * String, String)} which will evaluate the permission access based on the current fg/bg state
- * of the app and leave a record that the data was accessed.
+ * String, String, String)} which will evaluate the permission access based on the current
+ * fg/bg state of the app and leave a record that the data was accessed.
*
* @param context Context for accessing resources.
* @param permission The permission to check.
* @return The permission check result which is either {@link #PERMISSION_GRANTED}
* or {@link #PERMISSION_DENIED} or {@link #PERMISSION_DENIED_APP_OP}.
*
- * @see #checkCallingOrSelfPermissionForDataDelivery(Context, String, String)
+ * @see #checkCallingOrSelfPermissionForDataDelivery(Context, String, String, String)
*/
@PermissionResult
public static int checkCallingOrSelfPermissionForPreflight(@NonNull Context context,
@@ -380,8 +386,8 @@ public final class PermissionChecker {
}
private static int checkPermissionCommon(@NonNull Context context, @NonNull String permission,
- int pid, int uid, @Nullable String packageName, @Nullable String message,
- boolean forDataDelivery) {
+ int pid, int uid, @Nullable String packageName, @Nullable String featureId,
+ @Nullable String message, boolean forDataDelivery) {
if (context.checkPermission(permission, pid, uid) == PackageManager.PERMISSION_DENIED) {
return PERMISSION_DENIED;
}
@@ -401,8 +407,7 @@ public final class PermissionChecker {
}
if (forDataDelivery) {
- // TODO moltmann: Set correct feature id
- if (appOpsManager.noteProxyOpNoThrow(op, packageName, uid, null, message)
+ if (appOpsManager.noteProxyOpNoThrow(op, packageName, uid, featureId, message)
!= AppOpsManager.MODE_ALLOWED) {
return PERMISSION_DENIED_APP_OP;
}
diff --git a/core/java/android/content/res/Configuration.java b/core/java/android/content/res/Configuration.java
index 578d08617b5f..053444b28f01 100644
--- a/core/java/android/content/res/Configuration.java
+++ b/core/java/android/content/res/Configuration.java
@@ -1587,6 +1587,80 @@ public final class Configuration implements Parcelable, Comparable<Configuration
}
/**
+ * Copies the fields specified by mask from delta into this Configuration object. This will
+ * copy anything allowed by the mask (including undefined values).
+ * @hide
+ */
+ public void setTo(@NonNull Configuration delta, @Config int mask,
+ @WindowConfiguration.WindowConfig int windowMask) {
+ if ((mask & ActivityInfo.CONFIG_FONT_SCALE) != 0) {
+ fontScale = delta.fontScale;
+ }
+ if ((mask & ActivityInfo.CONFIG_MCC) != 0) {
+ mcc = delta.mcc;
+ }
+ if ((mask & ActivityInfo.CONFIG_MNC) != 0) {
+ mnc = delta.mnc;
+ }
+ if ((mask & ActivityInfo.CONFIG_LOCALE) != 0) {
+ mLocaleList = delta.mLocaleList;
+ if (!mLocaleList.isEmpty()) {
+ locale = (Locale) delta.locale.clone();
+ }
+ }
+ if ((mask & ActivityInfo.CONFIG_LAYOUT_DIRECTION) != 0) {
+ final int deltaScreenLayoutDir = delta.screenLayout & SCREENLAYOUT_LAYOUTDIR_MASK;
+ screenLayout = (screenLayout & ~SCREENLAYOUT_LAYOUTDIR_MASK) | deltaScreenLayoutDir;
+ }
+ if ((mask & ActivityInfo.CONFIG_LOCALE) != 0) {
+ userSetLocale = delta.userSetLocale;
+ }
+ if ((mask & ActivityInfo.CONFIG_TOUCHSCREEN) != 0) {
+ touchscreen = delta.touchscreen;
+ }
+ if ((mask & ActivityInfo.CONFIG_KEYBOARD) != 0) {
+ keyboard = delta.keyboard;
+ }
+ if ((mask & ActivityInfo.CONFIG_KEYBOARD_HIDDEN) != 0) {
+ keyboardHidden = delta.keyboardHidden;
+ hardKeyboardHidden = delta.hardKeyboardHidden;
+ navigationHidden = delta.navigationHidden;
+ }
+ if ((mask & ActivityInfo.CONFIG_NAVIGATION) != 0) {
+ navigation = delta.navigation;
+ }
+ if ((mask & ActivityInfo.CONFIG_ORIENTATION) != 0) {
+ orientation = delta.orientation;
+ }
+ if ((mask & ActivityInfo.CONFIG_SCREEN_LAYOUT) != 0) {
+ // Not enough granularity for each component unfortunately.
+ screenLayout = screenLayout | (delta.screenLayout & ~SCREENLAYOUT_LAYOUTDIR_MASK);
+ }
+ if ((mask & ActivityInfo.CONFIG_COLOR_MODE) != 0) {
+ colorMode = delta.colorMode;
+ }
+ if ((mask & ActivityInfo.CONFIG_UI_MODE) != 0) {
+ uiMode = delta.uiMode;
+ }
+ if ((mask & ActivityInfo.CONFIG_SCREEN_SIZE) != 0) {
+ screenWidthDp = delta.screenWidthDp;
+ screenHeightDp = delta.screenHeightDp;
+ }
+ if ((mask & ActivityInfo.CONFIG_SMALLEST_SCREEN_SIZE) != 0) {
+ smallestScreenWidthDp = delta.smallestScreenWidthDp;
+ }
+ if ((mask & ActivityInfo.CONFIG_DENSITY) != 0) {
+ densityDpi = delta.densityDpi;
+ }
+ if ((mask & ActivityInfo.CONFIG_ASSETS_PATHS) != 0) {
+ assetsSeq = delta.assetsSeq;
+ }
+ if ((mask & ActivityInfo.CONFIG_WINDOW_CONFIGURATION) != 0) {
+ windowConfiguration.setTo(delta.windowConfiguration, windowMask);
+ }
+ }
+
+ /**
* Return a bit mask of the differences between this Configuration
* object and the given one. Does not change the values of either. Any
* undefined fields in <var>delta</var> are ignored.
diff --git a/core/java/android/hardware/camera2/CameraCharacteristics.java b/core/java/android/hardware/camera2/CameraCharacteristics.java
index fbcc78593aa6..1f29d1a22325 100644
--- a/core/java/android/hardware/camera2/CameraCharacteristics.java
+++ b/core/java/android/hardware/camera2/CameraCharacteristics.java
@@ -1125,6 +1125,37 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri
new Key<android.util.Range<Integer>>("android.control.postRawSensitivityBoostRange", new TypeReference<android.util.Range<Integer>>() {{ }});
/**
+ * <p>The list of bokeh modes that are supported by this camera device, and each bokeh mode's
+ * maximum streaming (non-stall) size with bokeh effect.</p>
+ * <p>For OFF mode, the camera behaves normally with no bokeh effect.</p>
+ * <p>For STILL_CAPTURE mode, the maximum streaming dimension specifies the limit under which
+ * bokeh is effective when capture intent is PREVIEW. Note that when capture intent is
+ * PREVIEW, the bokeh effect may not be as high quality compared to STILL_CAPTURE intent
+ * in order to maintain reasonable frame rate. The maximum streaming dimension must be one
+ * of the YUV_420_888 or PRIVATE resolutions in availableStreamConfigurations, or (0, 0)
+ * if preview bokeh is not supported. If the application configures a stream larger than
+ * the maximum streaming dimension, bokeh effect may not be applied for this stream for
+ * PREVIEW intent.</p>
+ * <p>For CONTINUOUS mode, the maximum streaming dimension specifies the limit under which
+ * bokeh is effective. This dimension must be one of the YUV_420_888 or PRIVATE resolutions
+ * in availableStreamConfigurations, and if the sensor maximum resolution is larger than or
+ * equal to 1080p, the maximum streaming dimension must be at least 1080p. If the
+ * application configures a stream with larger dimension, the stream may not have bokeh
+ * effect applied.</p>
+ * <p><b>Units</b>: (mode, width, height)</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>
+ *
+ * @see CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL
+ */
+ @PublicKey
+ @NonNull
+ public static final Key<android.hardware.camera2.params.CapabilityAndMaxSize[]> CONTROL_AVAILABLE_BOKEH_CAPABILITIES =
+ new Key<android.hardware.camera2.params.CapabilityAndMaxSize[]>("android.control.availableBokehCapabilities", android.hardware.camera2.params.CapabilityAndMaxSize[].class);
+
+ /**
* <p>List of edge enhancement modes for {@link CaptureRequest#EDGE_MODE android.edge.mode} that are supported by this camera
* device.</p>
* <p>Full-capability camera devices must always support OFF; camera devices that support
diff --git a/core/java/android/hardware/camera2/CameraMetadata.java b/core/java/android/hardware/camera2/CameraMetadata.java
index 2fa612574810..799c71683d8a 100644
--- a/core/java/android/hardware/camera2/CameraMetadata.java
+++ b/core/java/android/hardware/camera2/CameraMetadata.java
@@ -2444,6 +2444,34 @@ public abstract class CameraMetadata<TKey> {
public static final int CONTROL_VIDEO_STABILIZATION_MODE_ON = 1;
//
+ // Enumeration values for CaptureRequest#CONTROL_BOKEH_MODE
+ //
+
+ /**
+ * <p>Bokeh mode is disabled.</p>
+ * @see CaptureRequest#CONTROL_BOKEH_MODE
+ */
+ public static final int CONTROL_BOKEH_MODE_OFF = 0;
+
+ /**
+ * <p>High quality bokeh mode is enabled for all non-raw streams (including YUV,
+ * JPEG, and IMPLEMENTATION_DEFINED) when capture intent is STILL_CAPTURE. Due to the
+ * extra image processing, this mode may introduce additional stall to non-raw streams.
+ * This mode should be used in high quality still capture use case.</p>
+ * @see CaptureRequest#CONTROL_BOKEH_MODE
+ */
+ public static final int CONTROL_BOKEH_MODE_STILL_CAPTURE = 1;
+
+ /**
+ * <p>Bokeh effect must not slow down capture rate relative to sensor raw output,
+ * and the effect is applied to all processed streams no larger than the maximum
+ * streaming dimension. This mode should be used if performance and power are a
+ * priority, such as video recording.</p>
+ * @see CaptureRequest#CONTROL_BOKEH_MODE
+ */
+ public static final int CONTROL_BOKEH_MODE_CONTINUOUS = 2;
+
+ //
// Enumeration values for CaptureRequest#EDGE_MODE
//
diff --git a/core/java/android/hardware/camera2/CaptureRequest.java b/core/java/android/hardware/camera2/CaptureRequest.java
index 43c197aa737d..5c76dff85a84 100644
--- a/core/java/android/hardware/camera2/CaptureRequest.java
+++ b/core/java/android/hardware/camera2/CaptureRequest.java
@@ -994,7 +994,7 @@ public final class CaptureRequest extends CameraMetadata<CaptureRequest.Key<?>>
* application controls how the color mapping is performed.</p>
* <p>We define the expected processing pipeline below. For consistency
* across devices, this is always the case with TRANSFORM_MATRIX.</p>
- * <p>When either FULL or HIGH_QUALITY is used, the camera device may
+ * <p>When either FAST or HIGH_QUALITY is used, the camera device may
* do additional processing but {@link CaptureRequest#COLOR_CORRECTION_GAINS android.colorCorrection.gains} and
* {@link CaptureRequest#COLOR_CORRECTION_TRANSFORM android.colorCorrection.transform} will still be provided by the
* camera device (in the results) and be roughly correct.</p>
@@ -2094,6 +2094,52 @@ public final class CaptureRequest extends CameraMetadata<CaptureRequest.Key<?>>
new Key<Boolean>("android.control.enableZsl", boolean.class);
/**
+ * <p>Whether bokeh mode is enabled for a particular capture request.</p>
+ * <p>With bokeh mode, the camera device may blur out the parts of scene that are not in
+ * focus, creating a bokeh (or shallow depth of field) effect for people or objects.</p>
+ * <p>When set to STILL_CAPTURE bokeh mode with STILL_CAPTURE capture intent, due to the extra
+ * processing needed for high quality bokeh effect, the stall may be longer than when
+ * capture intent is not STILL_CAPTURE.</p>
+ * <p>When set to STILL_CAPTURE bokeh mode with PREVIEW capture intent,</p>
+ * <ul>
+ * <li>If the camera device has BURST_CAPTURE capability, the frame rate requirement of
+ * BURST_CAPTURE must still be met.</li>
+ * <li>All streams not larger than the maximum streaming dimension for STILL_CAPTURE mode
+ * (queried via {@link android.hardware.camera2.CameraCharacteristics#CONTROL_AVAILABLE_BOKEH_CAPABILITIES })
+ * will have preview bokeh effect applied.</li>
+ * </ul>
+ * <p>When set to CONTINUOUS mode, configured streams dimension should not exceed this mode's
+ * maximum streaming dimension in order to have bokeh effect applied. Bokeh effect may not
+ * be available for streams larger than the maximum streaming dimension.</p>
+ * <p>Switching between different bokeh modes may involve reconfiguration of the camera
+ * pipeline, resulting in long latency. The application should check this key against the
+ * available session keys queried via
+ * {@link android.hardware.camera2.CameraCharacteristics#getAvailableSessionKeys }.</p>
+ * <p>When bokeh mode is on, the camera device may override certain control parameters, such as
+ * reduce frame rate or use face priority scene mode, to achieve best power and quality
+ * tradeoffs. When turned on, AE, AWB, and AF run in auto modes, and only the mandatory
+ * stream combinations of LIMITED hardware level are guaranteed.</p>
+ * <p>For a logical multi-camera, bokeh may be implemented by stereo vision from sub-cameras
+ * with different field of view. As a result, when bokeh mode is enabled, the camera device
+ * may override android.scaler.CropRegion, and the field of view will be smaller than when
+ * bokeh mode is off.</p>
+ * <p><b>Possible values:</b>
+ * <ul>
+ * <li>{@link #CONTROL_BOKEH_MODE_OFF OFF}</li>
+ * <li>{@link #CONTROL_BOKEH_MODE_STILL_CAPTURE STILL_CAPTURE}</li>
+ * <li>{@link #CONTROL_BOKEH_MODE_CONTINUOUS CONTINUOUS}</li>
+ * </ul></p>
+ * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p>
+ * @see #CONTROL_BOKEH_MODE_OFF
+ * @see #CONTROL_BOKEH_MODE_STILL_CAPTURE
+ * @see #CONTROL_BOKEH_MODE_CONTINUOUS
+ */
+ @PublicKey
+ @NonNull
+ public static final Key<Integer> CONTROL_BOKEH_MODE =
+ new Key<Integer>("android.control.bokehMode", int.class);
+
+ /**
* <p>Operation mode for edge
* enhancement.</p>
* <p>Edge enhancement improves sharpness and details in the captured image. OFF means
diff --git a/core/java/android/hardware/camera2/CaptureResult.java b/core/java/android/hardware/camera2/CaptureResult.java
index 1007fd96a0c7..2d0ec6d19286 100644
--- a/core/java/android/hardware/camera2/CaptureResult.java
+++ b/core/java/android/hardware/camera2/CaptureResult.java
@@ -398,7 +398,7 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> {
* application controls how the color mapping is performed.</p>
* <p>We define the expected processing pipeline below. For consistency
* across devices, this is always the case with TRANSFORM_MATRIX.</p>
- * <p>When either FULL or HIGH_QUALITY is used, the camera device may
+ * <p>When either FAST or HIGH_QUALITY is used, the camera device may
* do additional processing but {@link CaptureRequest#COLOR_CORRECTION_GAINS android.colorCorrection.gains} and
* {@link CaptureRequest#COLOR_CORRECTION_TRANSFORM android.colorCorrection.transform} will still be provided by the
* camera device (in the results) and be roughly correct.</p>
@@ -2324,6 +2324,52 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> {
new Key<Integer>("android.control.afSceneChange", int.class);
/**
+ * <p>Whether bokeh mode is enabled for a particular capture request.</p>
+ * <p>With bokeh mode, the camera device may blur out the parts of scene that are not in
+ * focus, creating a bokeh (or shallow depth of field) effect for people or objects.</p>
+ * <p>When set to STILL_CAPTURE bokeh mode with STILL_CAPTURE capture intent, due to the extra
+ * processing needed for high quality bokeh effect, the stall may be longer than when
+ * capture intent is not STILL_CAPTURE.</p>
+ * <p>When set to STILL_CAPTURE bokeh mode with PREVIEW capture intent,</p>
+ * <ul>
+ * <li>If the camera device has BURST_CAPTURE capability, the frame rate requirement of
+ * BURST_CAPTURE must still be met.</li>
+ * <li>All streams not larger than the maximum streaming dimension for STILL_CAPTURE mode
+ * (queried via {@link android.hardware.camera2.CameraCharacteristics#CONTROL_AVAILABLE_BOKEH_CAPABILITIES })
+ * will have preview bokeh effect applied.</li>
+ * </ul>
+ * <p>When set to CONTINUOUS mode, configured streams dimension should not exceed this mode's
+ * maximum streaming dimension in order to have bokeh effect applied. Bokeh effect may not
+ * be available for streams larger than the maximum streaming dimension.</p>
+ * <p>Switching between different bokeh modes may involve reconfiguration of the camera
+ * pipeline, resulting in long latency. The application should check this key against the
+ * available session keys queried via
+ * {@link android.hardware.camera2.CameraCharacteristics#getAvailableSessionKeys }.</p>
+ * <p>When bokeh mode is on, the camera device may override certain control parameters, such as
+ * reduce frame rate or use face priority scene mode, to achieve best power and quality
+ * tradeoffs. When turned on, AE, AWB, and AF run in auto modes, and only the mandatory
+ * stream combinations of LIMITED hardware level are guaranteed.</p>
+ * <p>For a logical multi-camera, bokeh may be implemented by stereo vision from sub-cameras
+ * with different field of view. As a result, when bokeh mode is enabled, the camera device
+ * may override android.scaler.CropRegion, and the field of view will be smaller than when
+ * bokeh mode is off.</p>
+ * <p><b>Possible values:</b>
+ * <ul>
+ * <li>{@link #CONTROL_BOKEH_MODE_OFF OFF}</li>
+ * <li>{@link #CONTROL_BOKEH_MODE_STILL_CAPTURE STILL_CAPTURE}</li>
+ * <li>{@link #CONTROL_BOKEH_MODE_CONTINUOUS CONTINUOUS}</li>
+ * </ul></p>
+ * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p>
+ * @see #CONTROL_BOKEH_MODE_OFF
+ * @see #CONTROL_BOKEH_MODE_STILL_CAPTURE
+ * @see #CONTROL_BOKEH_MODE_CONTINUOUS
+ */
+ @PublicKey
+ @NonNull
+ public static final Key<Integer> CONTROL_BOKEH_MODE =
+ new Key<Integer>("android.control.bokehMode", int.class);
+
+ /**
* <p>Operation mode for edge
* enhancement.</p>
* <p>Edge enhancement improves sharpness and details in the captured image. OFF means
diff --git a/core/java/android/hardware/camera2/impl/CameraMetadataNative.java b/core/java/android/hardware/camera2/impl/CameraMetadataNative.java
index e909c0075f38..7c1ddad5fe12 100644
--- a/core/java/android/hardware/camera2/impl/CameraMetadataNative.java
+++ b/core/java/android/hardware/camera2/impl/CameraMetadataNative.java
@@ -21,6 +21,7 @@ import android.graphics.ImageFormat;
import android.graphics.Point;
import android.graphics.Rect;
import android.hardware.camera2.CameraCharacteristics;
+import android.hardware.camera2.CameraMetadata;
import android.hardware.camera2.CameraDevice;
import android.hardware.camera2.CaptureRequest;
import android.hardware.camera2.CaptureResult;
@@ -29,6 +30,7 @@ import android.hardware.camera2.marshal.MarshalRegistry;
import android.hardware.camera2.marshal.Marshaler;
import android.hardware.camera2.marshal.impl.MarshalQueryableArray;
import android.hardware.camera2.marshal.impl.MarshalQueryableBlackLevelPattern;
+import android.hardware.camera2.marshal.impl.MarshalQueryableCapabilityAndMaxSize;
import android.hardware.camera2.marshal.impl.MarshalQueryableBoolean;
import android.hardware.camera2.marshal.impl.MarshalQueryableColorSpaceTransform;
import android.hardware.camera2.marshal.impl.MarshalQueryableEnum;
@@ -48,6 +50,7 @@ import android.hardware.camera2.marshal.impl.MarshalQueryableSizeF;
import android.hardware.camera2.marshal.impl.MarshalQueryableStreamConfiguration;
import android.hardware.camera2.marshal.impl.MarshalQueryableStreamConfigurationDuration;
import android.hardware.camera2.marshal.impl.MarshalQueryableString;
+import android.hardware.camera2.params.CapabilityAndMaxSize;
import android.hardware.camera2.params.Face;
import android.hardware.camera2.params.HighSpeedVideoConfiguration;
import android.hardware.camera2.params.LensShadingMap;
@@ -671,6 +674,15 @@ public class CameraMetadataNative implements Parcelable {
return (T) metadata.getOisSamples();
}
});
+ sGetCommandMap.put(
+ CameraCharacteristics.CONTROL_AVAILABLE_BOKEH_CAPABILITIES.getNativeKey(),
+ new GetCommand() {
+ @Override
+ @SuppressWarnings("unchecked")
+ public <T> T getValue(CameraMetadataNative metadata, Key<T> key) {
+ return (T) metadata.getBokehCapabilities();
+ }
+ });
}
private int[] getAvailableFormats() {
@@ -1373,6 +1385,24 @@ public class CameraMetadataNative implements Parcelable {
return samples;
}
+ private CapabilityAndMaxSize[] getBokehCapabilities() {
+ CapabilityAndMaxSize[] bcs = getBase(
+ CameraCharacteristics.CONTROL_AVAILABLE_BOKEH_CAPABILITIES);
+
+ if (bcs != null) {
+ for (CapabilityAndMaxSize bc : bcs) {
+ if (bc.getMode() < CameraMetadata.CONTROL_BOKEH_MODE_OFF ||
+ bc.getMode() > CameraMetadata.CONTROL_BOKEH_MODE_CONTINUOUS) {
+ throw new AssertionError(String.format(
+ "bokehMode %d is out of valid range [%d, %d]", bc.getMode(),
+ CameraMetadata.CONTROL_BOKEH_MODE_OFF,
+ CameraMetadata.CONTROL_BOKEH_MODE_CONTINUOUS));
+ }
+ }
+ }
+ return bcs;
+ }
+
private <T> void setBase(CameraCharacteristics.Key<T> key, T value) {
setBase(key.getNativeKey(), value);
}
@@ -1750,6 +1780,7 @@ public class CameraMetadataNative implements Parcelable {
new MarshalQueryableBlackLevelPattern(),
new MarshalQueryableHighSpeedVideoConfiguration(),
new MarshalQueryableRecommendedStreamConfiguration(),
+ new MarshalQueryableCapabilityAndMaxSize(),
// generic parcelable marshaler (MUST BE LAST since it has lowest priority)
new MarshalQueryableParcelable(),
diff --git a/core/java/android/hardware/camera2/marshal/impl/MarshalQueryableCapabilityAndMaxSize.java b/core/java/android/hardware/camera2/marshal/impl/MarshalQueryableCapabilityAndMaxSize.java
new file mode 100644
index 000000000000..5c1f301369e1
--- /dev/null
+++ b/core/java/android/hardware/camera2/marshal/impl/MarshalQueryableCapabilityAndMaxSize.java
@@ -0,0 +1,77 @@
+/*
+ * 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.hardware.camera2.marshal.impl;
+
+import android.hardware.camera2.marshal.MarshalQueryable;
+import android.hardware.camera2.marshal.Marshaler;
+import android.hardware.camera2.params.CapabilityAndMaxSize;
+import android.hardware.camera2.utils.TypeReference;
+import android.util.Size;
+
+import java.nio.ByteBuffer;
+
+import static android.hardware.camera2.impl.CameraMetadataNative.TYPE_INT32;
+import static android.hardware.camera2.marshal.MarshalHelpers.SIZEOF_INT32;
+
+/**
+ * Marshal {@link CapabilityAndMaxSize} to/from {@link #TYPE_INT32} {@code x CapabilityAndMaxSize.COUNT}
+ */
+public class MarshalQueryableCapabilityAndMaxSize implements MarshalQueryable<CapabilityAndMaxSize> {
+ private static final int SIZE = SIZEOF_INT32 * CapabilityAndMaxSize.COUNT;
+
+ private class MarshalerCapabilityAndMaxSize extends Marshaler<CapabilityAndMaxSize> {
+ protected MarshalerCapabilityAndMaxSize(TypeReference<CapabilityAndMaxSize> typeReference,
+ int nativeType) {
+ super(MarshalQueryableCapabilityAndMaxSize.this, typeReference, nativeType);
+ }
+
+ @Override
+ public void marshal(CapabilityAndMaxSize value, ByteBuffer buffer) {
+ Size maxStreamingSize = value.getMaxStreamingSize();
+
+ buffer.putInt(value.getMode());
+ buffer.putInt(maxStreamingSize.getWidth());
+ buffer.putInt(maxStreamingSize.getHeight());
+ }
+
+ @Override
+ public CapabilityAndMaxSize unmarshal(ByteBuffer buffer) {
+ int mode = buffer.getInt();
+ int maxWidth = buffer.getInt();
+ int maxHeight = buffer.getInt();
+
+ return new CapabilityAndMaxSize(mode, maxWidth, maxHeight);
+ }
+
+ @Override
+ public int getNativeSize() {
+ return SIZE;
+ }
+ }
+
+ @Override
+ public Marshaler<CapabilityAndMaxSize> createMarshaler(
+ TypeReference<CapabilityAndMaxSize> managedType, int nativeType) {
+ return new MarshalerCapabilityAndMaxSize(managedType, nativeType);
+ }
+
+ @Override
+ public boolean isTypeMappingSupported(
+ TypeReference<CapabilityAndMaxSize> managedType, int nativeType) {
+ return nativeType == TYPE_INT32 &&
+ (CapabilityAndMaxSize.class.equals(managedType.getType()));
+ }
+}
diff --git a/core/java/android/hardware/camera2/params/CapabilityAndMaxSize.java b/core/java/android/hardware/camera2/params/CapabilityAndMaxSize.java
new file mode 100644
index 000000000000..be0829934a4b
--- /dev/null
+++ b/core/java/android/hardware/camera2/params/CapabilityAndMaxSize.java
@@ -0,0 +1,126 @@
+/*
+ * 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.hardware.camera2.params;
+
+import static com.android.internal.util.Preconditions.checkArgumentInRange;
+import static com.android.internal.util.Preconditions.checkArgumentNonnegative;
+
+import android.annotation.NonNull;
+import android.hardware.camera2.CameraCharacteristics;
+import android.hardware.camera2.CameraMetadata;
+import android.hardware.camera2.utils.HashCodeHelpers;
+import android.util.Size;
+
+/**
+ * Immutable class to store the available camera capability and its
+ * corresponding maximum streaming dimensions.
+ *
+ * @see CameraCharacteristics#CONTROL_AVAILABLE_BOKEH_CAPABILITIES
+ */
+
+public final class CapabilityAndMaxSize {
+ /**
+ * @hide
+ */
+ public static final int COUNT = 3;
+
+ private final int mMode;
+ private final int mMaxStreamingWidth;
+ private final int mMaxStreamingHeight;
+
+ /**
+ * Create a new CapabilityAndMaxSize object.
+ *
+ * @param mode supported mode for a camera capability.
+ * @param maxStreamingWidth width >= 0
+ * @param maxStreamingHeight height >= 0
+ *
+ * @hide
+ */
+ public CapabilityAndMaxSize(int mode, int maxStreamingWidth, int maxStreamingHeight) {
+ mMode = mode;
+ mMaxStreamingWidth = checkArgumentNonnegative(maxStreamingWidth,
+ "maxStreamingWidth must be nonnegative");
+ mMaxStreamingHeight = checkArgumentNonnegative(maxStreamingHeight,
+ "maxStreamingHeight must be nonnegative");
+ }
+
+ /**
+ * Return the supported mode for this capability.
+ *
+ * @return One of supported modes for the capability. For example, for available bokeh modes,
+ * this will be one of {@link CameraMetadata#CONTROL_BOKEH_MODE_OFF},
+ * {@link CameraMetadata#CONTROL_BOKEH_MODE_STILL_CAPTURE}, and
+ * {@link CameraMetadata#CONTROL_BOKEH_MODE_CONTINUOUS}.
+ */
+ public int getMode() {
+ return mMode;
+ }
+
+ /**
+ * Return the maximum streaming dimension of this capability.
+ *
+ * @return a new {@link Size} with non-negative width and height
+ */
+ public @NonNull Size getMaxStreamingSize() {
+ return new Size(mMaxStreamingWidth, mMaxStreamingHeight);
+ }
+
+ /**
+ * Compare two CapabilityAndMaxSize objects to see if they are equal.
+ *
+ * @param obj Another CapabilityAndMaxSize object
+ *
+ * @return {@code true} if the mode and max size are equal, {@code false} otherwise
+ */
+ @Override
+ public boolean equals(final Object obj) {
+ if (obj == null) {
+ return false;
+ }
+ if (this == obj) {
+ return true;
+ }
+ if (obj instanceof CapabilityAndMaxSize) {
+ final CapabilityAndMaxSize other = (CapabilityAndMaxSize) obj;
+ return (mMode == other.mMode
+ && mMaxStreamingWidth == other.mMaxStreamingWidth
+ && mMaxStreamingHeight == other.mMaxStreamingHeight);
+ }
+ return false;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public int hashCode() {
+ return HashCodeHelpers.hashCode(mMode, mMaxStreamingWidth, mMaxStreamingHeight);
+ }
+
+ /**
+ * Return the CapabilityAndMaxSize as a string representation
+ * {@code "(mode:%d, maxStreamingSize:%d x %d)"}.
+ *
+ * @return string representation of the capability and max streaming size.
+ */
+ @Override
+ public String toString() {
+ return String.format("(mode:%d, maxStreamingSize:%d x %d)",
+ mMode, mMaxStreamingWidth, mMaxStreamingHeight);
+ }
+}
diff --git a/core/java/android/net/util/SocketUtils.java b/core/java/android/net/util/SocketUtils.java
index 489a2922f70e..e9ea99f84f90 100644
--- a/core/java/android/net/util/SocketUtils.java
+++ b/core/java/android/net/util/SocketUtils.java
@@ -77,7 +77,9 @@ public final class SocketUtils {
/**
* Make a socket address that packet socket can send packets to.
+ * @deprecated Use {@link #makePacketSocketAddress(int, int, byte[])} instead.
*/
+ @Deprecated
@NonNull
public static SocketAddress makePacketSocketAddress(int ifIndex, @NonNull byte[] hwAddr) {
return new PacketSocketAddress(
@@ -87,6 +89,18 @@ public final class SocketUtils {
}
/**
+ * Make a socket address that packet socket can send packets to.
+ */
+ @NonNull
+ public static SocketAddress makePacketSocketAddress(int protocol, int ifIndex,
+ @NonNull byte[] hwAddr) {
+ return new PacketSocketAddress(
+ protocol /* sll_protocol */,
+ ifIndex /* sll_ifindex */,
+ hwAddr /* sll_addr */);
+ }
+
+ /**
* @see IoBridge#closeAndSignalBlockedThreads(FileDescriptor)
*/
public static void closeSocket(@Nullable FileDescriptor fd) throws IOException {
diff --git a/core/java/android/os/BatteryStats.java b/core/java/android/os/BatteryStats.java
index af0ec1188bc7..3ae1fe63f6cc 100644
--- a/core/java/android/os/BatteryStats.java
+++ b/core/java/android/os/BatteryStats.java
@@ -17,11 +17,11 @@
package android.os;
import static android.app.ActivityManager.PROCESS_STATE_BOUND_TOP;
-import static android.app.ActivityManager.PROCESS_STATE_FOREGROUND_SERVICE_LOCATION;
import android.annotation.IntDef;
import android.annotation.UnsupportedAppUsage;
import android.app.ActivityManager;
+import android.app.job.JobParameters;
import android.content.Context;
import android.content.pm.ApplicationInfo;
import android.server.ServerProtoEnums;
@@ -45,7 +45,6 @@ import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.location.gnssmetrics.GnssMetrics;
import com.android.internal.os.BatterySipper;
import com.android.internal.os.BatteryStatsHelper;
-import com.android.internal.util.Preconditions;
import java.io.FileDescriptor;
import java.io.PrintWriter;
@@ -59,7 +58,6 @@ import java.util.Formatter;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
-import java.util.function.Function;
/**
* A class providing access to battery usage statistics, including information on
@@ -420,40 +418,6 @@ public abstract class BatteryStats implements Parcelable {
};
/**
- * "Job stop reason codes" from the job scheduler subsystem, which we can't refer to from this
- * class, so we initialize it from the job scheduler side at runtime using
- * {@link #setJobStopReasons}.
- */
- private static int[] sJobStopReasonCodes = {0};
-
- /**
- * A function that converts the "job stop reason codes" to their names.
- *
- * Similarly to {@link #sJobStopReasonCodes} it's initialized by the job scheduler subsystem
- * using {@link #setJobStopReasons}.
- */
- private static Function<Integer, String> sJobStopReasonNameConverter = (x) -> "unknown";
-
- /**
- * Set by the job scheduler subsystem to "push" job stop reasons, and a function that returns
- * the "name" of each code. We do it this way to remove a build time dependency from this
- * class to the job scheduler framework code.
- *
- * Note the passed array will be used as-is, without copying. The caller must not change
- * the array it passed to it.
- *
- * @hide
- */
- public static void setJobStopReasons(int[] reasonCodes,
- Function<Integer, String> jobStopReasonNameConverter) {
- Preconditions.checkArgument(reasonCodes.length > 0);
- Preconditions.checkArgument(jobStopReasonNameConverter != null);
-
- sJobStopReasonCodes = reasonCodes;
- sJobStopReasonNameConverter = jobStopReasonNameConverter;
- }
-
- /**
* State for keeping track of counting information.
*/
public static abstract class Counter {
@@ -923,7 +887,6 @@ public abstract class BatteryStats implements Parcelable {
*/
public static final int[] CRITICAL_PROC_STATES = {
PROCESS_STATE_TOP,
- PROCESS_STATE_FOREGROUND_SERVICE_LOCATION,
PROCESS_STATE_BOUND_TOP, PROCESS_STATE_FOREGROUND_SERVICE,
PROCESS_STATE_FOREGROUND
};
@@ -4341,15 +4304,16 @@ public abstract class BatteryStats implements Parcelable {
}
}
- final Object[] jobCompletionArgs = new Object[sJobStopReasonCodes.length + 1];
+ final int[] jobStopReasonCodes = JobParameters.getJobStopReasonCodes();
+ final Object[] jobCompletionArgs = new Object[jobStopReasonCodes.length + 1];
final ArrayMap<String, SparseIntArray> completions = u.getJobCompletionStats();
for (int ic=completions.size()-1; ic>=0; ic--) {
SparseIntArray types = completions.valueAt(ic);
if (types != null) {
jobCompletionArgs[0] = "\"" + completions.keyAt(ic) + "\"";
- for (int i = 0; i < sJobStopReasonCodes.length; i++) {
- jobCompletionArgs[i + 1] = types.get(sJobStopReasonCodes[i], 0);
+ for (int i = 0; i < jobStopReasonCodes.length; i++) {
+ jobCompletionArgs[i + 1] = types.get(jobStopReasonCodes[i], 0);
}
dumpLine(pw, uid, category, JOB_COMPLETION_DATA, jobCompletionArgs);
@@ -5969,7 +5933,7 @@ public abstract class BatteryStats implements Parcelable {
pw.print(":");
for (int it=0; it<types.size(); it++) {
pw.print(" ");
- pw.print(sJobStopReasonNameConverter.apply(types.keyAt(it)));
+ pw.print(JobParameters.getReasonCodeDescription(types.keyAt(it)));
pw.print("(");
pw.print(types.valueAt(it));
pw.print("x)");
@@ -7567,7 +7531,7 @@ public abstract class BatteryStats implements Parcelable {
proto.write(UidProto.JobCompletion.NAME, completions.keyAt(ic));
- for (int r : sJobStopReasonCodes) {
+ for (int r : JobParameters.getJobStopReasonCodes()) {
long rToken = proto.start(UidProto.JobCompletion.REASON_COUNT);
proto.write(UidProto.JobCompletion.ReasonCount.NAME, r);
proto.write(UidProto.JobCompletion.ReasonCount.COUNT, types.get(r, 0));
diff --git a/core/java/android/os/BinderProxy.java b/core/java/android/os/BinderProxy.java
index b3b4f784a04a..ee95fcee1f7a 100644
--- a/core/java/android/os/BinderProxy.java
+++ b/core/java/android/os/BinderProxy.java
@@ -242,31 +242,36 @@ public final class BinderProxy implements IBinder {
}
Map<String, Integer> counts = new HashMap<>();
- for (ArrayList<WeakReference<BinderProxy>> a : mMainIndexValues) {
- if (a != null) {
- for (WeakReference<BinderProxy> weakRef : a) {
- BinderProxy bp = weakRef.get();
- String key;
- if (bp == null) {
- key = "<cleared weak-ref>";
- } else {
- try {
- key = bp.getInterfaceDescriptor();
- if ((key == null || key.isEmpty()) && !bp.isBinderAlive()) {
- key = "<proxy to dead node>";
- }
- } catch (Throwable t) {
- key = "<exception during getDescriptor>";
- }
- }
- Integer i = counts.get(key);
- if (i == null) {
- counts.put(key, 1);
- } else {
- counts.put(key, i + 1);
+ final ArrayList<WeakReference<BinderProxy>> proxiesToQuery =
+ new ArrayList<WeakReference<BinderProxy>>();
+ synchronized (sProxyMap) {
+ for (ArrayList<WeakReference<BinderProxy>> a : mMainIndexValues) {
+ if (a != null) {
+ proxiesToQuery.addAll(a);
+ }
+ }
+ }
+ for (WeakReference<BinderProxy> weakRef : proxiesToQuery) {
+ BinderProxy bp = weakRef.get();
+ String key;
+ if (bp == null) {
+ key = "<cleared weak-ref>";
+ } else {
+ try {
+ key = bp.getInterfaceDescriptor();
+ if ((key == null || key.isEmpty()) && !bp.isBinderAlive()) {
+ key = "<proxy to dead node>";
}
+ } catch (Throwable t) {
+ key = "<exception during getDescriptor>";
}
}
+ Integer i = counts.get(key);
+ if (i == null) {
+ counts.put(key, 1);
+ } else {
+ counts.put(key, i + 1);
+ }
}
Map.Entry<String, Integer>[] sorted = counts.entrySet().toArray(
new Map.Entry[counts.size()]);
@@ -355,9 +360,7 @@ public final class BinderProxy implements IBinder {
* @hide
*/
public static InterfaceCount[] getSortedInterfaceCounts(int num) {
- synchronized (sProxyMap) {
- return sProxyMap.getSortedInterfaceCounts(num);
- }
+ return sProxyMap.getSortedInterfaceCounts(num);
}
/**
@@ -377,10 +380,8 @@ public final class BinderProxy implements IBinder {
*/
public static void dumpProxyDebugInfo() {
if (Build.IS_DEBUGGABLE) {
- synchronized (sProxyMap) {
- sProxyMap.dumpProxyInterfaceCounts();
- sProxyMap.dumpPerUidProxyCounts();
- }
+ sProxyMap.dumpProxyInterfaceCounts();
+ sProxyMap.dumpPerUidProxyCounts();
}
}
diff --git a/core/java/android/os/PowerManager.java b/core/java/android/os/PowerManager.java
index 794d62e8fd6c..dd1f8c31ebb1 100644
--- a/core/java/android/os/PowerManager.java
+++ b/core/java/android/os/PowerManager.java
@@ -37,7 +37,6 @@ import com.android.internal.util.Preconditions;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.util.concurrent.Executor;
-import java.util.function.Function;
/**
* This class gives you control of the power state of the device.
@@ -828,13 +827,13 @@ public final class PowerManager {
@UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.P)
final Handler mHandler;
+ /** We lazily initialize it.*/
+ private DeviceIdleManager mDeviceIdleManager;
+
IThermalService mThermalService;
private final ArrayMap<OnThermalStatusChangedListener, IThermalStatusListener>
mListenerMap = new ArrayMap<>();
- private static Function<String, Boolean> sIsIgnoringBatteryOptimizationsCallback =
- (packageName) -> false;
-
/**
* {@hide}
*/
@@ -844,6 +843,14 @@ public final class PowerManager {
mHandler = handler;
}
+ private DeviceIdleManager getDeviceIdleManager() {
+ if (mDeviceIdleManager == null) {
+ // No need for synchronization; getSystemService() will return the same object anyway.
+ mDeviceIdleManager = mContext.getSystemService(DeviceIdleManager.class);
+ }
+ return mDeviceIdleManager;
+ }
+
/**
* Gets the minimum supported screen brightness setting.
* The screen may be allowed to become dimmer than this value but
@@ -1662,12 +1669,7 @@ public final class PowerManager {
* {@link android.provider.Settings#ACTION_IGNORE_BATTERY_OPTIMIZATION_SETTINGS}.
*/
public boolean isIgnoringBatteryOptimizations(String packageName) {
- return sIsIgnoringBatteryOptimizationsCallback.apply(packageName);
- }
-
- /** @hide */
- public static void setIsIgnoringBatteryOptimizationsCallback(Function<String, Boolean> f) {
- sIsIgnoringBatteryOptimizationsCallback = f;
+ return getDeviceIdleManager().isApplicationWhitelisted(packageName);
}
/**
diff --git a/core/java/android/os/UserManager.java b/core/java/android/os/UserManager.java
index b7a3c8f2f3be..3476b18ceee0 100644
--- a/core/java/android/os/UserManager.java
+++ b/core/java/android/os/UserManager.java
@@ -1909,7 +1909,14 @@ public class UserManager {
* Returns the user-wide restrictions imposed on the user specified by <code>userHandle</code>.
* @param userHandle the UserHandle of the user for whom to retrieve the restrictions.
* @return a Bundle containing all the restrictions.
+ *
+ * <p>Requires {@code android.permission.MANAGE_USERS} or
+ * {@code android.permission.INTERACT_ACROSS_USERS}, otherwise specified {@link UserHandle user}
+ * must be the calling user or a managed profile associated with it.
*/
+ @RequiresPermission(anyOf = {
+ android.Manifest.permission.MANAGE_USERS,
+ android.Manifest.permission.INTERACT_ACROSS_USERS}, conditional = true)
public Bundle getUserRestrictions(UserHandle userHandle) {
try {
return mService.getUserRestrictions(userHandle.getIdentifier());
@@ -2000,7 +2007,7 @@ public class UserManager {
* @return {@code true} if the current user has the given restriction, {@code false} otherwise.
*/
public boolean hasUserRestriction(String restrictionKey) {
- return hasUserRestriction(restrictionKey, Process.myUserHandle());
+ return hasUserRestrictionForUser(restrictionKey, Process.myUserHandle());
}
/**
@@ -2012,9 +2019,29 @@ public class UserManager {
*/
@UnsupportedAppUsage
public boolean hasUserRestriction(String restrictionKey, UserHandle userHandle) {
+ return hasUserRestrictionForUser(restrictionKey, userHandle);
+ }
+
+ /**
+ * Returns whether the given user has been disallowed from performing certain actions
+ * or setting certain settings.
+ * @param restrictionKey the string key representing the restriction
+ * @param userHandle the UserHandle of the user for whom to retrieve the restrictions.
+ *
+ * <p>Requires {@code android.permission.MANAGE_USERS} or
+ * {@code android.permission.INTERACT_ACROSS_USERS}, otherwise specified {@link UserHandle user}
+ * must be the calling user or a managed profile associated with it.
+ *
+ * @hide
+ */
+ @SystemApi
+ @RequiresPermission(anyOf = {
+ android.Manifest.permission.MANAGE_USERS,
+ android.Manifest.permission.INTERACT_ACROSS_USERS}, conditional = true)
+ public boolean hasUserRestrictionForUser(@NonNull String restrictionKey,
+ @NonNull UserHandle userHandle) {
try {
- return mService.hasUserRestriction(restrictionKey,
- userHandle.getIdentifier());
+ return mService.hasUserRestriction(restrictionKey, userHandle.getIdentifier());
} catch (RemoteException re) {
throw re.rethrowFromSystemServer();
}
diff --git a/core/java/android/provider/DeviceConfig.java b/core/java/android/provider/DeviceConfig.java
index bb8b041f6b46..0401d7fb8d5d 100644
--- a/core/java/android/provider/DeviceConfig.java
+++ b/core/java/android/provider/DeviceConfig.java
@@ -130,8 +130,10 @@ public final class DeviceConfig {
/**
* Namespace for how dex runs. The feature requires a reboot to reach a clean state.
*
+ * @deprecated No longer used
* @hide
*/
+ @Deprecated
@SystemApi
public static final String NAMESPACE_DEX_BOOT = "dex_boot";
diff --git a/core/java/android/provider/FontsContract.java b/core/java/android/provider/FontsContract.java
index 8f772d4ec780..fcbda5f68f96 100644
--- a/core/java/android/provider/FontsContract.java
+++ b/core/java/android/provider/FontsContract.java
@@ -334,10 +334,17 @@ public class FontsContract {
return cachedTypeface;
}
- // Unfortunately the typeface is not available at this time, but requesting from the font
- // provider takes too much time. For now, request the font data to ensure it is in the cache
- // next time and return.
synchronized (sLock) {
+ // It is possible that Font is loaded during the thread sleep time
+ // re-check the cache to avoid re-loading the font
+ cachedTypeface = sTypefaceCache.get(id);
+ if (cachedTypeface != null) {
+ return cachedTypeface;
+ }
+
+ // Unfortunately the typeface is not available at this time, but requesting from
+ // the font provider takes too much time. For now, request the font data to ensure
+ // it is in the cache next time and return.
if (sHandler == null) {
sThread = new HandlerThread("fonts", Process.THREAD_PRIORITY_BACKGROUND);
sThread.start();
diff --git a/core/java/android/provider/MediaStore.java b/core/java/android/provider/MediaStore.java
index 4153831584e9..aa67d9779da4 100644
--- a/core/java/android/provider/MediaStore.java
+++ b/core/java/android/provider/MediaStore.java
@@ -2040,6 +2040,10 @@ public final class MediaStore {
* generated. Callers are responsible for their own in-memory
* caching of returned values.
*
+ * As of {@link android.os.Build.VERSION_CODES#Q}, this output
+ * of the thumbnail has correct rotation, don't need to rotate
+ * it again.
+ *
* @param imageId the image item to obtain a thumbnail for.
* @param kind optimal thumbnail size desired.
* @return decoded thumbnail, or {@code null} if problem was
@@ -2082,6 +2086,10 @@ public final class MediaStore {
* generated. Callers are responsible for their own in-memory
* caching of returned values.
*
+ * As of {@link android.os.Build.VERSION_CODES#Q}, this output
+ * of the thumbnail has correct rotation, don't need to rotate
+ * it again.
+ *
* @param imageId the image item to obtain a thumbnail for.
* @param kind optimal thumbnail size desired.
* @return decoded thumbnail, or {@code null} if problem was
@@ -2136,6 +2144,9 @@ public final class MediaStore {
* {@link ContentResolver#openFileDescriptor(Uri, String)} to gain
* access.
*
+ * As of {@link android.os.Build.VERSION_CODES#Q}, this thumbnail
+ * has correct rotation, don't need to rotate it again.
+ *
* @deprecated Apps may not have filesystem permissions to directly
* access this path. Instead of trying to open this path
* directly, apps should use
diff --git a/core/java/android/provider/Settings.java b/core/java/android/provider/Settings.java
index 44ab09ed8ad4..381d4921932f 100644
--- a/core/java/android/provider/Settings.java
+++ b/core/java/android/provider/Settings.java
@@ -10654,6 +10654,7 @@ public final class Settings {
* @hide
* @see com.android.server.AppOpsService.Constants
*/
+ @TestApi
public static final String APP_OPS_CONSTANTS = "app_ops_constants";
/**
diff --git a/core/java/android/provider/SettingsStringUtil.java b/core/java/android/provider/SettingsStringUtil.java
index a3dc9471a1d0..9e495dd775dc 100644
--- a/core/java/android/provider/SettingsStringUtil.java
+++ b/core/java/android/provider/SettingsStringUtil.java
@@ -126,7 +126,7 @@ public class SettingsStringUtil {
@Override
protected String itemToString(ComponentName item) {
- return item.flattenToString();
+ return item != null ? item.flattenToString() : "null";
}
public static String add(String delimitedElements, ComponentName element) {
diff --git a/core/java/android/service/carrier/CarrierMessagingServiceWrapper.java b/core/java/android/service/carrier/CarrierMessagingServiceWrapper.java
new file mode 100644
index 000000000000..de90b94d7535
--- /dev/null
+++ b/core/java/android/service/carrier/CarrierMessagingServiceWrapper.java
@@ -0,0 +1,389 @@
+/*
+ * 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.service.carrier;
+
+import android.annotation.NonNull;
+import android.annotation.Nullable;
+import android.annotation.SystemApi;
+import android.content.ComponentName;
+import android.content.Context;
+import android.content.Intent;
+import android.content.ServiceConnection;
+import android.net.Uri;
+import android.os.IBinder;
+import android.os.RemoteException;
+
+import com.android.internal.util.Preconditions;
+
+import java.util.List;
+
+/**
+ * Provides basic structure for platform to connect to the carrier messaging service.
+ * <p>
+ * <code>
+ * CarrierMessagingServiceWrapper carrierMessagingServiceWrapper =
+ * new CarrierMessagingServiceWrapperImpl();
+ * if (carrierMessagingServiceWrapper.bindToCarrierMessagingService(context, carrierPackageName)) {
+ * // wait for onServiceReady callback
+ * } else {
+ * // Unable to bind: handle error.
+ * }
+ * </code>
+ * <p> Upon completion {@link #disposeConnection} should be called to unbind the
+ * CarrierMessagingService.
+ * @hide
+ */
+@SystemApi
+public abstract class CarrierMessagingServiceWrapper {
+ // Populated by bindToCarrierMessagingService. bindToCarrierMessagingService must complete
+ // prior to calling disposeConnection so that mCarrierMessagingServiceConnection is initialized.
+ private volatile CarrierMessagingServiceConnection mCarrierMessagingServiceConnection;
+
+ private volatile ICarrierMessagingService mICarrierMessagingService;
+
+ /**
+ * Binds to the carrier messaging service under package {@code carrierPackageName}. This method
+ * should be called exactly once.
+ *
+ * @param context the context
+ * @param carrierPackageName the carrier package name
+ * @return true upon successfully binding to a carrier messaging service, false otherwise
+ * @hide
+ */
+ @SystemApi
+ public boolean bindToCarrierMessagingService(@NonNull Context context,
+ @NonNull String carrierPackageName) {
+ Preconditions.checkState(mCarrierMessagingServiceConnection == null);
+
+ Intent intent = new Intent(CarrierMessagingService.SERVICE_INTERFACE);
+ intent.setPackage(carrierPackageName);
+ mCarrierMessagingServiceConnection = new CarrierMessagingServiceConnection();
+ return context.bindService(intent, mCarrierMessagingServiceConnection,
+ Context.BIND_AUTO_CREATE);
+ }
+
+ /**
+ * Unbinds the carrier messaging service. This method should be called exactly once.
+ *
+ * @param context the context
+ * @hide
+ */
+ @SystemApi
+ public void disposeConnection(@NonNull Context context) {
+ Preconditions.checkNotNull(mCarrierMessagingServiceConnection);
+ context.unbindService(mCarrierMessagingServiceConnection);
+ mCarrierMessagingServiceConnection = null;
+ }
+
+ /**
+ * Implemented by subclasses to use the carrier messaging service once it is ready.
+ * @hide
+ */
+ @SystemApi
+ public abstract void onServiceReady();
+
+ /**
+ * Called when connection with service is established.
+ *
+ * @param carrierMessagingService the carrier messaing service interface
+ */
+ private void onServiceReady(ICarrierMessagingService carrierMessagingService) {
+ mICarrierMessagingService = carrierMessagingService;
+ onServiceReady();
+ }
+
+ /**
+ * Request filtering an incoming SMS message.
+ * The service will call callback.onFilterComplete with the filtering result.
+ *
+ * @param pdu the PDUs of the message
+ * @param format the format of the PDUs, typically "3gpp" or "3gpp2"
+ * @param destPort the destination port of a data SMS. It will be -1 for text SMS
+ * @param subId SMS subscription ID of the SIM
+ * @param callback the callback to notify upon completion
+ * @hide
+ */
+ @SystemApi
+ public void filterSms(@NonNull MessagePdu pdu, @NonNull String format, int destPort,
+ int subId, @NonNull final CarrierMessagingCallbackWrapper callback) {
+ if (mICarrierMessagingService != null) {
+ try {
+ mICarrierMessagingService.filterSms(pdu, format, destPort, subId,
+ new CarrierMessagingCallbackWrapperInternal(callback));
+ } catch (RemoteException e) {
+ throw new RuntimeException(e);
+ }
+ }
+ }
+
+ /**
+ * Request sending a new text SMS from the device.
+ * The service will call {@link ICarrierMessagingCallback#onSendSmsComplete} with the send
+ * status.
+ *
+ * @param text the text to send
+ * @param subId SMS subscription ID of the SIM
+ * @param destAddress phone number of the recipient of the message
+ * @param sendSmsFlag flag for sending SMS
+ * @param callback the callback to notify upon completion
+ * @hide
+ */
+ @SystemApi
+ public void sendTextSms(@NonNull String text, int subId, @NonNull String destAddress,
+ int sendSmsFlag, @NonNull final CarrierMessagingCallbackWrapper callback) {
+ if (mICarrierMessagingService != null) {
+ try {
+ mICarrierMessagingService.sendTextSms(text, subId, destAddress, sendSmsFlag,
+ new CarrierMessagingCallbackWrapperInternal(callback));
+ } catch (RemoteException e) {
+ throw new RuntimeException(e);
+ }
+ }
+ }
+
+ /**
+ * Request sending a new data SMS from the device.
+ * The service will call {@link ICarrierMessagingCallback#onSendSmsComplete} with the send
+ * status.
+ *
+ * @param data the data to send
+ * @param subId SMS subscription ID of the SIM
+ * @param destAddress phone number of the recipient of the message
+ * @param destPort port number of the recipient of the message
+ * @param sendSmsFlag flag for sending SMS
+ * @param callback the callback to notify upon completion
+ * @hide
+ */
+ @SystemApi
+ public void sendDataSms(@NonNull byte[] data, int subId, @NonNull String destAddress,
+ int destPort, int sendSmsFlag,
+ @NonNull final CarrierMessagingCallbackWrapper callback) {
+ if (mICarrierMessagingService != null) {
+ try {
+ mICarrierMessagingService.sendDataSms(data, subId, destAddress, destPort,
+ sendSmsFlag, new CarrierMessagingCallbackWrapperInternal(callback));
+ } catch (RemoteException e) {
+ throw new RuntimeException(e);
+ }
+ }
+ }
+
+ /**
+ * Request sending a new multi-part text SMS from the device.
+ * The service will call {@link ICarrierMessagingCallback#onSendMultipartSmsComplete}
+ * with the send status.
+ *
+ * @param parts the parts of the multi-part text SMS to send
+ * @param subId SMS subscription ID of the SIM
+ * @param destAddress phone number of the recipient of the message
+ * @param sendSmsFlag flag for sending SMS
+ * @param callback the callback to notify upon completion
+ * @hide
+ */
+ @SystemApi
+ public void sendMultipartTextSms(@NonNull List<String> parts, int subId,
+ @NonNull String destAddress, int sendSmsFlag,
+ @NonNull final CarrierMessagingCallbackWrapper callback) {
+ if (mICarrierMessagingService != null) {
+ try {
+ mICarrierMessagingService.sendMultipartTextSms(parts, subId, destAddress,
+ sendSmsFlag, new CarrierMessagingCallbackWrapperInternal(callback));
+ } catch (RemoteException e) {
+ throw new RuntimeException(e);
+ }
+ }
+ }
+
+ /**
+ * Request sending a new MMS PDU from the device.
+ * The service will call {@link ICarrierMessagingCallback#onSendMmsComplete} with the send
+ * status.
+ *
+ * @param pduUri the content provider URI of the PDU to send
+ * @param subId SMS subscription ID of the SIM
+ * @param location the optional URI to send this MMS PDU. If this is {code null},
+ * the PDU should be sent to the default MMSC URL.
+ * @param callback the callback to notify upon completion
+ * @hide
+ */
+ @SystemApi
+ public void sendMms(@NonNull Uri pduUri, int subId, @NonNull Uri location,
+ @NonNull final CarrierMessagingCallbackWrapper callback) {
+ if (mICarrierMessagingService != null) {
+ try {
+ mICarrierMessagingService.sendMms(pduUri, subId, location,
+ new CarrierMessagingCallbackWrapperInternal(callback));
+ } catch (RemoteException e) {
+ throw new RuntimeException(e);
+ }
+ }
+ }
+
+ /**
+ * Request downloading a new MMS.
+ * The service will call {@link ICarrierMessagingCallback#onDownloadMmsComplete} with the
+ * download status.
+ *
+ * @param pduUri the content provider URI of the PDU to be downloaded.
+ * @param subId SMS subscription ID of the SIM
+ * @param location the URI of the message to be downloaded.
+ * @param callback the callback to notify upon completion
+ * @hide
+ */
+ @SystemApi
+ public void downloadMms(@NonNull Uri pduUri, int subId, @NonNull Uri location,
+ @NonNull final CarrierMessagingCallbackWrapper callback) {
+ if (mICarrierMessagingService != null) {
+ try {
+ mICarrierMessagingService.downloadMms(pduUri, subId, location,
+ new CarrierMessagingCallbackWrapperInternal(callback));
+ } catch (RemoteException e) {
+ throw new RuntimeException(e);
+ }
+ }
+ }
+
+ /**
+ * A basic {@link ServiceConnection}.
+ */
+ private final class CarrierMessagingServiceConnection implements ServiceConnection {
+ @Override
+ public void onServiceConnected(ComponentName name, IBinder service) {
+ onServiceReady(ICarrierMessagingService.Stub.asInterface(service));
+ }
+
+ @Override
+ public void onServiceDisconnected(ComponentName name) {
+ }
+ }
+
+ /**
+ * Callback wrapper used for response to requests exposed by
+ * {@link CarrierMessagingServiceWrapper}.
+ * @hide
+ */
+ @SystemApi
+ public abstract static class CarrierMessagingCallbackWrapper {
+
+ /**
+ * Response callback for {@link CarrierMessagingServiceWrapper#filterSms}.
+ * @param result a bitmask integer to indicate how the incoming text SMS should be handled
+ * by the platform. Bits set can be
+ * {@link CarrierMessagingService#RECEIVE_OPTIONS_DROP} and
+ * {@link CarrierMessagingService#
+ * RECEIVE_OPTIONS_SKIP_NOTIFY_WHEN_CREDENTIAL_PROTECTED_STORAGE_UNAVAILABLE}.
+ * {@see CarrierMessagingService#onReceiveTextSms}.
+ * @hide
+ */
+ @SystemApi
+ public void onFilterComplete(int result) {
+
+ }
+
+ /**
+ * Response callback for {@link CarrierMessagingServiceWrapper#sendTextSms} and
+ * {@link CarrierMessagingServiceWrapper#sendDataSms}.
+ * @param result send status, one of {@link CarrierMessagingService#SEND_STATUS_OK},
+ * {@link CarrierMessagingService#SEND_STATUS_RETRY_ON_CARRIER_NETWORK},
+ * and {@link CarrierMessagingService#SEND_STATUS_ERROR}.
+ * @param messageRef message reference of the just-sent message. This field is applicable
+ * only if result is {@link CarrierMessagingService#SEND_STATUS_OK}.
+ * @hide
+ */
+ @SystemApi
+ public void onSendSmsComplete(int result, int messageRef) {
+
+ }
+
+ /**
+ * Response callback for {@link CarrierMessagingServiceWrapper#sendMultipartTextSms}.
+ * @param result send status, one of {@link CarrierMessagingService#SEND_STATUS_OK},
+ * {@link CarrierMessagingService#SEND_STATUS_RETRY_ON_CARRIER_NETWORK},
+ * and {@link CarrierMessagingService#SEND_STATUS_ERROR}.
+ * @param messageRefs an array of message references, one for each part of the
+ * multipart SMS. This field is applicable only if result is
+ * {@link CarrierMessagingService#SEND_STATUS_OK}.
+ * @hide
+ */
+ @SystemApi
+ public void onSendMultipartSmsComplete(int result, @Nullable int[] messageRefs) {
+
+ }
+
+ /**
+ * Response callback for {@link CarrierMessagingServiceWrapper#sendMms}.
+ * @param result send status, one of {@link CarrierMessagingService#SEND_STATUS_OK},
+ * {@link CarrierMessagingService#SEND_STATUS_RETRY_ON_CARRIER_NETWORK},
+ * and {@link CarrierMessagingService#SEND_STATUS_ERROR}.
+ * @param sendConfPdu a possibly {code null} SendConf PDU, which confirms that the message
+ * was sent. sendConfPdu is ignored if the {@code result} is not
+ * {@link CarrierMessagingService#SEND_STATUS_OK}.
+ * @hide
+ */
+ @SystemApi
+ public void onSendMmsComplete(int result, @Nullable byte[] sendConfPdu) {
+
+ }
+
+ /**
+ * Response callback for {@link CarrierMessagingServiceWrapper#downloadMms}.
+ * @param result download status, one of {@link CarrierMessagingService#SEND_STATUS_OK},
+ * {@link CarrierMessagingService#SEND_STATUS_RETRY_ON_CARRIER_NETWORK},
+ * and {@link CarrierMessagingService#SEND_STATUS_ERROR}.
+ * @hide
+ */
+ @SystemApi
+ public void onDownloadMmsComplete(int result) {
+
+ }
+ }
+
+ private final class CarrierMessagingCallbackWrapperInternal
+ extends ICarrierMessagingCallback.Stub {
+ CarrierMessagingCallbackWrapper mCarrierMessagingCallbackWrapper;
+
+ CarrierMessagingCallbackWrapperInternal(CarrierMessagingCallbackWrapper callback) {
+ mCarrierMessagingCallbackWrapper = callback;
+ }
+
+ @Override
+ public void onFilterComplete(int result) throws RemoteException {
+ mCarrierMessagingCallbackWrapper.onFilterComplete(result);
+ }
+
+ @Override
+ public void onSendSmsComplete(int result, int messageRef) throws RemoteException {
+ mCarrierMessagingCallbackWrapper.onSendSmsComplete(result, messageRef);
+ }
+
+ @Override
+ public void onSendMultipartSmsComplete(int result, int[] messageRefs)
+ throws RemoteException {
+ mCarrierMessagingCallbackWrapper.onSendMultipartSmsComplete(result, messageRefs);
+ }
+
+ @Override
+ public void onSendMmsComplete(int result, byte[] sendConfPdu) throws RemoteException {
+ mCarrierMessagingCallbackWrapper.onSendMmsComplete(result, sendConfPdu);
+ }
+
+ @Override
+ public void onDownloadMmsComplete(int result) throws RemoteException {
+ mCarrierMessagingCallbackWrapper.onDownloadMmsComplete(result);
+ }
+ }
+}
diff --git a/core/java/android/speech/IRecognitionService.aidl b/core/java/android/speech/IRecognitionService.aidl
index be6ef6d20e10..f91e122ea9cb 100644
--- a/core/java/android/speech/IRecognitionService.aidl
+++ b/core/java/android/speech/IRecognitionService.aidl
@@ -39,8 +39,11 @@ oneway interface IRecognitionService {
* this intent can contain extra parameters to manipulate the behavior of the recognition
* client. For more information see {@link RecognizerIntent}.
* @param listener to receive callbacks, note that this must be non-null
+ * @param packageName the package name calling this API
+ * @param featureId The feature in the package
*/
- void startListening(in Intent recognizerIntent, in IRecognitionListener listener);
+ void startListening(in Intent recognizerIntent, in IRecognitionListener listener,
+ String packageName, String featureId);
/**
* Stops listening for speech. Speech captured so far will be recognized as
@@ -48,13 +51,17 @@ oneway interface IRecognitionService {
* is called during the speech capturing.
*
* @param listener to receive callbacks, note that this must be non-null
+ * @param packageName the package name calling this API
+ * @param featureId The feature in the package
*/
- void stopListening(in IRecognitionListener listener);
+ void stopListening(in IRecognitionListener listener, String packageName, String featureId);
/**
* Cancels the speech recognition.
*
* @param listener to receive callbacks, note that this must be non-null
+ * @param packageName the package name calling this API
+ * @param featureId The feature in the package
*/
- void cancel(in IRecognitionListener listener);
+ void cancel(in IRecognitionListener listener, String packageName, String featureId);
}
diff --git a/core/java/android/speech/RecognitionService.java b/core/java/android/speech/RecognitionService.java
index dfc5c8217fda..4b42209be653 100644
--- a/core/java/android/speech/RecognitionService.java
+++ b/core/java/android/speech/RecognitionService.java
@@ -16,6 +16,8 @@
package android.speech;
+import android.annotation.NonNull;
+import android.annotation.Nullable;
import android.annotation.SdkConstant;
import android.annotation.SdkConstant.SdkConstantType;
import android.app.Service;
@@ -29,6 +31,8 @@ import android.os.Message;
import android.os.RemoteException;
import android.util.Log;
+import com.android.internal.util.Preconditions;
+
import java.lang.ref.WeakReference;
/**
@@ -171,13 +175,17 @@ public abstract class RecognitionService extends Service {
*
* @param listener to send the error message to in case of error
* @param forDataDelivery If the permission check is for delivering the sensitive data.
+ * @param packageName the package name of the caller
+ * @param featureId The feature in the package
* @return {@code true} if the caller has enough permissions, {@code false} otherwise
*/
- private boolean checkPermissions(IRecognitionListener listener, boolean forDataDelivery) {
+ private boolean checkPermissions(IRecognitionListener listener, boolean forDataDelivery,
+ @NonNull String packageName, @Nullable String featureId) {
if (DBG) Log.d(TAG, "checkPermissions");
if (forDataDelivery) {
- if (PermissionChecker.checkCallingOrSelfPermissionForDataDelivery(this,
- android.Manifest.permission.RECORD_AUDIO, null /*message*/)
+ if (PermissionChecker.checkCallingPermissionForDataDelivery(this,
+ android.Manifest.permission.RECORD_AUDIO, packageName, featureId,
+ null /*message*/)
== PermissionChecker.PERMISSION_GRANTED) {
return true;
}
@@ -349,10 +357,14 @@ public abstract class RecognitionService extends Service {
}
@Override
- public void startListening(Intent recognizerIntent, IRecognitionListener listener) {
+ public void startListening(Intent recognizerIntent, IRecognitionListener listener,
+ String packageName, String featureId) {
+ Preconditions.checkNotNull(packageName);
+
if (DBG) Log.d(TAG, "startListening called by:" + listener.asBinder());
final RecognitionService service = mServiceRef.get();
- if (service != null && service.checkPermissions(listener, true /*forDataDelivery*/)) {
+ if (service != null && service.checkPermissions(listener, true /*forDataDelivery*/,
+ packageName, featureId)) {
service.mHandler.sendMessage(Message.obtain(service.mHandler,
MSG_START_LISTENING, service.new StartListeningArgs(
recognizerIntent, listener, Binder.getCallingUid())));
@@ -360,20 +372,28 @@ public abstract class RecognitionService extends Service {
}
@Override
- public void stopListening(IRecognitionListener listener) {
+ public void stopListening(IRecognitionListener listener, String packageName,
+ String featureId) {
+ Preconditions.checkNotNull(packageName);
+
if (DBG) Log.d(TAG, "stopListening called by:" + listener.asBinder());
final RecognitionService service = mServiceRef.get();
- if (service != null && service.checkPermissions(listener, false /*forDataDelivery*/)) {
+ if (service != null && service.checkPermissions(listener, false /*forDataDelivery*/,
+ packageName, featureId)) {
service.mHandler.sendMessage(Message.obtain(service.mHandler,
MSG_STOP_LISTENING, listener));
}
}
@Override
- public void cancel(IRecognitionListener listener) {
+ public void cancel(IRecognitionListener listener, String packageName,
+ String featureId) {
+ Preconditions.checkNotNull(packageName);
+
if (DBG) Log.d(TAG, "cancel called by:" + listener.asBinder());
final RecognitionService service = mServiceRef.get();
- if (service != null && service.checkPermissions(listener, false /*forDataDelivery*/)) {
+ if (service != null && service.checkPermissions(listener, false /*forDataDelivery*/,
+ packageName, featureId)) {
service.mHandler.sendMessage(Message.obtain(service.mHandler,
MSG_CANCEL, listener));
}
diff --git a/core/java/android/speech/SpeechRecognizer.java b/core/java/android/speech/SpeechRecognizer.java
index 88e2edeee552..e93ba16fa594 100644
--- a/core/java/android/speech/SpeechRecognizer.java
+++ b/core/java/android/speech/SpeechRecognizer.java
@@ -341,7 +341,8 @@ public class SpeechRecognizer {
return;
}
try {
- mService.startListening(recognizerIntent, mListener);
+ mService.startListening(recognizerIntent, mListener, mContext.getOpPackageName(),
+ mContext.getFeatureId());
if (DBG) Log.d(TAG, "service start listening command succeded");
} catch (final RemoteException e) {
Log.e(TAG, "startListening() failed", e);
@@ -355,7 +356,8 @@ public class SpeechRecognizer {
return;
}
try {
- mService.stopListening(mListener);
+ mService.stopListening(mListener, mContext.getOpPackageName(),
+ mContext.getFeatureId());
if (DBG) Log.d(TAG, "service stop listening command succeded");
} catch (final RemoteException e) {
Log.e(TAG, "stopListening() failed", e);
@@ -369,7 +371,7 @@ public class SpeechRecognizer {
return;
}
try {
- mService.cancel(mListener);
+ mService.cancel(mListener, mContext.getOpPackageName(), mContext.getFeatureId());
if (DBG) Log.d(TAG, "service cancel command succeded");
} catch (final RemoteException e) {
Log.e(TAG, "cancel() failed", e);
@@ -398,7 +400,7 @@ public class SpeechRecognizer {
public void destroy() {
if (mService != null) {
try {
- mService.cancel(mListener);
+ mService.cancel(mListener, mContext.getOpPackageName(), mContext.getFeatureId());
} catch (final RemoteException e) {
// Not important
}
diff --git a/core/java/android/util/StatsEvent.java b/core/java/android/util/StatsEvent.java
index 91a5ec0303f7..8d9607ff11e2 100644
--- a/core/java/android/util/StatsEvent.java
+++ b/core/java/android/util/StatsEvent.java
@@ -20,312 +20,540 @@ import static java.nio.charset.StandardCharsets.UTF_8;
import android.annotation.NonNull;
import android.annotation.Nullable;
+import android.os.SystemClock;
import com.android.internal.annotations.GuardedBy;
+import com.android.internal.annotations.VisibleForTesting;
/**
* StatsEvent builds and stores the buffer sent over the statsd socket.
* This class defines and encapsulates the socket protocol.
+ *
+ * <p>Usage:</p>
+ * <pre>
+ * StatsEvent statsEvent = StatsEvent.newBuilder()
+ * .setAtomId(atomId)
+ * .writeBoolean(false)
+ * .writeString("annotated String field")
+ * .addBooleanAnnotation(annotationId, true)
+ * .build();
+ *
+ * StatsLog.write(statsEvent);
+ * </pre>
* @hide
**/
-public final class StatsEvent implements AutoCloseable {
- private static final int POS_NUM_ELEMENTS = 1;
- private static final int POS_TIMESTAMP = POS_NUM_ELEMENTS + 1;
-
+public final class StatsEvent {
private static final int LOGGER_ENTRY_MAX_PAYLOAD = 4068;
- // Max payload size is 4 KB less 4 bytes which are reserved for statsEventTag.
+ // Max payload size is 4 bytes less as 4 bytes are reserved for statsEventTag.
// See android_util_StatsLog.cpp.
- private static final int MAX_EVENT_PAYLOAD = LOGGER_ENTRY_MAX_PAYLOAD - 4;
-
- private static final byte INT_TYPE = 0;
- private static final byte LONG_TYPE = 1;
- private static final byte STRING_TYPE = 2;
- private static final byte LIST_TYPE = 3;
- private static final byte FLOAT_TYPE = 4;
-
- private static final int INT_TYPE_SIZE = 5;
- private static final int FLOAT_TYPE_SIZE = 5;
- private static final int LONG_TYPE_SIZE = 9;
-
- private static final int STRING_TYPE_OVERHEAD = 5;
- private static final int LIST_TYPE_OVERHEAD = 2;
-
- public static final int SUCCESS = 0;
- public static final int ERROR_BUFFER_LIMIT_EXCEEDED = -1;
- public static final int ERROR_NO_TIMESTAMP = -2;
- public static final int ERROR_TIMESTAMP_ALREADY_WRITTEN = -3;
- public static final int ERROR_NO_ATOM_ID = -4;
- public static final int ERROR_ATOM_ID_ALREADY_WRITTEN = -5;
- public static final int ERROR_UID_TAG_COUNT_MISMATCH = -6;
-
- private static Object sLock = new Object();
-
- @GuardedBy("sLock")
- private static StatsEvent sPool;
-
- private final byte[] mBuffer = new byte[MAX_EVENT_PAYLOAD];
- private int mPos;
- private int mNumElements;
- private int mAtomId;
-
- private StatsEvent() {
- // Write LIST_TYPE to buffer
- mBuffer[0] = LIST_TYPE;
- reset();
- }
+ private static final int MAX_PAYLOAD_SIZE = LOGGER_ENTRY_MAX_PAYLOAD - 4;
- private void reset() {
- // Reset state.
- mPos = POS_TIMESTAMP;
- mNumElements = 0;
- mAtomId = 0;
+ private final Buffer mBuffer;
+ private final int mNumBytes;
+
+ private StatsEvent(@NonNull final Buffer buffer, final int numBytes) {
+ mBuffer = buffer;
+ mNumBytes = numBytes;
}
/**
- * Returns a StatsEvent object from the pool.
+ * Returns a new StatsEvent.Builder for building StatsEvent object.
**/
@NonNull
- public static StatsEvent obtain() {
- final StatsEvent statsEvent;
- synchronized (sLock) {
- statsEvent = null == sPool ? new StatsEvent() : sPool;
- sPool = null;
- }
- statsEvent.reset();
- return statsEvent;
+ public StatsEvent.Builder newBuilder() {
+ return new StatsEvent.Builder(Buffer.obtain());
}
- @Override
- public void close() {
- synchronized (sLock) {
- if (null == sPool) {
- sPool = this;
- }
- }
- }
-
- /**
- * Writes the event timestamp to the buffer.
- **/
- public int writeTimestampNs(final long timestampNs) {
- if (hasTimestamp()) {
- return ERROR_TIMESTAMP_ALREADY_WRITTEN;
- }
- return writeLong(timestampNs);
+ @NonNull
+ byte[] getBytes() {
+ return mBuffer.getBytes();
}
- private boolean hasTimestamp() {
- return mPos > POS_TIMESTAMP;
+ int getNumBytes() {
+ return mNumBytes;
}
- private boolean hasAtomId() {
- return mAtomId != 0;
+ void release() {
+ mBuffer.release();
}
/**
- * Writes the atom id to the buffer.
+ * Builder for constructing a StatsEvent object.
+ *
+ * <p>This class defines and encapsulates the socket encoding for the buffer.
+ * The write methods must be called in the same order as the order of fields in the
+ * atom definition.</p>
+ *
+ * <p>setAtomId() can be called anytime before build().</p>
+ *
+ * <p>Example:</p>
+ * <pre>
+ * // Atom definition.
+ * message MyAtom {
+ * optional int32 field1 = 1;
+ * optional int64 field2 = 2;
+ * optional string field3 = 3 [(annotation1) = true];
+ * }
+ *
+ * // StatsEvent construction.
+ * StatsEvent.newBuilder()
+ * StatsEvent statsEvent = StatsEvent.newBuilder()
+ * .setAtomId(atomId)
+ * .writeInt(3) // field1
+ * .writeLong(8L) // field2
+ * .writeString("foo") // field 3
+ * .addBooleanAnnotation(annotation1Id, true)
+ * .build();
+ * </pre>
+ * @hide
**/
- public int writeAtomId(final int atomId) {
- if (!hasTimestamp()) {
- return ERROR_NO_TIMESTAMP;
- } else if (hasAtomId()) {
- return ERROR_ATOM_ID_ALREADY_WRITTEN;
+ public static final class Builder {
+ // Type Ids.
+ private static final byte TYPE_INT = 0x00;
+ private static final byte TYPE_LONG = 0x01;
+ private static final byte TYPE_STRING = 0x02;
+ private static final byte TYPE_LIST = 0x03;
+ private static final byte TYPE_FLOAT = 0x04;
+ private static final byte TYPE_BOOLEAN = 0x05;
+ private static final byte TYPE_OBJECT = 0x06;
+ private static final byte TYPE_BYTE_ARRAY = 0x07;
+ private static final byte TYPE_ATTRIBUTION_CHAIN = 0x08;
+ private static final byte TYPE_ERRORS = 0x0F;
+
+ // Error flags.
+ private static final int ERROR_NO_TIMESTAMP = 0x1;
+ private static final int ERROR_NO_ATOM_ID = 0x2;
+ private static final int ERROR_OVERFLOW = 0x4;
+ private static final int ERROR_ATTRIBUTION_CHAIN_TOO_LONG = 0x8;
+ private static final int ERROR_ANNOTATION_DOES_NOT_FOLLOW_FIELD = 0x10;
+ private static final int ERROR_INVALID_ANNOTATION_ID = 0x20;
+ private static final int ERROR_ANNOTATION_ID_TOO_LARGE = 0x40;
+ private static final int ERROR_TOO_MANY_ANNOTATIONS = 0x80;
+ private static final int ERROR_TOO_MANY_FIELDS = 0x100;
+ private static final int ERROR_ATTRIBUTION_UIDS_TAGS_SIZES_NOT_EQUAL = 0x200;
+
+ // Size limits.
+ private static final int MAX_ANNOTATION_COUNT = 15;
+ private static final int MAX_ATTRIBUTION_NODES = 127;
+ private static final int MAX_NUM_ELEMENTS = 127;
+
+ // Fixed positions.
+ private static final int POS_NUM_ELEMENTS = 1;
+ private static final int POS_TIMESTAMP_NS = POS_NUM_ELEMENTS + Byte.BYTES;
+ private static final int POS_ATOM_ID = POS_TIMESTAMP_NS + Byte.BYTES + Long.BYTES;
+
+ private final Buffer mBuffer;
+ private long mTimestampNs;
+ private int mAtomId;
+ private byte mCurrentAnnotationCount;
+ private int mPos;
+ private int mPosLastField;
+ private byte mLastType;
+ private int mNumElements;
+ private int mErrorMask;
+
+ private Builder(final Buffer buffer) {
+ mBuffer = buffer;
+ mCurrentAnnotationCount = 0;
+ mAtomId = 0;
+ mTimestampNs = SystemClock.elapsedRealtimeNanos();
+ mNumElements = 0;
+
+ // Set mPos to 0 for writing TYPE_OBJECT at 0th position.
+ mPos = 0;
+ writeTypeId(TYPE_OBJECT);
+
+ // Set mPos to after atom id's location in the buffer.
+ // First 2 elements in the buffer are event timestamp followed by the atom id.
+ mPos = POS_ATOM_ID + Byte.BYTES + Integer.BYTES;
+ mPosLastField = 0;
+ mLastType = 0;
}
- final int writeResult = writeInt(atomId);
- if (SUCCESS == writeResult) {
+ /**
+ * Sets the atom id for this StatsEvent.
+ **/
+ @NonNull
+ public Builder setAtomId(final int atomId) {
mAtomId = atomId;
+ return this;
}
- return writeResult;
- }
- /**
- * Appends the given int to the StatsEvent buffer.
- **/
- public int writeInt(final int value) {
- if (!hasTimestamp()) {
- return ERROR_NO_TIMESTAMP;
- } else if (!hasAtomId()) {
- return ERROR_NO_ATOM_ID;
- } else if (mPos + INT_TYPE_SIZE > MAX_EVENT_PAYLOAD) {
- return ERROR_BUFFER_LIMIT_EXCEEDED;
+ /**
+ * Sets the timestamp in nanos for this StatsEvent.
+ **/
+ @VisibleForTesting
+ @NonNull
+ public Builder setTimestampNs(final long timestampNs) {
+ mTimestampNs = timestampNs;
+ return this;
}
- mBuffer[mPos] = INT_TYPE;
- copyInt(mBuffer, mPos + 1, value);
- mPos += INT_TYPE_SIZE;
- mNumElements++;
- return SUCCESS;
- }
+ /**
+ * Write a boolean field to this StatsEvent.
+ **/
+ @NonNull
+ public Builder writeBoolean(final boolean value) {
+ // Write boolean typeId byte followed by boolean byte representation.
+ writeTypeId(TYPE_BOOLEAN);
+ mPos += mBuffer.putBoolean(mPos, value);
+ mNumElements++;
+ return this;
+ }
- /**
- * Appends the given long to the StatsEvent buffer.
- **/
- public int writeLong(final long value) {
- if (!hasTimestamp()) {
- return ERROR_NO_TIMESTAMP;
- } else if (!hasAtomId()) {
- return ERROR_NO_ATOM_ID;
- } else if (mPos + LONG_TYPE_SIZE > MAX_EVENT_PAYLOAD) {
- return ERROR_BUFFER_LIMIT_EXCEEDED;
+ /**
+ * Write an integer field to this StatsEvent.
+ **/
+ @NonNull
+ public Builder writeInt(final int value) {
+ // Write integer typeId byte followed by 4-byte representation of value.
+ writeTypeId(TYPE_INT);
+ mPos += mBuffer.putInt(mPos, value);
+ mNumElements++;
+ return this;
}
- mBuffer[mPos] = LONG_TYPE;
- copyLong(mBuffer, mPos + 1, value);
- mPos += LONG_TYPE_SIZE;
- mNumElements++;
- return SUCCESS;
- }
+ /**
+ * Write a long field to this StatsEvent.
+ **/
+ @NonNull
+ public Builder writeLong(final long value) {
+ // Write long typeId byte followed by 8-byte representation of value.
+ writeTypeId(TYPE_LONG);
+ mPos += mBuffer.putLong(mPos, value);
+ mNumElements++;
+ return this;
+ }
- /**
- * Appends the given float to the StatsEvent buffer.
- **/
- public int writeFloat(final float value) {
- if (!hasTimestamp()) {
- return ERROR_NO_TIMESTAMP;
- } else if (!hasAtomId()) {
- return ERROR_NO_ATOM_ID;
- } else if (mPos + FLOAT_TYPE_SIZE > MAX_EVENT_PAYLOAD) {
- return ERROR_BUFFER_LIMIT_EXCEEDED;
+ /**
+ * Write a float field to this StatsEvent.
+ **/
+ @NonNull
+ public Builder writeFloat(final float value) {
+ // Write float typeId byte followed by 4-byte representation of value.
+ writeTypeId(TYPE_FLOAT);
+ mPos += mBuffer.putFloat(mPos, value);
+ mNumElements++;
+ return this;
}
- mBuffer[mPos] = FLOAT_TYPE;
- copyInt(mBuffer, mPos + 1, Float.floatToIntBits(value));
- mPos += FLOAT_TYPE_SIZE;
- mNumElements++;
- return SUCCESS;
- }
+ /**
+ * Write a String field to this StatsEvent.
+ **/
+ @NonNull
+ public Builder writeString(@NonNull final String value) {
+ // Write String typeId byte, followed by 4-byte representation of number of bytes
+ // in the UTF-8 encoding, followed by the actual UTF-8 byte encoding of value.
+ final byte[] valueBytes = stringToBytes(value);
+ writeByteArray(valueBytes, TYPE_STRING);
+ return this;
+ }
- /**
- * Appends the given boolean to the StatsEvent buffer.
- **/
- public int writeBoolean(final boolean value) {
- return writeInt(value ? 1 : 0);
- }
+ /**
+ * Write a byte array field to this StatsEvent.
+ **/
+ @NonNull
+ public Builder writeByteArray(@NonNull final byte[] value) {
+ // Write byte array typeId byte, followed by 4-byte representation of number of bytes
+ // in value, followed by the actual byte array.
+ writeByteArray(value, TYPE_BYTE_ARRAY);
+ return this;
+ }
- /**
- * Appends the given byte array to the StatsEvent buffer.
- **/
- public int writeByteArray(@NonNull final byte[] value) {
- if (!hasTimestamp()) {
- return ERROR_NO_TIMESTAMP;
- } else if (!hasAtomId()) {
- return ERROR_NO_ATOM_ID;
- } else if (mPos + STRING_TYPE_OVERHEAD + value.length > MAX_EVENT_PAYLOAD) {
- return ERROR_BUFFER_LIMIT_EXCEEDED;
+ private void writeByteArray(@NonNull final byte[] value, final byte typeId) {
+ writeTypeId(typeId);
+ final int numBytes = value.length;
+ mPos += mBuffer.putInt(mPos, numBytes);
+ mPos += mBuffer.putByteArray(mPos, value);
+ mNumElements++;
}
- mBuffer[mPos] = STRING_TYPE;
- copyInt(mBuffer, mPos + 1, value.length);
- System.arraycopy(value, 0, mBuffer, mPos + STRING_TYPE_OVERHEAD, value.length);
- mPos += STRING_TYPE_OVERHEAD + value.length;
- mNumElements++;
- return SUCCESS;
- }
+ /**
+ * Write an attribution chain field to this StatsEvent.
+ *
+ * The sizes of uids and tags must be equal. The AttributionNode at position i is
+ * made up of uids[i] and tags[i].
+ *
+ * @param uids array of uids in the attribution nodes.
+ * @param tags array of tags in the attribution nodes.
+ **/
+ @NonNull
+ public Builder writeAttributionNode(
+ @NonNull final int[] uids, @NonNull final String[] tags) {
+ final byte numUids = (byte) uids.length;
+ final byte numTags = (byte) tags.length;
+
+ if (numUids != numTags) {
+ mErrorMask |= ERROR_ATTRIBUTION_UIDS_TAGS_SIZES_NOT_EQUAL;
+ } else if (numUids > MAX_ATTRIBUTION_NODES) {
+ mErrorMask |= ERROR_ATTRIBUTION_CHAIN_TOO_LONG;
+ } else {
+ // Write attribution chain typeId byte, followed by 1-byte representation of
+ // number of attribution nodes, followed by encoding of each attribution node.
+ writeTypeId(TYPE_ATTRIBUTION_CHAIN);
+ mPos += mBuffer.putByte(mPos, numUids);
+ for (int i = 0; i < numUids; i++) {
+ // Each uid is encoded as 4-byte representation of its int value.
+ mPos += mBuffer.putInt(mPos, uids[i]);
+
+ // Each tag is encoded as 4-byte representation of number of bytes in its
+ // UTF-8 encoding, followed by the actual UTF-8 bytes.
+ final byte[] tagBytes = stringToBytes(tags[i]);
+ mPos += mBuffer.putInt(mPos, tagBytes.length);
+ mPos += mBuffer.putByteArray(mPos, tagBytes);
+ }
+ mNumElements++;
+ }
+ return this;
+ }
- /**
- * Appends the given String to the StatsEvent buffer.
- **/
- public int writeString(@NonNull final String value) {
- final byte[] valueBytes = stringToBytes(value);
- return writeByteArray(valueBytes);
+ /**
+ * Write a boolean annotation for the last field written.
+ **/
+ @NonNull
+ public Builder addBooleanAnnotation(
+ final byte annotationId, final boolean value) {
+ // Ensure there's a field written to annotate.
+ if (0 == mPosLastField) {
+ mErrorMask |= ERROR_ANNOTATION_DOES_NOT_FOLLOW_FIELD;
+ } else if (mCurrentAnnotationCount >= MAX_ANNOTATION_COUNT) {
+ mErrorMask |= ERROR_TOO_MANY_ANNOTATIONS;
+ } else {
+ mPos += mBuffer.putByte(mPos, annotationId);
+ mPos += mBuffer.putByte(mPos, TYPE_BOOLEAN);
+ mPos += mBuffer.putBoolean(mPos, value);
+ mCurrentAnnotationCount++;
+ writeAnnotationCount();
+ }
+ return this;
+ }
+
+ /**
+ * Write an integer annotation for the last field written.
+ **/
+ @NonNull
+ public Builder addIntAnnotation(final byte annotationId, final int value) {
+ if (0 == mPosLastField) {
+ mErrorMask |= ERROR_ANNOTATION_DOES_NOT_FOLLOW_FIELD;
+ } else if (mCurrentAnnotationCount >= MAX_ANNOTATION_COUNT) {
+ mErrorMask |= ERROR_TOO_MANY_ANNOTATIONS;
+ } else {
+ mPos += mBuffer.putByte(mPos, annotationId);
+ mPos += mBuffer.putByte(mPos, TYPE_INT);
+ mPos += mBuffer.putInt(mPos, value);
+ mCurrentAnnotationCount++;
+ writeAnnotationCount();
+ }
+ return this;
+ }
+
+ /**
+ * Builds a StatsEvent object with values entered in this Builder.
+ **/
+ @NonNull
+ public StatsEvent build() {
+ if (0L == mTimestampNs) {
+ mErrorMask |= ERROR_NO_TIMESTAMP;
+ }
+ if (0 == mAtomId) {
+ mErrorMask |= ERROR_NO_ATOM_ID;
+ }
+ if (mBuffer.hasOverflowed()) {
+ mErrorMask |= ERROR_OVERFLOW;
+ }
+ if (mNumElements > MAX_NUM_ELEMENTS) {
+ mErrorMask |= ERROR_TOO_MANY_FIELDS;
+ }
+
+ int size = mPos;
+ mPos = POS_TIMESTAMP_NS;
+ writeLong(mTimestampNs);
+ writeInt(mAtomId);
+ if (0 == mErrorMask) {
+ mBuffer.putByte(POS_NUM_ELEMENTS, (byte) mNumElements);
+ } else {
+ mBuffer.putByte(0, TYPE_ERRORS);
+ mBuffer.putByte(POS_NUM_ELEMENTS, (byte) 3);
+ mPos += mBuffer.putInt(mPos, mErrorMask);
+ size = mPos;
+ }
+
+ return new StatsEvent(mBuffer, size);
+ }
+
+ private void writeTypeId(final byte typeId) {
+ mPosLastField = mPos;
+ mLastType = typeId;
+ mCurrentAnnotationCount = 0;
+ final byte encodedId = (byte) (typeId & 0x0F);
+ mPos += mBuffer.putByte(mPos, encodedId);
+ }
+
+ private void writeAnnotationCount() {
+ // Use first 4 bits for annotation count and last 4 bits for typeId.
+ final byte encodedId = (byte) ((mCurrentAnnotationCount << 4) | (mLastType & 0x0F));
+ mBuffer.putByte(mPosLastField, encodedId);
+ }
+
+ @NonNull
+ private static byte[] stringToBytes(@Nullable final String value) {
+ return (null == value ? "" : value).getBytes(UTF_8);
+ }
}
- /**
- * Appends the AttributionNode specified as array of uids and array of tags.
- **/
- public int writeAttributionNode(@NonNull final int[] uids, @NonNull final String[] tags) {
- if (!hasTimestamp()) {
- return ERROR_NO_TIMESTAMP;
- } else if (!hasAtomId()) {
- return ERROR_NO_ATOM_ID;
- } else if (mPos + LIST_TYPE_OVERHEAD > MAX_EVENT_PAYLOAD) {
- return ERROR_BUFFER_LIMIT_EXCEEDED;
+ private static final class Buffer {
+ private static Object sLock = new Object();
+
+ @GuardedBy("sLock")
+ private static Buffer sPool;
+
+ private final byte[] mBytes = new byte[MAX_PAYLOAD_SIZE];
+ private boolean mOverflow = false;
+
+ @NonNull
+ private static Buffer obtain() {
+ final Buffer buffer;
+ synchronized (sLock) {
+ buffer = null == sPool ? new Buffer() : sPool;
+ sPool = null;
+ }
+ buffer.reset();
+ return buffer;
}
- final int numTags = tags.length;
- final int numUids = uids.length;
- if (numTags != numUids) {
- return ERROR_UID_TAG_COUNT_MISMATCH;
+ private Buffer() {
}
- int pos = mPos;
- mBuffer[pos] = LIST_TYPE;
- mBuffer[pos + 1] = (byte) numTags;
- pos += LIST_TYPE_OVERHEAD;
- for (int i = 0; i < numTags; i++) {
- final byte[] tagBytes = stringToBytes(tags[i]);
+ @NonNull
+ private byte[] getBytes() {
+ return mBytes;
+ }
- if (pos + LIST_TYPE_OVERHEAD + INT_TYPE_SIZE
- + STRING_TYPE_OVERHEAD + tagBytes.length > MAX_EVENT_PAYLOAD) {
- return ERROR_BUFFER_LIMIT_EXCEEDED;
+ private void release() {
+ synchronized (sLock) {
+ if (null == sPool) {
+ sPool = this;
+ }
}
+ }
- mBuffer[pos] = LIST_TYPE;
- mBuffer[pos + 1] = 2;
- pos += LIST_TYPE_OVERHEAD;
- mBuffer[pos] = INT_TYPE;
- copyInt(mBuffer, pos + 1, uids[i]);
- pos += INT_TYPE_SIZE;
- mBuffer[pos] = STRING_TYPE;
- copyInt(mBuffer, pos + 1, tagBytes.length);
- System.arraycopy(tagBytes, 0, mBuffer, pos + STRING_TYPE_OVERHEAD, tagBytes.length);
- pos += STRING_TYPE_OVERHEAD + tagBytes.length;
+ private void reset() {
+ mOverflow = false;
}
- mPos = pos;
- mNumElements++;
- return SUCCESS;
- }
- /**
- * Returns the byte array containing data in the statsd socket format.
- * @hide
- **/
- @NonNull
- public byte[] getBuffer() {
- // Encode number of elements in the buffer.
- mBuffer[POS_NUM_ELEMENTS] = (byte) mNumElements;
- return mBuffer;
- }
+ private boolean hasOverflowed() {
+ return mOverflow;
+ }
- /**
- * Returns number of bytes used by the buffer.
- * @hide
- **/
- public int size() {
- return mPos;
- }
+ /**
+ * Checks for available space in the byte array.
+ *
+ * @param index starting position in the buffer to start the check.
+ * @param numBytes number of bytes to check from index.
+ * @return true if space is available, false otherwise.
+ **/
+ private boolean hasEnoughSpace(final int index, final int numBytes) {
+ final boolean result = index + numBytes < MAX_PAYLOAD_SIZE;
+ if (!result) {
+ mOverflow = true;
+ }
+ return result;
+ }
- /**
- * Getter for atom id.
- * @hide
- **/
- public int getAtomId() {
- return mAtomId;
- }
+ /**
+ * Writes a byte into the buffer.
+ *
+ * @param index position in the buffer where the byte is written.
+ * @param value the byte to write.
+ * @return number of bytes written to buffer from this write operation.
+ **/
+ private int putByte(final int index, final byte value) {
+ if (hasEnoughSpace(index, Byte.BYTES)) {
+ mBytes[index] = (byte) (value);
+ return Byte.BYTES;
+ }
+ return 0;
+ }
- @NonNull
- private static byte[] stringToBytes(@Nullable final String value) {
- return (null == value ? "" : value).getBytes(UTF_8);
- }
+ /**
+ * Writes a boolean into the buffer.
+ *
+ * @param index position in the buffer where the boolean is written.
+ * @param value the boolean to write.
+ * @return number of bytes written to buffer from this write operation.
+ **/
+ private int putBoolean(final int index, final boolean value) {
+ return putByte(index, (byte) (value ? 1 : 0));
+ }
- // Helper methods for copying primitives
- private static void copyInt(@NonNull byte[] buff, int pos, int value) {
- buff[pos] = (byte) (value);
- buff[pos + 1] = (byte) (value >> 8);
- buff[pos + 2] = (byte) (value >> 16);
- buff[pos + 3] = (byte) (value >> 24);
- }
+ /**
+ * Writes an integer into the buffer.
+ *
+ * @param index position in the buffer where the integer is written.
+ * @param value the integer to write.
+ * @return number of bytes written to buffer from this write operation.
+ **/
+ private int putInt(final int index, final int value) {
+ if (hasEnoughSpace(index, Integer.BYTES)) {
+ // Use little endian byte order.
+ mBytes[index] = (byte) (value);
+ mBytes[index + 1] = (byte) (value >> 8);
+ mBytes[index + 2] = (byte) (value >> 16);
+ mBytes[index + 3] = (byte) (value >> 24);
+ return Integer.BYTES;
+ }
+ return 0;
+ }
+
+ /**
+ * Writes a long into the buffer.
+ *
+ * @param index position in the buffer where the long is written.
+ * @param value the long to write.
+ * @return number of bytes written to buffer from this write operation.
+ **/
+ private int putLong(final int index, final long value) {
+ if (hasEnoughSpace(index, Long.BYTES)) {
+ // Use little endian byte order.
+ mBytes[index] = (byte) (value);
+ mBytes[index + 1] = (byte) (value >> 8);
+ mBytes[index + 2] = (byte) (value >> 16);
+ mBytes[index + 3] = (byte) (value >> 24);
+ mBytes[index + 4] = (byte) (value >> 32);
+ mBytes[index + 5] = (byte) (value >> 40);
+ mBytes[index + 6] = (byte) (value >> 48);
+ mBytes[index + 7] = (byte) (value >> 56);
+ return Long.BYTES;
+ }
+ return 0;
+ }
+
+ /**
+ * Writes a float into the buffer.
+ *
+ * @param index position in the buffer where the float is written.
+ * @param value the float to write.
+ * @return number of bytes written to buffer from this write operation.
+ **/
+ private int putFloat(final int index, final float value) {
+ return putInt(index, Float.floatToIntBits(value));
+ }
- private static void copyLong(@NonNull byte[] buff, int pos, long value) {
- buff[pos] = (byte) (value);
- buff[pos + 1] = (byte) (value >> 8);
- buff[pos + 2] = (byte) (value >> 16);
- buff[pos + 3] = (byte) (value >> 24);
- buff[pos + 4] = (byte) (value >> 32);
- buff[pos + 5] = (byte) (value >> 40);
- buff[pos + 6] = (byte) (value >> 48);
- buff[pos + 7] = (byte) (value >> 56);
+ /**
+ * Copies a byte array into the buffer.
+ *
+ * @param index position in the buffer where the byte array is copied.
+ * @param value the byte array to copy.
+ * @return number of bytes written to buffer from this write operation.
+ **/
+ private int putByteArray(final int index, @NonNull final byte[] value) {
+ final int numBytes = value.length;
+ if (hasEnoughSpace(index, numBytes)) {
+ System.arraycopy(value, 0, mBytes, index, numBytes);
+ return numBytes;
+ }
+ return 0;
+ }
}
}
diff --git a/core/java/android/view/GestureDetector.java b/core/java/android/view/GestureDetector.java
index 8fbbcf4b88c6..d59ee92dba7e 100644
--- a/core/java/android/view/GestureDetector.java
+++ b/core/java/android/view/GestureDetector.java
@@ -145,7 +145,7 @@ public class GestureDetector {
boolean onSingleTapConfirmed(MotionEvent e);
/**
- * Notified when a double-tap occurs.
+ * Notified when a double-tap occurs. Triggered on the down event of second tap.
*
* @param e The down motion event of the first tap of the double-tap.
* @return true if the event is consumed, else false
@@ -378,7 +378,9 @@ public class GestureDetector {
*
* @param context the application's context
* @param listener the listener invoked for all the callbacks, this must
- * not be null.
+ * not be null. If the listener implements the {@link OnDoubleTapListener} or
+ * {@link OnContextClickListener} then it will also be set as the listener for
+ * these callbacks (for example when using the {@link SimpleOnGestureListener}).
*
* @throws NullPointerException if {@code listener} is null.
*/
@@ -393,7 +395,9 @@ public class GestureDetector {
*
* @param context the application's context
* @param listener the listener invoked for all the callbacks, this must
- * not be null.
+ * not be null. If the listener implements the {@link OnDoubleTapListener} or
+ * {@link OnContextClickListener} then it will also be set as the listener for
+ * these callbacks (for example when using the {@link SimpleOnGestureListener}).
* @param handler the handler to use for running deferred listener events.
*
* @throws NullPointerException if {@code listener} is null.
diff --git a/core/java/android/view/HapticFeedbackConstants.java b/core/java/android/view/HapticFeedbackConstants.java
index db01cea3e72b..37b9eb3bd3d1 100644
--- a/core/java/android/view/HapticFeedbackConstants.java
+++ b/core/java/android/view/HapticFeedbackConstants.java
@@ -115,13 +115,11 @@ public class HapticFeedbackConstants {
/**
* A haptic effect to signal the confirmation or successful completion of a user
* interaction.
- * @hide
*/
public static final int CONFIRM = 16;
/**
* A haptic effect to signal the rejection or failure of a user interaction.
- * @hide
*/
public static final int REJECT = 17;
diff --git a/core/java/android/view/IWindowContainer.aidl b/core/java/android/view/IWindowContainer.aidl
new file mode 100644
index 000000000000..878d86bcae9a
--- /dev/null
+++ b/core/java/android/view/IWindowContainer.aidl
@@ -0,0 +1,32 @@
+/*
+ * 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.view.SurfaceControl;
+
+/**
+ * Interface for a window container to communicate with the window manager. This also acts as a
+ * token.
+ * @hide
+ */
+interface IWindowContainer {
+
+ /**
+ * Gets a persistent leash for this container or {@code null}.
+ */
+ SurfaceControl getLeash();
+}
diff --git a/core/java/android/view/ViewDebug.java b/core/java/android/view/ViewDebug.java
index ad59ae5d2bee..36daa5c57700 100644
--- a/core/java/android/view/ViewDebug.java
+++ b/core/java/android/view/ViewDebug.java
@@ -945,6 +945,94 @@ public class ViewDebug {
return null;
}
+ private static class StreamingPictureCallbackHandler implements AutoCloseable,
+ HardwareRenderer.PictureCapturedCallback, Runnable {
+ private final HardwareRenderer mRenderer;
+ private final Callable<OutputStream> mCallback;
+ private final Executor mExecutor;
+ private final ReentrantLock mLock = new ReentrantLock(false);
+ private final ArrayDeque<byte[]> mQueue = new ArrayDeque<>(3);
+ private final ByteArrayOutputStream mByteStream = new ByteArrayOutputStream();
+ private boolean mStopListening;
+ private Thread mRenderThread;
+
+ private StreamingPictureCallbackHandler(HardwareRenderer renderer,
+ Callable<OutputStream> callback, Executor executor) {
+ mRenderer = renderer;
+ mCallback = callback;
+ mExecutor = executor;
+ mRenderer.setPictureCaptureCallback(this);
+ }
+
+ @Override
+ public void close() {
+ mLock.lock();
+ mStopListening = true;
+ mLock.unlock();
+ mRenderer.setPictureCaptureCallback(null);
+ }
+
+ @Override
+ public void onPictureCaptured(Picture picture) {
+ mLock.lock();
+ if (mStopListening) {
+ mLock.unlock();
+ mRenderer.setPictureCaptureCallback(null);
+ return;
+ }
+ if (mRenderThread == null) {
+ mRenderThread = Thread.currentThread();
+ }
+ boolean needsInvoke = true;
+ if (mQueue.size() == 3) {
+ mQueue.removeLast();
+ needsInvoke = false;
+ }
+ picture.writeToStream(mByteStream);
+ mQueue.add(mByteStream.toByteArray());
+ mByteStream.reset();
+ mLock.unlock();
+
+ if (needsInvoke) {
+ mExecutor.execute(this);
+ }
+ }
+
+ @Override
+ public void run() {
+ mLock.lock();
+ final byte[] picture = mQueue.poll();
+ final boolean isStopped = mStopListening;
+ mLock.unlock();
+ if (Thread.currentThread() == mRenderThread) {
+ close();
+ throw new IllegalStateException(
+ "ViewDebug#startRenderingCommandsCapture must be given an executor that "
+ + "invokes asynchronously");
+ }
+ if (isStopped) {
+ return;
+ }
+ OutputStream stream = null;
+ try {
+ stream = mCallback.call();
+ } catch (Exception ex) {
+ Log.w("ViewDebug", "Aborting rendering commands capture "
+ + "because callback threw exception", ex);
+ }
+ if (stream != null) {
+ try {
+ stream.write(picture);
+ } catch (IOException ex) {
+ Log.w("ViewDebug", "Aborting rendering commands capture "
+ + "due to IOException writing to output stream", ex);
+ }
+ } else {
+ close();
+ }
+ }
+ }
+
/**
* Begins capturing the entire rendering commands for the view tree referenced by the given
* view. The view passed may be any View in the tree as long as it is attached. That is,
@@ -990,18 +1078,7 @@ public class ViewDebug {
}
final HardwareRenderer renderer = attachInfo.mThreadedRenderer;
if (renderer != null) {
- return new PictureCallbackHandler(renderer, (picture -> {
- try {
- OutputStream stream = callback.call();
- if (stream != null) {
- picture.writeToStream(stream);
- return true;
- }
- } catch (Exception ex) {
- // fall through
- }
- return false;
- }), executor);
+ return new StreamingPictureCallbackHandler(renderer, callback, executor);
}
return null;
}
diff --git a/core/java/android/view/WindowContainerTransaction.aidl b/core/java/android/view/WindowContainerTransaction.aidl
new file mode 100644
index 000000000000..46ba6c1d5c59
--- /dev/null
+++ b/core/java/android/view/WindowContainerTransaction.aidl
@@ -0,0 +1,19 @@
+/*
+ * 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;
+
+parcelable WindowContainerTransaction;
diff --git a/core/java/android/view/WindowContainerTransaction.java b/core/java/android/view/WindowContainerTransaction.java
new file mode 100644
index 000000000000..607a87047733
--- /dev/null
+++ b/core/java/android/view/WindowContainerTransaction.java
@@ -0,0 +1,173 @@
+/*
+ * 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.app.WindowConfiguration;
+import android.content.pm.ActivityInfo;
+import android.content.res.Configuration;
+import android.graphics.Rect;
+import android.os.IBinder;
+import android.os.Parcel;
+import android.os.Parcelable;
+import android.util.ArrayMap;
+
+import java.util.Map;
+
+/**
+ * Represents a collection of operations on some WindowContainers that should be applied all at
+ * once.
+ *
+ * @hide
+ */
+public class WindowContainerTransaction implements Parcelable {
+ private final ArrayMap<IBinder, Change> mChanges = new ArrayMap<>();
+
+ public WindowContainerTransaction() {}
+
+ protected WindowContainerTransaction(Parcel in) {
+ in.readMap(mChanges, null /* loader */);
+ }
+
+ private Change getOrCreateChange(IBinder token) {
+ Change out = mChanges.get(token);
+ if (out == null) {
+ out = new Change();
+ mChanges.put(token, out);
+ }
+ return out;
+ }
+
+ /**
+ * Resize a container.
+ */
+ public WindowContainerTransaction setBounds(IWindowContainer container, Rect bounds) {
+ Change chg = getOrCreateChange(container.asBinder());
+ chg.mConfiguration.windowConfiguration.setBounds(bounds);
+ chg.mConfigSetMask |= ActivityInfo.CONFIG_WINDOW_CONFIGURATION;
+ chg.mWindowSetMask |= WindowConfiguration.WINDOW_CONFIG_BOUNDS;
+ return this;
+ }
+
+ public Map<IBinder, Change> getChanges() {
+ return mChanges;
+ }
+
+ @Override
+ public String toString() {
+ return "WindowContainerTransaction { changes = " + mChanges + " }";
+ }
+
+ @Override
+ public void writeToParcel(Parcel dest, int flags) {
+ dest.writeMap(mChanges);
+ }
+
+ @Override
+ public int describeContents() {
+ return 0;
+ }
+
+ public static final Creator<WindowContainerTransaction> CREATOR =
+ new Creator<WindowContainerTransaction>() {
+ @Override
+ public WindowContainerTransaction createFromParcel(Parcel in) {
+ return new WindowContainerTransaction(in);
+ }
+
+ @Override
+ public WindowContainerTransaction[] newArray(int size) {
+ return new WindowContainerTransaction[size];
+ }
+ };
+
+ /**
+ * Holds changes on a single WindowContainer including Configuration changes.
+ *
+ * @hide
+ */
+ public static class Change implements Parcelable {
+ private final Configuration mConfiguration = new Configuration();
+ private @ActivityInfo.Config int mConfigSetMask = 0;
+ private @WindowConfiguration.WindowConfig int mWindowSetMask = 0;
+
+ public Change() {}
+
+ protected Change(Parcel in) {
+ mConfiguration.readFromParcel(in);
+ mConfigSetMask = in.readInt();
+ mWindowSetMask = in.readInt();
+ }
+
+ public Configuration getConfiguration() {
+ return mConfiguration;
+ }
+
+ @ActivityInfo.Config
+ public int getConfigSetMask() {
+ return mConfigSetMask;
+ }
+
+ @WindowConfiguration.WindowConfig
+ public int getWindowSetMask() {
+ return mWindowSetMask;
+ }
+
+ @Override
+ public String toString() {
+ final boolean changesBounds =
+ (mConfigSetMask & ActivityInfo.CONFIG_WINDOW_CONFIGURATION) != 0
+ && ((mWindowSetMask & WindowConfiguration.WINDOW_CONFIG_BOUNDS)
+ != 0);
+ final boolean changesSss =
+ (mConfigSetMask & ActivityInfo.CONFIG_SMALLEST_SCREEN_SIZE) != 0;
+ StringBuilder sb = new StringBuilder();
+ sb.append('{');
+ if (changesBounds) {
+ sb.append("bounds:" + mConfiguration.windowConfiguration.getBounds() + ",");
+ }
+ if (changesSss) {
+ sb.append("ssw:" + mConfiguration.smallestScreenWidthDp + ",");
+ }
+ sb.append("}");
+ return sb.toString();
+ }
+
+ @Override
+ public void writeToParcel(Parcel dest, int flags) {
+ mConfiguration.writeToParcel(dest, flags);
+ dest.writeInt(mConfigSetMask);
+ dest.writeInt(mWindowSetMask);
+ }
+
+ @Override
+ public int describeContents() {
+ return 0;
+ }
+
+ public static final Creator<Change> CREATOR = new Creator<Change>() {
+ @Override
+ public Change createFromParcel(Parcel in) {
+ return new Change(in);
+ }
+
+ @Override
+ public Change[] newArray(int size) {
+ return new Change[size];
+ }
+ };
+ }
+}
diff --git a/core/java/android/widget/Editor.java b/core/java/android/widget/Editor.java
index 57ce28e5059a..27402a463d4f 100644
--- a/core/java/android/widget/Editor.java
+++ b/core/java/android/widget/Editor.java
@@ -1189,6 +1189,9 @@ public class Editor {
}
public boolean performLongClick(boolean handled) {
+ if (TextView.DEBUG_CURSOR) {
+ logCursor("performLongClick", "handled=%s", handled);
+ }
// Long press in empty space moves cursor and starts the insertion action mode.
if (!handled && !isPositionOnText(mLastDownPositionX, mLastDownPositionY)
&& mInsertionControllerEnabled) {
@@ -1252,6 +1255,10 @@ public class Editor {
}
void onFocusChanged(boolean focused, int direction) {
+ if (TextView.DEBUG_CURSOR) {
+ logCursor("onFocusChanged", "focused=%s", focused);
+ }
+
mShowCursor = SystemClock.uptimeMillis();
ensureEndedBatchEdit();
@@ -1450,12 +1457,22 @@ public class Editor {
} else {
mTapState = TAP_STATE_TRIPLE_CLICK;
}
+ if (TextView.DEBUG_CURSOR) {
+ logCursor("updateTapState", "ACTION_DOWN: %s tap detected",
+ (mTapState == TAP_STATE_DOUBLE_TAP ? "double" : "triple"));
+ }
} else {
mTapState = TAP_STATE_FIRST_TAP;
+ if (TextView.DEBUG_CURSOR) {
+ logCursor("updateTapState", "ACTION_DOWN: first tap detected");
+ }
}
}
if (action == MotionEvent.ACTION_UP) {
mLastTouchUpTime = SystemClock.uptimeMillis();
+ if (TextView.DEBUG_CURSOR) {
+ logCursor("updateTapState", "ACTION_UP");
+ }
}
}
@@ -2354,6 +2371,9 @@ public class Editor {
}
void onTouchUpEvent(MotionEvent event) {
+ if (TextView.DEBUG_CURSOR) {
+ logCursor("onTouchUpEvent", null);
+ }
if (getSelectionActionModeHelper().resetSelection(
getTextView().getOffsetForPosition(event.getX(), event.getY()))) {
return;
@@ -2481,6 +2501,9 @@ public class Editor {
loadCursorDrawable();
final int left = clampHorizontalPosition(mDrawableForCursor, horizontal);
final int width = mDrawableForCursor.getIntrinsicWidth();
+ if (TextView.DEBUG_CURSOR) {
+ logCursor("updateCursorPosition", "left=%s, top=%s", left, (top - mTempRect.top));
+ }
mDrawableForCursor.setBounds(left, top - mTempRect.top, left + width,
bottom + mTempRect.bottom);
}
@@ -4621,6 +4644,11 @@ public class Editor {
}
public void show() {
+ if (TextView.DEBUG_CURSOR) {
+ logCursor(getClass().getSimpleName() + ": HandleView: show()", "offset=%s",
+ getCurrentCursorOffset());
+ }
+
if (isShowing()) return;
getPositionListener().addSubscriber(this, true /* local position may change */);
@@ -4637,6 +4665,11 @@ public class Editor {
}
public void hide() {
+ if (TextView.DEBUG_CURSOR) {
+ logCursor(getClass().getSimpleName() + ": HandleView: hide()", "offset=%s",
+ getCurrentCursorOffset());
+ }
+
dismiss();
getPositionListener().removeSubscriber(this);
@@ -5033,6 +5066,11 @@ public class Editor {
@Override
public boolean onTouchEvent(MotionEvent ev) {
+ if (TextView.DEBUG_CURSOR) {
+ logCursor(this.getClass().getSimpleName() + ": HandleView: onTouchEvent",
+ MotionEvent.actionToString(ev.getActionMasked()));
+ }
+
updateFloatingToolbarVisibility(ev);
switch (ev.getActionMasked()) {
@@ -5951,6 +5989,10 @@ public class Editor {
distanceSquared < doubleTapSlop * doubleTapSlop;
if (stayedInArea && (isMouse || isPositionOnText(eventX, eventY))) {
+ if (TextView.DEBUG_CURSOR) {
+ logCursor("SelectionModifierCursorController: onTouchEvent",
+ "ACTION_DOWN: select and start drag");
+ }
if (mTapState == TAP_STATE_DOUBLE_TAP) {
selectCurrentWordAndStartDrag();
} else if (mTapState == TAP_STATE_TRIPLE_CLICK) {
@@ -6028,6 +6070,9 @@ public class Editor {
break;
case MotionEvent.ACTION_UP:
+ if (TextView.DEBUG_CURSOR) {
+ logCursor("SelectionModifierCursorController: onTouchEvent", "ACTION_UP");
+ }
if (!isDragAcceleratorActive()) {
break;
}
@@ -7119,4 +7164,12 @@ public class Editor {
return resolveInfo.loadLabel(mPackageManager);
}
}
+
+ private static void logCursor(String location, @Nullable String msgFormat, Object ... msgArgs) {
+ if (msgFormat == null) {
+ Log.d(TAG, location);
+ } else {
+ Log.d(TAG, location + ": " + String.format(msgFormat, msgArgs));
+ }
+ }
}
diff --git a/core/java/android/widget/SimpleMonthView.java b/core/java/android/widget/SimpleMonthView.java
index 562cc4ffeeaa..217693eed686 100644
--- a/core/java/android/widget/SimpleMonthView.java
+++ b/core/java/android/widget/SimpleMonthView.java
@@ -28,6 +28,7 @@ import android.graphics.Paint.Style;
import android.graphics.Rect;
import android.graphics.Typeface;
import android.icu.text.DisplayContext;
+import android.icu.text.RelativeDateTimeFormatter;
import android.icu.text.SimpleDateFormat;
import android.icu.util.Calendar;
import android.os.Bundle;
@@ -1095,6 +1096,14 @@ class SimpleMonthView extends View {
node.setText(getDayText(virtualViewId));
node.setContentDescription(getDayDescription(virtualViewId));
+ if (virtualViewId == mToday) {
+ RelativeDateTimeFormatter fmt = RelativeDateTimeFormatter.getInstance();
+ node.setStateDescription(fmt.format(RelativeDateTimeFormatter.Direction.THIS,
+ RelativeDateTimeFormatter.AbsoluteUnit.DAY));
+ }
+ if (virtualViewId == mActivatedDay) {
+ node.setSelected(true);
+ }
node.setBoundsInParent(mTempRect);
final boolean isDayEnabled = isDayEnabled(virtualViewId);
diff --git a/core/java/android/widget/TextView.java b/core/java/android/widget/TextView.java
index 31f50555af1d..90e8ef2c6423 100644
--- a/core/java/android/widget/TextView.java
+++ b/core/java/android/widget/TextView.java
@@ -345,6 +345,8 @@ import java.util.function.Supplier;
public class TextView extends View implements ViewTreeObserver.OnPreDrawListener {
static final String LOG_TAG = "TextView";
static final boolean DEBUG_EXTRACT = false;
+ static final boolean DEBUG_CURSOR = false;
+
private static final float[] TEMP_POSITION = new float[2];
// Enum for the "typeface" XML parameter.
@@ -10857,6 +10859,10 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
@Override
public boolean onTouchEvent(MotionEvent event) {
+ if (DEBUG_CURSOR) {
+ logCursor("onTouchEvent", MotionEvent.actionToString(event.getActionMasked()));
+ }
+
final int action = event.getActionMasked();
if (mEditor != null) {
mEditor.onTouchEvent(event);
@@ -10868,6 +10874,9 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
}
final boolean superResult = super.onTouchEvent(event);
+ if (DEBUG_CURSOR) {
+ logCursor("onTouchEvent", "superResult=%s", superResult);
+ }
/*
* Don't handle the release after a long press, because it will move the selection away from
@@ -10876,7 +10885,9 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
*/
if (mEditor != null && mEditor.mDiscardNextActionUp && action == MotionEvent.ACTION_UP) {
mEditor.mDiscardNextActionUp = false;
-
+ if (DEBUG_CURSOR) {
+ logCursor("onTouchEvent", "release after long press detected");
+ }
if (mEditor.mIsInsertionActionModeStartPending) {
mEditor.startInsertionActionMode();
mEditor.mIsInsertionActionModeStartPending = false;
@@ -12254,6 +12265,10 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
@Override
public boolean performLongClick() {
+ if (DEBUG_CURSOR) {
+ logCursor("performLongClick", null);
+ }
+
boolean handled = false;
boolean performedHapticFeedback = false;
@@ -13481,4 +13496,12 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
TextView.this.spanChange(buf, what, s, -1, e, -1);
}
}
+
+ private static void logCursor(String location, @Nullable String msgFormat, Object ... msgArgs) {
+ if (msgFormat == null) {
+ Log.d(LOG_TAG, location);
+ } else {
+ Log.d(LOG_TAG, location + ": " + String.format(msgFormat, msgArgs));
+ }
+ }
}
diff --git a/core/java/com/android/internal/app/DumpHeapActivity.java b/core/java/com/android/internal/app/DumpHeapActivity.java
deleted file mode 100644
index e04e870a8ec5..000000000000
--- a/core/java/com/android/internal/app/DumpHeapActivity.java
+++ /dev/null
@@ -1,151 +0,0 @@
-/*
- * Copyright (C) 2015 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.internal.app;
-
-import android.app.Activity;
-import android.app.ActivityManager;
-import android.app.AlertDialog;
-import android.content.ActivityNotFoundException;
-import android.content.ClipData;
-import android.content.DialogInterface;
-import android.content.Intent;
-import android.net.Uri;
-import android.os.Bundle;
-import android.util.DebugUtils;
-import android.util.Slog;
-
-/**
- * This activity is displayed when the system has collected a heap dump from
- * a large process and the user has selected to share it.
- */
-public class DumpHeapActivity extends Activity {
- /** The process we are reporting */
- public static final String KEY_PROCESS = "process";
- /** The size limit the process reached */
- public static final String KEY_SIZE = "size";
- /** Whether the user initiated the dump or not. */
- public static final String KEY_IS_USER_INITIATED = "is_user_initiated";
- /** Whether the process is a system process (eg: Android System) or not. */
- public static final String KEY_IS_SYSTEM_PROCESS = "is_system_process";
- /** Optional name of package to directly launch */
- public static final String KEY_DIRECT_LAUNCH = "direct_launch";
-
- // Broadcast action to determine when to delete the current dump heap data.
- public static final String ACTION_DELETE_DUMPHEAP = "com.android.server.am.DELETE_DUMPHEAP";
-
- // Extra for above: delay delete of data, since the user is in the process of sharing it.
- public static final String EXTRA_DELAY_DELETE = "delay_delete";
-
- static final public Uri JAVA_URI = Uri.parse("content://com.android.server.heapdump/java");
-
- String mProcess;
- long mSize;
- AlertDialog mDialog;
- boolean mHandled = false;
-
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
-
- mProcess = getIntent().getStringExtra(KEY_PROCESS);
- mSize = getIntent().getLongExtra(KEY_SIZE, 0);
- final boolean isUserInitiated = getIntent().getBooleanExtra(KEY_IS_USER_INITIATED, false);
- final boolean isSystemProcess = getIntent().getBooleanExtra(KEY_IS_SYSTEM_PROCESS, false);
-
- String directLaunch = getIntent().getStringExtra(KEY_DIRECT_LAUNCH);
- if (directLaunch != null) {
- Intent intent = new Intent(ActivityManager.ACTION_REPORT_HEAP_LIMIT);
- intent.setPackage(directLaunch);
- ClipData clip = ClipData.newUri(getContentResolver(), "Heap Dump", JAVA_URI);
- intent.setClipData(clip);
- intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
- intent.setType(clip.getDescription().getMimeType(0));
- intent.putExtra(Intent.EXTRA_STREAM, JAVA_URI);
- try {
- startActivity(intent);
- scheduleDelete();
- mHandled = true;
- finish();
- return;
- } catch (ActivityNotFoundException e) {
- Slog.i("DumpHeapActivity", "Unable to direct launch to " + directLaunch
- + ": " + e.getMessage());
- }
- }
-
- final int messageId;
- if (isUserInitiated) {
- messageId = com.android.internal.R.string.dump_heap_ready_text;
- } else if (isSystemProcess) {
- messageId = com.android.internal.R.string.dump_heap_system_text;
- } else {
- messageId = com.android.internal.R.string.dump_heap_text;
- }
- AlertDialog.Builder b = new AlertDialog.Builder(this,
- android.R.style.Theme_Material_Light_Dialog_Alert);
- b.setTitle(com.android.internal.R.string.dump_heap_title);
- b.setMessage(getString(
- messageId, mProcess, DebugUtils.sizeValueToString(mSize, null)));
- b.setNegativeButton(android.R.string.cancel, new DialogInterface.OnClickListener() {
- @Override
- public void onClick(DialogInterface dialog, int which) {
- mHandled = true;
- sendBroadcast(new Intent(ACTION_DELETE_DUMPHEAP));
- finish();
- }
- });
- b.setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() {
- @Override
- public void onClick(DialogInterface dialog, int which) {
- mHandled = true;
- scheduleDelete();
- Intent intent = new Intent(Intent.ACTION_SEND);
- ClipData clip = ClipData.newUri(getContentResolver(), "Heap Dump", JAVA_URI);
- intent.setClipData(clip);
- intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
- intent.setType(clip.getDescription().getMimeType(0));
- intent.putExtra(Intent.EXTRA_STREAM, JAVA_URI);
- startActivity(Intent.createChooser(intent,
- getText(com.android.internal.R.string.dump_heap_title)));
- finish();
- }
- });
- mDialog = b.show();
- }
-
- void scheduleDelete() {
- Intent broadcast = new Intent(ACTION_DELETE_DUMPHEAP);
- broadcast.putExtra(EXTRA_DELAY_DELETE, true);
- sendBroadcast(broadcast);
- }
-
- @Override
- protected void onStop() {
- super.onStop();
- if (!isChangingConfigurations()) {
- if (!mHandled) {
- sendBroadcast(new Intent(ACTION_DELETE_DUMPHEAP));
- }
- }
- }
-
- @Override
- protected void onDestroy() {
- super.onDestroy();
- mDialog.dismiss();
- }
-}
diff --git a/core/java/com/android/internal/app/procstats/ProcessState.java b/core/java/com/android/internal/app/procstats/ProcessState.java
index 2f9136a2577e..392b8d300397 100644
--- a/core/java/com/android/internal/app/procstats/ProcessState.java
+++ b/core/java/com/android/internal/app/procstats/ProcessState.java
@@ -77,7 +77,6 @@ public final class ProcessState {
STATE_PERSISTENT, // ActivityManager.PROCESS_STATE_PERSISTENT
STATE_PERSISTENT, // ActivityManager.PROCESS_STATE_PERSISTENT_UI
STATE_TOP, // ActivityManager.PROCESS_STATE_TOP
- STATE_IMPORTANT_FOREGROUND, // ActivityManager.PROCESS_STATE_FOREGROUND_SERVICE_LOCATION
STATE_IMPORTANT_FOREGROUND, // ActivityManager.PROCESS_STATE_BOUND_TOP
STATE_IMPORTANT_FOREGROUND, // ActivityManager.PROCESS_STATE_FOREGROUND_SERVICE
STATE_IMPORTANT_FOREGROUND, // ActivityManager.PROCESS_STATE_BOUND_FOREGROUND_SERVICE
diff --git a/core/java/com/android/internal/compat/CompatibilityChangeConfig.java b/core/java/com/android/internal/compat/CompatibilityChangeConfig.java
index fd2ada08edc1..36bc22906695 100644
--- a/core/java/com/android/internal/compat/CompatibilityChangeConfig.java
+++ b/core/java/com/android/internal/compat/CompatibilityChangeConfig.java
@@ -49,6 +49,18 @@ public final class CompatibilityChangeConfig implements Parcelable {
return mChangeConfig.forceDisabledSet();
}
+ /**
+ * Returns if a change is enabled or disabled in this config.
+ */
+ public boolean isChangeEnabled(long changeId) {
+ if (mChangeConfig.isForceEnabled(changeId)) {
+ return true;
+ } else if (mChangeConfig.isForceDisabled(changeId)) {
+ return false;
+ }
+ throw new IllegalStateException("Change " + changeId + " is not defined.");
+ }
+
private CompatibilityChangeConfig(Parcel in) {
long[] enabledArray = in.createLongArray();
long[] disabledArray = in.createLongArray();
diff --git a/core/java/com/android/internal/compat/CompatibilityChangeInfo.aidl b/core/java/com/android/internal/compat/CompatibilityChangeInfo.aidl
new file mode 100644
index 000000000000..3bc72771f99c
--- /dev/null
+++ b/core/java/com/android/internal/compat/CompatibilityChangeInfo.aidl
@@ -0,0 +1,19 @@
+/*
+ * 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.internal.compat;
+
+parcelable CompatibilityChangeInfo;
diff --git a/core/java/com/android/internal/compat/CompatibilityChangeInfo.java b/core/java/com/android/internal/compat/CompatibilityChangeInfo.java
new file mode 100644
index 000000000000..e48e2df4043c
--- /dev/null
+++ b/core/java/com/android/internal/compat/CompatibilityChangeInfo.java
@@ -0,0 +1,92 @@
+/*
+ * 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.internal.compat;
+
+import android.annotation.Nullable;
+import android.os.Parcel;
+import android.os.Parcelable;
+
+/**
+ * This class is a parcelable version of {@link com.android.server.compat.Change}.
+ *
+ * @hide
+ */
+public class CompatibilityChangeInfo implements Parcelable {
+ private final long mChangeId;
+ private final @Nullable String mName;
+ private final int mEnableAfterTargetSdk;
+ private final boolean mDisabled;
+
+ public long getId() {
+ return mChangeId;
+ }
+
+ @Nullable
+ public String getName() {
+ return mName;
+ }
+
+ public int getEnableAfterTargetSdk() {
+ return mEnableAfterTargetSdk;
+ }
+
+ public boolean getDisabled() {
+ return mDisabled;
+ }
+
+ public CompatibilityChangeInfo(
+ Long changeId, String name, int enableAfterTargetSdk, boolean disabled) {
+ this.mChangeId = changeId;
+ this.mName = name;
+ this.mEnableAfterTargetSdk = enableAfterTargetSdk;
+ this.mDisabled = disabled;
+ }
+
+ private CompatibilityChangeInfo(Parcel in) {
+ mChangeId = in.readLong();
+ mName = in.readString();
+ mEnableAfterTargetSdk = in.readInt();
+ mDisabled = in.readBoolean();
+ }
+
+ @Override
+ public int describeContents() {
+ return 0;
+ }
+
+ @Override
+ public void writeToParcel(Parcel dest, int flags) {
+ dest.writeLong(mChangeId);
+ dest.writeString(mName);
+ dest.writeInt(mEnableAfterTargetSdk);
+ dest.writeBoolean(mDisabled);
+ }
+
+ public static final Parcelable.Creator<CompatibilityChangeInfo> CREATOR =
+ new Parcelable.Creator<CompatibilityChangeInfo>() {
+
+ @Override
+ public CompatibilityChangeInfo createFromParcel(Parcel in) {
+ return new CompatibilityChangeInfo(in);
+ }
+
+ @Override
+ public CompatibilityChangeInfo[] newArray(int size) {
+ return new CompatibilityChangeInfo[size];
+ }
+ };
+}
diff --git a/core/java/com/android/internal/compat/IPlatformCompat.aidl b/core/java/com/android/internal/compat/IPlatformCompat.aidl
index 8391ad2f12c2..5857642cbd4e 100644
--- a/core/java/com/android/internal/compat/IPlatformCompat.aidl
+++ b/core/java/com/android/internal/compat/IPlatformCompat.aidl
@@ -17,8 +17,10 @@
package com.android.internal.compat;
import android.content.pm.ApplicationInfo;
+import java.util.Map;
parcelable CompatibilityChangeConfig;
+parcelable CompatibilityChangeInfo;
/**
* Platform private API for talking with the PlatformCompat service.
@@ -146,4 +148,21 @@ interface IPlatformCompat
*
*/
void clearOverrides(in String packageName);
+
+ /**
+ * Get configs for an application.
+ *
+ * @param appInfo The application whose config will be returned.
+ *
+ * @return A {@link CompatibilityChangeConfig}, representing whether a change is enabled for
+ * the given app or not.
+ */
+ CompatibilityChangeConfig getAppConfig(in ApplicationInfo appInfo);
+
+ /**
+ * List all compatibility changes.
+ *
+ * @return An array of {@link CompatChangeInfo} known to the service.
+ */
+ CompatibilityChangeInfo[] listAllChanges();
}
diff --git a/core/java/com/android/internal/config/sysui/SystemUiDeviceConfigFlags.java b/core/java/com/android/internal/config/sysui/SystemUiDeviceConfigFlags.java
index 033e9b2c6eba..36a7a9c91ee4 100644
--- a/core/java/com/android/internal/config/sysui/SystemUiDeviceConfigFlags.java
+++ b/core/java/com/android/internal/config/sysui/SystemUiDeviceConfigFlags.java
@@ -337,6 +337,14 @@ public final class SystemUiDeviceConfigFlags {
"brightline_falsing_zigzag_y_secondary_deviance";
+ // Flags related to screenshots
+
+ /**
+ * (boolean) Whether screenshot flow going to the corner (instead of shown in a notification)
+ * is enabled.
+ */
+ public static final String SCREENSHOT_CORNER_FLOW = "screenshot_corner_flow";
+
private SystemUiDeviceConfigFlags() {
}
}
diff --git a/core/java/com/android/internal/os/KernelCpuUidTimeReader.java b/core/java/com/android/internal/os/KernelCpuUidTimeReader.java
index e6d044f4722b..f1eb2fb56331 100644
--- a/core/java/com/android/internal/os/KernelCpuUidTimeReader.java
+++ b/core/java/com/android/internal/os/KernelCpuUidTimeReader.java
@@ -403,7 +403,7 @@ public abstract class KernelCpuUidTimeReader<T> {
}
private long[] readFreqs(String line) {
- if (line == null) {
+ if (line == null || line.trim().isEmpty()) {
return null;
}
final String[] lineArray = line.split(" ");
@@ -620,14 +620,18 @@ public abstract class KernelCpuUidTimeReader<T> {
return true;
}
- String str = line.toString();
+ String str = line.toString().trim();
+ if (str.isEmpty()) {
+ Slog.w(mTag, "Empty uid_concurrent_active_time");
+ return false;
+ }
if (!str.startsWith("cpus:")) {
- Slog.wtf(mTag, "Malformed uid_concurrent_active_time line: " + line);
+ Slog.wtf(mTag, "Malformed uid_concurrent_active_time line: " + str);
return false;
}
int cores = Integer.parseInt(str.substring(5).trim(), 10);
if (cores <= 0) {
- Slog.wtf(mTag, "Malformed uid_concurrent_active_time line: " + line);
+ Slog.wtf(mTag, "Malformed uid_concurrent_active_time line: " + str);
return false;
}
mCores = cores;
@@ -750,17 +754,22 @@ public abstract class KernelCpuUidTimeReader<T> {
if (mNumClusters > 0) {
return true;
}
+ String lineStr = line.toString().trim();
+ if (lineStr.isEmpty()) {
+ Slog.w(mTag, "Empty uid_concurrent_policy_time");
+ return false;
+ }
// Parse # cores in clusters.
- String[] lineArray = line.toString().split(" ");
+ String[] lineArray = lineStr.split(" ");
if (lineArray.length % 2 != 0) {
- Slog.wtf(mTag, "Malformed uid_concurrent_policy_time line: " + line);
+ Slog.wtf(mTag, "Malformed uid_concurrent_policy_time line: " + lineStr);
return false;
}
int[] clusters = new int[lineArray.length / 2];
int cores = 0;
for (int i = 0; i < clusters.length; i++) {
if (!lineArray[i * 2].startsWith("policy")) {
- Slog.wtf(mTag, "Malformed uid_concurrent_policy_time line: " + line);
+ Slog.wtf(mTag, "Malformed uid_concurrent_policy_time line: " + lineStr);
return false;
}
clusters[i] = Integer.parseInt(lineArray[i * 2 + 1], 10);
diff --git a/core/java/com/android/internal/statusbar/IStatusBarService.aidl b/core/java/com/android/internal/statusbar/IStatusBarService.aidl
index 499a4d2fb949..d703b86d6c8d 100644
--- a/core/java/com/android/internal/statusbar/IStatusBarService.aidl
+++ b/core/java/com/android/internal/statusbar/IStatusBarService.aidl
@@ -21,6 +21,7 @@ import android.net.Uri;
import android.content.ComponentName;
import android.graphics.Rect;
import android.os.Bundle;
+import android.os.UserHandle;
import android.service.notification.StatusBarNotification;
import android.hardware.biometrics.IBiometricServiceReceiverInternal;
@@ -78,7 +79,8 @@ interface IStatusBarService
void onNotificationSettingsViewed(String key);
void setSystemUiVisibility(int displayId, int vis, int mask, String cause);
void onNotificationBubbleChanged(String key, boolean isBubble);
- void grantInlineReplyUriPermission(String key, in Uri uri);
+ void grantInlineReplyUriPermission(String key, in Uri uri, in UserHandle user, String packageName);
+ void clearInlineReplyUriPermissions(String key);
void onGlobalActionsShown();
void onGlobalActionsHidden();
diff --git a/core/java/com/android/server/SystemConfig.java b/core/java/com/android/server/SystemConfig.java
index b7523963ec19..db91dc5a8bc3 100644
--- a/core/java/com/android/server/SystemConfig.java
+++ b/core/java/com/android/server/SystemConfig.java
@@ -863,11 +863,7 @@ public class SystemConfig {
XmlUtils.skipCurrentTag(parser);
} break;
case "component-override": {
- if (allowAppConfigs) {
- readComponentOverrides(parser, permFile);
- } else {
- logNotAllowedInPartition(name, permFile, parser);
- }
+ readComponentOverrides(parser, permFile);
XmlUtils.skipCurrentTag(parser);
} break;
case "backup-transport-whitelisted-service": {
diff --git a/core/jni/android_graphics_Picture.cpp b/core/jni/android_graphics_Picture.cpp
index 03fcdef8fbfe..1d085e5ccc49 100644
--- a/core/jni/android_graphics_Picture.cpp
+++ b/core/jni/android_graphics_Picture.cpp
@@ -20,9 +20,12 @@
#include "SkCanvas.h"
#include "SkStream.h"
#include "core_jni_helpers.h"
+#include "nativehelper/jni_macros.h"
#include <jni.h>
+#include <array>
+
namespace android {
static jlong android_graphics_Picture_newPicture(JNIEnv* env, jobject, jlong srcHandle) {
@@ -91,20 +94,20 @@ static void android_graphics_Picture_endRecording(JNIEnv* env, jobject, jlong pi
pict->endRecording();
}
-static const JNINativeMethod gMethods[] = {
- {"nativeGetWidth", "(J)I", (void*) android_graphics_Picture_getWidth},
- {"nativeGetHeight", "(J)I", (void*) android_graphics_Picture_getHeight},
- {"nativeConstructor", "(J)J", (void*) android_graphics_Picture_newPicture},
- {"nativeCreateFromStream", "(Ljava/io/InputStream;[B)J", (void*)android_graphics_Picture_deserialize},
- {"nativeBeginRecording", "(JII)J", (void*) android_graphics_Picture_beginRecording},
- {"nativeEndRecording", "(J)V", (void*) android_graphics_Picture_endRecording},
- {"nativeDraw", "(JJ)V", (void*) android_graphics_Picture_draw},
- {"nativeWriteToStream", "(JLjava/io/OutputStream;[B)Z", (void*)android_graphics_Picture_serialize},
- {"nativeDestructor","(J)V", (void*) android_graphics_Picture_killPicture}
+static const std::array gMethods = {
+ MAKE_JNI_NATIVE_METHOD("nativeGetWidth", "(J)I", android_graphics_Picture_getWidth),
+ MAKE_JNI_NATIVE_METHOD("nativeGetHeight", "(J)I", android_graphics_Picture_getHeight),
+ MAKE_JNI_NATIVE_METHOD("nativeConstructor", "(J)J", android_graphics_Picture_newPicture),
+ MAKE_JNI_NATIVE_METHOD("nativeCreateFromStream", "(Ljava/io/InputStream;[B)J", android_graphics_Picture_deserialize),
+ MAKE_JNI_NATIVE_METHOD("nativeBeginRecording", "(JII)J", android_graphics_Picture_beginRecording),
+ MAKE_JNI_NATIVE_METHOD("nativeEndRecording", "(J)V", android_graphics_Picture_endRecording),
+ MAKE_JNI_NATIVE_METHOD("nativeDraw", "(JJ)V", android_graphics_Picture_draw),
+ MAKE_JNI_NATIVE_METHOD("nativeWriteToStream", "(JLjava/io/OutputStream;[B)Z", android_graphics_Picture_serialize),
+ MAKE_JNI_NATIVE_METHOD("nativeDestructor","(J)V", android_graphics_Picture_killPicture)
};
int register_android_graphics_Picture(JNIEnv* env) {
- return RegisterMethodsOrDie(env, "android/graphics/Picture", gMethods, NELEM(gMethods));
+ return RegisterMethodsOrDie(env, "android/graphics/Picture", gMethods.data(), gMethods.size());
}
}; // namespace android
diff --git a/core/proto/OWNERS b/core/proto/OWNERS
index 6ab0fc91d744..74ced8921799 100644
--- a/core/proto/OWNERS
+++ b/core/proto/OWNERS
@@ -3,8 +3,10 @@
# Metrics
joeo@google.com
singhtejinder@google.com
+yanmin@google.com
yaochen@google.com
yro@google.com
+zhouwenjie@google.com
# Settings UI
per-file settings_enums.proto=tmfang@google.com
diff --git a/core/proto/android/os/incident.proto b/core/proto/android/os/incident.proto
index 7d0629ee6fba..898e2f07f173 100644
--- a/core/proto/android/os/incident.proto
+++ b/core/proto/android/os/incident.proto
@@ -42,6 +42,7 @@ import "frameworks/base/core/proto/android/service/appwidget.proto";
import "frameworks/base/core/proto/android/service/battery.proto";
import "frameworks/base/core/proto/android/service/batterystats.proto";
import "frameworks/base/core/proto/android/service/diskstats.proto";
+import "frameworks/base/core/proto/android/service/dropbox.proto";
import "frameworks/base/core/proto/android/service/graphicsstats.proto";
import "frameworks/base/core/proto/android/service/netstats.proto";
import "frameworks/base/core/proto/android/service/notification.proto";
@@ -87,42 +88,80 @@ message IncidentProto {
optional android.util.LogProto main_logs = 1101 [
(section).type = SECTION_LOG,
- (section).args = "LOG_ID_MAIN"
+ (section).args = "main"
];
optional android.util.LogProto radio_logs = 1102 [
(section).type = SECTION_LOG,
- (section).args = "LOG_ID_RADIO"
+ (section).args = "radio"
];
optional android.util.LogProto events_logs = 1103 [
(section).type = SECTION_LOG,
- (section).args = "LOG_ID_EVENTS"
+ (section).args = "events"
];
optional android.util.LogProto system_logs = 1104 [
(section).type = SECTION_LOG,
- (section).args = "LOG_ID_SYSTEM"
+ (section).args = "system"
];
optional android.util.LogProto crash_logs = 1105 [
(section).type = SECTION_LOG,
- (section).args = "LOG_ID_CRASH"
+ (section).args = "crash"
];
optional android.util.LogProto stats_logs = 1106 [
(section).type = SECTION_LOG,
- (section).args = "LOG_ID_STATS"
+ (section).args = "stats"
];
optional android.util.LogProto security_logs = 1107 [
(section).type = SECTION_LOG,
- (section).args = "LOG_ID_SECURITY"
+ (section).args = "security"
];
optional android.util.LogProto kernel_logs = 1108 [
(section).type = SECTION_LOG,
- (section).args = "LOG_ID_KERNEL"
+ (section).args = "kernel"
+ ];
+
+ // Last logcat sections.
+ // Note that kernel logs is not persisted since it's contained in last kmsg.
+ optional android.util.LogProto last_main_logs = 1109 [
+ (section).type = SECTION_LOG,
+ (section).args = "main -L"
+ ];
+
+ optional android.util.LogProto last_radio_logs = 1110 [
+ (section).type = SECTION_LOG,
+ (section).args = "radio -L"
+ ];
+
+ optional android.util.LogProto last_events_logs = 1111 [
+ (section).type = SECTION_LOG,
+ (section).args = "events -L"
+ ];
+
+ optional android.util.LogProto last_system_logs = 1112 [
+ (section).type = SECTION_LOG,
+ (section).args = "system -L"
+ ];
+
+ optional android.util.LogProto last_crash_logs = 1113 [
+ (section).type = SECTION_LOG,
+ (section).args = "crash -L"
+ ];
+
+ optional android.util.LogProto last_stats_logs = 1114 [
+ (section).type = SECTION_LOG,
+ (section).args = "stats -L"
+ ];
+
+ // security logs is only available with "Device Owner" mode
+ optional android.util.LogProto last_security_logs = 1115 [
+ (section).type = SECTION_LOG,
+ (section).args = "security -L"
];
// Stack dumps
@@ -329,6 +368,22 @@ message IncidentProto {
(section).userdebug_and_eng_only = true
];
+ // Dropbox entries split by tags.
+ optional android.service.dropbox.DropBoxManagerServiceDumpProto dropbox_data_app_crashes = 3027 [
+ (section).type = SECTION_DUMPSYS,
+ (section).args = "dropbox --proto data_app_crash"
+ ];
+
+ optional android.service.dropbox.DropBoxManagerServiceDumpProto dropbox_data_app_anr = 3028 [
+ (section).type = SECTION_DUMPSYS,
+ (section).args = "dropbox --proto data_app_anr"
+ ];
+
+ optional android.service.dropbox.DropBoxManagerServiceDumpProto dropbox_data_app_native_crash = 3029 [
+ (section).type = SECTION_DUMPSYS,
+ (section).args = "dropbox --proto data_app_native_crash"
+ ];
+
// Reserved for OEMs.
extensions 50000 to 100000;
}
diff --git a/core/proto/android/server/activitymanagerservice.proto b/core/proto/android/server/activitymanagerservice.proto
index d01a45c2002a..2f87debce978 100644
--- a/core/proto/android/server/activitymanagerservice.proto
+++ b/core/proto/android/server/activitymanagerservice.proto
@@ -771,10 +771,11 @@ message ActivityManagerServiceDumpProcessesProto {
option (.android.msg_privacy).dest = DEST_AUTOMATIC;
optional string proc_name = 1;
- optional string file = 2 [ (.android.privacy).dest = DEST_EXPLICIT ];
+ reserved 2; // file, DEST_EXPLICIT
optional int32 pid = 3;
optional int32 uid = 4;
optional bool is_user_initiated = 5;
+ optional string uri = 6 [ (.android.privacy).dest = DEST_EXPLICIT ];
}
optional Dump dump = 2;
}
diff --git a/core/proto/android/server/windowmanagerservice.proto b/core/proto/android/server/windowmanagerservice.proto
index a346a63841fe..69e67d154d27 100644
--- a/core/proto/android/server/windowmanagerservice.proto
+++ b/core/proto/android/server/windowmanagerservice.proto
@@ -231,7 +231,7 @@ message AppWindowTokenProto {
optional WindowTokenProto window_token = 2;
optional bool last_surface_showing = 3;
optional bool is_waiting_for_transition_start = 4;
- optional bool is_really_animating = 5;
+ optional bool is_animating = 5;
optional AppWindowThumbnailProto thumbnail = 6;
optional bool fills_parent = 7;
optional bool app_stopped = 8;
diff --git a/core/proto/android/service/dropbox.proto b/core/proto/android/service/dropbox.proto
new file mode 100644
index 000000000000..29fe62b06c95
--- /dev/null
+++ b/core/proto/android/service/dropbox.proto
@@ -0,0 +1,34 @@
+/*
+ * 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.
+ */
+
+syntax = "proto2";
+package android.service.dropbox;
+
+import "frameworks/base/core/proto/android/privacy.proto";
+
+option java_multiple_files = true;
+
+// Dump from com.android.server.DropboxManagerService.java.
+message DropBoxManagerServiceDumpProto {
+ option (android.msg_privacy).dest = DEST_EXPLICIT;
+
+ message Entry {
+ // Time when entry was originally created.
+ optional int64 time_ms = 1 [ (.android.privacy).dest = DEST_AUTOMATIC ] ;
+ optional bytes data = 2;
+ }
+ repeated Entry entries = 1;
+}
diff --git a/core/res/AndroidManifest.xml b/core/res/AndroidManifest.xml
index 5bb18015c879..a15e1aea7a82 100644
--- a/core/res/AndroidManifest.xml
+++ b/core/res/AndroidManifest.xml
@@ -497,6 +497,7 @@
<protected-broadcast android:name="android.telephony.action.CARRIER_CONFIG_CHANGED" />
<protected-broadcast android:name="android.telephony.action.DEFAULT_SUBSCRIPTION_CHANGED" />
<protected-broadcast android:name="android.telephony.action.DEFAULT_SMS_SUBSCRIPTION_CHANGED" />
+ <protected-broadcast android:name="android.telephony.action.OTA_EMERGENCY_NUMBER_DB_INSTALLED" />
<protected-broadcast android:name="android.telephony.action.SECRET_CODE" />
<protected-broadcast android:name="android.telephony.action.SHOW_VOICEMAIL_NOTIFICATION" />
<protected-broadcast android:name="android.telephony.action.SUBSCRIPTION_PLANS_CHANGED" />
@@ -4735,19 +4736,6 @@
android:excludeFromRecents="true"
android:process=":ui">
</activity>
- <activity android:name="com.android.internal.app.DumpHeapActivity"
- android:theme="@style/Theme.Translucent.NoTitleBar"
- android:label="@string/dump_heap_title"
- android:finishOnCloseSystemDialogs="true"
- android:noHistory="true"
- android:excludeFromRecents="true"
- android:process=":ui">
- </activity>
- <provider android:name="com.android.server.am.DumpHeapProvider"
- android:authorities="com.android.server.heapdump"
- android:grantUriPermissions="true"
- android:multiprocess="false"
- android:singleUser="true" />
<activity android:name="android.accounts.ChooseAccountActivity"
android:excludeFromRecents="true"
diff --git a/core/res/res/values-as/strings.xml b/core/res/res/values-as/strings.xml
index 018ca7e9c8ff..8558d7cbc1df 100644
--- a/core/res/res/values-as/strings.xml
+++ b/core/res/res/values-as/strings.xml
@@ -1274,12 +1274,9 @@
<skip />
<string name="wifi_no_internet" msgid="5198100389964214865">"<xliff:g id="NETWORK_SSID">%1$s</xliff:g>ৰ ইণ্টাৰনেটৰ এক্সেছ নাই"</string>
<string name="wifi_no_internet_detailed" msgid="8083079241212301741">"অধিক বিকল্পৰ বাবে টিপক"</string>
- <!-- no translation found for mobile_no_internet (1445208572588803493) -->
- <skip />
- <!-- no translation found for other_networks_no_internet (1553338015597653827) -->
- <skip />
- <!-- no translation found for private_dns_broken_detailed (4293356177543535578) -->
- <skip />
+ <string name="mobile_no_internet" msgid="1445208572588803493">"ম’বাইল নেটৱৰ্কৰ কোনো ইণ্টাৰনেটৰ এক্সেছ নাই"</string>
+ <string name="other_networks_no_internet" msgid="1553338015597653827">"নেটৱৰ্কৰ কোনো ইণ্টাৰনেটৰ এক্সেছ নাই"</string>
+ <string name="private_dns_broken_detailed" msgid="4293356177543535578">"ব্যক্তিগত DNS ছাৰ্ভাৰ এক্সেছ কৰিব নোৱাৰি"</string>
<string name="captive_portal_logged_in_detailed" msgid="8489345381637456021">"সংযোগ কৰা হ’ল"</string>
<string name="network_partial_connectivity" msgid="7774883385494762741">"<xliff:g id="NETWORK_SSID">%1$s</xliff:g>ৰ সকলো সেৱাৰ এক্সেছ নাই"</string>
<string name="network_partial_connectivity_detailed" msgid="1959697814165325217">"যিকোনো প্ৰকাৰে সংযোগ কৰিবলৈ টিপক"</string>
diff --git a/core/res/res/values-el/strings.xml b/core/res/res/values-el/strings.xml
index 4fb03d6dc328..e74cbb14ee4d 100644
--- a/core/res/res/values-el/strings.xml
+++ b/core/res/res/values-el/strings.xml
@@ -299,13 +299,13 @@
<string name="permgrouplab_microphone" msgid="171539900250043464">"Μικρόφωνο"</string>
<string name="permgroupdesc_microphone" msgid="4988812113943554584">"ηχογραφεί"</string>
<string name="permgrouprequest_microphone" msgid="9167492350681916038">"Να επιτρέπεται στην εφαρμογή &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; η εγγραφή ήχου;"</string>
- <string name="permgrouplab_activityRecognition" msgid="1565108047054378642">"Σωματική δραστηριότητα"</string>
+ <string name="permgrouplab_activityRecognition" msgid="1565108047054378642">"Σωματική δραστ/τητα"</string>
<string name="permgroupdesc_activityRecognition" msgid="6949472038320473478">"πρόσβαση στη σωματική σας δραστηριότητα"</string>
<string name="permgrouprequest_activityRecognition" msgid="7626438016904799383">"Να επιτρέπεται στην εφαρμογή &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; να έχει πρόσβαση στη σωματική σας δραστηριότητα;"</string>
<string name="permgrouplab_camera" msgid="4820372495894586615">"Κάμερα"</string>
<string name="permgroupdesc_camera" msgid="3250611594678347720">"γίνεται λήψη φωτογραφιών και εγγραφή βίντεο"</string>
<string name="permgrouprequest_camera" msgid="1299833592069671756">"Να επιτρέπεται στην εφαρμογή &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; η λήψη φωτογραφιών και η εγγραφή βίντεο;"</string>
- <string name="permgrouplab_calllog" msgid="8798646184930388160">"Αρχεία καταγραφής κλήσεων"</string>
+ <string name="permgrouplab_calllog" msgid="8798646184930388160">"Αρχεία καταγρ. κλήσ."</string>
<string name="permgroupdesc_calllog" msgid="3006237336748283775">"ανάγνωση και εγγραφή αρχείου καταγραφής τηλεφωνικών κλήσεων"</string>
<string name="permgrouprequest_calllog" msgid="8487355309583773267">"Να επιτρέπεται στην εφαρμογή &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; να έχει πρόσβαση στα αρχεία καταγραφής τηλεφωνικών κλήσεών σας;"</string>
<string name="permgrouplab_phone" msgid="5229115638567440675">"Τηλέφωνο"</string>
diff --git a/core/res/res/values-fr-rCA/strings.xml b/core/res/res/values-fr-rCA/strings.xml
index 32530d3cfb60..02c804378122 100644
--- a/core/res/res/values-fr-rCA/strings.xml
+++ b/core/res/res/values-fr-rCA/strings.xml
@@ -299,7 +299,7 @@
<string name="permgrouplab_microphone" msgid="171539900250043464">"Microphone"</string>
<string name="permgroupdesc_microphone" msgid="4988812113943554584">"enregistrer des fichiers audio"</string>
<string name="permgrouprequest_microphone" msgid="9167492350681916038">"Autoriser &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; à enregistrer l\'audio?"</string>
- <string name="permgrouplab_activityRecognition" msgid="1565108047054378642">"données d\'activité physique"</string>
+ <string name="permgrouplab_activityRecognition" msgid="1565108047054378642">"Activité physique"</string>
<string name="permgroupdesc_activityRecognition" msgid="6949472038320473478">"accéder à vos activités physiques"</string>
<string name="permgrouprequest_activityRecognition" msgid="7626438016904799383">"Autoriser « <xliff:g id="APP_NAME">%1$s</xliff:g> » à accéder à vos activités physiques?"</string>
<string name="permgrouplab_camera" msgid="4820372495894586615">"Appareil photo"</string>
diff --git a/core/res/res/values-hy/strings.xml b/core/res/res/values-hy/strings.xml
index 73db059c71a2..967ddd0843ad 100644
--- a/core/res/res/values-hy/strings.xml
+++ b/core/res/res/values-hy/strings.xml
@@ -1274,8 +1274,8 @@
<skip />
<string name="wifi_no_internet" msgid="5198100389964214865">"<xliff:g id="NETWORK_SSID">%1$s</xliff:g> ցանցը չունի մուտք ինտերնետին"</string>
<string name="wifi_no_internet_detailed" msgid="8083079241212301741">"Հպեք՝ ընտրանքները տեսնելու համար"</string>
- <string name="mobile_no_internet" msgid="1445208572588803493">"Բջջային ցանցում ինտերնետ կապ չկա"</string>
- <string name="other_networks_no_internet" msgid="1553338015597653827">"Ցանցում ինտերնետ կապ չկա"</string>
+ <string name="mobile_no_internet" msgid="1445208572588803493">"Բջջային ցանցը չի ապահովում ինտերնետ կապ"</string>
+ <string name="other_networks_no_internet" msgid="1553338015597653827">"Ցանցը միացված չէ ինտերնետին"</string>
<string name="private_dns_broken_detailed" msgid="4293356177543535578">"Մասնավոր DNS սերվերն անհասանելի է"</string>
<string name="captive_portal_logged_in_detailed" msgid="8489345381637456021">"Միացված է"</string>
<string name="network_partial_connectivity" msgid="7774883385494762741">"<xliff:g id="NETWORK_SSID">%1$s</xliff:g> ցանցի կապը սահմանափակ է"</string>
diff --git a/core/res/res/values-iw/strings.xml b/core/res/res/values-iw/strings.xml
index 462ee36b5f4d..2888a532bcb4 100644
--- a/core/res/res/values-iw/strings.xml
+++ b/core/res/res/values-iw/strings.xml
@@ -304,13 +304,13 @@
<string name="permgrouprequest_storage" msgid="7885942926944299560">"‏לתת לאפליקציה &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; הרשאת גישה לתמונות, למדיה ולקבצים במכשיר?"</string>
<string name="permgrouplab_microphone" msgid="171539900250043464">"מיקרופון"</string>
<string name="permgroupdesc_microphone" msgid="4988812113943554584">"הקלטת אודיו"</string>
- <string name="permgrouprequest_microphone" msgid="9167492350681916038">"‏לתת לאפליקציה &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; הרשאה להקליט אודיו?"</string>
+ <string name="permgrouprequest_microphone" msgid="9167492350681916038">"‏לאשר לאפליקציית &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; להקליט אודיו?"</string>
<string name="permgrouplab_activityRecognition" msgid="1565108047054378642">"פעילות גופנית"</string>
<string name="permgroupdesc_activityRecognition" msgid="6949472038320473478">"גישה לפעילות הגופנית שלך"</string>
<string name="permgrouprequest_activityRecognition" msgid="7626438016904799383">"‏האם לאפשר לאפליקציה &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; גישה לפעילות הגופנית שלך?"</string>
<string name="permgrouplab_camera" msgid="4820372495894586615">"מצלמה"</string>
<string name="permgroupdesc_camera" msgid="3250611594678347720">"צילום תמונות והקלטת וידאו"</string>
- <string name="permgrouprequest_camera" msgid="1299833592069671756">"‏לאשר לאפליקציה של &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; לצלם תמונות וסרטונים?"</string>
+ <string name="permgrouprequest_camera" msgid="1299833592069671756">"‏לאשר לאפליקציית &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; לצלם תמונות וסרטונים?"</string>
<string name="permgrouplab_calllog" msgid="8798646184930388160">"יומני שיחות"</string>
<string name="permgroupdesc_calllog" msgid="3006237336748283775">"קריאה וכתיבה של יומן השיחות של הטלפון"</string>
<string name="permgrouprequest_calllog" msgid="8487355309583773267">"‏לתת לאפליקציה &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; הרשאת גישה ליומני השיחות של הטלפון?"</string>
@@ -1318,12 +1318,9 @@
<skip />
<string name="wifi_no_internet" msgid="5198100389964214865">"ל-<xliff:g id="NETWORK_SSID">%1$s</xliff:g> אין גישה לאינטרנט"</string>
<string name="wifi_no_internet_detailed" msgid="8083079241212301741">"הקש לקבלת אפשרויות"</string>
- <!-- no translation found for mobile_no_internet (1445208572588803493) -->
- <skip />
- <!-- no translation found for other_networks_no_internet (1553338015597653827) -->
- <skip />
- <!-- no translation found for private_dns_broken_detailed (4293356177543535578) -->
- <skip />
+ <string name="mobile_no_internet" msgid="1445208572588803493">"לרשת הסלולרית אין גישה לאינטרנט"</string>
+ <string name="other_networks_no_internet" msgid="1553338015597653827">"לרשת אין גישה לאינטרנט"</string>
+ <string name="private_dns_broken_detailed" msgid="4293356177543535578">"‏לא ניתן לגשת לשרת DNS הפרטי"</string>
<string name="captive_portal_logged_in_detailed" msgid="8489345381637456021">"הרשת מחוברת"</string>
<string name="network_partial_connectivity" msgid="7774883385494762741">"הקישוריות של <xliff:g id="NETWORK_SSID">%1$s</xliff:g> מוגבלת"</string>
<string name="network_partial_connectivity_detailed" msgid="1959697814165325217">"כדי להתחבר למרות זאת יש להקיש"</string>
diff --git a/core/res/res/values-kn/strings.xml b/core/res/res/values-kn/strings.xml
index d1317e967c34..3fb67669e4da 100644
--- a/core/res/res/values-kn/strings.xml
+++ b/core/res/res/values-kn/strings.xml
@@ -305,13 +305,13 @@
<string name="permgrouplab_camera" msgid="4820372495894586615">"ಕ್ಯಾಮರಾ"</string>
<string name="permgroupdesc_camera" msgid="3250611594678347720">"ಚಿತ್ರಗಳನ್ನು ತೆಗೆಯಲು, ವೀಡಿಯೊ ರೆಕಾರ್ಡ್ ಮಾಡಲು"</string>
<string name="permgrouprequest_camera" msgid="1299833592069671756">"ಚಿತ್ರಗಳನ್ನು ಸೆರೆಹಿಡಿಯಲು ಮತ್ತು ವೀಡಿಯೊ ರೆಕಾರ್ಡ್‌ ಮಾಡಲು &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; ಗೆ ಅನುಮತಿಸಬೇಕೇ?"</string>
- <string name="permgrouplab_calllog" msgid="8798646184930388160">"ಕರೆಯ ಲಾಗ್‌ಗಳು"</string>
+ <string name="permgrouplab_calllog" msgid="8798646184930388160">"ಕರೆಯ ಲಾಗ್‌"</string>
<string name="permgroupdesc_calllog" msgid="3006237336748283775">"ಪೋನ್‌ ಕರೆಯ ಲಾಗ್‌ ಅನ್ನು ಓದಿ ಮತ್ತು ಬರೆಯಿರಿ"</string>
<string name="permgrouprequest_calllog" msgid="8487355309583773267">"ನಿಮ್ಮ ಫೋನ್‌ ಕರೆಯ ಲಾಗ್‌ಗಳಿಗೆ ಪ್ರವೇಶ ಪಡೆಯಲು &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; ಗೆ ಅನುಮತಿಸಬೇಕೇ?"</string>
<string name="permgrouplab_phone" msgid="5229115638567440675">"ಫೋನ್"</string>
<string name="permgroupdesc_phone" msgid="6234224354060641055">"ಫೋನ್ ಕರೆ ಮಾಡಲು ಹಾಗೂ ನಿರ್ವಹಿಸಲು"</string>
<string name="permgrouprequest_phone" msgid="9166979577750581037">"ಫೋನ್ ಕರೆಗಳನ್ನು ಮಾಡಲು ಮತ್ತು ನಿರ್ವಹಿಸಲು &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; ಗೆ ಅನುಮತಿಸಬೇಕೇ?"</string>
- <string name="permgrouplab_sensors" msgid="4838614103153567532">"ದೇಹದ ಸೆನ್ಸರ್‌ಗಳು"</string>
+ <string name="permgrouplab_sensors" msgid="4838614103153567532">"ದೇಹದ ಸೆನ್ಸರ್‌"</string>
<string name="permgroupdesc_sensors" msgid="7147968539346634043">"ನಿಮ್ಮ ಮುಖ್ಯ ಲಕ್ಷಣಗಳ ಕುರಿತು ಸೆನ್ಸಾರ್ ಡೇಟಾವನ್ನು ಪ್ರವೇಶಿಸಿ"</string>
<string name="permgrouprequest_sensors" msgid="6349806962814556786">"ನಿಮ್ಮ ಮುಖ್ಯ ಲಕ್ಷಣಗಳ ಕುರಿತು ಸೆನ್ಸರ್ ಡೇಟಾವನ್ನು &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; ಗೆ ಅನುಮತಿಸಬೇಕೇ?"</string>
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"ವಿಂಡೋ ವಿಷಯವನ್ನು ಹಿಂಪಡೆಯುತ್ತದೆ"</string>
@@ -1274,12 +1274,9 @@
<skip />
<string name="wifi_no_internet" msgid="5198100389964214865">"<xliff:g id="NETWORK_SSID">%1$s</xliff:g> ಯಾವುದೇ ಇಂಟರ್ನೆಟ್ ಸಂಪರ್ಕವನ್ನು ಹೊಂದಿಲ್ಲ"</string>
<string name="wifi_no_internet_detailed" msgid="8083079241212301741">"ಆಯ್ಕೆಗಳಿಗೆ ಟ್ಯಾಪ್ ಮಾಡಿ"</string>
- <!-- no translation found for mobile_no_internet (1445208572588803493) -->
- <skip />
- <!-- no translation found for other_networks_no_internet (1553338015597653827) -->
- <skip />
- <!-- no translation found for private_dns_broken_detailed (4293356177543535578) -->
- <skip />
+ <string name="mobile_no_internet" msgid="1445208572588803493">"ಮೊಬೈಲ್ ನೆಟ್‌ವರ್ಕ್‌ ಯಾವುದೇ ಇಂಟರ್ನೆಟ್ ಪ್ರವೇಶವನ್ನು ಹೊಂದಿಲ್ಲ"</string>
+ <string name="other_networks_no_internet" msgid="1553338015597653827">"ನೆಟ್‌ವರ್ಕ್‌ ಇಂಟರ್ನೆಟ್‌ ಪ್ರವೇಶವನ್ನು ಹೊಂದಿಲ್ಲ"</string>
+ <string name="private_dns_broken_detailed" msgid="4293356177543535578">"ಖಾಸಗಿ DNS ಸರ್ವರ್ ಅನ್ನು ಪ್ರವೇಶಿಸಲು ಸಾಧ್ಯವಿಲ್ಲ"</string>
<string name="captive_portal_logged_in_detailed" msgid="8489345381637456021">"ಸಂಪರ್ಕಿಸಲಾಗಿದೆ"</string>
<string name="network_partial_connectivity" msgid="7774883385494762741">"<xliff:g id="NETWORK_SSID">%1$s</xliff:g> ಸೀಮಿತ ಸಂಪರ್ಕ ಕಲ್ಪಿಸುವಿಕೆಯನ್ನು ಹೊಂದಿದೆ"</string>
<string name="network_partial_connectivity_detailed" msgid="1959697814165325217">"ಹೇಗಾದರೂ ಸಂಪರ್ಕಿಸಲು ಟ್ಯಾಪ್ ಮಾಡಿ"</string>
diff --git a/core/res/res/values-ky/strings.xml b/core/res/res/values-ky/strings.xml
index dcb766d2bd8c..db54c4280b17 100644
--- a/core/res/res/values-ky/strings.xml
+++ b/core/res/res/values-ky/strings.xml
@@ -305,7 +305,7 @@
<string name="permgrouplab_camera" msgid="4820372495894586615">"Камера"</string>
<string name="permgroupdesc_camera" msgid="3250611594678347720">"сүрөт жана видео тартууга"</string>
<string name="permgrouprequest_camera" msgid="1299833592069671756">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; колдонмосуна сүрөттөр менен видеолорду тартканга уруксат бересизби?"</string>
- <string name="permgrouplab_calllog" msgid="8798646184930388160">"Чалуулар тизмелери"</string>
+ <string name="permgrouplab_calllog" msgid="8798646184930388160">"Чалуулар тизмеси"</string>
<string name="permgroupdesc_calllog" msgid="3006237336748283775">"телефондогу чалуулар тизмесин окуу жана жазуу"</string>
<string name="permgrouprequest_calllog" msgid="8487355309583773267">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; колдонмосуна телефондогу чалуулар тизмесин пайдаланууга уруксат берилсинби?"</string>
<string name="permgrouplab_phone" msgid="5229115638567440675">"Телефон"</string>
diff --git a/core/res/res/values-ml/strings.xml b/core/res/res/values-ml/strings.xml
index 9d87652667f3..5250df515fa2 100644
--- a/core/res/res/values-ml/strings.xml
+++ b/core/res/res/values-ml/strings.xml
@@ -278,7 +278,7 @@
<string name="android_system_label" msgid="6577375335728551336">"Android സിസ്റ്റം"</string>
<string name="user_owner_label" msgid="8836124313744349203">"വ്യക്തിഗത പ്രൊഫൈലിലേക്ക് മാറുക"</string>
<string name="managed_profile_label" msgid="8947929265267690522">"ഔദ്യോഗിക പ്രൊഫൈലിലേക്ക് മാറുക"</string>
- <string name="permgrouplab_contacts" msgid="3657758145679177612">"കോൺടാക്റ്റുകൾ"</string>
+ <string name="permgrouplab_contacts" msgid="3657758145679177612">"കോൺടാക്റ്റ്"</string>
<string name="permgroupdesc_contacts" msgid="6951499528303668046">"നിങ്ങളുടെ കോൺടാക്റ്റുകൾ ആക്‌സസ്സ് ചെയ്യുക"</string>
<string name="permgrouprequest_contacts" msgid="6032805601881764300">"നിങ്ങളുടെ കോണ്‍ടാക്റ്റുകള്‍ ആക്‌സസ് ചെയ്യാൻ &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; ആപ്പിനെ അനുവദിക്കണോ?"</string>
<string name="permgrouplab_location" msgid="7275582855722310164">"ലൊക്കേഷൻ"</string>
@@ -299,19 +299,19 @@
<string name="permgrouplab_microphone" msgid="171539900250043464">"മൈക്രോഫോണ്‍"</string>
<string name="permgroupdesc_microphone" msgid="4988812113943554584">"ഓഡിയോ റെക്കോർഡ് ചെയ്യുക"</string>
<string name="permgrouprequest_microphone" msgid="9167492350681916038">"ഓഡിയോ റെക്കോർഡ് ചെയ്യാൻ &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; ആപ്പിനെ അനുവദിക്കണോ?"</string>
- <string name="permgrouplab_activityRecognition" msgid="1565108047054378642">"ശാരീരിക പ്രവർത്തനം"</string>
+ <string name="permgrouplab_activityRecognition" msgid="1565108047054378642">"കായിക പ്രവർത്തനം"</string>
<string name="permgroupdesc_activityRecognition" msgid="6949472038320473478">"ശാരീരിക പ്രവർത്തനം ആക്‌സസ് ചെയ്യുക"</string>
<string name="permgrouprequest_activityRecognition" msgid="7626438016904799383">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt;-നെ നിങ്ങളുടെ ശാരീരിക പ്രവർത്തനം ആക്‌സസ് ചെയ്യാൻ അനുവദിക്കണോ?"</string>
<string name="permgrouplab_camera" msgid="4820372495894586615">"ക്യാമറ"</string>
<string name="permgroupdesc_camera" msgid="3250611594678347720">"ചിത്രങ്ങളെടുത്ത് വീഡിയോ റെക്കോർഡുചെയ്യുക"</string>
<string name="permgrouprequest_camera" msgid="1299833592069671756">"ചിത്രം എടുക്കാനും വീഡിയോ റെക്കോർഡ് ചെയ്യാനും &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; ആപ്പിനെ അനുവദിക്കണോ?"</string>
- <string name="permgrouplab_calllog" msgid="8798646184930388160">"കോൾ ലോഗുകൾ"</string>
+ <string name="permgrouplab_calllog" msgid="8798646184930388160">"കോൾ ലോഗ്"</string>
<string name="permgroupdesc_calllog" msgid="3006237336748283775">"ഫോൺ കോൾ ലോഗ് വായിക്കുകയും എഴുതുകയും ചെയ്യുക"</string>
<string name="permgrouprequest_calllog" msgid="8487355309583773267">"നിങ്ങളുടെ ഫോൺ കോൾ ലോഗുകൾ ആക്സസ് ചെയ്യാൻ &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; ആപ്പിനെ അനുവദിക്കണോ?"</string>
<string name="permgrouplab_phone" msgid="5229115638567440675">"ഫോണ്‍"</string>
<string name="permgroupdesc_phone" msgid="6234224354060641055">"ഫോൺ വിളിക്കുകയും നിയന്ത്രിക്കുകയും ചെയ്യുക"</string>
<string name="permgrouprequest_phone" msgid="9166979577750581037">"ഫോൺ കോളുകൾ ചെയ്യാനും അവ മാനേജ് ചെയ്യാനും &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; ആപ്പിനെ അനുവദിക്കണോ?"</string>
- <string name="permgrouplab_sensors" msgid="4838614103153567532">"ബോഡി സെൻസറുകൾ"</string>
+ <string name="permgrouplab_sensors" msgid="4838614103153567532">"ബോഡി സെൻസർ"</string>
<string name="permgroupdesc_sensors" msgid="7147968539346634043">"നിങ്ങളുടെ ജീവാധാര ലക്ഷണങ്ങളെ കുറിച്ചുള്ള സെൻസർ വിവരങ്ങൾ ആക്സസ് ചെയ്യുക"</string>
<string name="permgrouprequest_sensors" msgid="6349806962814556786">"നിങ്ങളുടെ ജീവധാരണ ലക്ഷണങ്ങളെ കുറിച്ചുള്ള സെൻസർ ഡാറ്റ ആക്‌സസ് ചെയ്യാൻ &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; ആപ്പിനെ അനുവദിക്കണോ?"</string>
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"വിൻഡോ ഉള്ളടക്കം വീണ്ടെടുക്കുക"</string>
diff --git a/core/res/res/values-mr/strings.xml b/core/res/res/values-mr/strings.xml
index 03b973b38520..39f614a11de0 100644
--- a/core/res/res/values-mr/strings.xml
+++ b/core/res/res/values-mr/strings.xml
@@ -1274,12 +1274,9 @@
<skip />
<string name="wifi_no_internet" msgid="5198100389964214865">"<xliff:g id="NETWORK_SSID">%1$s</xliff:g> ला इंटरनेट अ‍ॅक्सेस नाही"</string>
<string name="wifi_no_internet_detailed" msgid="8083079241212301741">"पर्यायांसाठी टॅप करा"</string>
- <!-- no translation found for mobile_no_internet (1445208572588803493) -->
- <skip />
- <!-- no translation found for other_networks_no_internet (1553338015597653827) -->
- <skip />
- <!-- no translation found for private_dns_broken_detailed (4293356177543535578) -->
- <skip />
+ <string name="mobile_no_internet" msgid="1445208572588803493">"मोबाइल नेटवर्कला इंटरनेट अॅक्सेस नाही"</string>
+ <string name="other_networks_no_internet" msgid="1553338015597653827">"नेटवर्कला इंटरनेट अॅक्सेस नाही"</string>
+ <string name="private_dns_broken_detailed" msgid="4293356177543535578">"खाजगी DNS सर्व्हर अॅक्सेस करू शकत नाही"</string>
<string name="captive_portal_logged_in_detailed" msgid="8489345381637456021">"कनेक्ट केले"</string>
<string name="network_partial_connectivity" msgid="7774883385494762741">"<xliff:g id="NETWORK_SSID">%1$s</xliff:g> ला मर्यादित कनेक्टिव्हिटी आहे"</string>
<string name="network_partial_connectivity_detailed" msgid="1959697814165325217">"तरीही कनेक्ट करण्यासाठी टॅप करा"</string>
diff --git a/core/res/res/values-or/strings.xml b/core/res/res/values-or/strings.xml
index b4079ef53dc6..cd36d537f6b1 100644
--- a/core/res/res/values-or/strings.xml
+++ b/core/res/res/values-or/strings.xml
@@ -1274,12 +1274,9 @@
<skip />
<string name="wifi_no_internet" msgid="5198100389964214865">"<xliff:g id="NETWORK_SSID">%1$s</xliff:g>ର ଇଣ୍ଟର୍ନେଟ୍ ଆକ୍ସେସ୍ ନାହିଁ"</string>
<string name="wifi_no_internet_detailed" msgid="8083079241212301741">"ବିକଳ୍ପ ପାଇଁ ଟାପ୍‍ କରନ୍ତୁ"</string>
- <!-- no translation found for mobile_no_internet (1445208572588803493) -->
- <skip />
- <!-- no translation found for other_networks_no_internet (1553338015597653827) -->
- <skip />
- <!-- no translation found for private_dns_broken_detailed (4293356177543535578) -->
- <skip />
+ <string name="mobile_no_internet" msgid="1445208572588803493">"ମୋବାଇଲ୍ ନେଟ୍‌ୱାର୍କରେ ଇଣ୍ଟର୍ନେଟ୍ ଆକ୍ସେସ୍ ନାହିଁ"</string>
+ <string name="other_networks_no_internet" msgid="1553338015597653827">"ନେଟ୍‌ୱାର୍କରେ ଇଣ୍ଟର୍ନେଟ୍ ଆକ୍ସେସ୍ ନାହିଁ"</string>
+ <string name="private_dns_broken_detailed" msgid="4293356177543535578">"ବ୍ୟକ୍ତିଗତ DNS ସର୍ଭର୍ ଆକ୍ସେସ୍ କରିହେବ ନାହିଁ"</string>
<string name="captive_portal_logged_in_detailed" msgid="8489345381637456021">"ସଂଯୁକ୍ତ ହୋଇଛି"</string>
<string name="network_partial_connectivity" msgid="7774883385494762741">"<xliff:g id="NETWORK_SSID">%1$s</xliff:g>ର ସୀମିତ ସଂଯୋଗ ଅଛି"</string>
<string name="network_partial_connectivity_detailed" msgid="1959697814165325217">"ତଥାପି ଯୋଗାଯୋଗ କରିବାକୁ ଟାପ୍ କରନ୍ତୁ"</string>
diff --git a/core/res/res/values-pl/strings.xml b/core/res/res/values-pl/strings.xml
index b238d4f08a83..3be09007c3ac 100644
--- a/core/res/res/values-pl/strings.xml
+++ b/core/res/res/values-pl/strings.xml
@@ -1318,12 +1318,9 @@
<skip />
<string name="wifi_no_internet" msgid="5198100389964214865">"<xliff:g id="NETWORK_SSID">%1$s</xliff:g> nie ma dostępu do internetu"</string>
<string name="wifi_no_internet_detailed" msgid="8083079241212301741">"Kliknij, by wyświetlić opcje"</string>
- <!-- no translation found for mobile_no_internet (1445208572588803493) -->
- <skip />
- <!-- no translation found for other_networks_no_internet (1553338015597653827) -->
- <skip />
- <!-- no translation found for private_dns_broken_detailed (4293356177543535578) -->
- <skip />
+ <string name="mobile_no_internet" msgid="1445208572588803493">"Sieć komórkowa nie ma dostępu do internetu"</string>
+ <string name="other_networks_no_internet" msgid="1553338015597653827">"Sieć nie ma dostępu do internetu"</string>
+ <string name="private_dns_broken_detailed" msgid="4293356177543535578">"Brak dostępu do prywatnego serwera DNS"</string>
<string name="captive_portal_logged_in_detailed" msgid="8489345381637456021">"Połączono"</string>
<string name="network_partial_connectivity" msgid="7774883385494762741">"<xliff:g id="NETWORK_SSID">%1$s</xliff:g> ma ograniczoną łączność"</string>
<string name="network_partial_connectivity_detailed" msgid="1959697814165325217">"Kliknij, by mimo to nawiązać połączenie"</string>
diff --git a/core/res/res/values-ro/strings.xml b/core/res/res/values-ro/strings.xml
index f1a6136ef006..82ec2b661f10 100644
--- a/core/res/res/values-ro/strings.xml
+++ b/core/res/res/values-ro/strings.xml
@@ -301,13 +301,13 @@
<string name="permgrouprequest_storage" msgid="7885942926944299560">"Permiteți &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; să acceseze fotografiile, conținutul media și fișierele de pe dispozitiv?"</string>
<string name="permgrouplab_microphone" msgid="171539900250043464">"Microfon"</string>
<string name="permgroupdesc_microphone" msgid="4988812113943554584">"înregistreze sunet"</string>
- <string name="permgrouprequest_microphone" msgid="9167492350681916038">"Pemiteți &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; să înregistreze conținut audio?"</string>
+ <string name="permgrouprequest_microphone" msgid="9167492350681916038">"Pemiteți &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; să înregistreze audio?"</string>
<string name="permgrouplab_activityRecognition" msgid="1565108047054378642">"Activitate fizică"</string>
<string name="permgroupdesc_activityRecognition" msgid="6949472038320473478">"accesați activitatea fizică"</string>
<string name="permgrouprequest_activityRecognition" msgid="7626438016904799383">"Permiteți aplicației &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; să vă acceseze activitatea fizică?"</string>
<string name="permgrouplab_camera" msgid="4820372495894586615">"Camera foto"</string>
<string name="permgroupdesc_camera" msgid="3250611594678347720">"fotografieze și să înregistreze videoclipuri"</string>
- <string name="permgrouprequest_camera" msgid="1299833592069671756">"Permiteți &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; să facă fotografii și să înregistreze videoclipuri?"</string>
+ <string name="permgrouprequest_camera" msgid="1299833592069671756">"Permiteți &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; să fotografieze și să înregistreze video?"</string>
<string name="permgrouplab_calllog" msgid="8798646184930388160">"Jurnale de apeluri"</string>
<string name="permgroupdesc_calllog" msgid="3006237336748283775">"să citească și să scrie jurnalul de apeluri telefonice"</string>
<string name="permgrouprequest_calllog" msgid="8487355309583773267">"Permiteți &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; să vă acceseze jurnalele de apeluri?"</string>
diff --git a/core/res/res/values-sk/strings.xml b/core/res/res/values-sk/strings.xml
index 1549f4ddfacd..18a87941e044 100644
--- a/core/res/res/values-sk/strings.xml
+++ b/core/res/res/values-sk/strings.xml
@@ -310,7 +310,7 @@
<string name="permgrouprequest_activityRecognition" msgid="7626438016904799383">"Povoliť aplikácii &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; prístup k vašej fyzickej aktivite?"</string>
<string name="permgrouplab_camera" msgid="4820372495894586615">"Fotoaparát"</string>
<string name="permgroupdesc_camera" msgid="3250611594678347720">"fotenie a natáčanie videí"</string>
- <string name="permgrouprequest_camera" msgid="1299833592069671756">"Povoliť aplikácii &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; snímať fotky a zaznamenávať video?"</string>
+ <string name="permgrouprequest_camera" msgid="1299833592069671756">"Chcete povoliť aplikácii &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; fotiť a nahrávať video?"</string>
<string name="permgrouplab_calllog" msgid="8798646184930388160">"Zoznam hovorov"</string>
<string name="permgroupdesc_calllog" msgid="3006237336748283775">"čítať a zapisovať do zoznamu hovorov"</string>
<string name="permgrouprequest_calllog" msgid="8487355309583773267">"Povoliť aplikácii &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; prístup k zoznamu hovorov?"</string>
diff --git a/core/res/res/values-th/strings.xml b/core/res/res/values-th/strings.xml
index 5431796ece89..fd77532c2cfb 100644
--- a/core/res/res/values-th/strings.xml
+++ b/core/res/res/values-th/strings.xml
@@ -1234,7 +1234,7 @@
<string name="volume_unknown" msgid="1400219669770445902">"ระดับเสียง"</string>
<string name="volume_icon_description_bluetooth" msgid="6538894177255964340">"ระดับบลูทูธ"</string>
<string name="volume_icon_description_ringer" msgid="3326003847006162496">"ระดับเสียงเรียกเข้า"</string>
- <string name="volume_icon_description_incall" msgid="8890073218154543397">"ปริมาณการโทร"</string>
+ <string name="volume_icon_description_incall" msgid="8890073218154543397">"ระดับเสียงการโทร"</string>
<string name="volume_icon_description_media" msgid="4217311719665194215">"ระดับเสียงของสื่อ"</string>
<string name="volume_icon_description_notification" msgid="7044986546477282274">"ระดับเสียงของการแจ้งเตือน"</string>
<string name="ringtone_default" msgid="3789758980357696936">"เสียงเรียกเข้าเริ่มต้น"</string>
diff --git a/core/res/res/values-ur/strings.xml b/core/res/res/values-ur/strings.xml
index 776595f0311b..97660b4c7b9a 100644
--- a/core/res/res/values-ur/strings.xml
+++ b/core/res/res/values-ur/strings.xml
@@ -1274,12 +1274,9 @@
<skip />
<string name="wifi_no_internet" msgid="5198100389964214865">"<xliff:g id="NETWORK_SSID">%1$s</xliff:g> کو انٹرنیٹ تک رسائی حاصل نہیں ہے"</string>
<string name="wifi_no_internet_detailed" msgid="8083079241212301741">"اختیارات کیلئے تھپتھپائیں"</string>
- <!-- no translation found for mobile_no_internet (1445208572588803493) -->
- <skip />
- <!-- no translation found for other_networks_no_internet (1553338015597653827) -->
- <skip />
- <!-- no translation found for private_dns_broken_detailed (4293356177543535578) -->
- <skip />
+ <string name="mobile_no_internet" msgid="1445208572588803493">"موبائل نیٹ ورک کو انٹرنیٹ تک رسائی حاصل نہیں ہے"</string>
+ <string name="other_networks_no_internet" msgid="1553338015597653827">"نیٹ ورک کو انٹرنیٹ تک رسائی حاصل نہیں ہے"</string>
+ <string name="private_dns_broken_detailed" msgid="4293356177543535578">"‏نجی DNS سرور تک رسائی حاصل نہیں کی جا سکی"</string>
<string name="captive_portal_logged_in_detailed" msgid="8489345381637456021">"منسلک ہے"</string>
<string name="network_partial_connectivity" msgid="7774883385494762741">"<xliff:g id="NETWORK_SSID">%1$s</xliff:g> کی کنیکٹوٹی محدود ہے"</string>
<string name="network_partial_connectivity_detailed" msgid="1959697814165325217">"بہر حال منسلک کرنے کے لیے تھپتھپائیں"</string>
diff --git a/core/tests/coretests/src/android/content/res/ConfigurationTest.java b/core/tests/coretests/src/android/content/res/ConfigurationTest.java
index 4a93f42a0f7c..c231e611809f 100644
--- a/core/tests/coretests/src/android/content/res/ConfigurationTest.java
+++ b/core/tests/coretests/src/android/content/res/ConfigurationTest.java
@@ -16,6 +16,18 @@
package android.content.res;
+import static android.app.WindowConfiguration.ROTATION_UNDEFINED;
+import static android.app.WindowConfiguration.WINDOWING_MODE_FULLSCREEN;
+import static android.app.WindowConfiguration.WINDOW_CONFIG_ROTATION;
+import static android.app.WindowConfiguration.WINDOW_CONFIG_WINDOWING_MODE;
+import static android.content.pm.ActivityInfo.CONFIG_ORIENTATION;
+import static android.content.pm.ActivityInfo.CONFIG_SMALLEST_SCREEN_SIZE;
+import static android.content.pm.ActivityInfo.CONFIG_WINDOW_CONFIGURATION;
+import static android.content.res.Configuration.ORIENTATION_LANDSCAPE;
+import static android.content.res.Configuration.ORIENTATION_PORTRAIT;
+import static android.content.res.Configuration.SMALLEST_SCREEN_WIDTH_DP_UNDEFINED;
+import static android.view.Surface.ROTATION_90;
+
import android.content.Context;
import android.os.LocaleList;
import android.platform.test.annotations.Presubmit;
@@ -104,6 +116,38 @@ public class ConfigurationTest extends TestCase {
read.getLocales().indexOf(urduExtension) != -1);
}
+ @Test
+ public void testMaskedSet() {
+ Configuration config = new Configuration();
+ Configuration other = new Configuration();
+ config.smallestScreenWidthDp = 100;
+ config.orientation = ORIENTATION_LANDSCAPE;
+ config.windowConfiguration.setRotation(ROTATION_90);
+ other.windowConfiguration.setWindowingMode(WINDOWING_MODE_FULLSCREEN);
+ other.orientation = ORIENTATION_PORTRAIT;
+
+ // no change
+ config.setTo(other, 0, 0);
+ assertEquals(100, config.smallestScreenWidthDp);
+ assertEquals(ORIENTATION_LANDSCAPE, config.orientation);
+ assertEquals(ROTATION_90, config.windowConfiguration.getRotation());
+
+ final int justOrientationAndWindowConfig = CONFIG_ORIENTATION | CONFIG_WINDOW_CONFIGURATION;
+ config.setTo(other, justOrientationAndWindowConfig, WINDOW_CONFIG_WINDOWING_MODE);
+ assertEquals(100, config.smallestScreenWidthDp);
+ assertEquals(other.orientation, config.orientation);
+ assertEquals(other.windowConfiguration.getWindowingMode(),
+ config.windowConfiguration.getWindowingMode());
+ assertEquals(ROTATION_90, config.windowConfiguration.getRotation());
+
+ // unset
+ final int justSmallestSwAndWindowConfig =
+ CONFIG_SMALLEST_SCREEN_SIZE | CONFIG_WINDOW_CONFIGURATION;
+ config.setTo(other, justSmallestSwAndWindowConfig, WINDOW_CONFIG_ROTATION);
+ assertEquals(ROTATION_UNDEFINED, config.windowConfiguration.getRotation());
+ assertEquals(SMALLEST_SCREEN_WIDTH_DP_UNDEFINED, config.smallestScreenWidthDp);
+ }
+
private void writeToProto(File f, Configuration config) throws Exception {
final AtomicFile af = new AtomicFile(f);
FileOutputStream fos = af.startWrite();
diff --git a/data/etc/services.core.protolog.json b/data/etc/services.core.protolog.json
index 342259d18b05..1326952a5750 100644
--- a/data/etc/services.core.protolog.json
+++ b/data/etc/services.core.protolog.json
@@ -169,12 +169,6 @@
"group": "WM_DEBUG_RESIZE",
"at": "com\/android\/server\/wm\/WindowState.java"
},
- "-1822611824": {
- "message": "\tRemove token=%s",
- "level": "DEBUG",
- "group": "WM_DEBUG_REMOTE_ANIMATIONS",
- "at": "com\/android\/server\/wm\/RemoteAnimationController.java"
- },
"-1797409732": {
"message": "Skipping %s because %s",
"level": "VERBOSE",
@@ -421,6 +415,12 @@
"group": "WM_SHOW_TRANSACTIONS",
"at": "com\/android\/server\/wm\/WindowManagerService.java"
},
+ "-1248645819": {
+ "message": "\tAdd container=%s",
+ "level": "DEBUG",
+ "group": "WM_DEBUG_REMOTE_ANIMATIONS",
+ "at": "com\/android\/server\/wm\/RemoteAnimationController.java"
+ },
"-1219773477": {
"message": "setInputConsumerEnabled(%s): mCanceled=%b",
"level": "DEBUG",
@@ -493,12 +493,6 @@
"group": "WM_DEBUG_ORIENTATION",
"at": "com\/android\/server\/wm\/RootWindowContainer.java"
},
- "-1099052739": {
- "message": "\tAdd token=%s",
- "level": "DEBUG",
- "group": "WM_DEBUG_REMOTE_ANIMATIONS",
- "at": "com\/android\/server\/wm\/RemoteAnimationController.java"
- },
"-1089874824": {
"message": "SURFACE SHOW (performLayout): %s",
"level": "INFO",
@@ -721,6 +715,12 @@
"group": "WM_DEBUG_SCREEN_ON",
"at": "com\/android\/server\/wm\/DisplayContent.java"
},
+ "-633961578": {
+ "message": "applyAnimation: transition animation is disabled or skipped. container=%s",
+ "level": "VERBOSE",
+ "group": "WM_DEBUG_APP_TRANSITIONS_ANIM",
+ "at": "com\/android\/server\/wm\/ActivityRecord.java"
+ },
"-622997754": {
"message": "postWindowRemoveCleanupLocked: %s",
"level": "VERBOSE",
@@ -883,12 +883,6 @@
"group": "WM_DEBUG_ADD_REMOVE",
"at": "com\/android\/server\/wm\/ActivityRecord.java"
},
- "-253016819": {
- "message": "applyAnimation: transition animation is disabled or skipped. atoken=%s",
- "level": "VERBOSE",
- "group": "WM_DEBUG_APP_TRANSITIONS_ANIM",
- "at": "com\/android\/server\/wm\/ActivityRecord.java"
- },
"-251259736": {
"message": "No longer freezing: %s",
"level": "VERBOSE",
@@ -919,12 +913,6 @@
"group": "WM_DEBUG_APP_TRANSITIONS",
"at": "com\/android\/server\/wm\/AppTransitionController.java"
},
- "-121104356": {
- "message": "Remove %s: mSurfaceController=%s mAnimatingExit=%b mRemoveOnExit=%b mHasSurface=%b surfaceShowing=%b animating=%b app-animation=%b mWillReplaceWindow=%b inPendingTransaction=%b mDisplayFrozen=%b callers=%s",
- "level": "VERBOSE",
- "group": "WM_DEBUG_APP_TRANSITIONS",
- "at": "com\/android\/server\/wm\/WindowState.java"
- },
"-116086365": {
"message": "******************** ENABLING SCREEN!",
"level": "INFO",
@@ -961,6 +949,12 @@
"group": "WM_SHOW_TRANSACTIONS",
"at": "com\/android\/server\/wm\/Session.java"
},
+ "-33096143": {
+ "message": "applyAnimation: transition animation is disabled or skipped. container=%s",
+ "level": "VERBOSE",
+ "group": "WM_DEBUG_APP_TRANSITIONS_ANIM",
+ "at": "com\/android\/server\/wm\/WindowContainer.java"
+ },
"-29233992": {
"message": "SURFACE CLEAR CROP: %s",
"level": "INFO",
@@ -1333,6 +1327,12 @@
"group": "WM_DEBUG_REMOTE_ANIMATIONS",
"at": "com\/android\/server\/wm\/RemoteAnimationController.java"
},
+ "594260654": {
+ "message": "Remove %s: mSurfaceController=%s mAnimatingExit=%b mRemoveOnExit=%b mHasSurface=%b surfaceShowing=%b animating=%b app-animation=%b mWillReplaceWindow=%b mDisplayFrozen=%b callers=%s",
+ "level": "VERBOSE",
+ "group": "WM_DEBUG_APP_TRANSITIONS",
+ "at": "com\/android\/server\/wm\/WindowState.java"
+ },
"600140673": {
"message": "checkBootAnimationComplete: Waiting for anim complete",
"level": "INFO",
@@ -1375,6 +1375,12 @@
"group": "WM_SHOW_TRANSACTIONS",
"at": "com\/android\/server\/wm\/WindowSurfaceController.java"
},
+ "638429464": {
+ "message": "\tRemove container=%s",
+ "level": "DEBUG",
+ "group": "WM_DEBUG_REMOTE_ANIMATIONS",
+ "at": "com\/android\/server\/wm\/RemoteAnimationController.java"
+ },
"644675193": {
"message": "Real start recents",
"level": "DEBUG",
@@ -1465,12 +1471,6 @@
"group": "WM_DEBUG_ORIENTATION",
"at": "com\/android\/server\/wm\/ActivityRecord.java"
},
- "815803557": {
- "message": "applyAnimation: atoken=%s",
- "level": "VERBOSE",
- "group": "WM_DEBUG_APP_TRANSITIONS_ANIM",
- "at": "com\/android\/server\/wm\/ActivityRecord.java"
- },
"829434921": {
"message": "Draw state now committed in %s",
"level": "VERBOSE",
@@ -1543,6 +1543,12 @@
"group": "WM_ERROR",
"at": "com\/android\/server\/wm\/WindowManagerService.java"
},
+ "972354148": {
+ "message": "\tcontainer=%s",
+ "level": "DEBUG",
+ "group": "WM_DEBUG_REMOTE_ANIMATIONS",
+ "at": "com\/android\/server\/wm\/RemoteAnimationController.java"
+ },
"1001904964": {
"message": "***** BOOT TIMEOUT: forcing display enabled",
"level": "WARN",
@@ -1675,12 +1681,6 @@
"group": "WM_DEBUG_FOCUS",
"at": "com\/android\/server\/wm\/DisplayContent.java"
},
- "1358786604": {
- "message": "No thumbnail header bitmap for: %d",
- "level": "DEBUG",
- "group": "WM_DEBUG_APP_TRANSITIONS",
- "at": "com\/android\/server\/wm\/ActivityRecord.java"
- },
"1364498663": {
"message": "notifyAppResumed: wasStopped=%b %s",
"level": "VERBOSE",
@@ -1795,11 +1795,11 @@
"group": "WM_DEBUG_RECENTS_ANIMATIONS",
"at": "com\/android\/server\/wm\/RecentsAnimationController.java"
},
- "1531527061": {
- "message": "createAnimationAdapter(): token=%s",
+ "1528528509": {
+ "message": "No thumbnail header bitmap for: %s",
"level": "DEBUG",
- "group": "WM_DEBUG_REMOTE_ANIMATIONS",
- "at": "com\/android\/server\/wm\/RemoteAnimationController.java"
+ "group": "WM_DEBUG_APP_TRANSITIONS",
+ "at": "com\/android\/server\/wm\/ActivityRecord.java"
},
"1563755163": {
"message": "Permission Denial: %s from pid=%d, uid=%d requires %s",
@@ -1819,6 +1819,12 @@
"group": "WM_DEBUG_ADD_REMOVE",
"at": "com\/android\/server\/wm\/WindowState.java"
},
+ "1584270979": {
+ "message": "applyAnimation: container=%s",
+ "level": "VERBOSE",
+ "group": "WM_DEBUG_APP_TRANSITIONS_ANIM",
+ "at": "com\/android\/server\/wm\/WindowContainer.java"
+ },
"1589610525": {
"message": "applyAnimation NEXT_TRANSIT_TYPE_OPEN_CROSS_PROFILE_APPS: anim=%s transit=%s isEntrance=true Callers=%s",
"level": "VERBOSE",
@@ -1909,11 +1915,11 @@
"group": "WM_ERROR",
"at": "com\/android\/server\/wm\/WindowManagerService.java"
},
- "1804869745": {
+ "1831008694": {
"message": "Loading animation for app transition. transit=%s enter=%b frame=%s insets=%s surfaceInsets=%s",
"level": "DEBUG",
"group": "WM_DEBUG_APP_TRANSITIONS",
- "at": "com\/android\/server\/wm\/ActivityRecord.java"
+ "at": "com\/android\/server\/wm\/WindowContainer.java"
},
"1836214582": {
"message": "startingData was nulled out before handling mAddStartingWindow: %s",
@@ -1939,12 +1945,6 @@
"group": "WM_DEBUG_SCREEN_ON",
"at": "com\/android\/server\/wm\/DisplayPolicy.java"
},
- "1865246212": {
- "message": "\tapp=%s",
- "level": "DEBUG",
- "group": "WM_DEBUG_REMOTE_ANIMATIONS",
- "at": "com\/android\/server\/wm\/RemoteAnimationController.java"
- },
"1866772666": {
"message": "SAFE MODE not enabled",
"level": "INFO",
@@ -2017,6 +2017,12 @@
"group": "WM_DEBUG_STARTING_WINDOW",
"at": "com\/android\/server\/wm\/ActivityRecord.java"
},
+ "2022422429": {
+ "message": "createAnimationAdapter(): container=%s",
+ "level": "DEBUG",
+ "group": "WM_DEBUG_REMOTE_ANIMATIONS",
+ "at": "com\/android\/server\/wm\/RemoteAnimationController.java"
+ },
"2028163120": {
"message": "applyAnimation: anim=%s nextAppTransition=ANIM_SCALE_UP transit=%s isEntrance=%s Callers=%s",
"level": "VERBOSE",
diff --git a/graphics/java/android/graphics/drawable/DrawableWrapper.java b/graphics/java/android/graphics/drawable/DrawableWrapper.java
index 64fc7042dfc7..6c90c4c6c8a4 100644
--- a/graphics/java/android/graphics/drawable/DrawableWrapper.java
+++ b/graphics/java/android/graphics/drawable/DrawableWrapper.java
@@ -364,6 +364,13 @@ public abstract class DrawableWrapper extends Drawable implements Drawable.Callb
}
@Override
+ public void jumpToCurrentState() {
+ if (mDrawable != null) {
+ mDrawable.jumpToCurrentState();
+ }
+ }
+
+ @Override
protected boolean onLevelChange(int level) {
return mDrawable != null && mDrawable.setLevel(level);
}
diff --git a/graphics/java/android/graphics/drawable/GradientDrawable.java b/graphics/java/android/graphics/drawable/GradientDrawable.java
index c6586ecfceb9..45b2de5f4b31 100644
--- a/graphics/java/android/graphics/drawable/GradientDrawable.java
+++ b/graphics/java/android/graphics/drawable/GradientDrawable.java
@@ -784,7 +784,9 @@ public class GradientDrawable extends Drawable {
mFillPaint.setDither(st.mDither);
mFillPaint.setColorFilter(colorFilter);
if (colorFilter != null && st.mSolidColors == null) {
- mFillPaint.setColor(mAlpha << 24);
+ // If we don't have a solid color and we don't have a gradient,
+ // the app is stroking the shape, set the color to transparent
+ mFillPaint.setColor(st.mGradientColors != null ? mAlpha << 24 : 0);
}
if (haveStroke) {
mStrokePaint.setAlpha(currStrokeAlpha);
diff --git a/libs/hwui/HardwareBitmapUploader.cpp b/libs/hwui/HardwareBitmapUploader.cpp
index 40bff88b7512..3681c69e912b 100644
--- a/libs/hwui/HardwareBitmapUploader.cpp
+++ b/libs/hwui/HardwareBitmapUploader.cpp
@@ -302,6 +302,7 @@ static FormatInfo determineFormat(const SkBitmap& skBitmap, bool usingGL) {
switch (skBitmap.info().colorType()) {
case kRGBA_8888_SkColorType:
formatInfo.isSupported = true;
+ [[fallthrough]];
// ARGB_4444 is upconverted to RGBA_8888
case kARGB_4444_SkColorType:
formatInfo.pixelFormat = PIXEL_FORMAT_RGBA_8888;
diff --git a/libs/hwui/TreeInfo.cpp b/libs/hwui/TreeInfo.cpp
index dc53dd6c27c3..750f869e2551 100644
--- a/libs/hwui/TreeInfo.cpp
+++ b/libs/hwui/TreeInfo.cpp
@@ -24,7 +24,6 @@ TreeInfo::TreeInfo(TraversalMode mode, renderthread::CanvasContext& canvasContex
: mode(mode)
, prepareTextures(mode == MODE_FULL)
, canvasContext(canvasContext)
- , damageGenerationId(canvasContext.getFrameNumber())
, disableForceDark(canvasContext.useForceDark() ? 0 : 1)
, screenSize(canvasContext.getNextFrameSize()) {}
diff --git a/libs/hwui/renderthread/CanvasContext.cpp b/libs/hwui/renderthread/CanvasContext.cpp
index e5c502cca09a..4ca26c273c95 100644
--- a/libs/hwui/renderthread/CanvasContext.cpp
+++ b/libs/hwui/renderthread/CanvasContext.cpp
@@ -303,6 +303,7 @@ void CanvasContext::prepareTree(TreeInfo& info, int64_t* uiFrameInfo, int64_t sy
info.damageAccumulator = &mDamageAccumulator;
info.layerUpdateQueue = &mLayerUpdateQueue;
+ info.damageGenerationId = mDamageId++;
info.out.canDrawThisFrame = true;
mAnimationContext->startFrame(info.mode);
@@ -702,7 +703,7 @@ bool CanvasContext::surfaceRequiresRedraw() {
surface->query(NATIVE_WINDOW_WIDTH, &width);
surface->query(NATIVE_WINDOW_HEIGHT, &height);
- return width == mLastFrameWidth && height == mLastFrameHeight;
+ return width != mLastFrameWidth || height != mLastFrameHeight;
}
void CanvasContext::setRenderAheadDepth(int renderAhead) {
diff --git a/libs/hwui/renderthread/CanvasContext.h b/libs/hwui/renderthread/CanvasContext.h
index 6e3e43af8c6f..b192d461da9b 100644
--- a/libs/hwui/renderthread/CanvasContext.h
+++ b/libs/hwui/renderthread/CanvasContext.h
@@ -245,6 +245,7 @@ private:
// Need at least 4 because we do quad buffer. Add a 5th for good measure.
RingBuffer<SwapHistory, 5> mSwapHistory;
int64_t mFrameNumber = -1;
+ int64_t mDamageId = 0;
// last vsync for a dropped frame due to stuffed queue
nsecs_t mLastDropVsync = 0;
diff --git a/location/java/android/location/ILocationListener.aidl b/location/java/android/location/ILocationListener.aidl
index ec1134566b24..8479caf367b0 100644
--- a/location/java/android/location/ILocationListener.aidl
+++ b/location/java/android/location/ILocationListener.aidl
@@ -31,8 +31,6 @@ oneway interface ILocationListener
void onProviderEnabled(String provider);
@UnsupportedAppUsage
void onProviderDisabled(String provider);
-
- // --- deprecated ---
- @UnsupportedAppUsage
- void onStatusChanged(String provider, int status, in Bundle extras);
+ // called when the listener is removed from the server side; no further callbacks are expected
+ void onRemoved();
}
diff --git a/location/java/android/location/LocationManager.java b/location/java/android/location/LocationManager.java
index 87b3be9cc26d..b7dd543680dc 100644
--- a/location/java/android/location/LocationManager.java
+++ b/location/java/android/location/LocationManager.java
@@ -708,6 +708,7 @@ public class LocationManager {
* @deprecated Use {@link #getCurrentLocation(String, CancellationSignal, Executor, Consumer)}
* instead as it does not carry a risk of extreme battery drain.
*/
+ @Deprecated
@RequiresPermission(anyOf = {ACCESS_COARSE_LOCATION, ACCESS_FINE_LOCATION})
public void requestSingleUpdate(
@NonNull Criteria criteria,
@@ -737,6 +738,7 @@ public class LocationManager {
* @deprecated Use {@link #getCurrentLocation(String, CancellationSignal, Executor, Consumer)}
* instead as it does not carry a risk of extreme battery drain.
*/
+ @Deprecated
@RequiresPermission(anyOf = {ACCESS_COARSE_LOCATION, ACCESS_FINE_LOCATION})
public void requestSingleUpdate(@NonNull String provider,
@NonNull PendingIntent pendingIntent) {
@@ -765,6 +767,7 @@ public class LocationManager {
* @deprecated Use {@link #getCurrentLocation(String, CancellationSignal, Executor, Consumer)}
* instead as it does not carry a risk of extreme battery drain.
*/
+ @Deprecated
@RequiresPermission(anyOf = {ACCESS_COARSE_LOCATION, ACCESS_FINE_LOCATION})
public void requestSingleUpdate(@NonNull Criteria criteria,
@NonNull PendingIntent pendingIntent) {
@@ -2481,9 +2484,6 @@ public class LocationManager {
}
@Override
- public void onStatusChanged(String provider, int status, Bundle extras) {}
-
- @Override
public void onProviderEnabled(String provider) {}
@Override
@@ -2493,6 +2493,11 @@ public class LocationManager {
deliverResult(null);
}
+ @Override
+ public void onRemoved() {
+ deliverResult(null);
+ }
+
private synchronized void deliverResult(@Nullable Location location) {
if (mExecutor == null) {
return;
@@ -2568,37 +2573,6 @@ public class LocationManager {
}
@Override
- public void onStatusChanged(String provider, int status, Bundle extras) {
- Executor currentExecutor = mExecutor;
- if (currentExecutor == null) {
- return;
- }
-
- try {
- currentExecutor.execute(() -> {
- try {
- if (currentExecutor != mExecutor) {
- return;
- }
-
- // we may be under the binder identity if a direct executor is used
- long identity = Binder.clearCallingIdentity();
- try {
- mListener.onStatusChanged(provider, status, extras);
- } finally {
- Binder.restoreCallingIdentity(identity);
- }
- } finally {
- locationCallbackFinished();
- }
- });
- } catch (RejectedExecutionException e) {
- locationCallbackFinished();
- throw e;
- }
- }
-
- @Override
public void onProviderEnabled(String provider) {
Executor currentExecutor = mExecutor;
if (currentExecutor == null) {
@@ -2660,6 +2634,14 @@ public class LocationManager {
}
}
+ @Override
+ public void onRemoved() {
+ unregister();
+ synchronized (mListeners) {
+ mListeners.remove(mListener, this);
+ }
+ }
+
private void locationCallbackFinished() {
try {
mService.locationCallbackFinished(this);
@@ -2757,9 +2739,14 @@ public class LocationManager {
protected boolean registerService() throws RemoteException {
Preconditions.checkState(mListenerTransport == null);
- mListenerTransport = new GnssStatusListener();
- return mService.registerGnssStatusCallback(mListenerTransport,
- mContext.getPackageName(), mContext.getFeatureId());
+ GnssStatusListener transport = new GnssStatusListener();
+ if (mService.registerGnssStatusCallback(transport, mContext.getPackageName(),
+ mContext.getFeatureId())) {
+ mListenerTransport = transport;
+ return true;
+ } else {
+ return false;
+ }
}
@Override
@@ -2817,10 +2804,14 @@ public class LocationManager {
protected boolean registerService() throws RemoteException {
Preconditions.checkState(mListenerTransport == null);
- mListenerTransport = new GnssMeasurementsListener();
- return mService.addGnssMeasurementsListener(mListenerTransport,
- mContext.getPackageName(), mContext.getFeatureId(),
- "gnss measurement callback");
+ GnssMeasurementsListener transport = new GnssMeasurementsListener();
+ if (mService.addGnssMeasurementsListener(transport, mContext.getPackageName(),
+ mContext.getFeatureId(), "gnss measurement callback")) {
+ mListenerTransport = transport;
+ return true;
+ } else {
+ return false;
+ }
}
@Override
@@ -2854,10 +2845,14 @@ public class LocationManager {
protected boolean registerService() throws RemoteException {
Preconditions.checkState(mListenerTransport == null);
- mListenerTransport = new GnssNavigationMessageListener();
- return mService.addGnssNavigationMessageListener(mListenerTransport,
- mContext.getPackageName(), mContext.getFeatureId(),
- "gnss navigation callback");
+ GnssNavigationMessageListener transport = new GnssNavigationMessageListener();
+ if (mService.addGnssNavigationMessageListener(transport, mContext.getPackageName(),
+ mContext.getFeatureId(), "gnss navigation callback")) {
+ mListenerTransport = transport;
+ return true;
+ } else {
+ return false;
+ }
}
@Override
@@ -2891,9 +2886,14 @@ public class LocationManager {
protected boolean registerService() throws RemoteException {
Preconditions.checkState(mListenerTransport == null);
- mListenerTransport = new BatchedLocationCallback();
- return mService.addGnssBatchingCallback(mListenerTransport, mContext.getPackageName(),
- mContext.getFeatureId(), "batched location callback");
+ BatchedLocationCallback transport = new BatchedLocationCallback();
+ if (mService.addGnssBatchingCallback(transport, mContext.getPackageName(),
+ mContext.getFeatureId(), "batched location callback")) {
+ mListenerTransport = transport;
+ return true;
+ } else {
+ return false;
+ }
}
@Override
diff --git a/location/lib/Android.bp b/location/lib/Android.bp
index fe0f669508eb..cd45e8e6ffa6 100644
--- a/location/lib/Android.bp
+++ b/location/lib/Android.bp
@@ -17,10 +17,8 @@
java_sdk_library {
name: "com.android.location.provider",
srcs: ["java/**/*.java"],
- api_srcs: [":framework-all-sources"],
libs: [
"androidx.annotation_annotation",
- "framework-all",
],
api_packages: ["com.android.location.provider"],
}
diff --git a/media/java/android/media/AudioManager.java b/media/java/android/media/AudioManager.java
index f797da70e7d1..9ad7f2a7dcc6 100644
--- a/media/java/android/media/AudioManager.java
+++ b/media/java/android/media/AudioManager.java
@@ -908,6 +908,7 @@ public class AudioManager {
/** @hide */
@UnsupportedAppUsage
+ @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING)
public void setMasterMute(boolean mute, int flags) {
final IAudioService service = getService();
try {
diff --git a/media/java/android/media/IMediaRouter2Client.aidl b/media/java/android/media/IMediaRouter2Client.aidl
index 26184af699db..72c33f994349 100644
--- a/media/java/android/media/IMediaRouter2Client.aidl
+++ b/media/java/android/media/IMediaRouter2Client.aidl
@@ -16,12 +16,14 @@
package android.media;
-import android.media.MediaRoute2ProviderInfo;
+import android.media.MediaRoute2Info;
/**
* @hide
*/
oneway interface IMediaRouter2Client {
void notifyRestoreRoute();
- void notifyProviderInfosUpdated(in List<MediaRoute2ProviderInfo> providers);
+ void notifyRoutesAdded(in List<MediaRoute2Info> routes);
+ void notifyRoutesRemoved(in List<MediaRoute2Info> routes);
+ void notifyRoutesChanged(in List<MediaRoute2Info> routes);
}
diff --git a/media/java/android/media/ImageWriter.java b/media/java/android/media/ImageWriter.java
index f813d1b68419..7bc2b31b16fa 100644
--- a/media/java/android/media/ImageWriter.java
+++ b/media/java/android/media/ImageWriter.java
@@ -192,13 +192,15 @@ public class ImageWriter implements AutoCloseable {
mMaxImages = maxImages;
- if (format == ImageFormat.UNKNOWN) {
- format = SurfaceUtils.getSurfaceFormat(surface);
- }
// Note that the underlying BufferQueue is working in synchronous mode
// to avoid dropping any buffers.
mNativeContext = nativeInit(new WeakReference<>(this), surface, maxImages, format);
+ // nativeInit internally overrides UNKNOWN format. So does surface format query after
+ // nativeInit and before getEstimatedNativeAllocBytes().
+ if (format == ImageFormat.UNKNOWN) {
+ format = SurfaceUtils.getSurfaceFormat(surface);
+ }
// Estimate the native buffer allocation size and register it so it gets accounted for
// during GC. Note that this doesn't include the buffers required by the buffer queue
// itself and the buffers requested by the producer.
diff --git a/media/java/android/media/MediaMetadataRetriever.java b/media/java/android/media/MediaMetadataRetriever.java
index cc5ddeb49813..5d2bdd756840 100644
--- a/media/java/android/media/MediaMetadataRetriever.java
+++ b/media/java/android/media/MediaMetadataRetriever.java
@@ -34,6 +34,7 @@ import java.io.FileNotFoundException;
import java.io.IOException;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
+import java.util.HashMap;
import java.util.List;
import java.util.Map;
@@ -62,7 +63,8 @@ public class MediaMetadataRetriever implements AutoCloseable {
* method before the rest of the methods in this class. This method may be
* time-consuming.
*
- * @param path The path of the input media file.
+ * @param path The path, or the URI (doesn't support streaming source currently)
+ * of the input media file.
* @throws IllegalArgumentException If the path is invalid.
*/
public void setDataSource(String path) throws IllegalArgumentException {
@@ -70,6 +72,15 @@ public class MediaMetadataRetriever implements AutoCloseable {
throw new IllegalArgumentException("null path");
}
+ final Uri uri = Uri.parse(path);
+ final String scheme = uri.getScheme();
+ if ("file".equals(scheme)) {
+ path = uri.getPath();
+ } else if (scheme != null) {
+ setDataSource(path, new HashMap<String, String>());
+ return;
+ }
+
try (FileInputStream is = new FileInputStream(path)) {
FileDescriptor fd = is.getFD();
setDataSource(fd, 0, 0x7ffffffffffffffL);
diff --git a/media/java/android/media/MediaRoute2Info.java b/media/java/android/media/MediaRoute2Info.java
index 59bd96ffb1bd..457ccb788d0d 100644
--- a/media/java/android/media/MediaRoute2Info.java
+++ b/media/java/android/media/MediaRoute2Info.java
@@ -314,7 +314,7 @@ public final class MediaRoute2Info implements Parcelable {
List<String> mSupportedCategories;
int mVolume;
int mVolumeMax;
- int mVolumeHandling;
+ int mVolumeHandling = PLAYBACK_VOLUME_FIXED;
Bundle mExtras;
public Builder(@NonNull String id, @NonNull String name) {
diff --git a/media/java/android/media/MediaRouter2.java b/media/java/android/media/MediaRouter2.java
index b52e2d647e5a..ce18ab3b3c83 100644
--- a/media/java/android/media/MediaRouter2.java
+++ b/media/java/android/media/MediaRouter2.java
@@ -33,7 +33,9 @@ import com.android.internal.annotations.GuardedBy;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
+import java.util.HashMap;
import java.util.List;
+import java.util.Map;
import java.util.Objects;
import java.util.concurrent.CopyOnWriteArrayList;
import java.util.concurrent.Executor;
@@ -51,23 +53,23 @@ public class MediaRouter2 {
@GuardedBy("sLock")
private static MediaRouter2 sInstance;
- private Context mContext;
+ private final Context mContext;
private final IMediaRouterService mMediaRouterService;
private final CopyOnWriteArrayList<CallbackRecord> mCallbackRecords =
new CopyOnWriteArrayList<>();
- @GuardedBy("sLock")
- private List<String> mControlCategories = Collections.emptyList();
- @GuardedBy("sLock")
- private Client mClient;
private final String mPackageName;
- final Handler mHandler;
+ private final Map<String, MediaRoute2Info> mRoutes = new HashMap<>();
- List<MediaRoute2ProviderInfo> mProviders = Collections.emptyList();
- volatile List<MediaRoute2Info> mRoutes = Collections.emptyList();
+ private volatile List<String> mControlCategories = Collections.emptyList();
- MediaRoute2Info mSelectedRoute;
+ private MediaRoute2Info mSelectedRoute;
+ @GuardedBy("sLock")
+ private Client mClient;
+
+ final Handler mHandler;
+ volatile List<MediaRoute2Info> mFilteredRoutes = Collections.emptyList();
/**
* Gets an instance of the media router associated with the context.
@@ -137,6 +139,7 @@ public class MediaRouter2 {
}
}
}
+ //TODO: Is it thread-safe?
record.notifyRoutes();
//TODO: Update discovery request here.
@@ -181,31 +184,22 @@ public class MediaRouter2 {
public void setControlCategories(@NonNull Collection<String> controlCategories) {
Objects.requireNonNull(controlCategories, "control categories must not be null");
- Client client;
- List<String> newControlCategories = new ArrayList<>(controlCategories);
- synchronized (sLock) {
- mControlCategories = newControlCategories;
- client = mClient;
- }
- if (client != null) {
- try {
- mMediaRouterService.setControlCategories2(client, newControlCategories);
- } catch (RemoteException ex) {
- Log.e(TAG, "Unable to set control categories.", ex);
- }
- }
- mHandler.sendMessage(obtainMessage(MediaRouter2::refreshAndNotifyRoutes, this));
+ // To ensure invoking callbacks correctly according to control categories
+ mHandler.sendMessage(obtainMessage(MediaRouter2::setControlCategoriesOnHandler,
+ MediaRouter2.this, new ArrayList<>(controlCategories)));
}
+
/**
- * Gets the list of {@link MediaRoute2Info routes} currently known to the media router.
+ * Gets the unmodifiable list of {@link MediaRoute2Info routes} currently
+ * known to the media router.
*
* @return the list of routes that support at least one of the control categories set by
* the application
*/
@NonNull
public List<MediaRoute2Info> getRoutes() {
- return mRoutes;
+ return mFilteredRoutes;
}
/**
@@ -326,77 +320,121 @@ public class MediaRouter2 {
return -1;
}
- void onProviderInfosUpdated(List<MediaRoute2ProviderInfo> providers) {
- if (providers == null) {
- Log.w(TAG, "Providers info is null.");
- return;
- }
-
- mProviders = providers;
- refreshAndNotifyRoutes();
- }
-
- void refreshAndNotifyRoutes() {
- ArrayList<MediaRoute2Info> routes = new ArrayList<>();
+ private void setControlCategoriesOnHandler(List<String> newControlCategories) {
+ List<String> prevControlCategories = mControlCategories;
+ List<MediaRoute2Info> addedRoutes = new ArrayList<>();
+ List<MediaRoute2Info> removedRoutes = new ArrayList<>();
+ List<MediaRoute2Info> filteredRoutes = new ArrayList<>();
- List<String> controlCategories;
+ mControlCategories = newControlCategories;
+ Client client;
synchronized (sLock) {
- controlCategories = mControlCategories;
+ client = mClient;
+ }
+ if (client != null) {
+ try {
+ mMediaRouterService.setControlCategories2(client, mControlCategories);
+ } catch (RemoteException ex) {
+ Log.e(TAG, "Unable to set control categories.", ex);
+ }
}
- for (MediaRoute2ProviderInfo provider : mProviders) {
- updateProvider(provider, controlCategories, routes);
+ for (MediaRoute2Info route : mRoutes.values()) {
+ boolean preSupported = route.supportsControlCategory(prevControlCategories);
+ boolean postSupported = route.supportsControlCategory(newControlCategories);
+ if (postSupported) {
+ filteredRoutes.add(route);
+ }
+ if (preSupported == postSupported) {
+ continue;
+ }
+ if (preSupported) {
+ removedRoutes.add(route);
+ } else {
+ addedRoutes.add(route);
+ }
}
+ mFilteredRoutes = Collections.unmodifiableList(filteredRoutes);
- //TODO: Can orders be changed?
- if (!Objects.equals(mRoutes, routes)) {
- mRoutes = Collections.unmodifiableList(routes);
- notifyRouteListChanged(mRoutes);
+ if (removedRoutes.size() > 0) {
+ notifyRoutesRemoved(removedRoutes);
+ }
+ if (addedRoutes.size() > 0) {
+ notifyRoutesAdded(addedRoutes);
}
}
- void updateProvider(MediaRoute2ProviderInfo provider, List<String> controlCategories,
- List<MediaRoute2Info> outRoutes) {
- if (provider == null || !provider.isValid()) {
- Log.w(TAG, "Ignoring invalid provider : " + provider);
- return;
+ void addRoutesOnHandler(List<MediaRoute2Info> routes) {
+ List<MediaRoute2Info> addedRoutes = new ArrayList<>();
+ for (MediaRoute2Info route : routes) {
+ mRoutes.put(route.getUniqueId(), route);
+ if (route.supportsControlCategory(mControlCategories)) {
+ addedRoutes.add(route);
+ }
}
+ if (addedRoutes.size() > 0) {
+ refreshFilteredRoutes();
+ notifyRoutesAdded(addedRoutes);
+ }
+ }
- final Collection<MediaRoute2Info> routes = provider.getRoutes();
+ void removeRoutesOnHandler(List<MediaRoute2Info> routes) {
+ List<MediaRoute2Info> removedRoutes = new ArrayList<>();
for (MediaRoute2Info route : routes) {
- if (!route.isValid()) {
- Log.w(TAG, "Ignoring invalid route : " + route);
- continue;
+ mRoutes.remove(route.getUniqueId());
+ if (route.supportsControlCategory(mControlCategories)) {
+ removedRoutes.add(route);
}
- if (!route.supportsControlCategory(controlCategories)) {
- continue;
+ }
+ if (removedRoutes.size() > 0) {
+ refreshFilteredRoutes();
+ notifyRoutesRemoved(removedRoutes);
+ }
+ }
+
+ void changeRoutesOnHandler(List<MediaRoute2Info> routes) {
+ List<MediaRoute2Info> changedRoutes = new ArrayList<>();
+ for (MediaRoute2Info route : routes) {
+ mRoutes.put(route.getUniqueId(), route);
+ if (route.supportsControlCategory(mControlCategories)) {
+ changedRoutes.add(route);
}
- MediaRoute2Info preRoute = findRouteById(route.getId());
- if (!route.equals(preRoute)) {
- notifyRouteChanged(route);
+ }
+ if (changedRoutes.size() > 0) {
+ refreshFilteredRoutes();
+ notifyRoutesChanged(changedRoutes);
+ }
+ }
+
+ private void refreshFilteredRoutes() {
+ List<MediaRoute2Info> filteredRoutes = new ArrayList<>();
+
+ for (MediaRoute2Info route : mRoutes.values()) {
+ if (route.supportsControlCategory(mControlCategories)) {
+ filteredRoutes.add(route);
}
- outRoutes.add(route);
}
+ mFilteredRoutes = Collections.unmodifiableList(filteredRoutes);
}
- MediaRoute2Info findRouteById(String id) {
- for (MediaRoute2Info route : mRoutes) {
- if (route.getId().equals(id)) return route;
+ private void notifyRoutesAdded(List<MediaRoute2Info> routes) {
+ for (CallbackRecord record: mCallbackRecords) {
+ record.mExecutor.execute(
+ () -> record.mCallback.onRoutesAdded(routes));
}
- return null;
}
- void notifyRouteListChanged(List<MediaRoute2Info> routes) {
+ private void notifyRoutesRemoved(List<MediaRoute2Info> routes) {
for (CallbackRecord record: mCallbackRecords) {
record.mExecutor.execute(
- () -> record.mCallback.onRoutesChanged(routes));
+ () -> record.mCallback.onRoutesRemoved(routes));
}
}
- void notifyRouteChanged(MediaRoute2Info route) {
+ private void notifyRoutesChanged(List<MediaRoute2Info> routes) {
for (CallbackRecord record: mCallbackRecords) {
record.mExecutor.execute(
- () -> record.mCallback.onRouteChanged(route));
+ () -> record.mCallback.onRoutesChanged(routes));
}
}
@@ -405,23 +443,22 @@ public class MediaRouter2 {
*/
public static class Callback {
//TODO: clean up these callbacks
- /**
- * Called when a route is added.
- */
- public void onRouteAdded(MediaRoute2Info routeInfo) {}
/**
- * Called when a route is changed.
+ * Called when routes are added.
+ * @param routes the list of routes that have been added. It's never empty.
*/
- public void onRouteChanged(MediaRoute2Info routeInfo) {}
+ public void onRoutesAdded(@NonNull List<MediaRoute2Info> routes) {}
/**
- * Called when a route is removed.
+ * Called when routes are removed.
+ * @param routes the list of routes that have been removed. It's never empty.
*/
- public void onRouteRemoved(MediaRoute2Info routeInfo) {}
+ public void onRoutesRemoved(@NonNull List<MediaRoute2Info> routes) {}
/**
- * Called when the list of routes is changed.
+ * Called when routes are changed.
+ * @param routes the list of routes that have been changed. It's never empty.
*/
public void onRoutesChanged(@NonNull List<MediaRoute2Info> routes) {}
}
@@ -436,11 +473,10 @@ public class MediaRouter2 {
}
void notifyRoutes() {
- final List<MediaRoute2Info> routes = mRoutes;
+ final List<MediaRoute2Info> routes = mFilteredRoutes;
// notify only when bound to media router service.
- //TODO: Correct the condition when control category, default route, .. are finalized.
if (routes.size() > 0) {
- mExecutor.execute(() -> mCallback.onRoutesChanged(routes));
+ mExecutor.execute(() -> mCallback.onRoutesAdded(routes));
}
}
}
@@ -450,9 +486,21 @@ public class MediaRouter2 {
public void notifyRestoreRoute() throws RemoteException {}
@Override
- public void notifyProviderInfosUpdated(List<MediaRoute2ProviderInfo> info) {
- mHandler.sendMessage(obtainMessage(MediaRouter2::onProviderInfosUpdated,
- MediaRouter2.this, info));
+ public void notifyRoutesAdded(List<MediaRoute2Info> routes) {
+ mHandler.sendMessage(obtainMessage(MediaRouter2::addRoutesOnHandler,
+ MediaRouter2.this, routes));
+ }
+
+ @Override
+ public void notifyRoutesRemoved(List<MediaRoute2Info> routes) {
+ mHandler.sendMessage(obtainMessage(MediaRouter2::removeRoutesOnHandler,
+ MediaRouter2.this, routes));
+ }
+
+ @Override
+ public void notifyRoutesChanged(List<MediaRoute2Info> routes) {
+ mHandler.sendMessage(obtainMessage(MediaRouter2::changeRoutesOnHandler,
+ MediaRouter2.this, routes));
}
}
}
diff --git a/media/java/android/media/MediaRouter2Manager.java b/media/java/android/media/MediaRouter2Manager.java
index 0d7b6ff0ea91..7e848a0bdf90 100644
--- a/media/java/android/media/MediaRouter2Manager.java
+++ b/media/java/android/media/MediaRouter2Manager.java
@@ -67,7 +67,7 @@ public class MediaRouter2Manager {
@NonNull
List<MediaRoute2Info> mRoutes = Collections.emptyList();
@NonNull
- ConcurrentMap<String, List<String>> mControlCategoryMap = new ConcurrentHashMap<>();
+ final ConcurrentMap<String, List<String>> mControlCategoryMap = new ConcurrentHashMap<>();
/**
* Gets an instance of media router manager that controls media route of other applications.
@@ -427,6 +427,8 @@ public class MediaRouter2Manager {
* A client may refresh available routes for each application.
*/
public void onRoutesChanged(@NonNull List<MediaRoute2Info> routes) {}
+
+ //TODO: add onControlCategoriesChanged to notify available routes are changed
}
final class CallbackRecord {
diff --git a/media/jni/Android.bp b/media/jni/Android.bp
index 3742f970e8fd..2f53cbb24129 100644
--- a/media/jni/Android.bp
+++ b/media/jni/Android.bp
@@ -99,13 +99,14 @@ cc_library_shared {
"android_media_Utils.cpp",
],
+ header_libs: [
+ "libgui_headers",
+ ],
+
shared_libs: [
"liblog",
- "libgui",
- "libnativewindow",
"libui",
"libutils",
- "android.hidl.token@1.0-utils",
],
include_dirs: [
diff --git a/media/lib/signer/Android.bp b/media/lib/signer/Android.bp
index 6b03e4de57d7..3b2578754087 100644
--- a/media/lib/signer/Android.bp
+++ b/media/lib/signer/Android.bp
@@ -17,7 +17,5 @@
java_sdk_library {
name: "com.android.mediadrm.signer",
srcs: ["java/**/*.java"],
- api_srcs: [":framework-all-sources"],
- libs: ["framework-all"],
api_packages: ["com.android.mediadrm.signer"],
}
diff --git a/media/tests/MediaRouter/src/com/android/mediaroutertest/MediaRouterManagerTest.java b/media/tests/MediaRouter/src/com/android/mediaroutertest/MediaRouterManagerTest.java
index ca43d04573f3..acf899881600 100644
--- a/media/tests/MediaRouter/src/com/android/mediaroutertest/MediaRouterManagerTest.java
+++ b/media/tests/MediaRouter/src/com/android/mediaroutertest/MediaRouterManagerTest.java
@@ -22,6 +22,7 @@ import static android.media.MediaRoute2Info.PLAYBACK_VOLUME_VARIABLE;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotEquals;
import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
import static org.mockito.ArgumentMatchers.argThat;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.timeout;
@@ -272,29 +273,28 @@ public class MediaRouterManagerTest {
@Test
public void testControlVolumeWithRouter() throws Exception {
- MediaRouter2.Callback mockCallback = mock(MediaRouter2.Callback.class);
-
Map<String, MediaRoute2Info> routes = waitAndGetRoutes(CONTROL_CATEGORIES_ALL);
- mRouter2.registerCallback(mExecutor, mockCallback);
MediaRoute2Info volRoute = routes.get(ROUTE_ID_VARIABLE_VOLUME);
int originalVolume = volRoute.getVolume();
int deltaVolume = (originalVolume == volRoute.getVolumeMax() ? -1 : 1);
- int targetVolume = originalVolume + deltaVolume;
-
- mRouter2.requestSetVolume(volRoute, targetVolume);
- verify(mockCallback, timeout(TIMEOUT_MS).atLeastOnce())
- .onRouteChanged(argThat(route ->
- route.getId().equals(volRoute.getId())
- && route.getVolume() == targetVolume));
-
- mRouter2.requestUpdateVolume(volRoute, -deltaVolume);
- verify(mockCallback, timeout(TIMEOUT_MS).atLeastOnce())
- .onRouteChanged(argThat(route ->
- route.getId().equals(volRoute.getId())
- && route.getVolume() == originalVolume));
- mRouter2.unregisterCallback(mockCallback);
+ CountDownLatch latch1 = new CountDownLatch(1);
+ MediaRouter2.Callback callback1 =
+ createVolumeChangeCallback(ROUTE_ID_VARIABLE_VOLUME,
+ originalVolume + deltaVolume, latch1);
+ mRouter2.registerCallback(mExecutor, callback1);
+ mRouter2.requestUpdateVolume(volRoute, deltaVolume);
+ assertTrue(latch1.await(TIMEOUT_MS, TimeUnit.MILLISECONDS));
+ mRouter2.unregisterCallback(callback1);
+
+ CountDownLatch latch2 = new CountDownLatch(1);
+ MediaRouter2.Callback callback2 =
+ createVolumeChangeCallback(ROUTE_ID_VARIABLE_VOLUME, originalVolume, latch2);
+ mRouter2.registerCallback(mExecutor, callback2);
+ mRouter2.requestSetVolume(volRoute, originalVolume);
+ assertTrue(latch1.await(TIMEOUT_MS, TimeUnit.MILLISECONDS));
+ mRouter2.unregisterCallback(callback1);
}
@Test
@@ -312,13 +312,13 @@ public class MediaRouterManagerTest {
int targetVolume = originalVolume + deltaVolume;
mManager.requestSetVolume(volRoute, targetVolume);
- verify(mockCallback, timeout(TIMEOUT_MS).atLeastOnce())
+ verify(managerCallback, timeout(TIMEOUT_MS).atLeastOnce())
.onRouteChanged(argThat(route ->
route.getId().equals(volRoute.getId())
&& route.getVolume() == targetVolume));
mManager.requestUpdateVolume(volRoute, -deltaVolume);
- verify(mockCallback, timeout(TIMEOUT_MS).atLeastOnce())
+ verify(managerCallback, timeout(TIMEOUT_MS).atLeastOnce())
.onRouteChanged(argThat(route ->
route.getId().equals(volRoute.getId())
&& route.getVolume() == originalVolume));
@@ -347,14 +347,14 @@ public class MediaRouterManagerTest {
CountDownLatch latch = new CountDownLatch(1);
MediaRouter2.Callback callback = new MediaRouter2.Callback() {
@Override
- public void onRoutesChanged(List<MediaRoute2Info> routes) {
- if (routes.size() > 0) latch.countDown();
+ public void onRoutesAdded(List<MediaRoute2Info> added) {
+ if (added.size() > 0) latch.countDown();
}
};
mRouter2.setControlCategories(controlCategories);
mRouter2.registerCallback(mExecutor, callback);
try {
- latch.await(TIMEOUT_MS, TimeUnit.MILLISECONDS);
+ assertTrue(latch.await(TIMEOUT_MS, TimeUnit.MILLISECONDS));
return createRouteMap(mRouter2.getRoutes());
} finally {
mRouter2.unregisterCallback(callback);
@@ -370,14 +370,18 @@ public class MediaRouterManagerTest {
MediaRouter2Manager.Callback managerCallback = new MediaRouter2Manager.Callback() {
@Override
public void onRoutesChanged(List<MediaRoute2Info> routes) {
- if (routes.size() > 0) latch.countDown();
+ if (routes.size() > 0) {
+ latch.countDown();
+ }
}
};
mManager.registerCallback(mExecutor, managerCallback);
mRouter2.setControlCategories(controlCategories);
mRouter2.registerCallback(mExecutor, routerCallback);
try {
- latch.await(TIMEOUT_MS, TimeUnit.MILLISECONDS);
+ assertTrue(latch.await(TIMEOUT_MS, TimeUnit.MILLISECONDS));
+ //TODO: currently this returns empty list occasionally.
+ //Maybe due to control category is not set yet
return createRouteMap(mManager.getAvailableRoutes(mPackageName));
} finally {
mRouter2.unregisterCallback(routerCallback);
@@ -385,6 +389,20 @@ public class MediaRouterManagerTest {
}
}
+ MediaRouter2.Callback createVolumeChangeCallback(String routeId,
+ int targetVolume, CountDownLatch latch) {
+ MediaRouter2.Callback callback = new MediaRouter2.Callback() {
+ @Override
+ public void onRoutesChanged(List<MediaRoute2Info> changed) {
+ MediaRoute2Info volRoute = createRouteMap(changed).get(routeId);
+ if (volRoute != null && volRoute.getVolume() == targetVolume) {
+ latch.countDown();
+ }
+ }
+ };
+ return callback;
+ }
+
// Helper for getting routes easily
static Map<String, MediaRoute2Info> createRouteMap(List<MediaRoute2Info> routes) {
Map<String, MediaRoute2Info> routeMap = new HashMap<>();
diff --git a/packages/CarSystemUI/res/values/config.xml b/packages/CarSystemUI/res/values/config.xml
index 329225cf94fb..981c129a0965 100644
--- a/packages/CarSystemUI/res/values/config.xml
+++ b/packages/CarSystemUI/res/values/config.xml
@@ -58,7 +58,6 @@
<!-- SystemUI Services: The classes of the stuff to start. -->
<string-array name="config_systemUIServiceComponents" translatable="false">
<item>com.android.systemui.util.NotificationChannels</item>
- <item>com.android.systemui.statusbar.CommandQueue$CommandQueueStart</item>
<item>com.android.systemui.keyguard.KeyguardViewMediator</item>
<item>com.android.systemui.recents.Recents</item>
<item>com.android.systemui.volume.VolumeUI</item>
diff --git a/packages/CarSystemUI/res/values/integers_car.xml b/packages/CarSystemUI/res/values/integers_car.xml
index fb67b302a4ae..d6c16cb4180b 100644
--- a/packages/CarSystemUI/res/values/integers_car.xml
+++ b/packages/CarSystemUI/res/values/integers_car.xml
@@ -34,4 +34,7 @@
<!-- The delay before the unlock dialog pops up -->
<integer name="unlock_dialog_delay_ms">0</integer>
+ <!-- Timeout values in milliseconds for displaying volume dialog-->
+ <integer name="car_volume_dialog_display_normal_timeout">3000</integer>
+ <integer name="car_volume_dialog_display_hovering_timeout">16000</integer>
</resources>
diff --git a/packages/CarSystemUI/src/com/android/systemui/CarComponentBinder.java b/packages/CarSystemUI/src/com/android/systemui/CarComponentBinder.java
index c40eda9fb303..f11eff851aa3 100644
--- a/packages/CarSystemUI/src/com/android/systemui/CarComponentBinder.java
+++ b/packages/CarSystemUI/src/com/android/systemui/CarComponentBinder.java
@@ -17,6 +17,7 @@
package com.android.systemui;
import com.android.systemui.dagger.DefaultActivityBinder;
+import com.android.systemui.dagger.DefaultBroadcastReceiverBinder;
import com.android.systemui.dagger.DefaultServiceBinder;
import dagger.Module;
@@ -26,6 +27,7 @@ import dagger.Module;
*/
@Module(includes = {
DefaultActivityBinder.class,
+ DefaultBroadcastReceiverBinder.class,
DefaultServiceBinder.class,
CarSystemUIBinder.class})
public class CarComponentBinder {
diff --git a/packages/CarSystemUI/src/com/android/systemui/CarSystemUIBinder.java b/packages/CarSystemUI/src/com/android/systemui/CarSystemUIBinder.java
index 4f7b5d530c96..706727bf050e 100644
--- a/packages/CarSystemUI/src/com/android/systemui/CarSystemUIBinder.java
+++ b/packages/CarSystemUI/src/com/android/systemui/CarSystemUIBinder.java
@@ -16,25 +16,107 @@
package com.android.systemui;
+import static com.android.systemui.Dependency.ALLOW_NOTIFICATION_LONG_PRESS_NAME;
+
+import android.content.Context;
+import android.os.PowerManager;
+import android.util.DisplayMetrics;
+
+import com.android.internal.logging.MetricsLogger;
+import com.android.keyguard.KeyguardUpdateMonitor;
+import com.android.systemui.appops.AppOpsController;
+import com.android.systemui.assist.AssistManager;
+import com.android.systemui.biometrics.AuthController;
+import com.android.systemui.broadcast.BroadcastDispatcher;
+import com.android.systemui.bubbles.BubbleController;
+import com.android.systemui.colorextraction.SysuiColorExtractor;
+import com.android.systemui.doze.DozeLog;
+import com.android.systemui.globalactions.GlobalActionsComponent;
import com.android.systemui.keyguard.KeyguardViewMediator;
+import com.android.systemui.keyguard.ScreenLifecycle;
+import com.android.systemui.keyguard.WakefulnessLifecycle;
import com.android.systemui.navigationbar.car.CarNavigationBar;
+import com.android.systemui.navigationbar.car.CarNavigationBarController;
import com.android.systemui.pip.PipUI;
+import com.android.systemui.plugins.FalsingManager;
import com.android.systemui.power.PowerUI;
import com.android.systemui.recents.Recents;
import com.android.systemui.recents.RecentsModule;
+import com.android.systemui.shared.plugins.PluginManager;
+import com.android.systemui.statusbar.CommandQueue;
+import com.android.systemui.statusbar.FeatureFlags;
+import com.android.systemui.statusbar.NavigationBarController;
+import com.android.systemui.statusbar.NotificationListener;
+import com.android.systemui.statusbar.NotificationLockscreenUserManager;
+import com.android.systemui.statusbar.NotificationMediaManager;
+import com.android.systemui.statusbar.NotificationRemoteInputManager;
+import com.android.systemui.statusbar.NotificationViewHierarchyManager;
+import com.android.systemui.statusbar.PulseExpansionHandler;
+import com.android.systemui.statusbar.SysuiStatusBarStateController;
+import com.android.systemui.statusbar.VibratorHelper;
import com.android.systemui.statusbar.car.CarStatusBar;
+import com.android.systemui.statusbar.notification.BypassHeadsUpNotifier;
+import com.android.systemui.statusbar.notification.DynamicPrivacyController;
+import com.android.systemui.statusbar.notification.InstantAppNotifier;
+import com.android.systemui.statusbar.notification.NewNotifPipeline;
+import com.android.systemui.statusbar.notification.NotificationAlertingManager;
+import com.android.systemui.statusbar.notification.NotificationEntryManager;
+import com.android.systemui.statusbar.notification.NotificationInterruptionStateProvider;
+import com.android.systemui.statusbar.notification.NotificationWakeUpCoordinator;
+import com.android.systemui.statusbar.notification.VisualStabilityManager;
+import com.android.systemui.statusbar.notification.logging.NotifLog;
+import com.android.systemui.statusbar.notification.logging.NotificationLogger;
+import com.android.systemui.statusbar.notification.row.NotificationGutsManager;
+import com.android.systemui.statusbar.phone.AutoHideController;
+import com.android.systemui.statusbar.phone.BiometricUnlockController;
+import com.android.systemui.statusbar.phone.DozeParameters;
+import com.android.systemui.statusbar.phone.DozeScrimController;
+import com.android.systemui.statusbar.phone.DozeServiceHost;
+import com.android.systemui.statusbar.phone.HeadsUpManagerPhone;
+import com.android.systemui.statusbar.phone.KeyguardBypassController;
+import com.android.systemui.statusbar.phone.LightBarController;
+import com.android.systemui.statusbar.phone.LockscreenWallpaper;
+import com.android.systemui.statusbar.phone.NotificationGroupAlertTransferHelper;
+import com.android.systemui.statusbar.phone.NotificationGroupManager;
+import com.android.systemui.statusbar.phone.ScrimController;
import com.android.systemui.statusbar.phone.StatusBar;
+import com.android.systemui.statusbar.phone.StatusBarIconController;
+import com.android.systemui.statusbar.phone.StatusBarWindowController;
+import com.android.systemui.statusbar.phone.StatusBarWindowViewController;
+import com.android.systemui.statusbar.policy.BatteryController;
+import com.android.systemui.statusbar.policy.ConfigurationController;
+import com.android.systemui.statusbar.policy.DeviceProvisionedController;
+import com.android.systemui.statusbar.policy.KeyguardStateController;
+import com.android.systemui.statusbar.policy.NetworkController;
+import com.android.systemui.statusbar.policy.RemoteInputQuickSettingsDisabler;
+import com.android.systemui.statusbar.policy.RemoteInputUriController;
+import com.android.systemui.statusbar.policy.UserSwitcherController;
+import com.android.systemui.statusbar.policy.ZenModeController;
+import com.android.systemui.statusbar.tv.TvStatusBar;
+import com.android.systemui.theme.ThemeOverlayController;
+import com.android.systemui.util.InjectionInflationController;
import com.android.systemui.util.leak.GarbageMonitor;
import com.android.systemui.volume.VolumeUI;
+import javax.inject.Named;
+import javax.inject.Singleton;
+
import dagger.Binds;
+import dagger.Lazy;
import dagger.Module;
+import dagger.Provides;
import dagger.multibindings.ClassKey;
import dagger.multibindings.IntoMap;
/** Binder for car specific {@link SystemUI} modules. */
@Module(includes = {RecentsModule.class})
public abstract class CarSystemUIBinder {
+ /** Inject into AuthController. */
+ @Binds
+ @IntoMap
+ @ClassKey(AuthController.class)
+ public abstract SystemUI bindAuthController(AuthController service);
+
/** */
@Binds
@IntoMap
@@ -47,6 +129,18 @@ public abstract class CarSystemUIBinder {
@ClassKey(GarbageMonitor.Service.class)
public abstract SystemUI bindGarbageMonitorService(GarbageMonitor.Service service);
+ /** Inject into GlobalActionsComponent. */
+ @Binds
+ @IntoMap
+ @ClassKey(GlobalActionsComponent.class)
+ public abstract SystemUI bindGlobalActionsComponent(GlobalActionsComponent sysui);
+
+ /** Inject into InstantAppNotifier. */
+ @Binds
+ @IntoMap
+ @ClassKey(InstantAppNotifier.class)
+ public abstract SystemUI bindInstantAppNotifier(InstantAppNotifier sysui);
+
/** Inject into KeyguardViewMediator. */
@Binds
@IntoMap
@@ -83,12 +177,37 @@ public abstract class CarSystemUIBinder {
@ClassKey(ScreenDecorations.class)
public abstract SystemUI bindScreenDecorations(ScreenDecorations sysui);
+ /** Inject into SizeCompatModeActivityController. */
+ @Binds
+ @IntoMap
+ @ClassKey(SizeCompatModeActivityController.class)
+ public abstract SystemUI bindsSizeCompatModeActivityController(
+ SizeCompatModeActivityController sysui);
+
+ /** Inject into SliceBroadcastRelayHandler. */
+ @Binds
+ @IntoMap
+ @ClassKey(SliceBroadcastRelayHandler.class)
+ public abstract SystemUI bindSliceBroadcastRelayHandler(SliceBroadcastRelayHandler sysui);
+
+ /** Inject into ThemeOverlayController. */
+ @Binds
+ @IntoMap
+ @ClassKey(ThemeOverlayController.class)
+ public abstract SystemUI bindThemeOverlayController(ThemeOverlayController sysui);
+
/** Inject into StatusBar. */
@Binds
@IntoMap
@ClassKey(StatusBar.class)
public abstract SystemUI bindsStatusBar(CarStatusBar sysui);
+ /** Inject into TvStatusBar. */
+ @Binds
+ @IntoMap
+ @ClassKey(TvStatusBar.class)
+ public abstract SystemUI bindsTvStatusBar(TvStatusBar sysui);
+
/** Inject into StatusBarGoogle. */
@Binds
@IntoMap
@@ -100,4 +219,147 @@ public abstract class CarSystemUIBinder {
@IntoMap
@ClassKey(VolumeUI.class)
public abstract SystemUI bindVolumeUI(VolumeUI sysui);
+
+ /**
+ * Provides our instance of StatusBar which is considered optional.
+ */
+ @Provides
+ @Singleton
+ static CarStatusBar provideStatusBar(
+ Context context,
+ FeatureFlags featureFlags,
+ LightBarController lightBarController,
+ AutoHideController autoHideController,
+ KeyguardUpdateMonitor keyguardUpdateMonitor,
+ StatusBarIconController statusBarIconController,
+ DozeLog dozeLog,
+ InjectionInflationController injectionInflationController,
+ PulseExpansionHandler pulseExpansionHandler,
+ NotificationWakeUpCoordinator notificationWakeUpCoordinator,
+ KeyguardBypassController keyguardBypassController,
+ KeyguardStateController keyguardStateController,
+ HeadsUpManagerPhone headsUpManagerPhone,
+ DynamicPrivacyController dynamicPrivacyController,
+ BypassHeadsUpNotifier bypassHeadsUpNotifier,
+ @Named(ALLOW_NOTIFICATION_LONG_PRESS_NAME) boolean allowNotificationLongPress,
+ Lazy<NewNotifPipeline> newNotifPipeline,
+ FalsingManager falsingManager,
+ BroadcastDispatcher broadcastDispatcher,
+ RemoteInputQuickSettingsDisabler remoteInputQuickSettingsDisabler,
+ NotificationGutsManager notificationGutsManager,
+ NotificationLogger notificationLogger,
+ NotificationEntryManager notificationEntryManager,
+ NotificationInterruptionStateProvider notificationInterruptionStateProvider,
+ NotificationViewHierarchyManager notificationViewHierarchyManager,
+ ForegroundServiceController foregroundServiceController,
+ AppOpsController appOpsController,
+ KeyguardViewMediator keyguardViewMediator,
+ ZenModeController zenModeController,
+ NotificationAlertingManager notificationAlertingManager,
+ DisplayMetrics displayMetrics,
+ MetricsLogger metricsLogger,
+ UiOffloadThread uiOffloadThread,
+ NotificationMediaManager notificationMediaManager,
+ NotificationLockscreenUserManager lockScreenUserManager,
+ NotificationRemoteInputManager remoteInputManager,
+ UserSwitcherController userSwitcherController,
+ NetworkController networkController,
+ BatteryController batteryController,
+ SysuiColorExtractor colorExtractor,
+ ScreenLifecycle screenLifecycle,
+ WakefulnessLifecycle wakefulnessLifecycle,
+ SysuiStatusBarStateController statusBarStateController,
+ VibratorHelper vibratorHelper,
+ BubbleController bubbleController,
+ NotificationGroupManager groupManager,
+ NotificationGroupAlertTransferHelper groupAlertTransferHelper,
+ VisualStabilityManager visualStabilityManager,
+ DeviceProvisionedController deviceProvisionedController,
+ NavigationBarController navigationBarController,
+ AssistManager assistManager,
+ NotificationListener notificationListener,
+ ConfigurationController configurationController,
+ StatusBarWindowController statusBarWindowController,
+ StatusBarWindowViewController.Builder statusBarWindowViewControllerBuilder,
+ NotifLog notifLog,
+ DozeParameters dozeParameters,
+ ScrimController scrimController,
+ Lazy<LockscreenWallpaper> lockscreenWallpaperLazy,
+ Lazy<BiometricUnlockController> biometricUnlockControllerLazy,
+ DozeServiceHost dozeServiceHost,
+ PowerManager powerManager,
+ DozeScrimController dozeScrimController,
+ CommandQueue commandQueue,
+ PluginManager pluginManager,
+ CarNavigationBarController carNavigationBarController,
+ RemoteInputUriController remoteInputUriController) {
+ return new CarStatusBar(
+ context,
+ featureFlags,
+ lightBarController,
+ autoHideController,
+ keyguardUpdateMonitor,
+ statusBarIconController,
+ dozeLog,
+ injectionInflationController,
+ pulseExpansionHandler,
+ notificationWakeUpCoordinator,
+ keyguardBypassController,
+ keyguardStateController,
+ headsUpManagerPhone,
+ dynamicPrivacyController,
+ bypassHeadsUpNotifier,
+ allowNotificationLongPress,
+ newNotifPipeline,
+ falsingManager,
+ broadcastDispatcher,
+ remoteInputQuickSettingsDisabler,
+ notificationGutsManager,
+ notificationLogger,
+ notificationEntryManager,
+ notificationInterruptionStateProvider,
+ notificationViewHierarchyManager,
+ foregroundServiceController,
+ appOpsController,
+ keyguardViewMediator,
+ zenModeController,
+ notificationAlertingManager,
+ displayMetrics,
+ metricsLogger,
+ uiOffloadThread,
+ notificationMediaManager,
+ lockScreenUserManager,
+ remoteInputManager,
+ userSwitcherController,
+ networkController,
+ batteryController,
+ colorExtractor,
+ screenLifecycle,
+ wakefulnessLifecycle,
+ statusBarStateController,
+ vibratorHelper,
+ bubbleController,
+ groupManager,
+ groupAlertTransferHelper,
+ visualStabilityManager,
+ deviceProvisionedController,
+ navigationBarController,
+ assistManager,
+ notificationListener,
+ configurationController,
+ statusBarWindowController,
+ statusBarWindowViewControllerBuilder,
+ notifLog,
+ dozeParameters,
+ scrimController,
+ lockscreenWallpaperLazy,
+ biometricUnlockControllerLazy,
+ dozeServiceHost,
+ powerManager,
+ dozeScrimController,
+ commandQueue,
+ pluginManager,
+ remoteInputUriController,
+ carNavigationBarController);
+ }
}
diff --git a/packages/CarSystemUI/src/com/android/systemui/navigationbar/car/CarNavigationBarView.java b/packages/CarSystemUI/src/com/android/systemui/navigationbar/car/CarNavigationBarView.java
index c2455088a52b..28da16932fc4 100644
--- a/packages/CarSystemUI/src/com/android/systemui/navigationbar/car/CarNavigationBarView.java
+++ b/packages/CarSystemUI/src/com/android/systemui/navigationbar/car/CarNavigationBarView.java
@@ -25,6 +25,7 @@ import android.widget.LinearLayout;
import com.android.systemui.Dependency;
import com.android.systemui.R;
import com.android.systemui.navigationbar.car.CarNavigationBarController.NotificationsShadeController;
+import com.android.systemui.statusbar.CommandQueue;
import com.android.systemui.statusbar.phone.StatusBarIconController;
/**
@@ -63,7 +64,8 @@ public class CarNavigationBarView extends LinearLayout {
// container is in the view.
StatusBarIconController.DarkIconManager mDarkIconManager =
new StatusBarIconController.DarkIconManager(
- mStatusIcons.findViewById(R.id.statusIcons));
+ mStatusIcons.findViewById(R.id.statusIcons),
+ Dependency.get(CommandQueue.class));
mDarkIconManager.setShouldLog(true);
Dependency.get(StatusBarIconController.class).addIconGroup(mDarkIconManager);
}
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 d548fa15fe1a..110b32b57878 100644
--- a/packages/CarSystemUI/src/com/android/systemui/statusbar/car/CarStatusBar.java
+++ b/packages/CarSystemUI/src/com/android/systemui/statusbar/car/CarStatusBar.java
@@ -80,6 +80,8 @@ import com.android.systemui.navigationbar.car.CarNavigationBarView;
import com.android.systemui.plugins.FalsingManager;
import com.android.systemui.plugins.qs.QS;
import com.android.systemui.qs.car.CarQSFragment;
+import com.android.systemui.shared.plugins.PluginManager;
+import com.android.systemui.statusbar.CommandQueue;
import com.android.systemui.statusbar.FeatureFlags;
import com.android.systemui.statusbar.FlingAnimationUtils;
import com.android.systemui.statusbar.NavigationBarController;
@@ -126,6 +128,7 @@ import com.android.systemui.statusbar.policy.DeviceProvisionedController;
import com.android.systemui.statusbar.policy.KeyguardStateController;
import com.android.systemui.statusbar.policy.NetworkController;
import com.android.systemui.statusbar.policy.RemoteInputQuickSettingsDisabler;
+import com.android.systemui.statusbar.policy.RemoteInputUriController;
import com.android.systemui.statusbar.policy.UserSwitcherController;
import com.android.systemui.statusbar.policy.ZenModeController;
import com.android.systemui.util.InjectionInflationController;
@@ -134,16 +137,13 @@ import java.io.FileDescriptor;
import java.io.PrintWriter;
import java.util.Map;
-import javax.inject.Inject;
import javax.inject.Named;
-import javax.inject.Singleton;
import dagger.Lazy;
/**
* A status bar tailored for the automotive use case.
*/
-@Singleton
public class CarStatusBar extends StatusBar implements CarBatteryController.BatteryViewHandler {
private static final String TAG = "CarStatusBar";
// used to calculate how fast to open or close the window
@@ -236,7 +236,6 @@ public class CarStatusBar extends StatusBar implements CarBatteryController.Batt
}
};
- @Inject
public CarStatusBar(
Context context,
FeatureFlags featureFlags,
@@ -301,7 +300,9 @@ public class CarStatusBar extends StatusBar implements CarBatteryController.Batt
DozeServiceHost dozeServiceHost,
PowerManager powerManager,
DozeScrimController dozeScrimController,
-
+ CommandQueue commandQueue,
+ PluginManager pluginManager,
+ RemoteInputUriController remoteInputUriController,
/* Car Settings injected components. */
CarNavigationBarController carNavigationBarController) {
super(
@@ -363,11 +364,15 @@ public class CarStatusBar extends StatusBar implements CarBatteryController.Batt
notifLog,
dozeParameters,
scrimController,
+ null /* keyguardLiftController */,
lockscreenWallpaperLazy,
biometricUnlockControllerLazy,
dozeServiceHost,
powerManager,
- dozeScrimController);
+ dozeScrimController,
+ commandQueue,
+ pluginManager,
+ remoteInputUriController);
mScrimController = scrimController;
mCarNavigationBarController = carNavigationBarController;
}
diff --git a/packages/CarSystemUI/src/com/android/systemui/statusbar/car/UserGridRecyclerView.java b/packages/CarSystemUI/src/com/android/systemui/statusbar/car/UserGridRecyclerView.java
index 05657fff70e0..fb1870a6ea42 100644
--- a/packages/CarSystemUI/src/com/android/systemui/statusbar/car/UserGridRecyclerView.java
+++ b/packages/CarSystemUI/src/com/android/systemui/statusbar/car/UserGridRecyclerView.java
@@ -19,6 +19,7 @@ package com.android.systemui.statusbar.car;
import static android.content.DialogInterface.BUTTON_NEGATIVE;
import static android.content.DialogInterface.BUTTON_POSITIVE;
import static android.os.UserManager.DISALLOW_ADD_USER;
+import static android.os.UserManager.SWITCHABILITY_STATUS_OK;
import android.app.ActivityManager;
import android.app.AlertDialog;
@@ -123,10 +124,12 @@ public class UserGridRecyclerView extends RecyclerView {
}
private List<UserRecord> createUserRecords(List<UserInfo> userInfoList) {
+ int fgUserId = ActivityManager.getCurrentUser();
+ UserHandle fgUserHandle = UserHandle.of(fgUserId);
List<UserRecord> userRecords = new ArrayList<>();
// If the foreground user CANNOT switch to other users, only display the foreground user.
- if (!mCarUserManagerHelper.canForegroundUserSwitchUsers()) {
+ if (mUserManager.getUserSwitchability(fgUserHandle) != SWITCHABILITY_STATUS_OK) {
userRecords.add(createForegroundUserRecord());
return userRecords;
}
@@ -137,7 +140,7 @@ public class UserGridRecyclerView extends RecyclerView {
continue;
}
- boolean isForeground = ActivityManager.getCurrentUser() == userInfo.id;
+ boolean isForeground = fgUserId == userInfo.id;
UserRecord record = new UserRecord(userInfo, false /* isStartGuestSession */,
false /* isAddUser */, isForeground);
userRecords.add(record);
@@ -147,7 +150,6 @@ public class UserGridRecyclerView extends RecyclerView {
userRecords.add(createStartGuestUserRecord());
// Add add user record if the foreground user can add users
- UserHandle fgUserHandle = UserHandle.of(ActivityManager.getCurrentUser());
if (!mUserManager.hasUserRestriction(DISALLOW_ADD_USER, fgUserHandle)) {
userRecords.add(createAddUserRecord());
}
diff --git a/packages/CarSystemUI/src/com/android/systemui/volume/CarVolumeDialogImpl.java b/packages/CarSystemUI/src/com/android/systemui/volume/CarVolumeDialogImpl.java
index d979bad94677..09223e8ff4c3 100644
--- a/packages/CarSystemUI/src/com/android/systemui/volume/CarVolumeDialogImpl.java
+++ b/packages/CarSystemUI/src/com/android/systemui/volume/CarVolumeDialogImpl.java
@@ -62,7 +62,6 @@ import org.xmlpull.v1.XmlPullParserException;
import java.io.IOException;
import java.util.ArrayList;
-import java.util.Iterator;
import java.util.List;
/**
@@ -76,8 +75,6 @@ public class CarVolumeDialogImpl implements VolumeDialog {
private static final String XML_TAG_VOLUME_ITEMS = "carVolumeItems";
private static final String XML_TAG_VOLUME_ITEM = "item";
- private static final int HOVERING_TIMEOUT = 16000;
- private static final int NORMAL_TIMEOUT = 3000;
private static final int LISTVIEW_ANIMATION_DURATION_IN_MILLIS = 250;
private static final int DISMISS_DELAY_IN_MILLIS = 50;
private static final int ARROW_FADE_IN_START_DELAY_IN_MILLIS = 100;
@@ -91,12 +88,23 @@ public class CarVolumeDialogImpl implements VolumeDialog {
// Volume items in the RecyclerView.
private final List<CarVolumeItem> mCarVolumeLineItems = new ArrayList<>();
private final KeyguardManager mKeyguard;
+ private final int mNormalTimeout;
+ private final int mHoveringTimeout;
+
private Window mWindow;
private CustomDialog mDialog;
private RecyclerView mListView;
private CarVolumeItemAdapter mVolumeItemsAdapter;
private Car mCar;
private CarAudioManager mCarAudioManager;
+ private boolean mHovering;
+ private int mCurrentlyDisplayingGroupId;
+ private int mPreviouslyDisplayingGroupId;
+ private boolean mShowing;
+ private boolean mDismissing;
+ private boolean mExpanded;
+ private View mExpandIcon;
+
private final CarAudioManager.CarVolumeCallback mVolumeChangeCallback =
new CarAudioManager.CarVolumeCallback() {
@Override
@@ -126,6 +134,7 @@ public class CarVolumeDialogImpl implements VolumeDialog {
volumeItem.progress = value;
}
if ((flags & AudioManager.FLAG_SHOW_UI) != 0) {
+ mPreviouslyDisplayingGroupId = mCurrentlyDisplayingGroupId;
mCurrentlyDisplayingGroupId = groupId;
mHandler.obtainMessage(H.SHOW,
Events.SHOW_REASON_VOLUME_CHANGED).sendToTarget();
@@ -137,12 +146,6 @@ public class CarVolumeDialogImpl implements VolumeDialog {
// ignored
}
};
- private boolean mHovering;
- private int mCurrentlyDisplayingGroupId;
- private boolean mShowing;
- private boolean mDismissing;
- private boolean mExpanded;
- private View mExpandIcon;
private final CarServiceLifecycleListener mCarServiceLifecycleListener = (car, ready) -> {
if (!ready) {
@@ -158,7 +161,7 @@ public class CarVolumeDialogImpl implements VolumeDialog {
mAvailableVolumeItems.add(volumeItem);
// The first one is the default item.
if (groupId == 0) {
- setuptListItem(0);
+ clearAllAndSetupDefaultCarVolumeLineItem(0);
}
}
@@ -169,18 +172,13 @@ public class CarVolumeDialogImpl implements VolumeDialog {
mCarAudioManager.registerCarVolumeCallback(mVolumeChangeCallback);
};
- private void setuptListItem(int groupId) {
- mCarVolumeLineItems.clear();
- VolumeItem volumeItem = mAvailableVolumeItems.get(groupId);
- volumeItem.defaultItem = true;
- addCarVolumeListItem(volumeItem, /* volumeGroupId = */ groupId,
- R.drawable.car_ic_keyboard_arrow_down, new ExpandIconListener()
- );
- }
-
public CarVolumeDialogImpl(Context context) {
mContext = context;
mKeyguard = (KeyguardManager) mContext.getSystemService(Context.KEYGUARD_SERVICE);
+ mNormalTimeout = mContext.getResources().getInteger(
+ R.integer.car_volume_dialog_display_normal_timeout);
+ mHoveringTimeout = mContext.getResources().getInteger(
+ R.integer.car_volume_dialog_display_hovering_timeout);
}
private static int getSeekbarValue(CarAudioManager carAudioManager, int volumeGroupId) {
@@ -204,7 +202,7 @@ public class CarVolumeDialogImpl implements VolumeDialog {
@Override
public void destroy() {
- mHandler.removeCallbacksAndMessages(null);
+ mHandler.removeCallbacksAndMessages(/* token= */ null);
cleanupAudioManager();
// unregisterVolumeCallback is not being called when disconnect car, so we manually cleanup
@@ -280,19 +278,36 @@ public class CarVolumeDialogImpl implements VolumeDialog {
mHandler.removeMessages(H.SHOW);
mHandler.removeMessages(H.DISMISS);
+
rescheduleTimeoutH();
+
// Refresh the data set before showing.
mVolumeItemsAdapter.notifyDataSetChanged();
+
if (mShowing) {
+ if (mPreviouslyDisplayingGroupId == mCurrentlyDisplayingGroupId || mExpanded) {
+ return;
+ }
+
+ clearAllAndSetupDefaultCarVolumeLineItem(mCurrentlyDisplayingGroupId);
return;
}
+
mShowing = true;
- setuptListItem(mCurrentlyDisplayingGroupId);
+ clearAllAndSetupDefaultCarVolumeLineItem(mCurrentlyDisplayingGroupId);
mDialog.show();
Events.writeEvent(mContext, Events.EVENT_SHOW_DIALOG, reason, mKeyguard.isKeyguardLocked());
}
- private void rescheduleTimeoutH() {
+ private void clearAllAndSetupDefaultCarVolumeLineItem(int groupId) {
+ mCarVolumeLineItems.clear();
+ VolumeItem volumeItem = mAvailableVolumeItems.get(groupId);
+ volumeItem.defaultItem = true;
+ addCarVolumeListItem(volumeItem, /* volumeGroupId = */ groupId,
+ R.drawable.car_ic_keyboard_arrow_down, new ExpandIconListener());
+ }
+
+ protected void rescheduleTimeoutH() {
mHandler.removeMessages(H.DISMISS);
final int timeout = computeTimeoutH();
mHandler.sendMessageDelayed(mHandler
@@ -304,7 +319,7 @@ public class CarVolumeDialogImpl implements VolumeDialog {
}
private int computeTimeoutH() {
- return mHovering ? HOVERING_TIMEOUT : NORMAL_TIMEOUT;
+ return mHovering ? mHoveringTimeout : mNormalTimeout;
}
private void dismissH(int reason) {
@@ -366,12 +381,13 @@ public class CarVolumeDialogImpl implements VolumeDialog {
if (XML_TAG_VOLUME_ITEM.equals(parser.getName())) {
TypedArray item = mContext.getResources().obtainAttributes(
attrs, R.styleable.carVolumeItems_item);
- int usage = item.getInt(R.styleable.carVolumeItems_item_usage, -1);
+ int usage = item.getInt(R.styleable.carVolumeItems_item_usage,
+ /* defValue= */ -1);
if (usage >= 0) {
VolumeItem volumeItem = new VolumeItem();
volumeItem.rank = rank;
- volumeItem.icon = item.getResourceId(R.styleable.carVolumeItems_item_icon,
- 0);
+ volumeItem.icon = item.getResourceId(
+ R.styleable.carVolumeItems_item_icon, /* defValue= */ 0);
mVolumeItems.put(usage, volumeItem);
rank++;
}
@@ -396,22 +412,22 @@ public class CarVolumeDialogImpl implements VolumeDialog {
return result;
}
- private CarVolumeItem addCarVolumeListItem(VolumeItem volumeItem, int volumeGroupId,
- int supplementalIconId,
+ private CarVolumeItem createCarVolumeListItem(VolumeItem volumeItem, int volumeGroupId,
+ Drawable supplementalIcon, int seekbarProgressValue,
@Nullable View.OnClickListener supplementalIconOnClickListener) {
CarVolumeItem carVolumeItem = new CarVolumeItem();
carVolumeItem.setMax(getMaxSeekbarValue(mCarAudioManager, volumeGroupId));
- int color = mContext.getResources().getColor(R.color.car_volume_dialog_tint);
- int progress = getSeekbarValue(mCarAudioManager, volumeGroupId);
- carVolumeItem.setProgress(progress);
+ carVolumeItem.setProgress(seekbarProgressValue);
carVolumeItem.setOnSeekBarChangeListener(
new CarVolumeDialogImpl.VolumeSeekBarChangeListener(volumeGroupId,
mCarAudioManager));
- Drawable primaryIcon = mContext.getResources().getDrawable(volumeItem.icon);
+ carVolumeItem.setGroupId(volumeGroupId);
+
+ int color = mContext.getColor(R.color.car_volume_dialog_tint);
+ Drawable primaryIcon = mContext.getDrawable(volumeItem.icon);
primaryIcon.mutate().setTint(color);
carVolumeItem.setPrimaryIcon(primaryIcon);
- if (supplementalIconId != 0) {
- Drawable supplementalIcon = mContext.getResources().getDrawable(supplementalIconId);
+ if (supplementalIcon != null) {
supplementalIcon.mutate().setTint(color);
carVolumeItem.setSupplementalIcon(supplementalIcon,
/* showSupplementalIconDivider= */ true);
@@ -420,21 +436,23 @@ public class CarVolumeDialogImpl implements VolumeDialog {
carVolumeItem.setSupplementalIcon(/* drawable= */ null,
/* showSupplementalIconDivider= */ false);
}
- carVolumeItem.setGroupId(volumeGroupId);
- mCarVolumeLineItems.add(carVolumeItem);
+
volumeItem.carVolumeItem = carVolumeItem;
- volumeItem.progress = progress;
+ volumeItem.progress = seekbarProgressValue;
+
return carVolumeItem;
}
- private VolumeItem findVolumeItem(CarVolumeItem targetItem) {
- for (int i = 0; i < mVolumeItems.size(); ++i) {
- VolumeItem volumeItem = mVolumeItems.valueAt(i);
- if (volumeItem.carVolumeItem == targetItem) {
- return volumeItem;
- }
- }
- return null;
+ private CarVolumeItem addCarVolumeListItem(VolumeItem volumeItem, int volumeGroupId,
+ int supplementalIconId,
+ @Nullable View.OnClickListener supplementalIconOnClickListener) {
+ int seekbarProgressValue = getSeekbarValue(mCarAudioManager, volumeGroupId);
+ Drawable supplementalIcon = supplementalIconId == 0 ? null : mContext.getDrawable(
+ supplementalIconId);
+ CarVolumeItem carVolumeItem = createCarVolumeListItem(volumeItem, volumeGroupId,
+ supplementalIcon, seekbarProgressValue, supplementalIconOnClickListener);
+ mCarVolumeLineItems.add(carVolumeItem);
+ return carVolumeItem;
}
private void cleanupAudioManager() {
@@ -530,21 +548,15 @@ public class CarVolumeDialogImpl implements VolumeDialog {
for (int groupId = 0; groupId < mAvailableVolumeItems.size(); ++groupId) {
if (groupId != mCurrentlyDisplayingGroupId) {
VolumeItem volumeItem = mAvailableVolumeItems.get(groupId);
- addCarVolumeListItem(volumeItem, groupId, 0, null);
+ addCarVolumeListItem(volumeItem, groupId, /* supplementalIconId= */ 0,
+ /* supplementalIconOnClickListener= */ null);
}
}
inAnimator = AnimatorInflater.loadAnimator(
mContext, R.anim.car_arrow_fade_in_rotate_up);
} else {
- // Only keeping the default stream if it is not expended.
- Iterator itr = mCarVolumeLineItems.iterator();
- while (itr.hasNext()) {
- CarVolumeItem carVolumeItem = (CarVolumeItem) itr.next();
- if (carVolumeItem.getGroupId() != mCurrentlyDisplayingGroupId) {
- itr.remove();
- }
- }
+ clearAllAndSetupDefaultCarVolumeLineItem(mCurrentlyDisplayingGroupId);
inAnimator = AnimatorInflater.loadAnimator(
mContext, R.anim.car_arrow_fade_in_rotate_down);
}
diff --git a/packages/PackageInstaller/src/com/android/packageinstaller/handheld/UninstallAlertDialogFragment.java b/packages/PackageInstaller/src/com/android/packageinstaller/handheld/UninstallAlertDialogFragment.java
index 0a37cc6cb6ca..99f6a92206b9 100644
--- a/packages/PackageInstaller/src/com/android/packageinstaller/handheld/UninstallAlertDialogFragment.java
+++ b/packages/PackageInstaller/src/com/android/packageinstaller/handheld/UninstallAlertDialogFragment.java
@@ -16,7 +16,6 @@
package com.android.packageinstaller.handheld;
-import static android.os.storage.StorageManager.convert;
import static android.text.format.Formatter.formatFileSize;
import android.annotation.NonNull;
@@ -34,8 +33,6 @@ import android.content.pm.UserInfo;
import android.os.Bundle;
import android.os.UserHandle;
import android.os.UserManager;
-import android.os.storage.StorageManager;
-import android.os.storage.StorageVolume;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
@@ -64,29 +61,18 @@ public class UninstallAlertDialogFragment extends DialogFragment implements
* @return The number of bytes.
*/
private long getAppDataSizeForUser(@NonNull String pkg, @NonNull UserHandle user) {
- StorageManager storageManager = getContext().getSystemService(StorageManager.class);
StorageStatsManager storageStatsManager =
getContext().getSystemService(StorageStatsManager.class);
-
- List<StorageVolume> volumes = storageManager.getStorageVolumes();
- long appDataSize = 0;
-
- int numVolumes = volumes.size();
- for (int i = 0; i < numVolumes; i++) {
- StorageStats stats;
- try {
- stats = storageStatsManager.queryStatsForPackage(convert(volumes.get(i).getUuid()),
- pkg, user);
- } catch (PackageManager.NameNotFoundException | IOException e) {
- Log.e(LOG_TAG, "Cannot determine amount of app data for " + pkg + " on "
- + volumes.get(i) + " (user " + user + ")", e);
- continue;
- }
-
- appDataSize += stats.getDataBytes();
+ try {
+ StorageStats stats = storageStatsManager.queryStatsForPackage(
+ getContext().getPackageManager().getApplicationInfo(pkg, 0).storageUuid,
+ pkg, user);
+ return stats.getDataBytes();
+ } catch (PackageManager.NameNotFoundException | IOException e) {
+ Log.e(LOG_TAG, "Cannot determine amount of app data for " + pkg, e);
}
- return appDataSize;
+ return 0;
}
/**
diff --git a/packages/SettingsLib/res/values-af/strings.xml b/packages/SettingsLib/res/values-af/strings.xml
index f25b5eb294e0..843967de46b1 100644
--- a/packages/SettingsLib/res/values-af/strings.xml
+++ b/packages/SettingsLib/res/values-af/strings.xml
@@ -61,6 +61,8 @@
<string name="speed_label_medium" msgid="3175763313268941953">"Middelmatig"</string>
<string name="speed_label_fast" msgid="7715732164050975057">"Vinnig"</string>
<string name="speed_label_very_fast" msgid="2265363430784523409">"Baie vinnig"</string>
+ <!-- no translation found for wifi_passpoint_expired (1711402866023391443) -->
+ <skip />
<string name="preference_summary_default_combination" msgid="8532964268242666060">"<xliff:g id="STATE">%1$s</xliff:g> / <xliff:g id="DESCRIPTION">%2$s</xliff:g>"</string>
<string name="bluetooth_disconnected" msgid="6557104142667339895">"Ontkoppel"</string>
<string name="bluetooth_disconnecting" msgid="8913264760027764974">"Ontkoppel tans…"</string>
@@ -466,4 +468,6 @@
<string name="zen_mode_forever" msgid="2704305038191592967">"Totdat jy dit afskakel"</string>
<string name="time_unit_just_now" msgid="6363336622778342422">"Sopas"</string>
<string name="media_transfer_this_device_name" msgid="1636276898262571213">"Hierdie toestel"</string>
+ <!-- no translation found for profile_connect_timeout_subtext (2401801610868184557) -->
+ <skip />
</resources>
diff --git a/packages/SettingsLib/res/values-am/strings.xml b/packages/SettingsLib/res/values-am/strings.xml
index 6332c848c5a6..871a7fc5f1a0 100644
--- a/packages/SettingsLib/res/values-am/strings.xml
+++ b/packages/SettingsLib/res/values-am/strings.xml
@@ -61,6 +61,8 @@
<string name="speed_label_medium" msgid="3175763313268941953">"መካከለኛ"</string>
<string name="speed_label_fast" msgid="7715732164050975057">"ፈጣን"</string>
<string name="speed_label_very_fast" msgid="2265363430784523409">"እጅግ በጣም ፈጣን"</string>
+ <!-- no translation found for wifi_passpoint_expired (1711402866023391443) -->
+ <skip />
<string name="preference_summary_default_combination" msgid="8532964268242666060">"<xliff:g id="STATE">%1$s</xliff:g> / <xliff:g id="DESCRIPTION">%2$s</xliff:g>"</string>
<string name="bluetooth_disconnected" msgid="6557104142667339895">"ተለያይቷል"</string>
<string name="bluetooth_disconnecting" msgid="8913264760027764974">"በመለያየት ላይ..."</string>
@@ -466,4 +468,6 @@
<string name="zen_mode_forever" msgid="2704305038191592967">"እስኪያጠፉት ድረስ"</string>
<string name="time_unit_just_now" msgid="6363336622778342422">"ልክ አሁን"</string>
<string name="media_transfer_this_device_name" msgid="1636276898262571213">"ይህ መሣሪያ"</string>
+ <!-- no translation found for profile_connect_timeout_subtext (2401801610868184557) -->
+ <skip />
</resources>
diff --git a/packages/SettingsLib/res/values-ar/strings.xml b/packages/SettingsLib/res/values-ar/strings.xml
index 8c72527604a4..9ee6322666b8 100644
--- a/packages/SettingsLib/res/values-ar/strings.xml
+++ b/packages/SettingsLib/res/values-ar/strings.xml
@@ -61,6 +61,8 @@
<string name="speed_label_medium" msgid="3175763313268941953">"متوسطة"</string>
<string name="speed_label_fast" msgid="7715732164050975057">"سريعة"</string>
<string name="speed_label_very_fast" msgid="2265363430784523409">"سريعة جدًا"</string>
+ <!-- no translation found for wifi_passpoint_expired (1711402866023391443) -->
+ <skip />
<string name="preference_summary_default_combination" msgid="8532964268242666060">"<xliff:g id="STATE">%1$s</xliff:g> / <xliff:g id="DESCRIPTION">%2$s</xliff:g>"</string>
<string name="bluetooth_disconnected" msgid="6557104142667339895">"غير متصل"</string>
<string name="bluetooth_disconnecting" msgid="8913264760027764974">"جارٍ قطع الاتصال..."</string>
@@ -470,4 +472,6 @@
<string name="zen_mode_forever" msgid="2704305038191592967">"إلى أن توقف الوضع يدويًا"</string>
<string name="time_unit_just_now" msgid="6363336622778342422">"للتو"</string>
<string name="media_transfer_this_device_name" msgid="1636276898262571213">"هذا الجهاز"</string>
+ <!-- no translation found for profile_connect_timeout_subtext (2401801610868184557) -->
+ <skip />
</resources>
diff --git a/packages/SettingsLib/res/values-as/strings.xml b/packages/SettingsLib/res/values-as/strings.xml
index a7ea1e020f03..9dcd8ba06f41 100644
--- a/packages/SettingsLib/res/values-as/strings.xml
+++ b/packages/SettingsLib/res/values-as/strings.xml
@@ -43,8 +43,7 @@
<string name="available_via_passpoint" msgid="1617440946846329613">"%1$sৰ মাধ্যমেৰে উপলব্ধ"</string>
<string name="tap_to_sign_up" msgid="6449724763052579434">"ছাইন আপ কৰিবলৈ টিপক"</string>
<string name="wifi_connected_no_internet" msgid="8202906332837777829">"সংযোজিত, ইণ্টাৰনেট নাই"</string>
- <!-- no translation found for private_dns_broken (7356676011023412490) -->
- <skip />
+ <string name="private_dns_broken" msgid="7356676011023412490">"ব্যক্তিগত DNS ছাৰ্ভাৰ এক্সেছ কৰিব নোৱাৰি"</string>
<string name="wifi_limited_connection" msgid="7717855024753201527">"ইণ্টাৰনেট সংযোগ সীমিত"</string>
<string name="wifi_status_no_internet" msgid="5784710974669608361">"ইণ্টাৰনেট সংযোগ নাই"</string>
<string name="wifi_status_sign_in_required" msgid="123517180404752756">"ছাইন ইন কৰা দৰকাৰী"</string>
@@ -62,6 +61,8 @@
<string name="speed_label_medium" msgid="3175763313268941953">"মধ্যমীয়া"</string>
<string name="speed_label_fast" msgid="7715732164050975057">"দ্ৰুত"</string>
<string name="speed_label_very_fast" msgid="2265363430784523409">"অতি দ্ৰুত"</string>
+ <!-- no translation found for wifi_passpoint_expired (1711402866023391443) -->
+ <skip />
<string name="preference_summary_default_combination" msgid="8532964268242666060">"<xliff:g id="STATE">%1$s</xliff:g> / <xliff:g id="DESCRIPTION">%2$s</xliff:g>"</string>
<string name="bluetooth_disconnected" msgid="6557104142667339895">"সংযোগ বিচ্ছিন্ন কৰা হ’ল"</string>
<string name="bluetooth_disconnecting" msgid="8913264760027764974">"সংযোগ বিচ্ছিন্ন কৰি থকা হৈছে…"</string>
@@ -467,4 +468,6 @@
<string name="zen_mode_forever" msgid="2704305038191592967">"আপুনি অফ নকৰা পর্যন্ত"</string>
<string name="time_unit_just_now" msgid="6363336622778342422">"এই মাত্ৰ"</string>
<string name="media_transfer_this_device_name" msgid="1636276898262571213">"এই ডিভাইচটো"</string>
+ <!-- no translation found for profile_connect_timeout_subtext (2401801610868184557) -->
+ <skip />
</resources>
diff --git a/packages/SettingsLib/res/values-az/strings.xml b/packages/SettingsLib/res/values-az/strings.xml
index cb7db78fd018..fda96b4d2851 100644
--- a/packages/SettingsLib/res/values-az/strings.xml
+++ b/packages/SettingsLib/res/values-az/strings.xml
@@ -61,6 +61,8 @@
<string name="speed_label_medium" msgid="3175763313268941953">"Orta"</string>
<string name="speed_label_fast" msgid="7715732164050975057">"Sürətli"</string>
<string name="speed_label_very_fast" msgid="2265363430784523409">"Çox Sürətli"</string>
+ <!-- no translation found for wifi_passpoint_expired (1711402866023391443) -->
+ <skip />
<string name="preference_summary_default_combination" msgid="8532964268242666060">"<xliff:g id="STATE">%1$s</xliff:g> / <xliff:g id="DESCRIPTION">%2$s</xliff:g>"</string>
<string name="bluetooth_disconnected" msgid="6557104142667339895">"Ayrıldı"</string>
<string name="bluetooth_disconnecting" msgid="8913264760027764974">"Ayrılır..."</string>
@@ -466,4 +468,6 @@
<string name="zen_mode_forever" msgid="2704305038191592967">"Deaktiv edənə qədər"</string>
<string name="time_unit_just_now" msgid="6363336622778342422">"İndicə"</string>
<string name="media_transfer_this_device_name" msgid="1636276898262571213">"Bu cihaz"</string>
+ <!-- no translation found for profile_connect_timeout_subtext (2401801610868184557) -->
+ <skip />
</resources>
diff --git a/packages/SettingsLib/res/values-b+sr+Latn/strings.xml b/packages/SettingsLib/res/values-b+sr+Latn/strings.xml
index 75feb326cd77..4dfbd8e1d6c4 100644
--- a/packages/SettingsLib/res/values-b+sr+Latn/strings.xml
+++ b/packages/SettingsLib/res/values-b+sr+Latn/strings.xml
@@ -61,6 +61,8 @@
<string name="speed_label_medium" msgid="3175763313268941953">"Srednja"</string>
<string name="speed_label_fast" msgid="7715732164050975057">"Brza"</string>
<string name="speed_label_very_fast" msgid="2265363430784523409">"Veoma brza"</string>
+ <!-- no translation found for wifi_passpoint_expired (1711402866023391443) -->
+ <skip />
<string name="preference_summary_default_combination" msgid="8532964268242666060">"<xliff:g id="STATE">%1$s</xliff:g>/<xliff:g id="DESCRIPTION">%2$s</xliff:g>"</string>
<string name="bluetooth_disconnected" msgid="6557104142667339895">"Veza je prekinuta"</string>
<string name="bluetooth_disconnecting" msgid="8913264760027764974">"Prekidanje veze..."</string>
@@ -467,4 +469,6 @@
<string name="zen_mode_forever" msgid="2704305038191592967">"Dok ne isključite"</string>
<string name="time_unit_just_now" msgid="6363336622778342422">"Upravo"</string>
<string name="media_transfer_this_device_name" msgid="1636276898262571213">"Ovaj uređaj"</string>
+ <!-- no translation found for profile_connect_timeout_subtext (2401801610868184557) -->
+ <skip />
</resources>
diff --git a/packages/SettingsLib/res/values-be/strings.xml b/packages/SettingsLib/res/values-be/strings.xml
index 677aa24ac43d..577c1ebf070d 100644
--- a/packages/SettingsLib/res/values-be/strings.xml
+++ b/packages/SettingsLib/res/values-be/strings.xml
@@ -61,6 +61,8 @@
<string name="speed_label_medium" msgid="3175763313268941953">"Сярэдняя"</string>
<string name="speed_label_fast" msgid="7715732164050975057">"Хуткая"</string>
<string name="speed_label_very_fast" msgid="2265363430784523409">"Вельмі хуткая"</string>
+ <!-- no translation found for wifi_passpoint_expired (1711402866023391443) -->
+ <skip />
<string name="preference_summary_default_combination" msgid="8532964268242666060">"<xliff:g id="STATE">%1$s</xliff:g> / <xliff:g id="DESCRIPTION">%2$s</xliff:g>"</string>
<string name="bluetooth_disconnected" msgid="6557104142667339895">"Адключана"</string>
<string name="bluetooth_disconnecting" msgid="8913264760027764974">"Адключэнне..."</string>
@@ -468,4 +470,6 @@
<string name="zen_mode_forever" msgid="2704305038191592967">"Пакуль не выключыце"</string>
<string name="time_unit_just_now" msgid="6363336622778342422">"Толькі што"</string>
<string name="media_transfer_this_device_name" msgid="1636276898262571213">"Гэта прылада"</string>
+ <!-- no translation found for profile_connect_timeout_subtext (2401801610868184557) -->
+ <skip />
</resources>
diff --git a/packages/SettingsLib/res/values-bg/strings.xml b/packages/SettingsLib/res/values-bg/strings.xml
index 162042209c46..1007b38ef3ec 100644
--- a/packages/SettingsLib/res/values-bg/strings.xml
+++ b/packages/SettingsLib/res/values-bg/strings.xml
@@ -61,6 +61,8 @@
<string name="speed_label_medium" msgid="3175763313268941953">"Средна"</string>
<string name="speed_label_fast" msgid="7715732164050975057">"Бърза"</string>
<string name="speed_label_very_fast" msgid="2265363430784523409">"Много бърза"</string>
+ <!-- no translation found for wifi_passpoint_expired (1711402866023391443) -->
+ <skip />
<string name="preference_summary_default_combination" msgid="8532964268242666060">"<xliff:g id="STATE">%1$s</xliff:g>/<xliff:g id="DESCRIPTION">%2$s</xliff:g>"</string>
<string name="bluetooth_disconnected" msgid="6557104142667339895">"Изкл."</string>
<string name="bluetooth_disconnecting" msgid="8913264760027764974">"Изключва се..."</string>
@@ -466,4 +468,6 @@
<string name="zen_mode_forever" msgid="2704305038191592967">"До изключване"</string>
<string name="time_unit_just_now" msgid="6363336622778342422">"Току-що"</string>
<string name="media_transfer_this_device_name" msgid="1636276898262571213">"Това устройство"</string>
+ <!-- no translation found for profile_connect_timeout_subtext (2401801610868184557) -->
+ <skip />
</resources>
diff --git a/packages/SettingsLib/res/values-bn/strings.xml b/packages/SettingsLib/res/values-bn/strings.xml
index b1e37a66fa82..a92e8e421c33 100644
--- a/packages/SettingsLib/res/values-bn/strings.xml
+++ b/packages/SettingsLib/res/values-bn/strings.xml
@@ -61,6 +61,8 @@
<string name="speed_label_medium" msgid="3175763313268941953">"মাঝারি"</string>
<string name="speed_label_fast" msgid="7715732164050975057">"দ্রুত"</string>
<string name="speed_label_very_fast" msgid="2265363430784523409">"খুব দ্রুত"</string>
+ <!-- no translation found for wifi_passpoint_expired (1711402866023391443) -->
+ <skip />
<string name="preference_summary_default_combination" msgid="8532964268242666060">"<xliff:g id="STATE">%1$s</xliff:g> / <xliff:g id="DESCRIPTION">%2$s</xliff:g>"</string>
<string name="bluetooth_disconnected" msgid="6557104142667339895">"ডিসকানেক্ট করা হয়েছে"</string>
<string name="bluetooth_disconnecting" msgid="8913264760027764974">"ডিসকানেক্ট হচ্ছে..."</string>
@@ -466,4 +468,6 @@
<string name="zen_mode_forever" msgid="2704305038191592967">"যতক্ষণ না আপনি বন্ধ করছেন"</string>
<string name="time_unit_just_now" msgid="6363336622778342422">"এখনই"</string>
<string name="media_transfer_this_device_name" msgid="1636276898262571213">"এই ডিভাইস"</string>
+ <!-- no translation found for profile_connect_timeout_subtext (2401801610868184557) -->
+ <skip />
</resources>
diff --git a/packages/SettingsLib/res/values-bs/strings.xml b/packages/SettingsLib/res/values-bs/strings.xml
index 911a8315523f..af7219d107f7 100644
--- a/packages/SettingsLib/res/values-bs/strings.xml
+++ b/packages/SettingsLib/res/values-bs/strings.xml
@@ -61,6 +61,8 @@
<string name="speed_label_medium" msgid="3175763313268941953">"Srednja brzina"</string>
<string name="speed_label_fast" msgid="7715732164050975057">"Brzo"</string>
<string name="speed_label_very_fast" msgid="2265363430784523409">"Veoma brzo"</string>
+ <!-- no translation found for wifi_passpoint_expired (1711402866023391443) -->
+ <skip />
<string name="preference_summary_default_combination" msgid="8532964268242666060">"<xliff:g id="STATE">%1$s</xliff:g> / <xliff:g id="DESCRIPTION">%2$s</xliff:g>"</string>
<string name="bluetooth_disconnected" msgid="6557104142667339895">"Isključen"</string>
<string name="bluetooth_disconnecting" msgid="8913264760027764974">"Prekidanje veze…"</string>
@@ -467,4 +469,6 @@
<string name="zen_mode_forever" msgid="2704305038191592967">"Dok ne isključite"</string>
<string name="time_unit_just_now" msgid="6363336622778342422">"Upravo"</string>
<string name="media_transfer_this_device_name" msgid="1636276898262571213">"Ovaj uređaj"</string>
+ <!-- no translation found for profile_connect_timeout_subtext (2401801610868184557) -->
+ <skip />
</resources>
diff --git a/packages/SettingsLib/res/values-ca/strings.xml b/packages/SettingsLib/res/values-ca/strings.xml
index 58c2b670630d..ad6a1311b9c9 100644
--- a/packages/SettingsLib/res/values-ca/strings.xml
+++ b/packages/SettingsLib/res/values-ca/strings.xml
@@ -61,6 +61,8 @@
<string name="speed_label_medium" msgid="3175763313268941953">"Mitjana"</string>
<string name="speed_label_fast" msgid="7715732164050975057">"Ràpida"</string>
<string name="speed_label_very_fast" msgid="2265363430784523409">"Molt ràpida"</string>
+ <!-- no translation found for wifi_passpoint_expired (1711402866023391443) -->
+ <skip />
<string name="preference_summary_default_combination" msgid="8532964268242666060">"<xliff:g id="STATE">%1$s</xliff:g> / <xliff:g id="DESCRIPTION">%2$s</xliff:g>"</string>
<string name="bluetooth_disconnected" msgid="6557104142667339895">"Desconnectat"</string>
<string name="bluetooth_disconnecting" msgid="8913264760027764974">"S\'està desconnectant..."</string>
@@ -466,4 +468,6 @@
<string name="zen_mode_forever" msgid="2704305038191592967">"Fins que no ho desactivis"</string>
<string name="time_unit_just_now" msgid="6363336622778342422">"Ara mateix"</string>
<string name="media_transfer_this_device_name" msgid="1636276898262571213">"Aquest dispositiu"</string>
+ <!-- no translation found for profile_connect_timeout_subtext (2401801610868184557) -->
+ <skip />
</resources>
diff --git a/packages/SettingsLib/res/values-cs/strings.xml b/packages/SettingsLib/res/values-cs/strings.xml
index 3c3d5b811d26..577200c5076c 100644
--- a/packages/SettingsLib/res/values-cs/strings.xml
+++ b/packages/SettingsLib/res/values-cs/strings.xml
@@ -61,6 +61,8 @@
<string name="speed_label_medium" msgid="3175763313268941953">"Střední"</string>
<string name="speed_label_fast" msgid="7715732164050975057">"Rychlá"</string>
<string name="speed_label_very_fast" msgid="2265363430784523409">"Velmi rychlá"</string>
+ <!-- no translation found for wifi_passpoint_expired (1711402866023391443) -->
+ <skip />
<string name="preference_summary_default_combination" msgid="8532964268242666060">"<xliff:g id="STATE">%1$s</xliff:g> / <xliff:g id="DESCRIPTION">%2$s</xliff:g>"</string>
<string name="bluetooth_disconnected" msgid="6557104142667339895">"Odpojeno"</string>
<string name="bluetooth_disconnecting" msgid="8913264760027764974">"Odpojování..."</string>
@@ -468,4 +470,6 @@
<string name="zen_mode_forever" msgid="2704305038191592967">"Dokud tuto funkci nevypnete"</string>
<string name="time_unit_just_now" msgid="6363336622778342422">"Právě teď"</string>
<string name="media_transfer_this_device_name" msgid="1636276898262571213">"Toto zařízení"</string>
+ <!-- no translation found for profile_connect_timeout_subtext (2401801610868184557) -->
+ <skip />
</resources>
diff --git a/packages/SettingsLib/res/values-da/strings.xml b/packages/SettingsLib/res/values-da/strings.xml
index bf5d6cfd472d..43bd1f156456 100644
--- a/packages/SettingsLib/res/values-da/strings.xml
+++ b/packages/SettingsLib/res/values-da/strings.xml
@@ -61,6 +61,8 @@
<string name="speed_label_medium" msgid="3175763313268941953">"Middel"</string>
<string name="speed_label_fast" msgid="7715732164050975057">"Hurtig"</string>
<string name="speed_label_very_fast" msgid="2265363430784523409">"Meget hurtig"</string>
+ <!-- no translation found for wifi_passpoint_expired (1711402866023391443) -->
+ <skip />
<string name="preference_summary_default_combination" msgid="8532964268242666060">"<xliff:g id="STATE">%1$s</xliff:g> – <xliff:g id="DESCRIPTION">%2$s</xliff:g>"</string>
<string name="bluetooth_disconnected" msgid="6557104142667339895">"Afbrudt"</string>
<string name="bluetooth_disconnecting" msgid="8913264760027764974">"Afbryder ..."</string>
@@ -466,4 +468,6 @@
<string name="zen_mode_forever" msgid="2704305038191592967">"Indtil du deaktiverer"</string>
<string name="time_unit_just_now" msgid="6363336622778342422">"Lige nu"</string>
<string name="media_transfer_this_device_name" msgid="1636276898262571213">"Denne enhed"</string>
+ <!-- no translation found for profile_connect_timeout_subtext (2401801610868184557) -->
+ <skip />
</resources>
diff --git a/packages/SettingsLib/res/values-de/strings.xml b/packages/SettingsLib/res/values-de/strings.xml
index a6dbd5ae215a..8f6d12337df8 100644
--- a/packages/SettingsLib/res/values-de/strings.xml
+++ b/packages/SettingsLib/res/values-de/strings.xml
@@ -61,6 +61,8 @@
<string name="speed_label_medium" msgid="3175763313268941953">"Mittel"</string>
<string name="speed_label_fast" msgid="7715732164050975057">"Schnell"</string>
<string name="speed_label_very_fast" msgid="2265363430784523409">"Sehr schnell"</string>
+ <!-- no translation found for wifi_passpoint_expired (1711402866023391443) -->
+ <skip />
<string name="preference_summary_default_combination" msgid="8532964268242666060">"<xliff:g id="STATE">%1$s</xliff:g> – <xliff:g id="DESCRIPTION">%2$s</xliff:g>"</string>
<string name="bluetooth_disconnected" msgid="6557104142667339895">"Nicht verbunden"</string>
<string name="bluetooth_disconnecting" msgid="8913264760027764974">"Verbindung wird getrennt..."</string>
@@ -466,4 +468,6 @@
<string name="zen_mode_forever" msgid="2704305038191592967">"Bis zur Deaktivierung"</string>
<string name="time_unit_just_now" msgid="6363336622778342422">"gerade eben"</string>
<string name="media_transfer_this_device_name" msgid="1636276898262571213">"Dieses Gerät"</string>
+ <!-- no translation found for profile_connect_timeout_subtext (2401801610868184557) -->
+ <skip />
</resources>
diff --git a/packages/SettingsLib/res/values-el/strings.xml b/packages/SettingsLib/res/values-el/strings.xml
index fdba74a4dfd8..fcdc4102985d 100644
--- a/packages/SettingsLib/res/values-el/strings.xml
+++ b/packages/SettingsLib/res/values-el/strings.xml
@@ -61,6 +61,8 @@
<string name="speed_label_medium" msgid="3175763313268941953">"Μέτρια"</string>
<string name="speed_label_fast" msgid="7715732164050975057">"Γρήγορη"</string>
<string name="speed_label_very_fast" msgid="2265363430784523409">"Πολύ γρήγορη"</string>
+ <!-- no translation found for wifi_passpoint_expired (1711402866023391443) -->
+ <skip />
<string name="preference_summary_default_combination" msgid="8532964268242666060">"<xliff:g id="STATE">%1$s</xliff:g> / <xliff:g id="DESCRIPTION">%2$s</xliff:g>"</string>
<string name="bluetooth_disconnected" msgid="6557104142667339895">"Αποσυνδέθηκε"</string>
<string name="bluetooth_disconnecting" msgid="8913264760027764974">"Αποσύνδεση..."</string>
@@ -466,4 +468,6 @@
<string name="zen_mode_forever" msgid="2704305038191592967">"Μέχρι την απενεργοποίηση"</string>
<string name="time_unit_just_now" msgid="6363336622778342422">"Μόλις τώρα"</string>
<string name="media_transfer_this_device_name" msgid="1636276898262571213">"Αυτή η συσκευή"</string>
+ <!-- no translation found for profile_connect_timeout_subtext (2401801610868184557) -->
+ <skip />
</resources>
diff --git a/packages/SettingsLib/res/values-en-rAU/strings.xml b/packages/SettingsLib/res/values-en-rAU/strings.xml
index 581adf86d062..65b19eeb5787 100644
--- a/packages/SettingsLib/res/values-en-rAU/strings.xml
+++ b/packages/SettingsLib/res/values-en-rAU/strings.xml
@@ -61,6 +61,8 @@
<string name="speed_label_medium" msgid="3175763313268941953">"Medium"</string>
<string name="speed_label_fast" msgid="7715732164050975057">"Fast"</string>
<string name="speed_label_very_fast" msgid="2265363430784523409">"Very fast"</string>
+ <!-- no translation found for wifi_passpoint_expired (1711402866023391443) -->
+ <skip />
<string name="preference_summary_default_combination" msgid="8532964268242666060">"<xliff:g id="STATE">%1$s</xliff:g>/<xliff:g id="DESCRIPTION">%2$s</xliff:g>"</string>
<string name="bluetooth_disconnected" msgid="6557104142667339895">"Disconnected"</string>
<string name="bluetooth_disconnecting" msgid="8913264760027764974">"Disconnecting…"</string>
@@ -466,4 +468,6 @@
<string name="zen_mode_forever" msgid="2704305038191592967">"Until you turn off"</string>
<string name="time_unit_just_now" msgid="6363336622778342422">"Just now"</string>
<string name="media_transfer_this_device_name" msgid="1636276898262571213">"This device"</string>
+ <!-- no translation found for profile_connect_timeout_subtext (2401801610868184557) -->
+ <skip />
</resources>
diff --git a/packages/SettingsLib/res/values-en-rCA/strings.xml b/packages/SettingsLib/res/values-en-rCA/strings.xml
index 581adf86d062..65b19eeb5787 100644
--- a/packages/SettingsLib/res/values-en-rCA/strings.xml
+++ b/packages/SettingsLib/res/values-en-rCA/strings.xml
@@ -61,6 +61,8 @@
<string name="speed_label_medium" msgid="3175763313268941953">"Medium"</string>
<string name="speed_label_fast" msgid="7715732164050975057">"Fast"</string>
<string name="speed_label_very_fast" msgid="2265363430784523409">"Very fast"</string>
+ <!-- no translation found for wifi_passpoint_expired (1711402866023391443) -->
+ <skip />
<string name="preference_summary_default_combination" msgid="8532964268242666060">"<xliff:g id="STATE">%1$s</xliff:g>/<xliff:g id="DESCRIPTION">%2$s</xliff:g>"</string>
<string name="bluetooth_disconnected" msgid="6557104142667339895">"Disconnected"</string>
<string name="bluetooth_disconnecting" msgid="8913264760027764974">"Disconnecting…"</string>
@@ -466,4 +468,6 @@
<string name="zen_mode_forever" msgid="2704305038191592967">"Until you turn off"</string>
<string name="time_unit_just_now" msgid="6363336622778342422">"Just now"</string>
<string name="media_transfer_this_device_name" msgid="1636276898262571213">"This device"</string>
+ <!-- no translation found for profile_connect_timeout_subtext (2401801610868184557) -->
+ <skip />
</resources>
diff --git a/packages/SettingsLib/res/values-en-rGB/strings.xml b/packages/SettingsLib/res/values-en-rGB/strings.xml
index 581adf86d062..65b19eeb5787 100644
--- a/packages/SettingsLib/res/values-en-rGB/strings.xml
+++ b/packages/SettingsLib/res/values-en-rGB/strings.xml
@@ -61,6 +61,8 @@
<string name="speed_label_medium" msgid="3175763313268941953">"Medium"</string>
<string name="speed_label_fast" msgid="7715732164050975057">"Fast"</string>
<string name="speed_label_very_fast" msgid="2265363430784523409">"Very fast"</string>
+ <!-- no translation found for wifi_passpoint_expired (1711402866023391443) -->
+ <skip />
<string name="preference_summary_default_combination" msgid="8532964268242666060">"<xliff:g id="STATE">%1$s</xliff:g>/<xliff:g id="DESCRIPTION">%2$s</xliff:g>"</string>
<string name="bluetooth_disconnected" msgid="6557104142667339895">"Disconnected"</string>
<string name="bluetooth_disconnecting" msgid="8913264760027764974">"Disconnecting…"</string>
@@ -466,4 +468,6 @@
<string name="zen_mode_forever" msgid="2704305038191592967">"Until you turn off"</string>
<string name="time_unit_just_now" msgid="6363336622778342422">"Just now"</string>
<string name="media_transfer_this_device_name" msgid="1636276898262571213">"This device"</string>
+ <!-- no translation found for profile_connect_timeout_subtext (2401801610868184557) -->
+ <skip />
</resources>
diff --git a/packages/SettingsLib/res/values-en-rIN/strings.xml b/packages/SettingsLib/res/values-en-rIN/strings.xml
index 581adf86d062..65b19eeb5787 100644
--- a/packages/SettingsLib/res/values-en-rIN/strings.xml
+++ b/packages/SettingsLib/res/values-en-rIN/strings.xml
@@ -61,6 +61,8 @@
<string name="speed_label_medium" msgid="3175763313268941953">"Medium"</string>
<string name="speed_label_fast" msgid="7715732164050975057">"Fast"</string>
<string name="speed_label_very_fast" msgid="2265363430784523409">"Very fast"</string>
+ <!-- no translation found for wifi_passpoint_expired (1711402866023391443) -->
+ <skip />
<string name="preference_summary_default_combination" msgid="8532964268242666060">"<xliff:g id="STATE">%1$s</xliff:g>/<xliff:g id="DESCRIPTION">%2$s</xliff:g>"</string>
<string name="bluetooth_disconnected" msgid="6557104142667339895">"Disconnected"</string>
<string name="bluetooth_disconnecting" msgid="8913264760027764974">"Disconnecting…"</string>
@@ -466,4 +468,6 @@
<string name="zen_mode_forever" msgid="2704305038191592967">"Until you turn off"</string>
<string name="time_unit_just_now" msgid="6363336622778342422">"Just now"</string>
<string name="media_transfer_this_device_name" msgid="1636276898262571213">"This device"</string>
+ <!-- no translation found for profile_connect_timeout_subtext (2401801610868184557) -->
+ <skip />
</resources>
diff --git a/packages/SettingsLib/res/values-en-rXC/strings.xml b/packages/SettingsLib/res/values-en-rXC/strings.xml
index e75d7bc19bbf..38430851cf34 100644
--- a/packages/SettingsLib/res/values-en-rXC/strings.xml
+++ b/packages/SettingsLib/res/values-en-rXC/strings.xml
@@ -61,6 +61,7 @@
<string name="speed_label_medium" msgid="3175763313268941953">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‏‎‏‎‏‏‎‎‎‎‎‏‎‎‏‎‏‎‎‏‎‎‏‏‏‏‏‎‏‎‎‎‎‏‎‏‎‎‏‎‎‎‎‏‏‏‎‎‏‏‏‎‎‏‎‎‏‎‎‎‎‎‎‏‎Medium‎‏‎‎‏‎"</string>
<string name="speed_label_fast" msgid="7715732164050975057">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‏‏‏‏‎‏‎‏‏‎‎‎‏‎‎‏‏‏‏‎‎‏‎‎‏‏‎‎‎‎‏‏‎‎‎‎‎‎‏‎‎‎‏‎‏‎‎‎‎‎‏‏‏‏‎‎‏‎‏‎‏‎‎‎‏‎Fast‎‏‎‎‏‎"</string>
<string name="speed_label_very_fast" msgid="2265363430784523409">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‎‏‏‏‏‏‏‎‏‏‏‎‎‎‎‎‎‏‏‎‎‎‎‎‎‎‎‏‎‎‏‏‎‏‏‎‎‏‏‎‎‎‏‎‎‏‎‎‏‎‏‏‏‎‎‏‎‎‏‎‎‎‏‎Very Fast‎‏‎‎‏‎"</string>
+ <string name="wifi_passpoint_expired" msgid="1711402866023391443">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‎‏‏‎‏‏‏‏‏‎‎‎‎‎‎‎‎‎‏‏‏‏‏‏‏‎‏‎‏‏‎‏‏‎‏‏‎‎‎‏‏‏‎‏‎‎‎‏‏‏‎‎‎‎‎‏‏‎‏‎‎‏‏‎Expired‎‏‎‎‏‎"</string>
<string name="preference_summary_default_combination" msgid="8532964268242666060">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‏‏‏‏‏‎‏‏‎‎‏‏‎‏‎‏‏‎‎‏‎‏‏‎‏‏‏‎‎‏‎‏‎‏‏‎‏‏‎‎‏‏‎‏‏‎‏‎‎‏‎‎‎‎‎‏‎‎‏‎‎‏‏‎‎‎‎‏‎‎‏‏‎<xliff:g id="STATE">%1$s</xliff:g>‎‏‎‎‏‏‏‎ / ‎‏‎‎‏‏‎<xliff:g id="DESCRIPTION">%2$s</xliff:g>‎‏‎‎‏‏‏‎‎‏‎‎‏‎"</string>
<string name="bluetooth_disconnected" msgid="6557104142667339895">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‏‏‏‎‏‏‎‏‎‏‏‏‏‏‏‏‏‏‎‎‎‎‎‏‏‎‏‏‏‏‎‏‎‎‎‎‎‏‎‏‎‏‏‏‎‏‏‎‏‏‏‎‏‏‎‎‎‎‏‏‏‎‏‏‏‎Disconnected‎‏‎‎‏‎"</string>
<string name="bluetooth_disconnecting" msgid="8913264760027764974">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‏‏‏‏‏‏‎‏‏‏‎‏‏‎‎‏‎‎‏‎‎‎‏‏‏‎‎‎‏‎‎‏‏‎‎‏‎‎‎‏‎‎‏‏‏‎‏‏‎‎‏‎‏‏‎‎‎‏‏‏‎‏‏‏‎‎Disconnecting…‎‏‎‎‏‎"</string>
@@ -466,4 +467,5 @@
<string name="zen_mode_forever" msgid="2704305038191592967">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‏‎‏‎‎‏‎‏‏‎‎‎‎‏‏‏‏‎‎‏‏‏‏‏‎‎‎‏‏‎‏‎‏‎‏‎‏‏‎‏‏‎‏‏‎‏‎‏‏‎‎‎‎‏‏‎‎‎‎‎‎‏‏‏‎Until you turn off‎‏‎‎‏‎"</string>
<string name="time_unit_just_now" msgid="6363336622778342422">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‏‏‏‎‏‏‎‎‎‎‏‎‎‏‏‏‏‎‎‎‏‏‏‎‎‏‏‏‏‎‎‎‏‏‎‏‎‏‎‏‎‏‏‏‎‏‏‏‏‏‏‎‏‏‏‎‎‎‎‎‏‎‏‏‎‎Just now‎‏‎‎‏‎"</string>
<string name="media_transfer_this_device_name" msgid="1636276898262571213">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‎‏‏‎‏‏‎‏‎‏‏‎‏‎‏‎‎‏‏‏‎‎‏‎‎‏‎‏‎‏‏‎‏‏‎‏‎‏‏‎‎‎‏‏‏‏‎‎‏‎‏‏‎‎‎‏‏‎‎‏‏‎‏‎This device‎‏‎‎‏‎"</string>
+ <string name="profile_connect_timeout_subtext" msgid="2401801610868184557">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‏‎‏‎‎‎‎‏‎‏‎‏‎‏‎‎‏‏‏‎‏‎‎‏‏‏‎‏‎‏‏‎‏‏‏‏‏‏‎‎‏‏‎‎‎‎‏‎‎‏‎‏‎‏‎‏‏‏‏‎‏‏‎‏‎Problem connecting. Turn device off &amp; back on‎‏‎‎‏‎"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-es-rUS/strings.xml b/packages/SettingsLib/res/values-es-rUS/strings.xml
index 97cce55c11d8..2e1a132c3af6 100644
--- a/packages/SettingsLib/res/values-es-rUS/strings.xml
+++ b/packages/SettingsLib/res/values-es-rUS/strings.xml
@@ -61,6 +61,8 @@
<string name="speed_label_medium" msgid="3175763313268941953">"Media"</string>
<string name="speed_label_fast" msgid="7715732164050975057">"Rápida"</string>
<string name="speed_label_very_fast" msgid="2265363430784523409">"Muy rápida"</string>
+ <!-- no translation found for wifi_passpoint_expired (1711402866023391443) -->
+ <skip />
<string name="preference_summary_default_combination" msgid="8532964268242666060">"<xliff:g id="STATE">%1$s</xliff:g>/<xliff:g id="DESCRIPTION">%2$s</xliff:g>"</string>
<string name="bluetooth_disconnected" msgid="6557104142667339895">"Desconectado"</string>
<string name="bluetooth_disconnecting" msgid="8913264760027764974">"Desconectando…"</string>
@@ -466,4 +468,6 @@
<string name="zen_mode_forever" msgid="2704305038191592967">"Hasta que lo desactives"</string>
<string name="time_unit_just_now" msgid="6363336622778342422">"Recién"</string>
<string name="media_transfer_this_device_name" msgid="1636276898262571213">"Este dispositivo"</string>
+ <!-- no translation found for profile_connect_timeout_subtext (2401801610868184557) -->
+ <skip />
</resources>
diff --git a/packages/SettingsLib/res/values-es/strings.xml b/packages/SettingsLib/res/values-es/strings.xml
index 7ba1a9435be2..31ac2a1f74ac 100644
--- a/packages/SettingsLib/res/values-es/strings.xml
+++ b/packages/SettingsLib/res/values-es/strings.xml
@@ -61,6 +61,8 @@
<string name="speed_label_medium" msgid="3175763313268941953">"Media"</string>
<string name="speed_label_fast" msgid="7715732164050975057">"Rápida"</string>
<string name="speed_label_very_fast" msgid="2265363430784523409">"Muy rápida"</string>
+ <!-- no translation found for wifi_passpoint_expired (1711402866023391443) -->
+ <skip />
<string name="preference_summary_default_combination" msgid="8532964268242666060">"<xliff:g id="STATE">%1$s</xliff:g>/<xliff:g id="DESCRIPTION">%2$s</xliff:g>"</string>
<string name="bluetooth_disconnected" msgid="6557104142667339895">"Desconectado"</string>
<string name="bluetooth_disconnecting" msgid="8913264760027764974">"Desconectando…"</string>
@@ -466,4 +468,6 @@
<string name="zen_mode_forever" msgid="2704305038191592967">"Hasta que se desactive"</string>
<string name="time_unit_just_now" msgid="6363336622778342422">"Justo ahora"</string>
<string name="media_transfer_this_device_name" msgid="1636276898262571213">"Este dispositivo"</string>
+ <!-- no translation found for profile_connect_timeout_subtext (2401801610868184557) -->
+ <skip />
</resources>
diff --git a/packages/SettingsLib/res/values-et/strings.xml b/packages/SettingsLib/res/values-et/strings.xml
index 0e987528d73a..983132a3b7d3 100644
--- a/packages/SettingsLib/res/values-et/strings.xml
+++ b/packages/SettingsLib/res/values-et/strings.xml
@@ -61,6 +61,8 @@
<string name="speed_label_medium" msgid="3175763313268941953">"Keskmine"</string>
<string name="speed_label_fast" msgid="7715732164050975057">"Kiire"</string>
<string name="speed_label_very_fast" msgid="2265363430784523409">"Väga kiire"</string>
+ <!-- no translation found for wifi_passpoint_expired (1711402866023391443) -->
+ <skip />
<string name="preference_summary_default_combination" msgid="8532964268242666060">"<xliff:g id="STATE">%1$s</xliff:g> / <xliff:g id="DESCRIPTION">%2$s</xliff:g>"</string>
<string name="bluetooth_disconnected" msgid="6557104142667339895">"Ühendus katkestatud"</string>
<string name="bluetooth_disconnecting" msgid="8913264760027764974">"Ühenduse katkestamine ..."</string>
@@ -466,4 +468,6 @@
<string name="zen_mode_forever" msgid="2704305038191592967">"Kuni välja lülitate"</string>
<string name="time_unit_just_now" msgid="6363336622778342422">"Äsja"</string>
<string name="media_transfer_this_device_name" msgid="1636276898262571213">"See seade"</string>
+ <!-- no translation found for profile_connect_timeout_subtext (2401801610868184557) -->
+ <skip />
</resources>
diff --git a/packages/SettingsLib/res/values-eu/strings.xml b/packages/SettingsLib/res/values-eu/strings.xml
index 872e9a56ed87..727c6569afdd 100644
--- a/packages/SettingsLib/res/values-eu/strings.xml
+++ b/packages/SettingsLib/res/values-eu/strings.xml
@@ -61,6 +61,8 @@
<string name="speed_label_medium" msgid="3175763313268941953">"Tartekoa"</string>
<string name="speed_label_fast" msgid="7715732164050975057">"Bizkorra"</string>
<string name="speed_label_very_fast" msgid="2265363430784523409">"Oso bizkorra"</string>
+ <!-- no translation found for wifi_passpoint_expired (1711402866023391443) -->
+ <skip />
<string name="preference_summary_default_combination" msgid="8532964268242666060">"<xliff:g id="STATE">%1$s</xliff:g> / <xliff:g id="DESCRIPTION">%2$s</xliff:g>"</string>
<string name="bluetooth_disconnected" msgid="6557104142667339895">"Deskonektatuta"</string>
<string name="bluetooth_disconnecting" msgid="8913264760027764974">"Deskonektatzen…"</string>
@@ -466,4 +468,6 @@
<string name="zen_mode_forever" msgid="2704305038191592967">"Zuk desaktibatu arte"</string>
<string name="time_unit_just_now" msgid="6363336622778342422">"Oraintxe"</string>
<string name="media_transfer_this_device_name" msgid="1636276898262571213">"Gailu hau"</string>
+ <!-- no translation found for profile_connect_timeout_subtext (2401801610868184557) -->
+ <skip />
</resources>
diff --git a/packages/SettingsLib/res/values-fa/strings.xml b/packages/SettingsLib/res/values-fa/strings.xml
index 6e281fe05486..f93af2a50116 100644
--- a/packages/SettingsLib/res/values-fa/strings.xml
+++ b/packages/SettingsLib/res/values-fa/strings.xml
@@ -61,6 +61,8 @@
<string name="speed_label_medium" msgid="3175763313268941953">"متوسط"</string>
<string name="speed_label_fast" msgid="7715732164050975057">"سریع"</string>
<string name="speed_label_very_fast" msgid="2265363430784523409">"خیلی سریع"</string>
+ <!-- no translation found for wifi_passpoint_expired (1711402866023391443) -->
+ <skip />
<string name="preference_summary_default_combination" msgid="8532964268242666060">"<xliff:g id="STATE">%1$s</xliff:g> / <xliff:g id="DESCRIPTION">%2$s</xliff:g>"</string>
<string name="bluetooth_disconnected" msgid="6557104142667339895">"اتصال قطع شد"</string>
<string name="bluetooth_disconnecting" msgid="8913264760027764974">"در حال قطع اتصال..."</string>
@@ -466,4 +468,6 @@
<string name="zen_mode_forever" msgid="2704305038191592967">"تا زمانی‌که آن را خاموش کنید"</string>
<string name="time_unit_just_now" msgid="6363336622778342422">"هم‌اکنون"</string>
<string name="media_transfer_this_device_name" msgid="1636276898262571213">"این دستگاه"</string>
+ <!-- no translation found for profile_connect_timeout_subtext (2401801610868184557) -->
+ <skip />
</resources>
diff --git a/packages/SettingsLib/res/values-fi/strings.xml b/packages/SettingsLib/res/values-fi/strings.xml
index 8c3630a08c9b..855082604143 100644
--- a/packages/SettingsLib/res/values-fi/strings.xml
+++ b/packages/SettingsLib/res/values-fi/strings.xml
@@ -61,6 +61,8 @@
<string name="speed_label_medium" msgid="3175763313268941953">"Kohtuullinen"</string>
<string name="speed_label_fast" msgid="7715732164050975057">"Nopea"</string>
<string name="speed_label_very_fast" msgid="2265363430784523409">"Hyvin nopea"</string>
+ <!-- no translation found for wifi_passpoint_expired (1711402866023391443) -->
+ <skip />
<string name="preference_summary_default_combination" msgid="8532964268242666060">"<xliff:g id="STATE">%1$s</xliff:g> / <xliff:g id="DESCRIPTION">%2$s</xliff:g>"</string>
<string name="bluetooth_disconnected" msgid="6557104142667339895">"Yhteys katkaistu"</string>
<string name="bluetooth_disconnecting" msgid="8913264760027764974">"Katkaistaan yhteyttä..."</string>
@@ -466,4 +468,6 @@
<string name="zen_mode_forever" msgid="2704305038191592967">"Kunnes poistat sen käytöstä"</string>
<string name="time_unit_just_now" msgid="6363336622778342422">"Äsken"</string>
<string name="media_transfer_this_device_name" msgid="1636276898262571213">"Tämä laite"</string>
+ <!-- no translation found for profile_connect_timeout_subtext (2401801610868184557) -->
+ <skip />
</resources>
diff --git a/packages/SettingsLib/res/values-fr-rCA/strings.xml b/packages/SettingsLib/res/values-fr-rCA/strings.xml
index 6c5834ae793a..5c84be718832 100644
--- a/packages/SettingsLib/res/values-fr-rCA/strings.xml
+++ b/packages/SettingsLib/res/values-fr-rCA/strings.xml
@@ -61,6 +61,8 @@
<string name="speed_label_medium" msgid="3175763313268941953">"Moyenne"</string>
<string name="speed_label_fast" msgid="7715732164050975057">"Élevée"</string>
<string name="speed_label_very_fast" msgid="2265363430784523409">"Très rapide"</string>
+ <!-- no translation found for wifi_passpoint_expired (1711402866023391443) -->
+ <skip />
<string name="preference_summary_default_combination" msgid="8532964268242666060">"<xliff:g id="STATE">%1$s</xliff:g> : <xliff:g id="DESCRIPTION">%2$s</xliff:g>"</string>
<string name="bluetooth_disconnected" msgid="6557104142667339895">"Déconnecté"</string>
<string name="bluetooth_disconnecting" msgid="8913264760027764974">"Déconnexion…"</string>
@@ -466,4 +468,6 @@
<string name="zen_mode_forever" msgid="2704305038191592967">"Jusqu\'à la désactivation"</string>
<string name="time_unit_just_now" msgid="6363336622778342422">"À l\'instant"</string>
<string name="media_transfer_this_device_name" msgid="1636276898262571213">"Cet appareil"</string>
+ <!-- no translation found for profile_connect_timeout_subtext (2401801610868184557) -->
+ <skip />
</resources>
diff --git a/packages/SettingsLib/res/values-fr/strings.xml b/packages/SettingsLib/res/values-fr/strings.xml
index 508556ece88a..a6711c7fcbf9 100644
--- a/packages/SettingsLib/res/values-fr/strings.xml
+++ b/packages/SettingsLib/res/values-fr/strings.xml
@@ -61,6 +61,8 @@
<string name="speed_label_medium" msgid="3175763313268941953">"Moyenne"</string>
<string name="speed_label_fast" msgid="7715732164050975057">"Élevée"</string>
<string name="speed_label_very_fast" msgid="2265363430784523409">"Très élevée"</string>
+ <!-- no translation found for wifi_passpoint_expired (1711402866023391443) -->
+ <skip />
<string name="preference_summary_default_combination" msgid="8532964268242666060">"<xliff:g id="STATE">%1$s</xliff:g>/<xliff:g id="DESCRIPTION">%2$s</xliff:g>"</string>
<string name="bluetooth_disconnected" msgid="6557104142667339895">"Déconnecté"</string>
<string name="bluetooth_disconnecting" msgid="8913264760027764974">"Déconnexion…"</string>
@@ -466,4 +468,6 @@
<string name="zen_mode_forever" msgid="2704305038191592967">"Jusqu\'à la désactivation"</string>
<string name="time_unit_just_now" msgid="6363336622778342422">"À l\'instant"</string>
<string name="media_transfer_this_device_name" msgid="1636276898262571213">"Cet appareil"</string>
+ <!-- no translation found for profile_connect_timeout_subtext (2401801610868184557) -->
+ <skip />
</resources>
diff --git a/packages/SettingsLib/res/values-gl/strings.xml b/packages/SettingsLib/res/values-gl/strings.xml
index 1a3ae3d601e1..c70c453aedca 100644
--- a/packages/SettingsLib/res/values-gl/strings.xml
+++ b/packages/SettingsLib/res/values-gl/strings.xml
@@ -61,6 +61,8 @@
<string name="speed_label_medium" msgid="3175763313268941953">"Media"</string>
<string name="speed_label_fast" msgid="7715732164050975057">"Rápida"</string>
<string name="speed_label_very_fast" msgid="2265363430784523409">"Moi rápida"</string>
+ <!-- no translation found for wifi_passpoint_expired (1711402866023391443) -->
+ <skip />
<string name="preference_summary_default_combination" msgid="8532964268242666060">"<xliff:g id="STATE">%1$s</xliff:g>/<xliff:g id="DESCRIPTION">%2$s</xliff:g>"</string>
<string name="bluetooth_disconnected" msgid="6557104142667339895">"Desconectado"</string>
<string name="bluetooth_disconnecting" msgid="8913264760027764974">"Desconectando..."</string>
@@ -466,4 +468,6 @@
<string name="zen_mode_forever" msgid="2704305038191592967">"Ata a desactivación"</string>
<string name="time_unit_just_now" msgid="6363336622778342422">"Agora mesmo"</string>
<string name="media_transfer_this_device_name" msgid="1636276898262571213">"Este dispositivo"</string>
+ <!-- no translation found for profile_connect_timeout_subtext (2401801610868184557) -->
+ <skip />
</resources>
diff --git a/packages/SettingsLib/res/values-gu/strings.xml b/packages/SettingsLib/res/values-gu/strings.xml
index b3f518541c71..34a8355a0781 100644
--- a/packages/SettingsLib/res/values-gu/strings.xml
+++ b/packages/SettingsLib/res/values-gu/strings.xml
@@ -61,6 +61,8 @@
<string name="speed_label_medium" msgid="3175763313268941953">"મધ્યમ"</string>
<string name="speed_label_fast" msgid="7715732164050975057">"ઝડપી"</string>
<string name="speed_label_very_fast" msgid="2265363430784523409">"ખૂબ ઝડપી"</string>
+ <!-- no translation found for wifi_passpoint_expired (1711402866023391443) -->
+ <skip />
<string name="preference_summary_default_combination" msgid="8532964268242666060">"<xliff:g id="STATE">%1$s</xliff:g> / <xliff:g id="DESCRIPTION">%2$s</xliff:g>"</string>
<string name="bluetooth_disconnected" msgid="6557104142667339895">"ડિસ્કનેક્ટ કર્યું"</string>
<string name="bluetooth_disconnecting" msgid="8913264760027764974">"ડિસ્કનેક્ટ થઈ રહ્યું છે..."</string>
@@ -466,4 +468,6 @@
<string name="zen_mode_forever" msgid="2704305038191592967">"તમે બંધ ન કરો ત્યાં સુધી"</string>
<string name="time_unit_just_now" msgid="6363336622778342422">"હમણાં જ"</string>
<string name="media_transfer_this_device_name" msgid="1636276898262571213">"આ ડિવાઇસ"</string>
+ <!-- no translation found for profile_connect_timeout_subtext (2401801610868184557) -->
+ <skip />
</resources>
diff --git a/packages/SettingsLib/res/values-hi/strings.xml b/packages/SettingsLib/res/values-hi/strings.xml
index 454773ca3538..758ce2704eda 100644
--- a/packages/SettingsLib/res/values-hi/strings.xml
+++ b/packages/SettingsLib/res/values-hi/strings.xml
@@ -61,6 +61,8 @@
<string name="speed_label_medium" msgid="3175763313268941953">"मध्यम"</string>
<string name="speed_label_fast" msgid="7715732164050975057">"तेज़"</string>
<string name="speed_label_very_fast" msgid="2265363430784523409">"अत्‍यधिक तेज़"</string>
+ <!-- no translation found for wifi_passpoint_expired (1711402866023391443) -->
+ <skip />
<string name="preference_summary_default_combination" msgid="8532964268242666060">"<xliff:g id="STATE">%1$s</xliff:g> / <xliff:g id="DESCRIPTION">%2$s</xliff:g>"</string>
<string name="bluetooth_disconnected" msgid="6557104142667339895">"डिसकनेक्ट किया गया"</string>
<string name="bluetooth_disconnecting" msgid="8913264760027764974">"डिस्‍कनेक्‍ट हो रहा है..."</string>
@@ -466,4 +468,6 @@
<string name="zen_mode_forever" msgid="2704305038191592967">"जब तक आप इसे बंद नहीं करते"</string>
<string name="time_unit_just_now" msgid="6363336622778342422">"अभी-अभी"</string>
<string name="media_transfer_this_device_name" msgid="1636276898262571213">"यह डिवाइस"</string>
+ <!-- no translation found for profile_connect_timeout_subtext (2401801610868184557) -->
+ <skip />
</resources>
diff --git a/packages/SettingsLib/res/values-hr/strings.xml b/packages/SettingsLib/res/values-hr/strings.xml
index 0ec154baa0e9..2f89a66f8845 100644
--- a/packages/SettingsLib/res/values-hr/strings.xml
+++ b/packages/SettingsLib/res/values-hr/strings.xml
@@ -61,6 +61,8 @@
<string name="speed_label_medium" msgid="3175763313268941953">"Srednje"</string>
<string name="speed_label_fast" msgid="7715732164050975057">"Brzo"</string>
<string name="speed_label_very_fast" msgid="2265363430784523409">"Vrlo brzo"</string>
+ <!-- no translation found for wifi_passpoint_expired (1711402866023391443) -->
+ <skip />
<string name="preference_summary_default_combination" msgid="8532964268242666060">"<xliff:g id="STATE">%1$s</xliff:g>/<xliff:g id="DESCRIPTION">%2$s</xliff:g>"</string>
<string name="bluetooth_disconnected" msgid="6557104142667339895">"Niste povezani"</string>
<string name="bluetooth_disconnecting" msgid="8913264760027764974">"Isključivanje…"</string>
@@ -467,4 +469,6 @@
<string name="zen_mode_forever" msgid="2704305038191592967">"Dok ne isključite"</string>
<string name="time_unit_just_now" msgid="6363336622778342422">"Upravo sad"</string>
<string name="media_transfer_this_device_name" msgid="1636276898262571213">"Ovaj uređaj"</string>
+ <!-- no translation found for profile_connect_timeout_subtext (2401801610868184557) -->
+ <skip />
</resources>
diff --git a/packages/SettingsLib/res/values-hu/strings.xml b/packages/SettingsLib/res/values-hu/strings.xml
index 4a0af7d27ab5..8f6e77615bc6 100644
--- a/packages/SettingsLib/res/values-hu/strings.xml
+++ b/packages/SettingsLib/res/values-hu/strings.xml
@@ -61,6 +61,8 @@
<string name="speed_label_medium" msgid="3175763313268941953">"Közepes"</string>
<string name="speed_label_fast" msgid="7715732164050975057">"Gyors"</string>
<string name="speed_label_very_fast" msgid="2265363430784523409">"Nagyon gyors"</string>
+ <!-- no translation found for wifi_passpoint_expired (1711402866023391443) -->
+ <skip />
<string name="preference_summary_default_combination" msgid="8532964268242666060">"<xliff:g id="STATE">%1$s</xliff:g> / <xliff:g id="DESCRIPTION">%2$s</xliff:g>"</string>
<string name="bluetooth_disconnected" msgid="6557104142667339895">"Szétkapcsolva"</string>
<string name="bluetooth_disconnecting" msgid="8913264760027764974">"Szétkapcsolás..."</string>
@@ -466,4 +468,6 @@
<string name="zen_mode_forever" msgid="2704305038191592967">"Kikapcsolásig"</string>
<string name="time_unit_just_now" msgid="6363336622778342422">"Az imént"</string>
<string name="media_transfer_this_device_name" msgid="1636276898262571213">"Ez az eszköz"</string>
+ <!-- no translation found for profile_connect_timeout_subtext (2401801610868184557) -->
+ <skip />
</resources>
diff --git a/packages/SettingsLib/res/values-hy/strings.xml b/packages/SettingsLib/res/values-hy/strings.xml
index cc0ecb8125b6..3791b94c464c 100644
--- a/packages/SettingsLib/res/values-hy/strings.xml
+++ b/packages/SettingsLib/res/values-hy/strings.xml
@@ -61,6 +61,8 @@
<string name="speed_label_medium" msgid="3175763313268941953">"Միջին"</string>
<string name="speed_label_fast" msgid="7715732164050975057">"Արագ"</string>
<string name="speed_label_very_fast" msgid="2265363430784523409">"Շատ արագ"</string>
+ <!-- no translation found for wifi_passpoint_expired (1711402866023391443) -->
+ <skip />
<string name="preference_summary_default_combination" msgid="8532964268242666060">"<xliff:g id="STATE">%1$s</xliff:g> / <xliff:g id="DESCRIPTION">%2$s</xliff:g>"</string>
<string name="bluetooth_disconnected" msgid="6557104142667339895">"Անջատված է"</string>
<string name="bluetooth_disconnecting" msgid="8913264760027764974">"Անջատվում է..."</string>
@@ -466,4 +468,6 @@
<string name="zen_mode_forever" msgid="2704305038191592967">"Մինչև չանջատեք"</string>
<string name="time_unit_just_now" msgid="6363336622778342422">"Հենց նոր"</string>
<string name="media_transfer_this_device_name" msgid="1636276898262571213">"Այս սարքը"</string>
+ <!-- no translation found for profile_connect_timeout_subtext (2401801610868184557) -->
+ <skip />
</resources>
diff --git a/packages/SettingsLib/res/values-in/strings.xml b/packages/SettingsLib/res/values-in/strings.xml
index 0733c1f76a66..1a8248476eef 100644
--- a/packages/SettingsLib/res/values-in/strings.xml
+++ b/packages/SettingsLib/res/values-in/strings.xml
@@ -61,6 +61,8 @@
<string name="speed_label_medium" msgid="3175763313268941953">"Sedang"</string>
<string name="speed_label_fast" msgid="7715732164050975057">"Cepat"</string>
<string name="speed_label_very_fast" msgid="2265363430784523409">"Sangat Cepat"</string>
+ <!-- no translation found for wifi_passpoint_expired (1711402866023391443) -->
+ <skip />
<string name="preference_summary_default_combination" msgid="8532964268242666060">"<xliff:g id="STATE">%1$s</xliff:g>/<xliff:g id="DESCRIPTION">%2$s</xliff:g>"</string>
<string name="bluetooth_disconnected" msgid="6557104142667339895">"Sambungan terputus"</string>
<string name="bluetooth_disconnecting" msgid="8913264760027764974">"Memutus sambungan..."</string>
@@ -466,4 +468,6 @@
<string name="zen_mode_forever" msgid="2704305038191592967">"Sampai Anda menonaktifkannya"</string>
<string name="time_unit_just_now" msgid="6363336622778342422">"Baru saja"</string>
<string name="media_transfer_this_device_name" msgid="1636276898262571213">"Perangkat ini"</string>
+ <!-- no translation found for profile_connect_timeout_subtext (2401801610868184557) -->
+ <skip />
</resources>
diff --git a/packages/SettingsLib/res/values-is/strings.xml b/packages/SettingsLib/res/values-is/strings.xml
index 28ed8fc6224a..c75e12b875a6 100644
--- a/packages/SettingsLib/res/values-is/strings.xml
+++ b/packages/SettingsLib/res/values-is/strings.xml
@@ -61,6 +61,8 @@
<string name="speed_label_medium" msgid="3175763313268941953">"Miðlungshratt"</string>
<string name="speed_label_fast" msgid="7715732164050975057">"Hratt"</string>
<string name="speed_label_very_fast" msgid="2265363430784523409">"Mjög hratt"</string>
+ <!-- no translation found for wifi_passpoint_expired (1711402866023391443) -->
+ <skip />
<string name="preference_summary_default_combination" msgid="8532964268242666060">"<xliff:g id="STATE">%1$s</xliff:g> / <xliff:g id="DESCRIPTION">%2$s</xliff:g>"</string>
<string name="bluetooth_disconnected" msgid="6557104142667339895">"Aftengt"</string>
<string name="bluetooth_disconnecting" msgid="8913264760027764974">"Aftengist…"</string>
@@ -466,4 +468,6 @@
<string name="zen_mode_forever" msgid="2704305038191592967">"Þar til þú slekkur"</string>
<string name="time_unit_just_now" msgid="6363336622778342422">"Rétt í þessu"</string>
<string name="media_transfer_this_device_name" msgid="1636276898262571213">"Þetta tæki"</string>
+ <!-- no translation found for profile_connect_timeout_subtext (2401801610868184557) -->
+ <skip />
</resources>
diff --git a/packages/SettingsLib/res/values-it/strings.xml b/packages/SettingsLib/res/values-it/strings.xml
index b0569b0f96f2..b00d06db49b8 100644
--- a/packages/SettingsLib/res/values-it/strings.xml
+++ b/packages/SettingsLib/res/values-it/strings.xml
@@ -61,6 +61,8 @@
<string name="speed_label_medium" msgid="3175763313268941953">"Media"</string>
<string name="speed_label_fast" msgid="7715732164050975057">"Veloce"</string>
<string name="speed_label_very_fast" msgid="2265363430784523409">"Molto veloce"</string>
+ <!-- no translation found for wifi_passpoint_expired (1711402866023391443) -->
+ <skip />
<string name="preference_summary_default_combination" msgid="8532964268242666060">"<xliff:g id="STATE">%1$s</xliff:g>/<xliff:g id="DESCRIPTION">%2$s</xliff:g>"</string>
<string name="bluetooth_disconnected" msgid="6557104142667339895">"Disconnesso"</string>
<string name="bluetooth_disconnecting" msgid="8913264760027764974">"Disconnessione..."</string>
@@ -466,4 +468,6 @@
<string name="zen_mode_forever" msgid="2704305038191592967">"Fino alla disattivazione"</string>
<string name="time_unit_just_now" msgid="6363336622778342422">"Adesso"</string>
<string name="media_transfer_this_device_name" msgid="1636276898262571213">"Questo dispositivo"</string>
+ <!-- no translation found for profile_connect_timeout_subtext (2401801610868184557) -->
+ <skip />
</resources>
diff --git a/packages/SettingsLib/res/values-iw/strings.xml b/packages/SettingsLib/res/values-iw/strings.xml
index f7d4fcd317ad..8aeb9af8f58f 100644
--- a/packages/SettingsLib/res/values-iw/strings.xml
+++ b/packages/SettingsLib/res/values-iw/strings.xml
@@ -43,8 +43,7 @@
<string name="available_via_passpoint" msgid="1617440946846329613">"‏זמינה דרך %1$s"</string>
<string name="tap_to_sign_up" msgid="6449724763052579434">"יש להקיש כדי להירשם"</string>
<string name="wifi_connected_no_internet" msgid="8202906332837777829">"מחובר. אין אינטרנט"</string>
- <!-- no translation found for private_dns_broken (7356676011023412490) -->
- <skip />
+ <string name="private_dns_broken" msgid="7356676011023412490">"‏לא ניתן לגשת לשרת DNS הפרטי"</string>
<string name="wifi_limited_connection" msgid="7717855024753201527">"חיבור מוגבל"</string>
<string name="wifi_status_no_internet" msgid="5784710974669608361">"אין אינטרנט"</string>
<string name="wifi_status_sign_in_required" msgid="123517180404752756">"נדרשת כניסה"</string>
@@ -62,6 +61,8 @@
<string name="speed_label_medium" msgid="3175763313268941953">"בינונית"</string>
<string name="speed_label_fast" msgid="7715732164050975057">"מהירה"</string>
<string name="speed_label_very_fast" msgid="2265363430784523409">"מהירה מאוד"</string>
+ <!-- no translation found for wifi_passpoint_expired (1711402866023391443) -->
+ <skip />
<string name="preference_summary_default_combination" msgid="8532964268242666060">"<xliff:g id="STATE">%1$s</xliff:g> / <xliff:g id="DESCRIPTION">%2$s</xliff:g>"</string>
<string name="bluetooth_disconnected" msgid="6557104142667339895">"מנותק"</string>
<string name="bluetooth_disconnecting" msgid="8913264760027764974">"מתנתק..."</string>
@@ -469,4 +470,6 @@
<string name="zen_mode_forever" msgid="2704305038191592967">"עד הכיבוי"</string>
<string name="time_unit_just_now" msgid="6363336622778342422">"הרגע"</string>
<string name="media_transfer_this_device_name" msgid="1636276898262571213">"המכשיר הזה"</string>
+ <!-- no translation found for profile_connect_timeout_subtext (2401801610868184557) -->
+ <skip />
</resources>
diff --git a/packages/SettingsLib/res/values-ja/strings.xml b/packages/SettingsLib/res/values-ja/strings.xml
index 4d5c86cafe3a..bd17074605e2 100644
--- a/packages/SettingsLib/res/values-ja/strings.xml
+++ b/packages/SettingsLib/res/values-ja/strings.xml
@@ -61,6 +61,8 @@
<string name="speed_label_medium" msgid="3175763313268941953">"普通"</string>
<string name="speed_label_fast" msgid="7715732164050975057">"速い"</string>
<string name="speed_label_very_fast" msgid="2265363430784523409">"非常に速い"</string>
+ <!-- no translation found for wifi_passpoint_expired (1711402866023391443) -->
+ <skip />
<string name="preference_summary_default_combination" msgid="8532964268242666060">"<xliff:g id="STATE">%1$s</xliff:g> / <xliff:g id="DESCRIPTION">%2$s</xliff:g>"</string>
<string name="bluetooth_disconnected" msgid="6557104142667339895">"切断"</string>
<string name="bluetooth_disconnecting" msgid="8913264760027764974">"切断中..."</string>
@@ -466,4 +468,6 @@
<string name="zen_mode_forever" msgid="2704305038191592967">"OFF にするまで"</string>
<string name="time_unit_just_now" msgid="6363336622778342422">"たった今"</string>
<string name="media_transfer_this_device_name" msgid="1636276898262571213">"このデバイス"</string>
+ <!-- no translation found for profile_connect_timeout_subtext (2401801610868184557) -->
+ <skip />
</resources>
diff --git a/packages/SettingsLib/res/values-ka/strings.xml b/packages/SettingsLib/res/values-ka/strings.xml
index 20342bc011cd..b1fa87fb2d90 100644
--- a/packages/SettingsLib/res/values-ka/strings.xml
+++ b/packages/SettingsLib/res/values-ka/strings.xml
@@ -61,6 +61,8 @@
<string name="speed_label_medium" msgid="3175763313268941953">"საშუალო"</string>
<string name="speed_label_fast" msgid="7715732164050975057">"სწრაფი"</string>
<string name="speed_label_very_fast" msgid="2265363430784523409">"ძალიან სწრაფი"</string>
+ <!-- no translation found for wifi_passpoint_expired (1711402866023391443) -->
+ <skip />
<string name="preference_summary_default_combination" msgid="8532964268242666060">"<xliff:g id="STATE">%1$s</xliff:g> / <xliff:g id="DESCRIPTION">%2$s</xliff:g>"</string>
<string name="bluetooth_disconnected" msgid="6557104142667339895">"კავშირი გაწყვეტილია"</string>
<string name="bluetooth_disconnecting" msgid="8913264760027764974">"მიმდინარეობს გათიშვა…"</string>
@@ -466,4 +468,6 @@
<string name="zen_mode_forever" msgid="2704305038191592967">"გამორთვამდე"</string>
<string name="time_unit_just_now" msgid="6363336622778342422">"ახლახან"</string>
<string name="media_transfer_this_device_name" msgid="1636276898262571213">"ეს მოწყობილობა"</string>
+ <!-- no translation found for profile_connect_timeout_subtext (2401801610868184557) -->
+ <skip />
</resources>
diff --git a/packages/SettingsLib/res/values-kk/strings.xml b/packages/SettingsLib/res/values-kk/strings.xml
index 7b6d29eb43ad..e4dc6efc45b1 100644
--- a/packages/SettingsLib/res/values-kk/strings.xml
+++ b/packages/SettingsLib/res/values-kk/strings.xml
@@ -61,6 +61,8 @@
<string name="speed_label_medium" msgid="3175763313268941953">"Орташа"</string>
<string name="speed_label_fast" msgid="7715732164050975057">"Жылдам"</string>
<string name="speed_label_very_fast" msgid="2265363430784523409">"Өте жылдам"</string>
+ <!-- no translation found for wifi_passpoint_expired (1711402866023391443) -->
+ <skip />
<string name="preference_summary_default_combination" msgid="8532964268242666060">"<xliff:g id="STATE">%1$s</xliff:g> / <xliff:g id="DESCRIPTION">%2$s</xliff:g>"</string>
<string name="bluetooth_disconnected" msgid="6557104142667339895">"Ажыратылған"</string>
<string name="bluetooth_disconnecting" msgid="8913264760027764974">"Ажыратылуда…"</string>
@@ -466,4 +468,6 @@
<string name="zen_mode_forever" msgid="2704305038191592967">"Өшірілгенге дейін"</string>
<string name="time_unit_just_now" msgid="6363336622778342422">"Дәл қазір"</string>
<string name="media_transfer_this_device_name" msgid="1636276898262571213">"Осы құрылғы"</string>
+ <!-- no translation found for profile_connect_timeout_subtext (2401801610868184557) -->
+ <skip />
</resources>
diff --git a/packages/SettingsLib/res/values-km/strings.xml b/packages/SettingsLib/res/values-km/strings.xml
index 115be8e07f59..5ca7fe7a97f9 100644
--- a/packages/SettingsLib/res/values-km/strings.xml
+++ b/packages/SettingsLib/res/values-km/strings.xml
@@ -61,6 +61,8 @@
<string name="speed_label_medium" msgid="3175763313268941953">"មធ្យម"</string>
<string name="speed_label_fast" msgid="7715732164050975057">"លឿន"</string>
<string name="speed_label_very_fast" msgid="2265363430784523409">"លឿន​ណាស់"</string>
+ <!-- no translation found for wifi_passpoint_expired (1711402866023391443) -->
+ <skip />
<string name="preference_summary_default_combination" msgid="8532964268242666060">"<xliff:g id="STATE">%1$s</xliff:g> / <xliff:g id="DESCRIPTION">%2$s</xliff:g>"</string>
<string name="bluetooth_disconnected" msgid="6557104142667339895">"បាន​ផ្ដាច់"</string>
<string name="bluetooth_disconnecting" msgid="8913264760027764974">"កំពុង​ផ្ដាច់…"</string>
@@ -466,4 +468,6 @@
<string name="zen_mode_forever" msgid="2704305038191592967">"រហូតទាល់តែ​អ្នកបិទ"</string>
<string name="time_unit_just_now" msgid="6363336622778342422">"អម្បាញ់មិញ"</string>
<string name="media_transfer_this_device_name" msgid="1636276898262571213">"ឧបករណ៍នេះ"</string>
+ <!-- no translation found for profile_connect_timeout_subtext (2401801610868184557) -->
+ <skip />
</resources>
diff --git a/packages/SettingsLib/res/values-kn/strings.xml b/packages/SettingsLib/res/values-kn/strings.xml
index ac8bfb1654cb..cbdb62c412a6 100644
--- a/packages/SettingsLib/res/values-kn/strings.xml
+++ b/packages/SettingsLib/res/values-kn/strings.xml
@@ -43,8 +43,7 @@
<string name="available_via_passpoint" msgid="1617440946846329613">"%1$s ಮೂಲಕ ಲಭ್ಯವಿದೆ"</string>
<string name="tap_to_sign_up" msgid="6449724763052579434">"ಸೈನ್ ಅಪ್ ಮಾಡಲು ಟ್ಯಾಪ್‌ ಮಾಡಿ"</string>
<string name="wifi_connected_no_internet" msgid="8202906332837777829">"ಸಂಪರ್ಕಪಡಿಸಲಾಗಿದೆ, ಇಂಟರ್ನೆಟ್ ಇಲ್ಲ"</string>
- <!-- no translation found for private_dns_broken (7356676011023412490) -->
- <skip />
+ <string name="private_dns_broken" msgid="7356676011023412490">"ಖಾಸಗಿ DNS ಸರ್ವರ್ ಅನ್ನು ಪ್ರವೇಶಿಸಲು ಸಾಧ್ಯವಿಲ್ಲ"</string>
<string name="wifi_limited_connection" msgid="7717855024753201527">"ಸೀಮಿತ ಸಂಪರ್ಕ"</string>
<string name="wifi_status_no_internet" msgid="5784710974669608361">"ಇಂಟರ್ನೆಟ್ ಇಲ್ಲ"</string>
<string name="wifi_status_sign_in_required" msgid="123517180404752756">"ಸೈನ್ ಇನ್ ಮಾಡುವ ಅಗತ್ಯವಿದೆ"</string>
@@ -62,6 +61,8 @@
<string name="speed_label_medium" msgid="3175763313268941953">"ಮಧ್ಯಮ"</string>
<string name="speed_label_fast" msgid="7715732164050975057">"ವೇಗ"</string>
<string name="speed_label_very_fast" msgid="2265363430784523409">"ತುಂಬಾ ವೇಗವಾಗಿದೆ"</string>
+ <!-- no translation found for wifi_passpoint_expired (1711402866023391443) -->
+ <skip />
<string name="preference_summary_default_combination" msgid="8532964268242666060">"<xliff:g id="STATE">%1$s</xliff:g> / <xliff:g id="DESCRIPTION">%2$s</xliff:g>"</string>
<string name="bluetooth_disconnected" msgid="6557104142667339895">"ಸಂಪರ್ಕ ಕಡಿತಗೊಳಿಸಲಾಗಿದೆ"</string>
<string name="bluetooth_disconnecting" msgid="8913264760027764974">"ಸಂಪರ್ಕ ಕಡಿತಗೊಳಿಸಲಾಗುತ್ತಿದೆ..."</string>
@@ -467,4 +468,6 @@
<string name="zen_mode_forever" msgid="2704305038191592967">"ನೀವು ಆಫ್ ಮಾಡುವವರೆಗೆ"</string>
<string name="time_unit_just_now" msgid="6363336622778342422">"ಇದೀಗ"</string>
<string name="media_transfer_this_device_name" msgid="1636276898262571213">"ಈ ಸಾಧನ"</string>
+ <!-- no translation found for profile_connect_timeout_subtext (2401801610868184557) -->
+ <skip />
</resources>
diff --git a/packages/SettingsLib/res/values-ko/strings.xml b/packages/SettingsLib/res/values-ko/strings.xml
index 4e543103fe60..9d4a947f8953 100644
--- a/packages/SettingsLib/res/values-ko/strings.xml
+++ b/packages/SettingsLib/res/values-ko/strings.xml
@@ -61,6 +61,8 @@
<string name="speed_label_medium" msgid="3175763313268941953">"보통"</string>
<string name="speed_label_fast" msgid="7715732164050975057">"빠름"</string>
<string name="speed_label_very_fast" msgid="2265363430784523409">"매우 빠름"</string>
+ <!-- no translation found for wifi_passpoint_expired (1711402866023391443) -->
+ <skip />
<string name="preference_summary_default_combination" msgid="8532964268242666060">"<xliff:g id="STATE">%1$s</xliff:g>/<xliff:g id="DESCRIPTION">%2$s</xliff:g>"</string>
<string name="bluetooth_disconnected" msgid="6557104142667339895">"연결 끊김"</string>
<string name="bluetooth_disconnecting" msgid="8913264760027764974">"연결을 끊는 중…"</string>
@@ -466,4 +468,6 @@
<string name="zen_mode_forever" msgid="2704305038191592967">"사용 중지할 때까지"</string>
<string name="time_unit_just_now" msgid="6363336622778342422">"조금 전"</string>
<string name="media_transfer_this_device_name" msgid="1636276898262571213">"이 기기"</string>
+ <!-- no translation found for profile_connect_timeout_subtext (2401801610868184557) -->
+ <skip />
</resources>
diff --git a/packages/SettingsLib/res/values-ky/strings.xml b/packages/SettingsLib/res/values-ky/strings.xml
index e891b5a902cb..46e002f935ab 100644
--- a/packages/SettingsLib/res/values-ky/strings.xml
+++ b/packages/SettingsLib/res/values-ky/strings.xml
@@ -61,6 +61,8 @@
<string name="speed_label_medium" msgid="3175763313268941953">"Орто"</string>
<string name="speed_label_fast" msgid="7715732164050975057">"Ылдам"</string>
<string name="speed_label_very_fast" msgid="2265363430784523409">"Абдан ылдам"</string>
+ <!-- no translation found for wifi_passpoint_expired (1711402866023391443) -->
+ <skip />
<string name="preference_summary_default_combination" msgid="8532964268242666060">"<xliff:g id="STATE">%1$s</xliff:g>/<xliff:g id="DESCRIPTION">%2$s</xliff:g>"</string>
<string name="bluetooth_disconnected" msgid="6557104142667339895">"Ажыратылган"</string>
<string name="bluetooth_disconnecting" msgid="8913264760027764974">"Ажыратылууда…"</string>
@@ -466,4 +468,6 @@
<string name="zen_mode_forever" msgid="2704305038191592967">"Бул функция өчүрүлгөнгө чейин"</string>
<string name="time_unit_just_now" msgid="6363336622778342422">"Азыр эле"</string>
<string name="media_transfer_this_device_name" msgid="1636276898262571213">"Ушул түзмөк"</string>
+ <!-- no translation found for profile_connect_timeout_subtext (2401801610868184557) -->
+ <skip />
</resources>
diff --git a/packages/SettingsLib/res/values-lo/strings.xml b/packages/SettingsLib/res/values-lo/strings.xml
index 406a42b2b041..981685e7cdc4 100644
--- a/packages/SettingsLib/res/values-lo/strings.xml
+++ b/packages/SettingsLib/res/values-lo/strings.xml
@@ -61,6 +61,8 @@
<string name="speed_label_medium" msgid="3175763313268941953">"ປານກາງ"</string>
<string name="speed_label_fast" msgid="7715732164050975057">"ໄວ"</string>
<string name="speed_label_very_fast" msgid="2265363430784523409">"ໄວຫຼາຍ"</string>
+ <!-- no translation found for wifi_passpoint_expired (1711402866023391443) -->
+ <skip />
<string name="preference_summary_default_combination" msgid="8532964268242666060">"<xliff:g id="STATE">%1$s</xliff:g> / <xliff:g id="DESCRIPTION">%2$s</xliff:g>"</string>
<string name="bluetooth_disconnected" msgid="6557104142667339895">"ຕັດການເຊື່ອມຕໍ່ແລ້ວ"</string>
<string name="bluetooth_disconnecting" msgid="8913264760027764974">"ກຳລັງຢຸດການເຊື່ອມຕໍ່..."</string>
@@ -466,4 +468,6 @@
<string name="zen_mode_forever" msgid="2704305038191592967">"ຈົນກວ່າທ່ານຈະປິດ"</string>
<string name="time_unit_just_now" msgid="6363336622778342422">"ຕອນນີ້"</string>
<string name="media_transfer_this_device_name" msgid="1636276898262571213">"ອຸປະກອນນີ້"</string>
+ <!-- no translation found for profile_connect_timeout_subtext (2401801610868184557) -->
+ <skip />
</resources>
diff --git a/packages/SettingsLib/res/values-lt/strings.xml b/packages/SettingsLib/res/values-lt/strings.xml
index b305fd90d1cc..6d23090cd4e3 100644
--- a/packages/SettingsLib/res/values-lt/strings.xml
+++ b/packages/SettingsLib/res/values-lt/strings.xml
@@ -61,6 +61,8 @@
<string name="speed_label_medium" msgid="3175763313268941953">"Vidutinis"</string>
<string name="speed_label_fast" msgid="7715732164050975057">"Greitas"</string>
<string name="speed_label_very_fast" msgid="2265363430784523409">"Labai greitas"</string>
+ <!-- no translation found for wifi_passpoint_expired (1711402866023391443) -->
+ <skip />
<string name="preference_summary_default_combination" msgid="8532964268242666060">"<xliff:g id="STATE">%1$s</xliff:g> / <xliff:g id="DESCRIPTION">%2$s</xliff:g>"</string>
<string name="bluetooth_disconnected" msgid="6557104142667339895">"Atsijungęs (-usi)"</string>
<string name="bluetooth_disconnecting" msgid="8913264760027764974">"Atjungiama..."</string>
@@ -468,4 +470,6 @@
<string name="zen_mode_forever" msgid="2704305038191592967">"Kol išjungsite"</string>
<string name="time_unit_just_now" msgid="6363336622778342422">"Ką tik"</string>
<string name="media_transfer_this_device_name" msgid="1636276898262571213">"Šis įrenginys"</string>
+ <!-- no translation found for profile_connect_timeout_subtext (2401801610868184557) -->
+ <skip />
</resources>
diff --git a/packages/SettingsLib/res/values-lv/strings.xml b/packages/SettingsLib/res/values-lv/strings.xml
index c9e2c1114556..76304e09b132 100644
--- a/packages/SettingsLib/res/values-lv/strings.xml
+++ b/packages/SettingsLib/res/values-lv/strings.xml
@@ -61,6 +61,8 @@
<string name="speed_label_medium" msgid="3175763313268941953">"Vidējs"</string>
<string name="speed_label_fast" msgid="7715732164050975057">"Ātrs"</string>
<string name="speed_label_very_fast" msgid="2265363430784523409">"Ļoti ātrs"</string>
+ <!-- no translation found for wifi_passpoint_expired (1711402866023391443) -->
+ <skip />
<string name="preference_summary_default_combination" msgid="8532964268242666060">"<xliff:g id="STATE">%1$s</xliff:g> / <xliff:g id="DESCRIPTION">%2$s</xliff:g>"</string>
<string name="bluetooth_disconnected" msgid="6557104142667339895">"Atvienots"</string>
<string name="bluetooth_disconnecting" msgid="8913264760027764974">"Notiek atvienošana..."</string>
@@ -467,4 +469,6 @@
<string name="zen_mode_forever" msgid="2704305038191592967">"Līdz brīdim, kad izslēgsiet"</string>
<string name="time_unit_just_now" msgid="6363336622778342422">"Tikko"</string>
<string name="media_transfer_this_device_name" msgid="1636276898262571213">"Šī ierīce"</string>
+ <!-- no translation found for profile_connect_timeout_subtext (2401801610868184557) -->
+ <skip />
</resources>
diff --git a/packages/SettingsLib/res/values-mk/strings.xml b/packages/SettingsLib/res/values-mk/strings.xml
index e06d414c2453..d0a284ad56a7 100644
--- a/packages/SettingsLib/res/values-mk/strings.xml
+++ b/packages/SettingsLib/res/values-mk/strings.xml
@@ -61,6 +61,8 @@
<string name="speed_label_medium" msgid="3175763313268941953">"Средна"</string>
<string name="speed_label_fast" msgid="7715732164050975057">"Брза"</string>
<string name="speed_label_very_fast" msgid="2265363430784523409">"Многу брза"</string>
+ <!-- no translation found for wifi_passpoint_expired (1711402866023391443) -->
+ <skip />
<string name="preference_summary_default_combination" msgid="8532964268242666060">"<xliff:g id="STATE">%1$s</xliff:g>/<xliff:g id="DESCRIPTION">%2$s</xliff:g>"</string>
<string name="bluetooth_disconnected" msgid="6557104142667339895">"Исклучено"</string>
<string name="bluetooth_disconnecting" msgid="8913264760027764974">"Се исклучува..."</string>
@@ -466,4 +468,6 @@
<string name="zen_mode_forever" msgid="2704305038191592967">"Додека не го исклучите"</string>
<string name="time_unit_just_now" msgid="6363336622778342422">"Неодамнешни"</string>
<string name="media_transfer_this_device_name" msgid="1636276898262571213">"Овој уред"</string>
+ <!-- no translation found for profile_connect_timeout_subtext (2401801610868184557) -->
+ <skip />
</resources>
diff --git a/packages/SettingsLib/res/values-ml/strings.xml b/packages/SettingsLib/res/values-ml/strings.xml
index 36e632a917f5..b5649aaef0c2 100644
--- a/packages/SettingsLib/res/values-ml/strings.xml
+++ b/packages/SettingsLib/res/values-ml/strings.xml
@@ -61,6 +61,8 @@
<string name="speed_label_medium" msgid="3175763313268941953">"ഇടത്തരം"</string>
<string name="speed_label_fast" msgid="7715732164050975057">"വേഗത്തിൽ"</string>
<string name="speed_label_very_fast" msgid="2265363430784523409">"വളരെ വേഗത്തിൽ"</string>
+ <!-- no translation found for wifi_passpoint_expired (1711402866023391443) -->
+ <skip />
<string name="preference_summary_default_combination" msgid="8532964268242666060">"<xliff:g id="STATE">%1$s</xliff:g> / <xliff:g id="DESCRIPTION">%2$s</xliff:g>"</string>
<string name="bluetooth_disconnected" msgid="6557104142667339895">"വിച്ഛേദിച്ചു"</string>
<string name="bluetooth_disconnecting" msgid="8913264760027764974">"വിച്‌ഛേദിക്കുന്നു..."</string>
@@ -466,4 +468,6 @@
<string name="zen_mode_forever" msgid="2704305038191592967">"നിങ്ങൾ ഓഫാക്കുന്നത് വരെ"</string>
<string name="time_unit_just_now" msgid="6363336622778342422">"ഇപ്പോൾ"</string>
<string name="media_transfer_this_device_name" msgid="1636276898262571213">"ഈ ഉപകരണം"</string>
+ <!-- no translation found for profile_connect_timeout_subtext (2401801610868184557) -->
+ <skip />
</resources>
diff --git a/packages/SettingsLib/res/values-mn/strings.xml b/packages/SettingsLib/res/values-mn/strings.xml
index 1a5a0af7bd5c..93911429398f 100644
--- a/packages/SettingsLib/res/values-mn/strings.xml
+++ b/packages/SettingsLib/res/values-mn/strings.xml
@@ -61,6 +61,8 @@
<string name="speed_label_medium" msgid="3175763313268941953">"Дунд"</string>
<string name="speed_label_fast" msgid="7715732164050975057">"Хурдан"</string>
<string name="speed_label_very_fast" msgid="2265363430784523409">"Маш хурдан"</string>
+ <!-- no translation found for wifi_passpoint_expired (1711402866023391443) -->
+ <skip />
<string name="preference_summary_default_combination" msgid="8532964268242666060">"<xliff:g id="STATE">%1$s</xliff:g> / <xliff:g id="DESCRIPTION">%2$s</xliff:g>"</string>
<string name="bluetooth_disconnected" msgid="6557104142667339895">"Салгагдсан"</string>
<string name="bluetooth_disconnecting" msgid="8913264760027764974">"Салгаж байна…"</string>
@@ -466,4 +468,6 @@
<string name="zen_mode_forever" msgid="2704305038191592967">"Таныг унтраах хүртэл"</string>
<string name="time_unit_just_now" msgid="6363336622778342422">"Дөнгөж сая"</string>
<string name="media_transfer_this_device_name" msgid="1636276898262571213">"Энэ төхөөрөмж"</string>
+ <!-- no translation found for profile_connect_timeout_subtext (2401801610868184557) -->
+ <skip />
</resources>
diff --git a/packages/SettingsLib/res/values-mr/strings.xml b/packages/SettingsLib/res/values-mr/strings.xml
index 751010759fd0..224aa118250e 100644
--- a/packages/SettingsLib/res/values-mr/strings.xml
+++ b/packages/SettingsLib/res/values-mr/strings.xml
@@ -43,8 +43,7 @@
<string name="available_via_passpoint" msgid="1617440946846329613">"%1$s द्वारे उपलब्‍ध"</string>
<string name="tap_to_sign_up" msgid="6449724763052579434">"साइन अप करण्यासाठी टॅप करा"</string>
<string name="wifi_connected_no_internet" msgid="8202906332837777829">"कनेक्‍ट केले, इंटरनेट नाही"</string>
- <!-- no translation found for private_dns_broken (7356676011023412490) -->
- <skip />
+ <string name="private_dns_broken" msgid="7356676011023412490">"खाजगी DNS सर्व्हर अॅक्सेस करू शकत नाही"</string>
<string name="wifi_limited_connection" msgid="7717855024753201527">"मर्यादित कनेक्शन"</string>
<string name="wifi_status_no_internet" msgid="5784710974669608361">"इंटरनेट नाही"</string>
<string name="wifi_status_sign_in_required" msgid="123517180404752756">"साइन इन करणे आवश्यक आहे"</string>
@@ -62,6 +61,8 @@
<string name="speed_label_medium" msgid="3175763313268941953">"मध्‍यम"</string>
<string name="speed_label_fast" msgid="7715732164050975057">"जलद"</string>
<string name="speed_label_very_fast" msgid="2265363430784523409">"खूप जलद"</string>
+ <!-- no translation found for wifi_passpoint_expired (1711402866023391443) -->
+ <skip />
<string name="preference_summary_default_combination" msgid="8532964268242666060">"<xliff:g id="STATE">%1$s</xliff:g> / <xliff:g id="DESCRIPTION">%2$s</xliff:g>"</string>
<string name="bluetooth_disconnected" msgid="6557104142667339895">"डिस्कनेक्ट केले"</string>
<string name="bluetooth_disconnecting" msgid="8913264760027764974">"डिस्कनेक्ट करत आहे..."</string>
@@ -467,4 +468,6 @@
<string name="zen_mode_forever" msgid="2704305038191592967">"तुम्ही बंद करेपर्यंत"</string>
<string name="time_unit_just_now" msgid="6363336622778342422">"आत्ताच"</string>
<string name="media_transfer_this_device_name" msgid="1636276898262571213">"हे डिव्हाइस"</string>
+ <!-- no translation found for profile_connect_timeout_subtext (2401801610868184557) -->
+ <skip />
</resources>
diff --git a/packages/SettingsLib/res/values-ms/strings.xml b/packages/SettingsLib/res/values-ms/strings.xml
index 82bd697a6a52..1c88ba3ea94a 100644
--- a/packages/SettingsLib/res/values-ms/strings.xml
+++ b/packages/SettingsLib/res/values-ms/strings.xml
@@ -61,6 +61,8 @@
<string name="speed_label_medium" msgid="3175763313268941953">"Sederhana"</string>
<string name="speed_label_fast" msgid="7715732164050975057">"Laju"</string>
<string name="speed_label_very_fast" msgid="2265363430784523409">"Sangat Laju"</string>
+ <!-- no translation found for wifi_passpoint_expired (1711402866023391443) -->
+ <skip />
<string name="preference_summary_default_combination" msgid="8532964268242666060">"<xliff:g id="STATE">%1$s</xliff:g> / <xliff:g id="DESCRIPTION">%2$s</xliff:g>"</string>
<string name="bluetooth_disconnected" msgid="6557104142667339895">"Diputuskan sambungan"</string>
<string name="bluetooth_disconnecting" msgid="8913264760027764974">"Memutuskan sambungan..."</string>
@@ -466,4 +468,6 @@
<string name="zen_mode_forever" msgid="2704305038191592967">"Sehingga anda matikan"</string>
<string name="time_unit_just_now" msgid="6363336622778342422">"Sebentar tadi"</string>
<string name="media_transfer_this_device_name" msgid="1636276898262571213">"Peranti ini"</string>
+ <!-- no translation found for profile_connect_timeout_subtext (2401801610868184557) -->
+ <skip />
</resources>
diff --git a/packages/SettingsLib/res/values-my/strings.xml b/packages/SettingsLib/res/values-my/strings.xml
index 9636f0675dd4..d6a2b93a1d00 100644
--- a/packages/SettingsLib/res/values-my/strings.xml
+++ b/packages/SettingsLib/res/values-my/strings.xml
@@ -61,6 +61,8 @@
<string name="speed_label_medium" msgid="3175763313268941953">"အတော်အသင့်"</string>
<string name="speed_label_fast" msgid="7715732164050975057">"မြန်"</string>
<string name="speed_label_very_fast" msgid="2265363430784523409">"အလွန်မြန်"</string>
+ <!-- no translation found for wifi_passpoint_expired (1711402866023391443) -->
+ <skip />
<string name="preference_summary_default_combination" msgid="8532964268242666060">"<xliff:g id="STATE">%1$s</xliff:g> / <xliff:g id="DESCRIPTION">%2$s</xliff:g>"</string>
<string name="bluetooth_disconnected" msgid="6557104142667339895">"ချိတ်ဆက်မှုပြတ်တောက်သည်"</string>
<string name="bluetooth_disconnecting" msgid="8913264760027764974">"အဆက်အသွယ်ဖြတ်တောက်သည်"</string>
@@ -466,4 +468,6 @@
<string name="zen_mode_forever" msgid="2704305038191592967">"သင်ပိတ်လိုက်သည် အထိ"</string>
<string name="time_unit_just_now" msgid="6363336622778342422">"ယခုလေးတင်"</string>
<string name="media_transfer_this_device_name" msgid="1636276898262571213">"ဤစက်ပစ္စည်း"</string>
+ <!-- no translation found for profile_connect_timeout_subtext (2401801610868184557) -->
+ <skip />
</resources>
diff --git a/packages/SettingsLib/res/values-nb/strings.xml b/packages/SettingsLib/res/values-nb/strings.xml
index 99af7c88598a..51d84a03fe78 100644
--- a/packages/SettingsLib/res/values-nb/strings.xml
+++ b/packages/SettingsLib/res/values-nb/strings.xml
@@ -61,6 +61,8 @@
<string name="speed_label_medium" msgid="3175763313268941953">"Middels"</string>
<string name="speed_label_fast" msgid="7715732164050975057">"Rask"</string>
<string name="speed_label_very_fast" msgid="2265363430784523409">"Veldig rask"</string>
+ <!-- no translation found for wifi_passpoint_expired (1711402866023391443) -->
+ <skip />
<string name="preference_summary_default_combination" msgid="8532964268242666060">"<xliff:g id="STATE">%1$s</xliff:g> / <xliff:g id="DESCRIPTION">%2$s</xliff:g>"</string>
<string name="bluetooth_disconnected" msgid="6557104142667339895">"Frakoblet"</string>
<string name="bluetooth_disconnecting" msgid="8913264760027764974">"Kobler fra…"</string>
@@ -466,4 +468,6 @@
<string name="zen_mode_forever" msgid="2704305038191592967">"Til du slår av"</string>
<string name="time_unit_just_now" msgid="6363336622778342422">"Nå nettopp"</string>
<string name="media_transfer_this_device_name" msgid="1636276898262571213">"Denne enheten"</string>
+ <!-- no translation found for profile_connect_timeout_subtext (2401801610868184557) -->
+ <skip />
</resources>
diff --git a/packages/SettingsLib/res/values-ne/strings.xml b/packages/SettingsLib/res/values-ne/strings.xml
index cdf2c7d27134..b41b0c794eed 100644
--- a/packages/SettingsLib/res/values-ne/strings.xml
+++ b/packages/SettingsLib/res/values-ne/strings.xml
@@ -61,6 +61,8 @@
<string name="speed_label_medium" msgid="3175763313268941953">"मध्यम"</string>
<string name="speed_label_fast" msgid="7715732164050975057">"छिटो"</string>
<string name="speed_label_very_fast" msgid="2265363430784523409">"धेरै छिटो"</string>
+ <!-- no translation found for wifi_passpoint_expired (1711402866023391443) -->
+ <skip />
<string name="preference_summary_default_combination" msgid="8532964268242666060">"<xliff:g id="STATE">%1$s</xliff:g> / <xliff:g id="DESCRIPTION">%2$s</xliff:g>"</string>
<string name="bluetooth_disconnected" msgid="6557104142667339895">"विच्छेदन गरियो"</string>
<string name="bluetooth_disconnecting" msgid="8913264760027764974">"जडान हटाइँदै ..."</string>
@@ -466,4 +468,6 @@
<string name="zen_mode_forever" msgid="2704305038191592967">"तपाईंले निष्क्रिय नपार्दासम्म"</string>
<string name="time_unit_just_now" msgid="6363336622778342422">"अहिले भर्खरै"</string>
<string name="media_transfer_this_device_name" msgid="1636276898262571213">"यो यन्त्र"</string>
+ <!-- no translation found for profile_connect_timeout_subtext (2401801610868184557) -->
+ <skip />
</resources>
diff --git a/packages/SettingsLib/res/values-nl/strings.xml b/packages/SettingsLib/res/values-nl/strings.xml
index 709e98d5b2c7..70d652d89c36 100644
--- a/packages/SettingsLib/res/values-nl/strings.xml
+++ b/packages/SettingsLib/res/values-nl/strings.xml
@@ -61,6 +61,8 @@
<string name="speed_label_medium" msgid="3175763313268941953">"Gemiddeld"</string>
<string name="speed_label_fast" msgid="7715732164050975057">"Snel"</string>
<string name="speed_label_very_fast" msgid="2265363430784523409">"Zeer snel"</string>
+ <!-- no translation found for wifi_passpoint_expired (1711402866023391443) -->
+ <skip />
<string name="preference_summary_default_combination" msgid="8532964268242666060">"<xliff:g id="STATE">%1$s</xliff:g>/<xliff:g id="DESCRIPTION">%2$s</xliff:g>"</string>
<string name="bluetooth_disconnected" msgid="6557104142667339895">"Verbinding verbroken"</string>
<string name="bluetooth_disconnecting" msgid="8913264760027764974">"Verbinding verbreken..."</string>
@@ -466,4 +468,6 @@
<string name="zen_mode_forever" msgid="2704305038191592967">"Totdat je uitschakelt"</string>
<string name="time_unit_just_now" msgid="6363336622778342422">"Zojuist"</string>
<string name="media_transfer_this_device_name" msgid="1636276898262571213">"Dit apparaat"</string>
+ <!-- no translation found for profile_connect_timeout_subtext (2401801610868184557) -->
+ <skip />
</resources>
diff --git a/packages/SettingsLib/res/values-or/strings.xml b/packages/SettingsLib/res/values-or/strings.xml
index abe01984e9ef..c4e0e3007adf 100644
--- a/packages/SettingsLib/res/values-or/strings.xml
+++ b/packages/SettingsLib/res/values-or/strings.xml
@@ -43,8 +43,7 @@
<string name="available_via_passpoint" msgid="1617440946846329613">"%1$s ମାଧ୍ୟମରେ ଉପଲବ୍ଧ"</string>
<string name="tap_to_sign_up" msgid="6449724763052579434">"ସାଇନ୍ ଅପ୍ ପାଇଁ ଟାପ୍ କରନ୍ତୁ"</string>
<string name="wifi_connected_no_internet" msgid="8202906332837777829">"ସଂଯୁକ୍ତ, ଇଣ୍ଟର୍‌ନେଟ୍‌ ନାହିଁ"</string>
- <!-- no translation found for private_dns_broken (7356676011023412490) -->
- <skip />
+ <string name="private_dns_broken" msgid="7356676011023412490">"ବ୍ୟକ୍ତିଗତ DNS ସର୍ଭର୍ ଆକ୍ସେସ୍ କରିହେବ ନାହିଁ"</string>
<string name="wifi_limited_connection" msgid="7717855024753201527">"ସୀମିତ ସଂଯୋଗ"</string>
<string name="wifi_status_no_internet" msgid="5784710974669608361">"କୌଣସି ଇଣ୍ଟରନେଟ୍‌ ନାହିଁ"</string>
<string name="wifi_status_sign_in_required" msgid="123517180404752756">"ସାଇନ୍-ଇନ୍ ଆବଶ୍ୟକ"</string>
@@ -62,6 +61,8 @@
<string name="speed_label_medium" msgid="3175763313268941953">"ମଧ୍ୟମ"</string>
<string name="speed_label_fast" msgid="7715732164050975057">"ଦ୍ରୁତ"</string>
<string name="speed_label_very_fast" msgid="2265363430784523409">"ଅତି ଦ୍ରୁତ"</string>
+ <!-- no translation found for wifi_passpoint_expired (1711402866023391443) -->
+ <skip />
<string name="preference_summary_default_combination" msgid="8532964268242666060">"<xliff:g id="STATE">%1$s</xliff:g> / <xliff:g id="DESCRIPTION">%2$s</xliff:g>"</string>
<string name="bluetooth_disconnected" msgid="6557104142667339895">"ବିଛିନ୍ନ ହେଲା"</string>
<string name="bluetooth_disconnecting" msgid="8913264760027764974">"ବିଚ୍ଛିନ୍ନ କରୁଛି…"</string>
@@ -467,4 +468,6 @@
<string name="zen_mode_forever" msgid="2704305038191592967">"ଆପଣ ବନ୍ଦ ନକରିବା ପର୍ଯ୍ୟନ୍ତ"</string>
<string name="time_unit_just_now" msgid="6363336622778342422">"ଏହିକ୍ଷଣି"</string>
<string name="media_transfer_this_device_name" msgid="1636276898262571213">"ଏହି ଡିଭାଇସ୍‍"</string>
+ <!-- no translation found for profile_connect_timeout_subtext (2401801610868184557) -->
+ <skip />
</resources>
diff --git a/packages/SettingsLib/res/values-pa/strings.xml b/packages/SettingsLib/res/values-pa/strings.xml
index b372185be7f2..732b78a81f82 100644
--- a/packages/SettingsLib/res/values-pa/strings.xml
+++ b/packages/SettingsLib/res/values-pa/strings.xml
@@ -61,6 +61,8 @@
<string name="speed_label_medium" msgid="3175763313268941953">"ਔਸਤ"</string>
<string name="speed_label_fast" msgid="7715732164050975057">"ਤੇਜ਼"</string>
<string name="speed_label_very_fast" msgid="2265363430784523409">"ਬਹੁਤ ਤੇਜ਼"</string>
+ <!-- no translation found for wifi_passpoint_expired (1711402866023391443) -->
+ <skip />
<string name="preference_summary_default_combination" msgid="8532964268242666060">"<xliff:g id="STATE">%1$s</xliff:g> / <xliff:g id="DESCRIPTION">%2$s</xliff:g>"</string>
<string name="bluetooth_disconnected" msgid="6557104142667339895">"ਡਿਸਕਨੈਕਟ ਕੀਤਾ"</string>
<string name="bluetooth_disconnecting" msgid="8913264760027764974">"ਡਿਸਕਨੈਕਟ ਕਰ ਰਿਹਾ ਹੈ..."</string>
@@ -466,4 +468,6 @@
<string name="zen_mode_forever" msgid="2704305038191592967">"ਜਦੋਂ ਤੱਕ ਤੁਸੀਂ ਬੰਦ ਨਹੀਂ ਕਰਦੇ"</string>
<string name="time_unit_just_now" msgid="6363336622778342422">"ਹੁਣੇ ਹੀ"</string>
<string name="media_transfer_this_device_name" msgid="1636276898262571213">"ਇਹ ਡੀਵਾਈਸ"</string>
+ <!-- no translation found for profile_connect_timeout_subtext (2401801610868184557) -->
+ <skip />
</resources>
diff --git a/packages/SettingsLib/res/values-pl/strings.xml b/packages/SettingsLib/res/values-pl/strings.xml
index e7a8f22b52a5..ce49b75ce319 100644
--- a/packages/SettingsLib/res/values-pl/strings.xml
+++ b/packages/SettingsLib/res/values-pl/strings.xml
@@ -43,8 +43,7 @@
<string name="available_via_passpoint" msgid="1617440946846329613">"Dostępne przez %1$s"</string>
<string name="tap_to_sign_up" msgid="6449724763052579434">"Kliknij, by się zarejestrować"</string>
<string name="wifi_connected_no_internet" msgid="8202906332837777829">"Połączono, brak internetu"</string>
- <!-- no translation found for private_dns_broken (7356676011023412490) -->
- <skip />
+ <string name="private_dns_broken" msgid="7356676011023412490">"Brak dostępu do prywatnego serwera DNS"</string>
<string name="wifi_limited_connection" msgid="7717855024753201527">"Ograniczone połączenie"</string>
<string name="wifi_status_no_internet" msgid="5784710974669608361">"Brak internetu"</string>
<string name="wifi_status_sign_in_required" msgid="123517180404752756">"Musisz się zalogować"</string>
@@ -62,6 +61,8 @@
<string name="speed_label_medium" msgid="3175763313268941953">"Średnia"</string>
<string name="speed_label_fast" msgid="7715732164050975057">"Szybka"</string>
<string name="speed_label_very_fast" msgid="2265363430784523409">"Bardzo szybka"</string>
+ <!-- no translation found for wifi_passpoint_expired (1711402866023391443) -->
+ <skip />
<string name="preference_summary_default_combination" msgid="8532964268242666060">"<xliff:g id="STATE">%1$s</xliff:g> / <xliff:g id="DESCRIPTION">%2$s</xliff:g>"</string>
<string name="bluetooth_disconnected" msgid="6557104142667339895">"Rozłączona"</string>
<string name="bluetooth_disconnecting" msgid="8913264760027764974">"Rozłączanie..."</string>
@@ -469,4 +470,6 @@
<string name="zen_mode_forever" msgid="2704305038191592967">"Dopóki nie wyłączysz"</string>
<string name="time_unit_just_now" msgid="6363336622778342422">"Przed chwilą"</string>
<string name="media_transfer_this_device_name" msgid="1636276898262571213">"To urządzenie"</string>
+ <!-- no translation found for profile_connect_timeout_subtext (2401801610868184557) -->
+ <skip />
</resources>
diff --git a/packages/SettingsLib/res/values-pt-rBR/strings.xml b/packages/SettingsLib/res/values-pt-rBR/strings.xml
index 6e75fbaa9d3f..4b194ec2db9e 100644
--- a/packages/SettingsLib/res/values-pt-rBR/strings.xml
+++ b/packages/SettingsLib/res/values-pt-rBR/strings.xml
@@ -61,6 +61,8 @@
<string name="speed_label_medium" msgid="3175763313268941953">"Média"</string>
<string name="speed_label_fast" msgid="7715732164050975057">"Rápida"</string>
<string name="speed_label_very_fast" msgid="2265363430784523409">"Muito rápida"</string>
+ <!-- no translation found for wifi_passpoint_expired (1711402866023391443) -->
+ <skip />
<string name="preference_summary_default_combination" msgid="8532964268242666060">"<xliff:g id="STATE">%1$s</xliff:g> / <xliff:g id="DESCRIPTION">%2$s</xliff:g>"</string>
<string name="bluetooth_disconnected" msgid="6557104142667339895">"Desconectado"</string>
<string name="bluetooth_disconnecting" msgid="8913264760027764974">"Desconectando…"</string>
@@ -466,4 +468,6 @@
<string name="zen_mode_forever" msgid="2704305038191592967">"Até você desativar"</string>
<string name="time_unit_just_now" msgid="6363336622778342422">"Agora"</string>
<string name="media_transfer_this_device_name" msgid="1636276898262571213">"Este dispositivo"</string>
+ <!-- no translation found for profile_connect_timeout_subtext (2401801610868184557) -->
+ <skip />
</resources>
diff --git a/packages/SettingsLib/res/values-pt-rPT/strings.xml b/packages/SettingsLib/res/values-pt-rPT/strings.xml
index 4ee0a17cec74..966ba3fa1d24 100644
--- a/packages/SettingsLib/res/values-pt-rPT/strings.xml
+++ b/packages/SettingsLib/res/values-pt-rPT/strings.xml
@@ -61,6 +61,8 @@
<string name="speed_label_medium" msgid="3175763313268941953">"Média"</string>
<string name="speed_label_fast" msgid="7715732164050975057">"Rápida"</string>
<string name="speed_label_very_fast" msgid="2265363430784523409">"Muito rápida"</string>
+ <!-- no translation found for wifi_passpoint_expired (1711402866023391443) -->
+ <skip />
<string name="preference_summary_default_combination" msgid="8532964268242666060">"<xliff:g id="STATE">%1$s</xliff:g>/<xliff:g id="DESCRIPTION">%2$s</xliff:g>"</string>
<string name="bluetooth_disconnected" msgid="6557104142667339895">"Desligado"</string>
<string name="bluetooth_disconnecting" msgid="8913264760027764974">"A desligar..."</string>
@@ -466,4 +468,6 @@
<string name="zen_mode_forever" msgid="2704305038191592967">"Até ser desativado"</string>
<string name="time_unit_just_now" msgid="6363336622778342422">"Agora mesmo"</string>
<string name="media_transfer_this_device_name" msgid="1636276898262571213">"Este dispositivo"</string>
+ <!-- no translation found for profile_connect_timeout_subtext (2401801610868184557) -->
+ <skip />
</resources>
diff --git a/packages/SettingsLib/res/values-pt/strings.xml b/packages/SettingsLib/res/values-pt/strings.xml
index 6e75fbaa9d3f..4b194ec2db9e 100644
--- a/packages/SettingsLib/res/values-pt/strings.xml
+++ b/packages/SettingsLib/res/values-pt/strings.xml
@@ -61,6 +61,8 @@
<string name="speed_label_medium" msgid="3175763313268941953">"Média"</string>
<string name="speed_label_fast" msgid="7715732164050975057">"Rápida"</string>
<string name="speed_label_very_fast" msgid="2265363430784523409">"Muito rápida"</string>
+ <!-- no translation found for wifi_passpoint_expired (1711402866023391443) -->
+ <skip />
<string name="preference_summary_default_combination" msgid="8532964268242666060">"<xliff:g id="STATE">%1$s</xliff:g> / <xliff:g id="DESCRIPTION">%2$s</xliff:g>"</string>
<string name="bluetooth_disconnected" msgid="6557104142667339895">"Desconectado"</string>
<string name="bluetooth_disconnecting" msgid="8913264760027764974">"Desconectando…"</string>
@@ -466,4 +468,6 @@
<string name="zen_mode_forever" msgid="2704305038191592967">"Até você desativar"</string>
<string name="time_unit_just_now" msgid="6363336622778342422">"Agora"</string>
<string name="media_transfer_this_device_name" msgid="1636276898262571213">"Este dispositivo"</string>
+ <!-- no translation found for profile_connect_timeout_subtext (2401801610868184557) -->
+ <skip />
</resources>
diff --git a/packages/SettingsLib/res/values-ro/strings.xml b/packages/SettingsLib/res/values-ro/strings.xml
index c5725d3262d7..117962dbc4e7 100644
--- a/packages/SettingsLib/res/values-ro/strings.xml
+++ b/packages/SettingsLib/res/values-ro/strings.xml
@@ -61,6 +61,8 @@
<string name="speed_label_medium" msgid="3175763313268941953">"Medie"</string>
<string name="speed_label_fast" msgid="7715732164050975057">"Rapidă"</string>
<string name="speed_label_very_fast" msgid="2265363430784523409">"Foarte rapidă"</string>
+ <!-- no translation found for wifi_passpoint_expired (1711402866023391443) -->
+ <skip />
<string name="preference_summary_default_combination" msgid="8532964268242666060">"<xliff:g id="STATE">%1$s</xliff:g>/<xliff:g id="DESCRIPTION">%2$s</xliff:g>"</string>
<string name="bluetooth_disconnected" msgid="6557104142667339895">"Deconectat"</string>
<string name="bluetooth_disconnecting" msgid="8913264760027764974">"În curs de deconectare..."</string>
@@ -467,4 +469,6 @@
<string name="zen_mode_forever" msgid="2704305038191592967">"Până când dezactivați"</string>
<string name="time_unit_just_now" msgid="6363336622778342422">"Chiar acum"</string>
<string name="media_transfer_this_device_name" msgid="1636276898262571213">"Acest dispozitiv"</string>
+ <!-- no translation found for profile_connect_timeout_subtext (2401801610868184557) -->
+ <skip />
</resources>
diff --git a/packages/SettingsLib/res/values-ru/strings.xml b/packages/SettingsLib/res/values-ru/strings.xml
index 6e98601fbcd9..fcbbed9ad09f 100644
--- a/packages/SettingsLib/res/values-ru/strings.xml
+++ b/packages/SettingsLib/res/values-ru/strings.xml
@@ -61,6 +61,8 @@
<string name="speed_label_medium" msgid="3175763313268941953">"Средняя"</string>
<string name="speed_label_fast" msgid="7715732164050975057">"Быстрая"</string>
<string name="speed_label_very_fast" msgid="2265363430784523409">"Очень быстрая"</string>
+ <!-- no translation found for wifi_passpoint_expired (1711402866023391443) -->
+ <skip />
<string name="preference_summary_default_combination" msgid="8532964268242666060">"<xliff:g id="STATE">%1$s</xliff:g> / <xliff:g id="DESCRIPTION">%2$s</xliff:g>"</string>
<string name="bluetooth_disconnected" msgid="6557104142667339895">"Нет подключения"</string>
<string name="bluetooth_disconnecting" msgid="8913264760027764974">"Отключение..."</string>
@@ -468,4 +470,6 @@
<string name="zen_mode_forever" msgid="2704305038191592967">"Пока вы не отключите"</string>
<string name="time_unit_just_now" msgid="6363336622778342422">"Только что"</string>
<string name="media_transfer_this_device_name" msgid="1636276898262571213">"Это устройство"</string>
+ <!-- no translation found for profile_connect_timeout_subtext (2401801610868184557) -->
+ <skip />
</resources>
diff --git a/packages/SettingsLib/res/values-si/strings.xml b/packages/SettingsLib/res/values-si/strings.xml
index 0f67a6517ccc..374e5c446698 100644
--- a/packages/SettingsLib/res/values-si/strings.xml
+++ b/packages/SettingsLib/res/values-si/strings.xml
@@ -61,6 +61,8 @@
<string name="speed_label_medium" msgid="3175763313268941953">"මධ්‍යම"</string>
<string name="speed_label_fast" msgid="7715732164050975057">"වේගවත්"</string>
<string name="speed_label_very_fast" msgid="2265363430784523409">"ඉතා වේගවත්"</string>
+ <!-- no translation found for wifi_passpoint_expired (1711402866023391443) -->
+ <skip />
<string name="preference_summary_default_combination" msgid="8532964268242666060">"<xliff:g id="STATE">%1$s</xliff:g> / <xliff:g id="DESCRIPTION">%2$s</xliff:g>"</string>
<string name="bluetooth_disconnected" msgid="6557104142667339895">"විසන්ධි වුණි"</string>
<string name="bluetooth_disconnecting" msgid="8913264760027764974">"විසන්ධි වෙමින්…"</string>
@@ -466,4 +468,6 @@
<string name="zen_mode_forever" msgid="2704305038191592967">"ඔබ ක්‍රියාවිරහිත කරන තුරු"</string>
<string name="time_unit_just_now" msgid="6363336622778342422">"මේ දැන්"</string>
<string name="media_transfer_this_device_name" msgid="1636276898262571213">"මෙම උපාංගය"</string>
+ <!-- no translation found for profile_connect_timeout_subtext (2401801610868184557) -->
+ <skip />
</resources>
diff --git a/packages/SettingsLib/res/values-sk/strings.xml b/packages/SettingsLib/res/values-sk/strings.xml
index e4b48487688d..4a660c109ae4 100644
--- a/packages/SettingsLib/res/values-sk/strings.xml
+++ b/packages/SettingsLib/res/values-sk/strings.xml
@@ -61,6 +61,8 @@
<string name="speed_label_medium" msgid="3175763313268941953">"Stredná"</string>
<string name="speed_label_fast" msgid="7715732164050975057">"Vysoká"</string>
<string name="speed_label_very_fast" msgid="2265363430784523409">"Veľmi vysoká"</string>
+ <!-- no translation found for wifi_passpoint_expired (1711402866023391443) -->
+ <skip />
<string name="preference_summary_default_combination" msgid="8532964268242666060">"<xliff:g id="STATE">%1$s</xliff:g> / <xliff:g id="DESCRIPTION">%2$s</xliff:g>"</string>
<string name="bluetooth_disconnected" msgid="6557104142667339895">"Odpojený"</string>
<string name="bluetooth_disconnecting" msgid="8913264760027764974">"Prebieha odpájanie..."</string>
@@ -468,4 +470,6 @@
<string name="zen_mode_forever" msgid="2704305038191592967">"Dokiaľ túto funkciu nevypnete"</string>
<string name="time_unit_just_now" msgid="6363336622778342422">"Teraz"</string>
<string name="media_transfer_this_device_name" msgid="1636276898262571213">"Toto zariadenie"</string>
+ <!-- no translation found for profile_connect_timeout_subtext (2401801610868184557) -->
+ <skip />
</resources>
diff --git a/packages/SettingsLib/res/values-sl/strings.xml b/packages/SettingsLib/res/values-sl/strings.xml
index 3e181c2cacb0..e806fae598aa 100644
--- a/packages/SettingsLib/res/values-sl/strings.xml
+++ b/packages/SettingsLib/res/values-sl/strings.xml
@@ -61,6 +61,8 @@
<string name="speed_label_medium" msgid="3175763313268941953">"Srednje hitra"</string>
<string name="speed_label_fast" msgid="7715732164050975057">"Hitra"</string>
<string name="speed_label_very_fast" msgid="2265363430784523409">"Zelo hitra"</string>
+ <!-- no translation found for wifi_passpoint_expired (1711402866023391443) -->
+ <skip />
<string name="preference_summary_default_combination" msgid="8532964268242666060">"<xliff:g id="STATE">%1$s</xliff:g>/<xliff:g id="DESCRIPTION">%2$s</xliff:g>"</string>
<string name="bluetooth_disconnected" msgid="6557104142667339895">"Prekinjena povezava"</string>
<string name="bluetooth_disconnecting" msgid="8913264760027764974">"Prekinjanje povezave ..."</string>
@@ -468,4 +470,6 @@
<string name="zen_mode_forever" msgid="2704305038191592967">"Dokler ne izklopite"</string>
<string name="time_unit_just_now" msgid="6363336622778342422">"pravkar"</string>
<string name="media_transfer_this_device_name" msgid="1636276898262571213">"Ta naprava"</string>
+ <!-- no translation found for profile_connect_timeout_subtext (2401801610868184557) -->
+ <skip />
</resources>
diff --git a/packages/SettingsLib/res/values-sq/strings.xml b/packages/SettingsLib/res/values-sq/strings.xml
index 53803022f388..8aa29174cb9f 100644
--- a/packages/SettingsLib/res/values-sq/strings.xml
+++ b/packages/SettingsLib/res/values-sq/strings.xml
@@ -61,6 +61,8 @@
<string name="speed_label_medium" msgid="3175763313268941953">"Mesatare"</string>
<string name="speed_label_fast" msgid="7715732164050975057">"E shpejtë"</string>
<string name="speed_label_very_fast" msgid="2265363430784523409">"Shumë e shpejtë"</string>
+ <!-- no translation found for wifi_passpoint_expired (1711402866023391443) -->
+ <skip />
<string name="preference_summary_default_combination" msgid="8532964268242666060">"<xliff:g id="STATE">%1$s</xliff:g> / <xliff:g id="DESCRIPTION">%2$s</xliff:g>"</string>
<string name="bluetooth_disconnected" msgid="6557104142667339895">"Shkëputur"</string>
<string name="bluetooth_disconnecting" msgid="8913264760027764974">"Po shkëputet..."</string>
@@ -466,4 +468,6 @@
<string name="zen_mode_forever" msgid="2704305038191592967">"Deri sa ta çaktivizosh"</string>
<string name="time_unit_just_now" msgid="6363336622778342422">"Pikërisht tani"</string>
<string name="media_transfer_this_device_name" msgid="1636276898262571213">"Kjo pajisje"</string>
+ <!-- no translation found for profile_connect_timeout_subtext (2401801610868184557) -->
+ <skip />
</resources>
diff --git a/packages/SettingsLib/res/values-sr/strings.xml b/packages/SettingsLib/res/values-sr/strings.xml
index d68c9e8a1f22..01c9b807e22f 100644
--- a/packages/SettingsLib/res/values-sr/strings.xml
+++ b/packages/SettingsLib/res/values-sr/strings.xml
@@ -61,6 +61,8 @@
<string name="speed_label_medium" msgid="3175763313268941953">"Средња"</string>
<string name="speed_label_fast" msgid="7715732164050975057">"Брза"</string>
<string name="speed_label_very_fast" msgid="2265363430784523409">"Веома брза"</string>
+ <!-- no translation found for wifi_passpoint_expired (1711402866023391443) -->
+ <skip />
<string name="preference_summary_default_combination" msgid="8532964268242666060">"<xliff:g id="STATE">%1$s</xliff:g>/<xliff:g id="DESCRIPTION">%2$s</xliff:g>"</string>
<string name="bluetooth_disconnected" msgid="6557104142667339895">"Веза је прекинута"</string>
<string name="bluetooth_disconnecting" msgid="8913264760027764974">"Прекидање везе..."</string>
@@ -467,4 +469,6 @@
<string name="zen_mode_forever" msgid="2704305038191592967">"Док не искључите"</string>
<string name="time_unit_just_now" msgid="6363336622778342422">"Управо"</string>
<string name="media_transfer_this_device_name" msgid="1636276898262571213">"Овај уређај"</string>
+ <!-- no translation found for profile_connect_timeout_subtext (2401801610868184557) -->
+ <skip />
</resources>
diff --git a/packages/SettingsLib/res/values-sv/strings.xml b/packages/SettingsLib/res/values-sv/strings.xml
index 45841f0ee816..0f9abc9830cb 100644
--- a/packages/SettingsLib/res/values-sv/strings.xml
+++ b/packages/SettingsLib/res/values-sv/strings.xml
@@ -61,6 +61,8 @@
<string name="speed_label_medium" msgid="3175763313268941953">"Medelsnabb"</string>
<string name="speed_label_fast" msgid="7715732164050975057">"Snabb"</string>
<string name="speed_label_very_fast" msgid="2265363430784523409">"Mycket snabb"</string>
+ <!-- no translation found for wifi_passpoint_expired (1711402866023391443) -->
+ <skip />
<string name="preference_summary_default_combination" msgid="8532964268242666060">"<xliff:g id="STATE">%1$s</xliff:g>/<xliff:g id="DESCRIPTION">%2$s</xliff:g>"</string>
<string name="bluetooth_disconnected" msgid="6557104142667339895">"Kopplas ifrån"</string>
<string name="bluetooth_disconnecting" msgid="8913264760027764974">"Kopplar ifrån…"</string>
@@ -466,4 +468,6 @@
<string name="zen_mode_forever" msgid="2704305038191592967">"Tills du inaktiverar funktionen"</string>
<string name="time_unit_just_now" msgid="6363336622778342422">"Nyss"</string>
<string name="media_transfer_this_device_name" msgid="1636276898262571213">"Den här enheten"</string>
+ <!-- no translation found for profile_connect_timeout_subtext (2401801610868184557) -->
+ <skip />
</resources>
diff --git a/packages/SettingsLib/res/values-sw/strings.xml b/packages/SettingsLib/res/values-sw/strings.xml
index a8e73d75dad2..3ccf8a4a6aa9 100644
--- a/packages/SettingsLib/res/values-sw/strings.xml
+++ b/packages/SettingsLib/res/values-sw/strings.xml
@@ -61,6 +61,8 @@
<string name="speed_label_medium" msgid="3175763313268941953">"Wastani"</string>
<string name="speed_label_fast" msgid="7715732164050975057">"Haraka"</string>
<string name="speed_label_very_fast" msgid="2265363430784523409">"Haraka Sana"</string>
+ <!-- no translation found for wifi_passpoint_expired (1711402866023391443) -->
+ <skip />
<string name="preference_summary_default_combination" msgid="8532964268242666060">"<xliff:g id="STATE">%1$s</xliff:g> / <xliff:g id="DESCRIPTION">%2$s</xliff:g>"</string>
<string name="bluetooth_disconnected" msgid="6557104142667339895">"Haijaunganishwa"</string>
<string name="bluetooth_disconnecting" msgid="8913264760027764974">"Inatenganisha..."</string>
@@ -466,4 +468,6 @@
<string name="zen_mode_forever" msgid="2704305038191592967">"Hadi utakapoizima"</string>
<string name="time_unit_just_now" msgid="6363336622778342422">"Sasa hivi"</string>
<string name="media_transfer_this_device_name" msgid="1636276898262571213">"Kifaa hiki"</string>
+ <!-- no translation found for profile_connect_timeout_subtext (2401801610868184557) -->
+ <skip />
</resources>
diff --git a/packages/SettingsLib/res/values-ta/strings.xml b/packages/SettingsLib/res/values-ta/strings.xml
index 83fe954dcac8..4c6bd222785d 100644
--- a/packages/SettingsLib/res/values-ta/strings.xml
+++ b/packages/SettingsLib/res/values-ta/strings.xml
@@ -61,6 +61,8 @@
<string name="speed_label_medium" msgid="3175763313268941953">"நடுத்தரம்"</string>
<string name="speed_label_fast" msgid="7715732164050975057">"வேகம்"</string>
<string name="speed_label_very_fast" msgid="2265363430784523409">"மிகவும் வேகமானது"</string>
+ <!-- no translation found for wifi_passpoint_expired (1711402866023391443) -->
+ <skip />
<string name="preference_summary_default_combination" msgid="8532964268242666060">"<xliff:g id="STATE">%1$s</xliff:g> / <xliff:g id="DESCRIPTION">%2$s</xliff:g>"</string>
<string name="bluetooth_disconnected" msgid="6557104142667339895">"தொடர்பு துண்டிக்கப்பட்டது"</string>
<string name="bluetooth_disconnecting" msgid="8913264760027764974">"துண்டிக்கிறது..."</string>
@@ -466,4 +468,6 @@
<string name="zen_mode_forever" msgid="2704305038191592967">"ஆஃப் செய்யும் வரை"</string>
<string name="time_unit_just_now" msgid="6363336622778342422">"சற்றுமுன்"</string>
<string name="media_transfer_this_device_name" msgid="1636276898262571213">"இந்தச் சாதனம்"</string>
+ <!-- no translation found for profile_connect_timeout_subtext (2401801610868184557) -->
+ <skip />
</resources>
diff --git a/packages/SettingsLib/res/values-te/strings.xml b/packages/SettingsLib/res/values-te/strings.xml
index ad0f673886c1..f1f192b0f040 100644
--- a/packages/SettingsLib/res/values-te/strings.xml
+++ b/packages/SettingsLib/res/values-te/strings.xml
@@ -61,6 +61,8 @@
<string name="speed_label_medium" msgid="3175763313268941953">"మధ్యస్థం"</string>
<string name="speed_label_fast" msgid="7715732164050975057">"వేగవంతం"</string>
<string name="speed_label_very_fast" msgid="2265363430784523409">"చాలా వేగవంతం"</string>
+ <!-- no translation found for wifi_passpoint_expired (1711402866023391443) -->
+ <skip />
<string name="preference_summary_default_combination" msgid="8532964268242666060">"<xliff:g id="STATE">%1$s</xliff:g> / <xliff:g id="DESCRIPTION">%2$s</xliff:g>"</string>
<string name="bluetooth_disconnected" msgid="6557104142667339895">"డిస్‌కనెక్ట్ చేయబడింది"</string>
<string name="bluetooth_disconnecting" msgid="8913264760027764974">"డిస్‌కనెక్ట్ చేస్తోంది..."</string>
@@ -466,4 +468,6 @@
<string name="zen_mode_forever" msgid="2704305038191592967">"మీరు ఆఫ్‌ చేసే వరకు"</string>
<string name="time_unit_just_now" msgid="6363336622778342422">"ఇప్పుడే"</string>
<string name="media_transfer_this_device_name" msgid="1636276898262571213">"ఈ పరికరం"</string>
+ <!-- no translation found for profile_connect_timeout_subtext (2401801610868184557) -->
+ <skip />
</resources>
diff --git a/packages/SettingsLib/res/values-th/strings.xml b/packages/SettingsLib/res/values-th/strings.xml
index c9e232d45a85..e7d7d5b93376 100644
--- a/packages/SettingsLib/res/values-th/strings.xml
+++ b/packages/SettingsLib/res/values-th/strings.xml
@@ -61,6 +61,8 @@
<string name="speed_label_medium" msgid="3175763313268941953">"ปานกลาง"</string>
<string name="speed_label_fast" msgid="7715732164050975057">"เร็ว"</string>
<string name="speed_label_very_fast" msgid="2265363430784523409">"เร็วมาก"</string>
+ <!-- no translation found for wifi_passpoint_expired (1711402866023391443) -->
+ <skip />
<string name="preference_summary_default_combination" msgid="8532964268242666060">"<xliff:g id="STATE">%1$s</xliff:g>/<xliff:g id="DESCRIPTION">%2$s</xliff:g>"</string>
<string name="bluetooth_disconnected" msgid="6557104142667339895">"ตัดการเชื่อมต่อ"</string>
<string name="bluetooth_disconnecting" msgid="8913264760027764974">"กำลังตัดการเชื่อมต่อ..."</string>
@@ -466,4 +468,6 @@
<string name="zen_mode_forever" msgid="2704305038191592967">"จนกว่าคุณจะปิด"</string>
<string name="time_unit_just_now" msgid="6363336622778342422">"เมื่อสักครู่"</string>
<string name="media_transfer_this_device_name" msgid="1636276898262571213">"อุปกรณ์นี้"</string>
+ <!-- no translation found for profile_connect_timeout_subtext (2401801610868184557) -->
+ <skip />
</resources>
diff --git a/packages/SettingsLib/res/values-tl/strings.xml b/packages/SettingsLib/res/values-tl/strings.xml
index 74307f8e3912..a22135528e60 100644
--- a/packages/SettingsLib/res/values-tl/strings.xml
+++ b/packages/SettingsLib/res/values-tl/strings.xml
@@ -61,6 +61,8 @@
<string name="speed_label_medium" msgid="3175763313268941953">"Katamtaman"</string>
<string name="speed_label_fast" msgid="7715732164050975057">"Mabilis"</string>
<string name="speed_label_very_fast" msgid="2265363430784523409">"Napakabilis"</string>
+ <!-- no translation found for wifi_passpoint_expired (1711402866023391443) -->
+ <skip />
<string name="preference_summary_default_combination" msgid="8532964268242666060">"<xliff:g id="STATE">%1$s</xliff:g> / <xliff:g id="DESCRIPTION">%2$s</xliff:g>"</string>
<string name="bluetooth_disconnected" msgid="6557104142667339895">"Hindi nakakonekta"</string>
<string name="bluetooth_disconnecting" msgid="8913264760027764974">"Nadidiskonekta..."</string>
@@ -466,4 +468,6 @@
<string name="zen_mode_forever" msgid="2704305038191592967">"Hanggang sa i-off mo"</string>
<string name="time_unit_just_now" msgid="6363336622778342422">"Ngayon lang"</string>
<string name="media_transfer_this_device_name" msgid="1636276898262571213">"Ang device na ito"</string>
+ <!-- no translation found for profile_connect_timeout_subtext (2401801610868184557) -->
+ <skip />
</resources>
diff --git a/packages/SettingsLib/res/values-tr/strings.xml b/packages/SettingsLib/res/values-tr/strings.xml
index b95d941a83b3..49aecf8b9054 100644
--- a/packages/SettingsLib/res/values-tr/strings.xml
+++ b/packages/SettingsLib/res/values-tr/strings.xml
@@ -61,6 +61,8 @@
<string name="speed_label_medium" msgid="3175763313268941953">"Orta"</string>
<string name="speed_label_fast" msgid="7715732164050975057">"Hızlı"</string>
<string name="speed_label_very_fast" msgid="2265363430784523409">"Çok Hızlı"</string>
+ <!-- no translation found for wifi_passpoint_expired (1711402866023391443) -->
+ <skip />
<string name="preference_summary_default_combination" msgid="8532964268242666060">"<xliff:g id="STATE">%1$s</xliff:g> / <xliff:g id="DESCRIPTION">%2$s</xliff:g>"</string>
<string name="bluetooth_disconnected" msgid="6557104142667339895">"Bağlantı kesildi"</string>
<string name="bluetooth_disconnecting" msgid="8913264760027764974">"Bağlantı kesiliyor…"</string>
@@ -466,4 +468,6 @@
<string name="zen_mode_forever" msgid="2704305038191592967">"Siz kapatana kadar"</string>
<string name="time_unit_just_now" msgid="6363336622778342422">"Az önce"</string>
<string name="media_transfer_this_device_name" msgid="1636276898262571213">"Bu cihaz"</string>
+ <!-- no translation found for profile_connect_timeout_subtext (2401801610868184557) -->
+ <skip />
</resources>
diff --git a/packages/SettingsLib/res/values-uk/strings.xml b/packages/SettingsLib/res/values-uk/strings.xml
index 61a0c3e6128e..cf86f4d27014 100644
--- a/packages/SettingsLib/res/values-uk/strings.xml
+++ b/packages/SettingsLib/res/values-uk/strings.xml
@@ -61,6 +61,8 @@
<string name="speed_label_medium" msgid="3175763313268941953">"Середня"</string>
<string name="speed_label_fast" msgid="7715732164050975057">"Швидка"</string>
<string name="speed_label_very_fast" msgid="2265363430784523409">"Дуже швидка"</string>
+ <!-- no translation found for wifi_passpoint_expired (1711402866023391443) -->
+ <skip />
<string name="preference_summary_default_combination" msgid="8532964268242666060">"<xliff:g id="STATE">%1$s</xliff:g>: <xliff:g id="DESCRIPTION">%2$s</xliff:g>"</string>
<string name="bluetooth_disconnected" msgid="6557104142667339895">"Роз’єднано"</string>
<string name="bluetooth_disconnecting" msgid="8913264760027764974">"Відключення..."</string>
@@ -468,4 +470,6 @@
<string name="zen_mode_forever" msgid="2704305038191592967">"Доки не вимкнути"</string>
<string name="time_unit_just_now" msgid="6363336622778342422">"Щойно"</string>
<string name="media_transfer_this_device_name" msgid="1636276898262571213">"Цей пристрій"</string>
+ <!-- no translation found for profile_connect_timeout_subtext (2401801610868184557) -->
+ <skip />
</resources>
diff --git a/packages/SettingsLib/res/values-ur/strings.xml b/packages/SettingsLib/res/values-ur/strings.xml
index f21e891fb9ae..de93a4ac1446 100644
--- a/packages/SettingsLib/res/values-ur/strings.xml
+++ b/packages/SettingsLib/res/values-ur/strings.xml
@@ -43,8 +43,7 @@
<string name="available_via_passpoint" msgid="1617440946846329613">"‏دستیاب بذریعہ ‎%1$s"</string>
<string name="tap_to_sign_up" msgid="6449724763052579434">"سائن اپ کے لیے تھپتھپائیں"</string>
<string name="wifi_connected_no_internet" msgid="8202906332837777829">"منسلک، انٹرنیٹ نہیں ہے"</string>
- <!-- no translation found for private_dns_broken (7356676011023412490) -->
- <skip />
+ <string name="private_dns_broken" msgid="7356676011023412490">"‏نجی DNS سرور تک رسائی حاصل نہیں کی جا سکی"</string>
<string name="wifi_limited_connection" msgid="7717855024753201527">"محدود کنکشن"</string>
<string name="wifi_status_no_internet" msgid="5784710974669608361">"انٹرنیٹ نہیں ہے"</string>
<string name="wifi_status_sign_in_required" msgid="123517180404752756">"سائن ان درکار ہے"</string>
@@ -62,6 +61,8 @@
<string name="speed_label_medium" msgid="3175763313268941953">"متوسط"</string>
<string name="speed_label_fast" msgid="7715732164050975057">"تیز"</string>
<string name="speed_label_very_fast" msgid="2265363430784523409">"بہت تیز"</string>
+ <!-- no translation found for wifi_passpoint_expired (1711402866023391443) -->
+ <skip />
<string name="preference_summary_default_combination" msgid="8532964268242666060">"<xliff:g id="STATE">%1$s</xliff:g> / <xliff:g id="DESCRIPTION">%2$s</xliff:g>"</string>
<string name="bluetooth_disconnected" msgid="6557104142667339895">"منقطع"</string>
<string name="bluetooth_disconnecting" msgid="8913264760027764974">"منقطع کیا جارہا ہے…"</string>
@@ -467,4 +468,6 @@
<string name="zen_mode_forever" msgid="2704305038191592967">"یہاں تک کہ آپ آف کر دیں"</string>
<string name="time_unit_just_now" msgid="6363336622778342422">"ابھی ابھی"</string>
<string name="media_transfer_this_device_name" msgid="1636276898262571213">"یہ آلہ"</string>
+ <!-- no translation found for profile_connect_timeout_subtext (2401801610868184557) -->
+ <skip />
</resources>
diff --git a/packages/SettingsLib/res/values-uz/strings.xml b/packages/SettingsLib/res/values-uz/strings.xml
index a0a79e38422f..42847e13bbe6 100644
--- a/packages/SettingsLib/res/values-uz/strings.xml
+++ b/packages/SettingsLib/res/values-uz/strings.xml
@@ -61,6 +61,8 @@
<string name="speed_label_medium" msgid="3175763313268941953">"O‘rtacha"</string>
<string name="speed_label_fast" msgid="7715732164050975057">"Tez"</string>
<string name="speed_label_very_fast" msgid="2265363430784523409">"Juda tez"</string>
+ <!-- no translation found for wifi_passpoint_expired (1711402866023391443) -->
+ <skip />
<string name="preference_summary_default_combination" msgid="8532964268242666060">"<xliff:g id="STATE">%1$s</xliff:g> / <xliff:g id="DESCRIPTION">%2$s</xliff:g>"</string>
<string name="bluetooth_disconnected" msgid="6557104142667339895">"Uzildi"</string>
<string name="bluetooth_disconnecting" msgid="8913264760027764974">"Uzilyapti…"</string>
@@ -466,4 +468,6 @@
<string name="zen_mode_forever" msgid="2704305038191592967">"Rejimdan chiqilgunicha"</string>
<string name="time_unit_just_now" msgid="6363336622778342422">"Hozir"</string>
<string name="media_transfer_this_device_name" msgid="1636276898262571213">"Shu qurilma"</string>
+ <!-- no translation found for profile_connect_timeout_subtext (2401801610868184557) -->
+ <skip />
</resources>
diff --git a/packages/SettingsLib/res/values-vi/strings.xml b/packages/SettingsLib/res/values-vi/strings.xml
index 3723b83db79d..433e924284c2 100644
--- a/packages/SettingsLib/res/values-vi/strings.xml
+++ b/packages/SettingsLib/res/values-vi/strings.xml
@@ -61,6 +61,8 @@
<string name="speed_label_medium" msgid="3175763313268941953">"Trung bình"</string>
<string name="speed_label_fast" msgid="7715732164050975057">"Nhanh"</string>
<string name="speed_label_very_fast" msgid="2265363430784523409">"Rất nhanh"</string>
+ <!-- no translation found for wifi_passpoint_expired (1711402866023391443) -->
+ <skip />
<string name="preference_summary_default_combination" msgid="8532964268242666060">"<xliff:g id="STATE">%1$s</xliff:g> / <xliff:g id="DESCRIPTION">%2$s</xliff:g>"</string>
<string name="bluetooth_disconnected" msgid="6557104142667339895">"Đã ngắt kết nối"</string>
<string name="bluetooth_disconnecting" msgid="8913264760027764974">"Đang ngắt kết nối…"</string>
@@ -466,4 +468,6 @@
<string name="zen_mode_forever" msgid="2704305038191592967">"Cho đến khi bạn tắt"</string>
<string name="time_unit_just_now" msgid="6363336622778342422">"Vừa xong"</string>
<string name="media_transfer_this_device_name" msgid="1636276898262571213">"Thiết bị này"</string>
+ <!-- no translation found for profile_connect_timeout_subtext (2401801610868184557) -->
+ <skip />
</resources>
diff --git a/packages/SettingsLib/res/values-zh-rCN/strings.xml b/packages/SettingsLib/res/values-zh-rCN/strings.xml
index f1200ee13404..c967372d9017 100644
--- a/packages/SettingsLib/res/values-zh-rCN/strings.xml
+++ b/packages/SettingsLib/res/values-zh-rCN/strings.xml
@@ -61,6 +61,8 @@
<string name="speed_label_medium" msgid="3175763313268941953">"适中"</string>
<string name="speed_label_fast" msgid="7715732164050975057">"快"</string>
<string name="speed_label_very_fast" msgid="2265363430784523409">"很快"</string>
+ <!-- no translation found for wifi_passpoint_expired (1711402866023391443) -->
+ <skip />
<string name="preference_summary_default_combination" msgid="8532964268242666060">"<xliff:g id="STATE">%1$s</xliff:g> / <xliff:g id="DESCRIPTION">%2$s</xliff:g>"</string>
<string name="bluetooth_disconnected" msgid="6557104142667339895">"已断开连接"</string>
<string name="bluetooth_disconnecting" msgid="8913264760027764974">"正在断开连接..."</string>
@@ -466,4 +468,6 @@
<string name="zen_mode_forever" msgid="2704305038191592967">"直到您将其关闭"</string>
<string name="time_unit_just_now" msgid="6363336622778342422">"刚刚"</string>
<string name="media_transfer_this_device_name" msgid="1636276898262571213">"此设备"</string>
+ <!-- no translation found for profile_connect_timeout_subtext (2401801610868184557) -->
+ <skip />
</resources>
diff --git a/packages/SettingsLib/res/values-zh-rHK/strings.xml b/packages/SettingsLib/res/values-zh-rHK/strings.xml
index 57ab472b5d3f..325425cc0ae1 100644
--- a/packages/SettingsLib/res/values-zh-rHK/strings.xml
+++ b/packages/SettingsLib/res/values-zh-rHK/strings.xml
@@ -61,6 +61,8 @@
<string name="speed_label_medium" msgid="3175763313268941953">"適中"</string>
<string name="speed_label_fast" msgid="7715732164050975057">"快"</string>
<string name="speed_label_very_fast" msgid="2265363430784523409">"非常快"</string>
+ <!-- no translation found for wifi_passpoint_expired (1711402866023391443) -->
+ <skip />
<string name="preference_summary_default_combination" msgid="8532964268242666060">"<xliff:g id="STATE">%1$s</xliff:g>/<xliff:g id="DESCRIPTION">%2$s</xliff:g>"</string>
<string name="bluetooth_disconnected" msgid="6557104142667339895">"已中斷連線"</string>
<string name="bluetooth_disconnecting" msgid="8913264760027764974">"正在中斷連線..."</string>
@@ -466,4 +468,6 @@
<string name="zen_mode_forever" msgid="2704305038191592967">"直至您關閉為止"</string>
<string name="time_unit_just_now" msgid="6363336622778342422">"剛剛"</string>
<string name="media_transfer_this_device_name" msgid="1636276898262571213">"此裝置"</string>
+ <!-- no translation found for profile_connect_timeout_subtext (2401801610868184557) -->
+ <skip />
</resources>
diff --git a/packages/SettingsLib/res/values-zh-rTW/strings.xml b/packages/SettingsLib/res/values-zh-rTW/strings.xml
index 630619bba7ab..82477ea275ce 100644
--- a/packages/SettingsLib/res/values-zh-rTW/strings.xml
+++ b/packages/SettingsLib/res/values-zh-rTW/strings.xml
@@ -61,6 +61,8 @@
<string name="speed_label_medium" msgid="3175763313268941953">"適中"</string>
<string name="speed_label_fast" msgid="7715732164050975057">"快"</string>
<string name="speed_label_very_fast" msgid="2265363430784523409">"非常快"</string>
+ <!-- no translation found for wifi_passpoint_expired (1711402866023391443) -->
+ <skip />
<string name="preference_summary_default_combination" msgid="8532964268242666060">"<xliff:g id="STATE">%1$s</xliff:g> / <xliff:g id="DESCRIPTION">%2$s</xliff:g>"</string>
<string name="bluetooth_disconnected" msgid="6557104142667339895">"已中斷連線"</string>
<string name="bluetooth_disconnecting" msgid="8913264760027764974">"正在中斷連線…"</string>
@@ -466,4 +468,6 @@
<string name="zen_mode_forever" msgid="2704305038191592967">"直到你關閉為止"</string>
<string name="time_unit_just_now" msgid="6363336622778342422">"剛剛"</string>
<string name="media_transfer_this_device_name" msgid="1636276898262571213">"這個裝置"</string>
+ <!-- no translation found for profile_connect_timeout_subtext (2401801610868184557) -->
+ <skip />
</resources>
diff --git a/packages/SettingsLib/res/values-zu/strings.xml b/packages/SettingsLib/res/values-zu/strings.xml
index ede336e831f9..d4e8166fb6fe 100644
--- a/packages/SettingsLib/res/values-zu/strings.xml
+++ b/packages/SettingsLib/res/values-zu/strings.xml
@@ -61,6 +61,8 @@
<string name="speed_label_medium" msgid="3175763313268941953">"Okumaphakathi"</string>
<string name="speed_label_fast" msgid="7715732164050975057">"Sheshayo"</string>
<string name="speed_label_very_fast" msgid="2265363430784523409">"Kushesha kakhulu"</string>
+ <!-- no translation found for wifi_passpoint_expired (1711402866023391443) -->
+ <skip />
<string name="preference_summary_default_combination" msgid="8532964268242666060">"<xliff:g id="STATE">%1$s</xliff:g> / <xliff:g id="DESCRIPTION">%2$s</xliff:g>"</string>
<string name="bluetooth_disconnected" msgid="6557104142667339895">"Ayixhunyiwe"</string>
<string name="bluetooth_disconnecting" msgid="8913264760027764974">"Inqamula uxhumano kwi-inthanethi..."</string>
@@ -466,4 +468,6 @@
<string name="zen_mode_forever" msgid="2704305038191592967">"Uze uvale isikrini"</string>
<string name="time_unit_just_now" msgid="6363336622778342422">"Khona manje"</string>
<string name="media_transfer_this_device_name" msgid="1636276898262571213">"Le divayisi"</string>
+ <!-- no translation found for profile_connect_timeout_subtext (2401801610868184557) -->
+ <skip />
</resources>
diff --git a/packages/SettingsLib/res/values/strings.xml b/packages/SettingsLib/res/values/strings.xml
index 66e89237ac6d..a1ef831523b1 100644
--- a/packages/SettingsLib/res/values/strings.xml
+++ b/packages/SettingsLib/res/values/strings.xml
@@ -1186,4 +1186,7 @@
<!-- Name of the this device. [CHAR LIMIT=30] -->
<string name="media_transfer_this_device_name">This device</string>
+
+ <!-- Warning message to tell user is have problem during profile connect, it need to turn off device and back on. [CHAR_LIMIT=NONE] -->
+ <string name="profile_connect_timeout_subtext">Problem connecting. Turn device off &amp; back on</string>
</resources>
diff --git a/packages/SettingsLib/search/src/com/android/settingslib/search/Indexable.java b/packages/SettingsLib/search/src/com/android/settingslib/search/Indexable.java
index e68b0d1d6798..8b17ddf4c58d 100644
--- a/packages/SettingsLib/search/src/com/android/settingslib/search/Indexable.java
+++ b/packages/SettingsLib/search/src/com/android/settingslib/search/Indexable.java
@@ -56,6 +56,16 @@ public interface Indexable {
List<SearchIndexableRaw> getRawDataToIndex(Context context, boolean enabled);
/**
+ * Return a list of dynamic raw data for indexing. See {@link SearchIndexableRaw}
+ *
+ * @param context the context.
+ * @param enabled hint telling if the data needs to be considered into the search results
+ * or not.
+ * @return a list of {@link SearchIndexableRaw} references. Can be null.
+ */
+ List<SearchIndexableRaw> getDynamicRawDataToIndex(Context context, boolean enabled);
+
+ /**
* Return a list of data keys that cannot be indexed. See {@link SearchIndexableRaw}
*
* @param context the context.
diff --git a/packages/SettingsLib/src/com/android/settingslib/bluetooth/CachedBluetoothDevice.java b/packages/SettingsLib/src/com/android/settingslib/bluetooth/CachedBluetoothDevice.java
index 98db7c8fb59c..2507a3486f2b 100644
--- a/packages/SettingsLib/src/com/android/settingslib/bluetooth/CachedBluetoothDevice.java
+++ b/packages/SettingsLib/src/com/android/settingslib/bluetooth/CachedBluetoothDevice.java
@@ -24,6 +24,9 @@ import android.bluetooth.BluetoothProfile;
import android.bluetooth.BluetoothUuid;
import android.content.Context;
import android.content.SharedPreferences;
+import android.os.Handler;
+import android.os.Looper;
+import android.os.Message;
import android.os.ParcelUuid;
import android.os.SystemClock;
import android.text.TextUtils;
@@ -55,6 +58,7 @@ public class CachedBluetoothDevice implements Comparable<CachedBluetoothDevice>
// Some Hearing Aids (especially the 2nd device) needs more time to do service discovery
private static final long MAX_HEARING_AIDS_DELAY_FOR_AUTO_CONNECT = 15000;
private static final long MAX_HOGP_DELAY_FOR_AUTO_CONNECT = 30000;
+ private static final long MAX_MEDIA_PROFILE_CONNECT_DELAY = 60000;
private final Context mContext;
private final BluetoothAdapter mLocalAdapter;
@@ -90,9 +94,35 @@ public class CachedBluetoothDevice implements Comparable<CachedBluetoothDevice>
private boolean mIsActiveDeviceA2dp = false;
private boolean mIsActiveDeviceHeadset = false;
private boolean mIsActiveDeviceHearingAid = false;
+ // Media profile connect state
+ private boolean mIsA2dpProfileConnectedFail = false;
+ private boolean mIsHeadsetProfileConnectedFail = false;
+ private boolean mIsHearingAidProfileConnectedFail = false;
// Group second device for Hearing Aid
private CachedBluetoothDevice mSubDevice;
+ private final Handler mHandler = new Handler(Looper.getMainLooper()) {
+ @Override
+ public void handleMessage(Message msg) {
+ switch (msg.what) {
+ case BluetoothProfile.A2DP:
+ mIsA2dpProfileConnectedFail = true;
+ break;
+ case BluetoothProfile.HEADSET:
+ mIsHeadsetProfileConnectedFail = true;
+ break;
+ case BluetoothProfile.HEARING_AID:
+ mIsHearingAidProfileConnectedFail = true;
+ break;
+ default:
+ Log.w(TAG, "handleMessage(): unknown message : " + msg.what);
+ break;
+ }
+ Log.w(TAG, "Connect to profile : " + msg.what + " timeout, show error message !");
+ refresh();
+ }
+ };
+
CachedBluetoothDevice(Context context, LocalBluetoothProfileManager profileManager,
BluetoothDevice device) {
mContext = context;
@@ -133,6 +163,35 @@ public class CachedBluetoothDevice implements Comparable<CachedBluetoothDevice>
}
synchronized (mProfileLock) {
+ if (profile instanceof A2dpProfile || profile instanceof HeadsetProfile
+ || profile instanceof HearingAidProfile) {
+ setProfileConnectedStatus(profile.getProfileId(), false);
+ switch (newProfileState) {
+ case BluetoothProfile.STATE_CONNECTED:
+ mHandler.removeMessages(profile.getProfileId());
+ break;
+ case BluetoothProfile.STATE_CONNECTING:
+ mHandler.sendEmptyMessageDelayed(profile.getProfileId(),
+ MAX_MEDIA_PROFILE_CONNECT_DELAY);
+ break;
+ case BluetoothProfile.STATE_DISCONNECTING:
+ if (mHandler.hasMessages(profile.getProfileId())) {
+ mHandler.removeMessages(profile.getProfileId());
+ }
+ break;
+ case BluetoothProfile.STATE_DISCONNECTED:
+ if (mHandler.hasMessages(profile.getProfileId())) {
+ mHandler.removeMessages(profile.getProfileId());
+ setProfileConnectedStatus(profile.getProfileId(), true);
+ }
+ break;
+ default:
+ Log.w(TAG, "onProfileStateChanged(): unknown profile state : "
+ + newProfileState);
+ break;
+ }
+ }
+
if (newProfileState == BluetoothProfile.STATE_CONNECTED) {
if (profile instanceof MapProfile) {
profile.setPreferred(mDevice, true);
@@ -162,6 +221,24 @@ public class CachedBluetoothDevice implements Comparable<CachedBluetoothDevice>
fetchActiveDevices();
}
+ @VisibleForTesting
+ void setProfileConnectedStatus(int profileId, boolean isFailed) {
+ switch (profileId) {
+ case BluetoothProfile.A2DP:
+ mIsA2dpProfileConnectedFail = isFailed;
+ break;
+ case BluetoothProfile.HEADSET:
+ mIsHeadsetProfileConnectedFail = isFailed;
+ break;
+ case BluetoothProfile.HEARING_AID:
+ mIsHearingAidProfileConnectedFail = isFailed;
+ break;
+ default:
+ Log.w(TAG, "setProfileConnectedStatus(): unknown profile id : " + profileId);
+ break;
+ }
+ }
+
public void disconnect() {
synchronized (mProfileLock) {
for (LocalBluetoothProfile profile : mProfiles) {
@@ -844,6 +921,10 @@ public class CachedBluetoothDevice implements Comparable<CachedBluetoothDevice>
int leftBattery = -1;
int rightBattery = -1;
+ if (isProfileConnectedFail() && isConnected()) {
+ return mContext.getString(R.string.profile_connect_timeout_subtext);
+ }
+
synchronized (mProfileLock) {
for (LocalBluetoothProfile profile : getProfiles()) {
int connectionStatus = getProfileConnectionState(profile);
@@ -943,6 +1024,11 @@ public class CachedBluetoothDevice implements Comparable<CachedBluetoothDevice>
return leftBattery >= 0 && rightBattery >= 0;
}
+ private boolean isProfileConnectedFail() {
+ return mIsA2dpProfileConnectedFail || mIsHearingAidProfileConnectedFail
+ || mIsHeadsetProfileConnectedFail;
+ }
+
/**
* @return resource for android auto string that describes the connection state of this device.
*/
diff --git a/packages/SettingsLib/src/com/android/settingslib/utils/ThreadUtils.java b/packages/SettingsLib/src/com/android/settingslib/utils/ThreadUtils.java
index 4e052f1aeca4..69f1c17f97b1 100644
--- a/packages/SettingsLib/src/com/android/settingslib/utils/ThreadUtils.java
+++ b/packages/SettingsLib/src/com/android/settingslib/utils/ThreadUtils.java
@@ -18,6 +18,7 @@ package com.android.settingslib.utils;
import android.os.Handler;
import android.os.Looper;
+import java.util.concurrent.Callable;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
@@ -64,11 +65,16 @@ public class ThreadUtils {
* @Return A future of the task that can be monitored for updates or cancelled.
*/
public static Future postOnBackgroundThread(Runnable runnable) {
- if (sThreadExecutor == null) {
- sThreadExecutor = Executors.newFixedThreadPool(
- Runtime.getRuntime().availableProcessors());
- }
- return sThreadExecutor.submit(runnable);
+ return getThreadExecutor().submit(runnable);
+ }
+
+ /**
+ * Posts callable in background using shared background thread pool.
+ *
+ * @Return A future of the task that can be monitored for updates or cancelled.
+ */
+ public static Future postOnBackgroundThread(Callable callable) {
+ return getThreadExecutor().submit(callable);
}
/**
@@ -78,4 +84,11 @@ public class ThreadUtils {
getUiThreadHandler().post(runnable);
}
+ private static synchronized ExecutorService getThreadExecutor() {
+ if (sThreadExecutor == null) {
+ sThreadExecutor = Executors.newFixedThreadPool(
+ Runtime.getRuntime().availableProcessors());
+ }
+ return sThreadExecutor;
+ }
}
diff --git a/packages/SettingsLib/src/com/android/settingslib/wifi/WifiUtils.java b/packages/SettingsLib/src/com/android/settingslib/wifi/WifiUtils.java
index 658a0b59622c..6f19559bcbd1 100644
--- a/packages/SettingsLib/src/com/android/settingslib/wifi/WifiUtils.java
+++ b/packages/SettingsLib/src/com/android/settingslib/wifi/WifiUtils.java
@@ -93,7 +93,7 @@ public class WifiUtils {
if (bssid != null) {
visibility.append(" ").append(bssid);
}
- visibility.append(" technology = ").append(info.getWifiTechnology());
+ visibility.append(" standard = ").append(info.getWifiStandard());
visibility.append(" rssi=").append(info.getRssi());
visibility.append(" ");
visibility.append(" score=").append(info.score);
diff --git a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/bluetooth/CachedBluetoothDeviceTest.java b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/bluetooth/CachedBluetoothDeviceTest.java
index 93dcbfeab172..5c89a019bf82 100644
--- a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/bluetooth/CachedBluetoothDeviceTest.java
+++ b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/bluetooth/CachedBluetoothDeviceTest.java
@@ -21,6 +21,7 @@ import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyString;
import static org.mockito.Mockito.doAnswer;
import static org.mockito.Mockito.doReturn;
+import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.verify;
@@ -31,6 +32,8 @@ import android.bluetooth.BluetoothProfile;
import android.content.Context;
import android.media.AudioManager;
+import com.android.settingslib.R;
+
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
@@ -922,4 +925,16 @@ public class CachedBluetoothDeviceTest {
assertThat(subCachedDevice.mJustDiscovered).isEqualTo(JUSTDISCOVERED_1);
assertThat(subCachedDevice.mDevice).isEqualTo(mDevice);
}
+
+ @Test
+ public void getConnectionSummary_profileConnectedFail_showErrorMessage() {
+ final A2dpProfile profle = mock(A2dpProfile.class);
+ mCachedDevice.onProfileStateChanged(profle, BluetoothProfile.STATE_CONNECTED);
+ mCachedDevice.setProfileConnectedStatus(BluetoothProfile.A2DP, true);
+
+ when(profle.getConnectionStatus(mDevice)).thenReturn(BluetoothProfile.STATE_CONNECTED);
+
+ assertThat(mCachedDevice.getConnectionSummary()).isEqualTo(
+ mContext.getString(R.string.profile_connect_timeout_subtext));
+ }
}
diff --git a/packages/SettingsProvider/src/com/android/providers/settings/SettingsProtoDumpUtil.java b/packages/SettingsProvider/src/com/android/providers/settings/SettingsProtoDumpUtil.java
index d28c1aa4cfc4..55a51dab3f28 100644
--- a/packages/SettingsProvider/src/com/android/providers/settings/SettingsProtoDumpUtil.java
+++ b/packages/SettingsProvider/src/com/android/providers/settings/SettingsProtoDumpUtil.java
@@ -56,8 +56,6 @@ class SettingsProtoDumpUtil {
ConfigSettingsProto.CONNECTIVITY_SETTINGS);
namespaceToFieldMap.put(DeviceConfig.NAMESPACE_CONTENT_CAPTURE,
ConfigSettingsProto.CONTENT_CAPTURE_SETTINGS);
- namespaceToFieldMap.put(DeviceConfig.NAMESPACE_DEX_BOOT,
- ConfigSettingsProto.DEX_BOOT_SETTINGS);
namespaceToFieldMap.put(DeviceConfig.NAMESPACE_GAME_DRIVER,
ConfigSettingsProto.GAME_DRIVER_SETTINGS);
namespaceToFieldMap.put(DeviceConfig.NAMESPACE_INPUT_NATIVE_BOOT,
diff --git a/packages/Shell/AndroidManifest.xml b/packages/Shell/AndroidManifest.xml
index 54e291f904eb..c59f342d81e1 100644
--- a/packages/Shell/AndroidManifest.xml
+++ b/packages/Shell/AndroidManifest.xml
@@ -180,6 +180,8 @@
<uses-permission android:name="android.permission.MANAGE_WIFI_WHEN_WIRELESS_CONSENT_REQUIRED" />
<!-- Permission needed to invoke DynamicSystem (AOT) -->
<uses-permission android:name="android.permission.INSTALL_DYNAMIC_SYSTEM" />
+ <!-- Used to clean up heap dumps on boot. -->
+ <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<uses-permission android:name="android.permission.CONTROL_KEYGUARD" />
@@ -209,7 +211,7 @@
<!-- Permission required to test ExplicitHealthCheckServiceImpl. -->
<uses-permission android:name="android.permission.BIND_EXPLICIT_HEALTH_CHECK_SERVICE" />
-
+
<!-- Permission required for CTS test - CrossProfileAppsHostSideTest -->
<uses-permission android:name="android.permission.INTERACT_ACROSS_PROFILES"/>
@@ -239,6 +241,11 @@
</intent-filter>
</provider>
+ <provider android:name=".HeapDumpProvider"
+ android:authorities="com.android.shell.heapdump"
+ android:grantUriPermissions="true"
+ android:exported="true" />
+
<activity
android:name=".BugreportWarningActivity"
android:theme="@*android:style/Theme.DeviceDefault.Dialog.Alert.DayNight"
@@ -246,6 +253,14 @@
android:excludeFromRecents="true"
android:exported="false" />
+ <activity android:name=".HeapDumpActivity"
+ android:theme="@*android:style/Theme.Translucent.NoTitleBar"
+ android:label="@*android:string/dump_heap_title"
+ android:finishOnCloseSystemDialogs="true"
+ android:noHistory="true"
+ android:excludeFromRecents="true"
+ android:exported="false" />
+
<receiver
android:name=".BugreportRequestedReceiver"
android:permission="android.permission.TRIGGER_SHELL_BUGREPORT">
@@ -254,6 +269,16 @@
</intent-filter>
</receiver>
+ <receiver
+ android:name=".HeapDumpReceiver"
+ android:permission="android.permission.DUMP">
+ <intent-filter>
+ <action android:name="android.intent.action.BOOT_COMPLETED" />
+ <action android:name="com.android.internal.intent.action.HEAP_DUMP_FINISHED" />
+ <action android:name="com.android.shell.action.DELETE_HEAP_DUMP" />
+ </intent-filter>
+ </receiver>
+
<service
android:name=".BugreportProgressService"
android:exported="false"/>
diff --git a/packages/Shell/src/com/android/shell/BugreportProgressService.java b/packages/Shell/src/com/android/shell/BugreportProgressService.java
index 1b35770ccbd7..30ad9c5d658c 100644
--- a/packages/Shell/src/com/android/shell/BugreportProgressService.java
+++ b/packages/Shell/src/com/android/shell/BugreportProgressService.java
@@ -1560,7 +1560,7 @@ public class BugreportProgressService extends Service {
return false;
}
- private static boolean isTv(Context context) {
+ static boolean isTv(Context context) {
return context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_LEANBACK);
}
diff --git a/packages/Shell/src/com/android/shell/HeapDumpActivity.java b/packages/Shell/src/com/android/shell/HeapDumpActivity.java
new file mode 100644
index 000000000000..0ff0d3353041
--- /dev/null
+++ b/packages/Shell/src/com/android/shell/HeapDumpActivity.java
@@ -0,0 +1,142 @@
+/*
+ * 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.shell;
+
+import static com.android.shell.HeapDumpProvider.makeUri;
+import static com.android.shell.HeapDumpReceiver.ACTION_DELETE_HEAP_DUMP;
+import static com.android.shell.HeapDumpReceiver.EXTRA_IS_USER_INITIATED;
+import static com.android.shell.HeapDumpReceiver.EXTRA_PROCESS_NAME;
+import static com.android.shell.HeapDumpReceiver.EXTRA_REPORT_PACKAGE;
+import static com.android.shell.HeapDumpReceiver.EXTRA_SIZE_BYTES;
+
+import android.app.Activity;
+import android.app.ActivityManager;
+import android.app.AlertDialog;
+import android.content.ActivityNotFoundException;
+import android.content.ClipData;
+import android.content.Intent;
+import android.net.Uri;
+import android.os.Bundle;
+import android.os.Process;
+import android.util.DebugUtils;
+import android.util.Log;
+
+import com.android.internal.R;
+
+/**
+ * This activity is displayed when the system has collected a heap dump.
+ */
+public class HeapDumpActivity extends Activity {
+ private static final String TAG = "HeapDumpActivity";
+
+ static final String KEY_URI = "uri";
+
+ private AlertDialog mDialog;
+ private Uri mDumpUri;
+ private boolean mHandled = false;
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+
+ String process = getIntent().getStringExtra(EXTRA_PROCESS_NAME);
+ long size = getIntent().getLongExtra(EXTRA_SIZE_BYTES, 0);
+ final boolean isUserInitiated = getIntent().getBooleanExtra(EXTRA_IS_USER_INITIATED, false);
+ final int uid = getIntent().getIntExtra(Intent.EXTRA_UID, 0);
+ final boolean isSystemProcess = uid == Process.SYSTEM_UID;
+ mDumpUri = makeUri(process);
+ final String procDisplayName = isSystemProcess
+ ? getString(com.android.internal.R.string.android_system_label)
+ : process;
+
+ final Intent sendIntent = new Intent();
+ ClipData clip = ClipData.newUri(getContentResolver(), "Heap Dump", mDumpUri);
+ sendIntent.setClipData(clip);
+ sendIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
+ sendIntent.setType(clip.getDescription().getMimeType(0));
+ sendIntent.putExtra(Intent.EXTRA_STREAM, mDumpUri);
+
+ String directLaunchPackage = getIntent().getStringExtra(EXTRA_REPORT_PACKAGE);
+ if (directLaunchPackage != null) {
+ sendIntent.setAction(ActivityManager.ACTION_REPORT_HEAP_LIMIT);
+ sendIntent.setPackage(directLaunchPackage);
+ try {
+ startActivity(sendIntent);
+ mHandled = true;
+ finish();
+ return;
+ } catch (ActivityNotFoundException e) {
+ Log.e(TAG, "Unable to direct launch to " + directLaunchPackage, e);
+ }
+ }
+
+ final int messageId;
+ if (isUserInitiated) {
+ messageId = com.android.internal.R.string.dump_heap_ready_text;
+ } else if (isSystemProcess) {
+ messageId = com.android.internal.R.string.dump_heap_system_text;
+ } else {
+ messageId = com.android.internal.R.string.dump_heap_text;
+ }
+ mDialog = new AlertDialog.Builder(this, android.R.style.Theme_Material_Light_Dialog_Alert)
+ .setTitle(com.android.internal.R.string.dump_heap_title)
+ .setMessage(getString(messageId, procDisplayName,
+ DebugUtils.sizeValueToString(size, null)))
+ .setNegativeButton(android.R.string.cancel, (dialog, which) -> {
+ mHandled = true;
+ finish();
+ })
+ .setNeutralButton(R.string.delete, (dialog, which) -> {
+ mHandled = true;
+ Intent deleteIntent = new Intent(ACTION_DELETE_HEAP_DUMP);
+ deleteIntent.setClass(getApplicationContext(), HeapDumpReceiver.class);
+ deleteIntent.putExtra(KEY_URI, mDumpUri.toString());
+ sendBroadcast(deleteIntent);
+ finish();
+ })
+ .setPositiveButton(android.R.string.ok, (dialog, which) -> {
+ mHandled = true;
+ sendIntent.setAction(Intent.ACTION_SEND);
+ sendIntent.setPackage(null);
+ startActivity(Intent.createChooser(sendIntent,
+ getText(com.android.internal.R.string.dump_heap_title)));
+ finish();
+ })
+ .show();
+ }
+
+ @Override
+ protected void onStop() {
+ super.onStop();
+ if (!isChangingConfigurations()) {
+ if (!mHandled) {
+ Intent deleteIntent = new Intent(ACTION_DELETE_HEAP_DUMP);
+ deleteIntent.setClass(getApplicationContext(), HeapDumpReceiver.class);
+ deleteIntent.putExtra(KEY_URI, mDumpUri.toString());
+ sendBroadcast(deleteIntent);
+ }
+ }
+ }
+
+ @Override
+ protected void onDestroy() {
+ super.onDestroy();
+ if (mDialog != null) {
+ mDialog.dismiss();
+ }
+ }
+}
diff --git a/packages/Shell/src/com/android/shell/HeapDumpProvider.java b/packages/Shell/src/com/android/shell/HeapDumpProvider.java
new file mode 100644
index 000000000000..3eceb9118b12
--- /dev/null
+++ b/packages/Shell/src/com/android/shell/HeapDumpProvider.java
@@ -0,0 +1,101 @@
+/*
+ * 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.shell;
+
+import android.annotation.NonNull;
+import android.content.ContentProvider;
+import android.content.ContentValues;
+import android.database.Cursor;
+import android.net.Uri;
+import android.os.Binder;
+import android.os.ParcelFileDescriptor;
+import android.os.Process;
+
+import java.io.File;
+import java.io.FileNotFoundException;
+
+/** ContentProvider to write and access heap dumps. */
+public class HeapDumpProvider extends ContentProvider {
+ private static final String FILENAME_SUFFIX = "_javaheap.bin";
+ private static final Object sLock = new Object();
+
+ private File mRoot;
+
+ @Override
+ public boolean onCreate() {
+ synchronized (sLock) {
+ mRoot = new File(getContext().createCredentialProtectedStorageContext().getFilesDir(),
+ "heapdumps");
+ return mRoot.mkdir();
+ }
+ }
+
+ @Override
+ public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs,
+ String sortOrder) {
+ return null;
+ }
+
+ @Override
+ public String getType(Uri uri) {
+ return "application/octet-stream";
+ }
+
+ @Override
+ public Uri insert(Uri uri, ContentValues values) {
+ throw new UnsupportedOperationException("Insert not allowed.");
+ }
+
+ @Override
+ public int delete(Uri uri, String selection, String[] selectionArgs) {
+ String path = sanitizePath(uri.getEncodedPath());
+ String tag = Uri.decode(path);
+ return (new File(mRoot, tag)).delete() ? 1 : 0;
+ }
+
+ @Override
+ public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) {
+ throw new UnsupportedOperationException("Update not allowed.");
+ }
+
+ @Override
+ public ParcelFileDescriptor openFile(Uri uri, String mode) throws FileNotFoundException {
+ String path = sanitizePath(uri.getEncodedPath());
+ String tag = Uri.decode(path);
+ final int pMode;
+ if (Binder.getCallingUid() == Process.SYSTEM_UID) {
+ pMode = ParcelFileDescriptor.MODE_CREATE
+ | ParcelFileDescriptor.MODE_TRUNCATE
+ | ParcelFileDescriptor.MODE_WRITE_ONLY;
+ } else {
+ pMode = ParcelFileDescriptor.MODE_READ_ONLY;
+ }
+
+ synchronized (sLock) {
+ return ParcelFileDescriptor.open(new File(mRoot, tag), pMode);
+ }
+ }
+
+ @NonNull
+ static Uri makeUri(@NonNull String procName) {
+ return Uri.parse("content://com.android.shell.heapdump/" + procName + FILENAME_SUFFIX);
+ }
+
+ private String sanitizePath(String path) {
+ return path.replaceAll("[^a-zA-Z0-9_.]", "");
+ }
+}
diff --git a/packages/Shell/src/com/android/shell/HeapDumpReceiver.java b/packages/Shell/src/com/android/shell/HeapDumpReceiver.java
new file mode 100644
index 000000000000..858c521eaed5
--- /dev/null
+++ b/packages/Shell/src/com/android/shell/HeapDumpReceiver.java
@@ -0,0 +1,188 @@
+/*
+ * 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.shell;
+
+import static com.android.shell.BugreportProgressService.isTv;
+
+import android.annotation.Nullable;
+import android.app.Notification;
+import android.app.NotificationChannel;
+import android.app.NotificationManager;
+import android.app.PendingIntent;
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+import android.net.Uri;
+import android.os.AsyncTask;
+import android.os.FileUtils;
+import android.os.Process;
+import android.text.format.DateUtils;
+import android.util.Log;
+
+import java.io.File;
+
+/**
+ * Receiver that handles finished heap dumps.
+ */
+public class HeapDumpReceiver extends BroadcastReceiver {
+ private static final String TAG = "HeapDumpReceiver";
+
+ /**
+ * Broadcast action to determine when to delete a specific dump heap. Must include a {@link
+ * HeapDumpActivity#KEY_URI} String extra.
+ */
+ static final String ACTION_DELETE_HEAP_DUMP = "com.android.shell.action.DELETE_HEAP_DUMP";
+
+ /** Broadcast sent when heap dump collection has been completed. */
+ private static final String ACTION_HEAP_DUMP_FINISHED =
+ "com.android.internal.intent.action.HEAP_DUMP_FINISHED";
+
+ /** The process we are reporting */
+ static final String EXTRA_PROCESS_NAME = "com.android.internal.extra.heap_dump.PROCESS_NAME";
+
+ /** The size limit the process reached. */
+ static final String EXTRA_SIZE_BYTES = "com.android.internal.extra.heap_dump.SIZE_BYTES";
+
+ /** Whether the user initiated the dump or not. */
+ static final String EXTRA_IS_USER_INITIATED =
+ "com.android.internal.extra.heap_dump.IS_USER_INITIATED";
+
+ /** Optional name of package to directly launch. */
+ static final String EXTRA_REPORT_PACKAGE =
+ "com.android.internal.extra.heap_dump.REPORT_PACKAGE";
+
+ private static final String NOTIFICATION_CHANNEL_ID = "heapdumps";
+ private static final int NOTIFICATION_ID = 2019;
+
+ /**
+ * Always keep heap dumps taken in the last week.
+ */
+ private static final long MIN_KEEP_AGE_MS = DateUtils.WEEK_IN_MILLIS;
+
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ Log.d(TAG, "onReceive(): " + intent);
+ final String action = intent.getAction();
+ if (action == null) {
+ Log.e(TAG, "null action received");
+ return;
+ }
+ switch (action) {
+ case Intent.ACTION_BOOT_COMPLETED:
+ cleanupOldFiles(context);
+ break;
+ case ACTION_DELETE_HEAP_DUMP:
+ deleteHeapDump(context, intent.getStringExtra(HeapDumpActivity.KEY_URI));
+ break;
+ case ACTION_HEAP_DUMP_FINISHED:
+ showDumpNotification(context, intent);
+ break;
+ }
+ }
+
+ private void cleanupOldFiles(Context context) {
+ final PendingResult result = goAsync();
+ new AsyncTask<Void, Void, Void>() {
+ @Override
+ protected Void doInBackground(Void... params) {
+ try {
+ Log.d(TAG, "Deleting from " + new File(context.getFilesDir(), "heapdumps"));
+ FileUtils.deleteOlderFiles(new File(context.getFilesDir(), "heapdumps"), 0,
+ MIN_KEEP_AGE_MS);
+ } catch (RuntimeException e) {
+ Log.e(TAG, "Couldn't delete old files", e);
+ }
+ result.finish();
+ return null;
+ }
+ }.execute();
+ }
+
+ private void deleteHeapDump(Context context, @Nullable final String uri) {
+ if (uri == null) {
+ Log.e(TAG, "null URI for delete heap dump intent");
+ return;
+ }
+ final PendingResult result = goAsync();
+ new AsyncTask<Void, Void, Void>() {
+ @Override
+ protected Void doInBackground(Void... params) {
+ context.getContentResolver().delete(Uri.parse(uri), null, null);
+ result.finish();
+ return null;
+ }
+ }.execute();
+ }
+
+ private void showDumpNotification(Context context, Intent intent) {
+ final boolean isUserInitiated = intent.getBooleanExtra(
+ EXTRA_IS_USER_INITIATED, false);
+ final String procName = intent.getStringExtra(EXTRA_PROCESS_NAME);
+ final int uid = intent.getIntExtra(Intent.EXTRA_UID, 0);
+
+ final String reportPackage = intent.getStringExtra(
+ EXTRA_REPORT_PACKAGE);
+ final long size = intent.getLongExtra(EXTRA_SIZE_BYTES, 0);
+
+ if (procName == null) {
+ Log.e(TAG, "No process name sent over");
+ return;
+ }
+
+ NotificationManager nm = NotificationManager.from(context);
+ nm.createNotificationChannel(
+ new NotificationChannel(NOTIFICATION_CHANNEL_ID,
+ "Heap dumps",
+ NotificationManager.IMPORTANCE_DEFAULT));
+
+ final int titleId = isUserInitiated
+ ? com.android.internal.R.string.dump_heap_ready_notification
+ : com.android.internal.R.string.dump_heap_notification;
+ final String procDisplayName = uid == Process.SYSTEM_UID
+ ? context.getString(com.android.internal.R.string.android_system_label)
+ : procName;
+ String text = context.getString(titleId, procDisplayName);
+
+ Intent shareIntent = new Intent();
+ shareIntent.setClassName(context, HeapDumpActivity.class.getName());
+ shareIntent.putExtra(EXTRA_PROCESS_NAME, procName);
+ shareIntent.putExtra(EXTRA_SIZE_BYTES, size);
+ shareIntent.putExtra(EXTRA_IS_USER_INITIATED, isUserInitiated);
+ shareIntent.putExtra(Intent.EXTRA_UID, uid);
+ if (reportPackage != null) {
+ shareIntent.putExtra(EXTRA_REPORT_PACKAGE, reportPackage);
+ }
+ final Notification.Builder builder = new Notification.Builder(context,
+ NOTIFICATION_CHANNEL_ID)
+ .setSmallIcon(
+ isTv(context) ? R.drawable.ic_bug_report_black_24dp
+ : com.android.internal.R.drawable.stat_sys_adb)
+ .setLocalOnly(true)
+ .setColor(context.getColor(
+ com.android.internal.R.color.system_notification_accent_color))
+ .setContentTitle(text)
+ .setTicker(text)
+ .setAutoCancel(true)
+ .setContentText(context.getText(
+ com.android.internal.R.string.dump_heap_notification_detail))
+ .setContentIntent(PendingIntent.getActivity(context, 2, shareIntent,
+ PendingIntent.FLAG_UPDATE_CURRENT));
+
+ Log.v(TAG, "Creating share heap dump notification");
+ NotificationManager.from(context).notify(NOTIFICATION_ID, builder.build());
+ }
+}
diff --git a/packages/SystemUI/README.md b/packages/SystemUI/README.md
index a3d420ee4cdf..a4dbf38d8782 100644
--- a/packages/SystemUI/README.md
+++ b/packages/SystemUI/README.md
@@ -80,11 +80,6 @@ Provides custom dependency injection.
Creates/initializes the channels sysui uses when posting notifications.
-### [com.android.systemui.statusbar.CommandQueue$CommandQueueStart](/packages/SystemUI/src/com/android/systemui/sstatusbar/CommandQueue.java)
-
-Creates CommandQueue and calls putComponent because its always been there
-and sysui expects it to be there :/
-
### [com.android.systemui.keyguard.KeyguardViewMediator](/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java)
Manages keyguard view state.
diff --git a/packages/SystemUI/docs/broadcasts.md b/packages/SystemUI/docs/broadcasts.md
new file mode 100644
index 000000000000..56a637fe588c
--- /dev/null
+++ b/packages/SystemUI/docs/broadcasts.md
@@ -0,0 +1,89 @@
+# Using SystemUI's BroadcastDispatcher
+
+## What is this dispatcher?
+
+This is an internal dispatcher class for global broadcasts that SystemUI components want to receive. The dispatcher consolidates most `BroadcastReceiver` that exist in SystemUI by merging the `IntentFilter` and subscribing a single `BroadcastReceiver` per user with the system.
+
+## Why use the dispatcher?
+
+Having a single `BroadcastReceiver` in SystemUI improves the multi dispatch situation that occurs whenever many classes are filtering for the same intent action. In particular:
+* All supported `BroadcastReceiver` will be aggregated into one single receiver per user.
+* Whenever there is a broadcast, the number of IPC calls from `system_server` into SystemUI will be reduced to one per user (plus one for `USER_ALL`). This is meaninful for actions that are filtered by `BroadcastReceiver` in multiple classes.
+*There could be more than one per user in the case of unsupported filters.*
+* The dispatcher immediately moves out of the main thread upon broadcast, giving back control to `system_server`. This improves the total dispatch time for broadcasts and prevents from timing out.
+* The dispatcher significantly reduces time spent in main thread by handling most operations in a background thread and only using the main thread for subscribing/unsubscribind and dispatching where appropriate.
+
+## Should I use the dispatcher?
+
+The dispatcher supports `BroadcastReceiver` dynamic subscriptions in the following cases:
+
+* The `IntentFilter` contains at least one action.
+* The `IntentFilter` may or may not contain categories.
+* The `IntentFilter` **does not** contain data types, data schemes, data authorities or data paths.
+* The broadcast **is not** gated behind a permission.
+
+Additionally, the dispatcher supports the following:
+
+* Subscriptions can be done in any thread.
+* Broadcasts will be dispatched on the main thread (same as `system_server`) by default but a `Handler` can be specified for dispatching
+* A `UserHandle` can be provided to filter the broadcasts by user.
+
+If introducing a new `BroadcastReceiver` (not declared in `AndroidManifest`) that satisfies the constraints above, use the dispatcher to reduce the load on `system_server`.
+
+Do not use the dispatcher to obtain the last broadcast (by passing a null `BroadcastReceiver`). `BroadcastDispatcher#registerReceiver` **does not** return the last sticky Intent.
+
+Additionally, if listening to some broadcast is latency critical (beyond 100ms of latency), consider registering with Context instead.
+
+## How do I use the dispatcher?
+
+Acquire the dispatcher by using `@Inject` to obtain a `BroadcastDispatcher`. Then, use the following methods in that instance.
+
+### Subscribe
+
+```kotlin
+/**
+ * Register a receiver for broadcast with the dispatcher
+ *
+ * @param receiver A receiver to dispatch the [Intent]
+ * @param filter A filter to determine what broadcasts should be dispatched to this receiver.
+ * It will only take into account actions and categories for filtering. It must
+ * have at least one action.
+ * @param handler A handler to dispatch [BroadcastReceiver.onReceive]. By default, it is the
+ * main handler. Pass `null` to use the default.
+ * @param user A user handle to determine which broadcast should be dispatched to this receiver.
+ * By default, it is the current user.
+ * @throws IllegalArgumentException if the filter has other constraints that are not actions or
+ * categories or the filter has no actions.
+ */
+@JvmOverloads
+fun registerReceiver(BroadcastReceiver, IntentFilter, Handler? = mainHandler, UserHandle = context.user)
+```
+
+All subscriptions are done with the same overloaded method. As specified in the doc, in order to pass a `UserHandle` with the default `Handler`, pass `null` for the `Handler`.
+
+In the same way as with `Context`, subscribing the same `BroadcastReceiver` for the same user using different filters will result on two subscriptions, not in replacing the filter.
+
+### Unsubscribe
+
+There are two methods to unsubscribe a given `BroadcastReceiver`. One that will remove it for all users and another where the user can be specified. This allows using separate subscriptions of the same receiver for different users and manipulating them separately.
+
+```kotlin
+/**
+ * Unregister receiver for all users.
+ * <br>
+ * This will remove every registration of [receiver], not those done just with [UserHandle.ALL].
+ *
+ * @param receiver The receiver to unregister. It will be unregistered for all users.
+ */
+fun unregisterReceiver(BroadcastReceiver)
+
+/**
+ * Unregister receiver for a particular user.
+ *
+ * @param receiver The receiver to unregister. It will be unregistered for all users.
+ * @param user The user associated to the registered [receiver]. It can be [UserHandle.ALL].
+ */
+fun unregisterReceiverForUser(BroadcastReceiver, UserHandle)
+```
+
+Unregistering can be done even if the `BroadcastReceiver` has never been registered with `BroadcastDispatcher`. In that case, it is a No-Op.
diff --git a/packages/SystemUI/plugin/ExamplePlugin/AndroidManifest.xml b/packages/SystemUI/plugin/ExamplePlugin/AndroidManifest.xml
index ff89bbcb455f..e9e844124e43 100644
--- a/packages/SystemUI/plugin/ExamplePlugin/AndroidManifest.xml
+++ b/packages/SystemUI/plugin/ExamplePlugin/AndroidManifest.xml
@@ -22,14 +22,16 @@
<application>
<activity android:name=".PluginSettings"
- android:label="@string/plugin_label">
+ android:label="@string/plugin_label"
+ android:exported="false">
<intent-filter>
<action android:name="com.android.systemui.action.PLUGIN_SETTINGS" />
</intent-filter>
</activity>
<service android:name=".SampleOverlayPlugin"
- android:label="@string/plugin_label">
+ android:label="@string/plugin_label"
+ android:exported="false">
<intent-filter>
<action android:name="com.android.systemui.action.PLUGIN_OVERLAY" />
</intent-filter>
diff --git a/packages/SystemUI/res/layout/home_controls.xml b/packages/SystemUI/res/layout/home_controls.xml
index b9a6a482cf1a..69a0e872dc8c 100644
--- a/packages/SystemUI/res/layout/home_controls.xml
+++ b/packages/SystemUI/res/layout/home_controls.xml
@@ -3,7 +3,7 @@
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/home_controls_layout"
android:layout_width="match_parent"
- android:layout_height="125dp"
+ android:layout_height="wrap_content"
android:layout_gravity="@integer/notification_panel_layout_gravity"
android:visibility="gone"
android:padding="8dp"
diff --git a/packages/SystemUI/res/layout/status_bar_expanded_plugin_frame.xml b/packages/SystemUI/res/layout/status_bar_expanded_plugin_frame.xml
index 7d6ff3b16db6..69beffe0798c 100644
--- a/packages/SystemUI/res/layout/status_bar_expanded_plugin_frame.xml
+++ b/packages/SystemUI/res/layout/status_bar_expanded_plugin_frame.xml
@@ -20,7 +20,7 @@
android:id="@+id/plugin_frame"
android:theme="@style/qs_theme"
android:layout_width="@dimen/qs_panel_width"
- android:layout_height="105dp"
+ android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_marginTop="@dimen/notification_side_paddings"
android:layout_marginLeft="@dimen/notification_side_paddings"
diff --git a/packages/SystemUI/res/values/config.xml b/packages/SystemUI/res/values/config.xml
index efcc2c44ba94..dff21cfd2c22 100644
--- a/packages/SystemUI/res/values/config.xml
+++ b/packages/SystemUI/res/values/config.xml
@@ -274,7 +274,6 @@
<!-- SystemUI Services: The classes of the stuff to start. -->
<string-array name="config_systemUIServiceComponents" translatable="false">
<item>com.android.systemui.util.NotificationChannels</item>
- <item>com.android.systemui.statusbar.CommandQueue$CommandQueueStart</item>
<item>com.android.systemui.keyguard.KeyguardViewMediator</item>
<item>com.android.systemui.recents.Recents</item>
<item>com.android.systemui.volume.VolumeUI</item>
@@ -483,4 +482,7 @@
<!-- Whether or not to add a "people" notifications section -->
<bool name="config_usePeopleFiltering">false</bool>
+ <!-- Package name for controls plugin -->
+ <string name="config_controlsPluginPackageName" translatable="false">com.android.systemui.controls.panel</string>
+
</resources>
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 6186589ab086..5f92b2811807 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
@@ -89,6 +89,14 @@ public abstract class TaskStackChangeListener {
onTaskMovedToFront(taskInfo.taskId);
}
+ /**
+ * Called when a task’s description is changed due to an activity calling
+ * ActivityManagerService.setTaskDescription
+ *
+ * @param taskInfo info about the task which changed, with {@link TaskInfo#taskDescription}
+ */
+ public void onTaskDescriptionChanged(RunningTaskInfo taskInfo) { }
+
public void onActivityRequestedOrientationChanged(int taskId, int requestedOrientation) { }
public void onSizeCompatModeActivityChanged(int displayId, IBinder activityToken) { }
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 8d823ca34b39..074ef53aa57c 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
@@ -230,6 +230,11 @@ public class TaskStackChangeListeners extends TaskStackListener {
.sendToTarget();
}
+ @Override
+ public void onTaskDescriptionChanged(RunningTaskInfo taskInfo) {
+ mHandler.obtainMessage(H.ON_TASK_DESCRIPTION_CHANGED, taskInfo).sendToTarget();
+ }
+
private final class H extends Handler {
private static final int ON_TASK_STACK_CHANGED = 1;
private static final int ON_TASK_SNAPSHOT_CHANGED = 2;
@@ -254,6 +259,7 @@ public class TaskStackChangeListeners extends TaskStackListener {
private static final int ON_TASK_LIST_UPDATED = 21;
private static final int ON_SINGLE_TASK_DISPLAY_EMPTY = 22;
private static final int ON_TASK_LIST_FROZEN_UNFROZEN = 23;
+ private static final int ON_TASK_DESCRIPTION_CHANGED = 24;
public H(Looper looper) {
@@ -421,6 +427,13 @@ public class TaskStackChangeListeners extends TaskStackListener {
}
break;
}
+ case ON_TASK_DESCRIPTION_CHANGED: {
+ final RunningTaskInfo info = (RunningTaskInfo) msg.obj;
+ for (int i = mTaskStackListeners.size() - 1; i >= 0; i--) {
+ mTaskStackListeners.get(i).onTaskDescriptionChanged(info);
+ }
+ break;
+ }
}
}
}
diff --git a/packages/SystemUI/src/com/android/keyguard/EmergencyButton.java b/packages/SystemUI/src/com/android/keyguard/EmergencyButton.java
index 1c307628f86d..ecd8c8d34aa2 100644
--- a/packages/SystemUI/src/com/android/keyguard/EmergencyButton.java
+++ b/packages/SystemUI/src/com/android/keyguard/EmergencyButton.java
@@ -50,14 +50,6 @@ import com.android.systemui.util.EmergencyDialerConstants;
* allows the user to return to the call.
*/
public class EmergencyButton extends Button {
- private static final Intent INTENT_EMERGENCY_DIAL = new Intent()
- .setAction(EmergencyDialerConstants.ACTION_DIAL)
- .setPackage("com.android.phone")
- .setFlags(Intent.FLAG_ACTIVITY_NEW_TASK
- | Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS
- | Intent.FLAG_ACTIVITY_CLEAR_TOP)
- .putExtra(EmergencyDialerConstants.EXTRA_ENTRY_TYPE,
- EmergencyDialerConstants.ENTRY_TYPE_LOCKSCREEN_BUTTON);
private static final String LOG_TAG = "EmergencyButton";
private final EmergencyAffordanceManager mEmergencyAffordanceManager;
@@ -189,7 +181,15 @@ public class EmergencyButton extends Button {
} else {
Dependency.get(KeyguardUpdateMonitor.class).reportEmergencyCallAction(
true /* bypassHandler */);
- getContext().startActivityAsUser(INTENT_EMERGENCY_DIAL,
+ Intent emergencyDialIntent =
+ getTelecommManager().createLaunchEmergencyDialerIntent(null /* number*/)
+ .setFlags(Intent.FLAG_ACTIVITY_NEW_TASK
+ | Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS
+ | Intent.FLAG_ACTIVITY_CLEAR_TOP)
+ .putExtra(EmergencyDialerConstants.EXTRA_ENTRY_TYPE,
+ EmergencyDialerConstants.ENTRY_TYPE_LOCKSCREEN_BUTTON);
+
+ getContext().startActivityAsUser(emergencyDialIntent,
ActivityOptions.makeCustomAnimation(getContext(), 0, 0).toBundle(),
new UserHandle(KeyguardUpdateMonitor.getCurrentUser()));
}
diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityModel.java b/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityModel.java
index 1395fd9e3482..64b4d32f3a1f 100644
--- a/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityModel.java
+++ b/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityModel.java
@@ -75,7 +75,6 @@ public class KeyguardSecurityModel {
return SecurityMode.SimPin;
}
- // TODO(b/140034863)
final int security = whitelistIpcs(() ->
mLockPatternUtils.getActivePasswordQuality(userId));
switch (security) {
diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java b/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java
index 27410be09db0..6685db130d4a 100644
--- a/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java
+++ b/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java
@@ -99,7 +99,10 @@ import com.android.internal.telephony.TelephonyIntents;
import com.android.internal.widget.LockPatternUtils;
import com.android.settingslib.WirelessUtils;
import com.android.systemui.DejankUtils;
+import com.android.systemui.DumpController;
+import com.android.systemui.Dumpable;
import com.android.systemui.R;
+import com.android.systemui.broadcast.BroadcastDispatcher;
import com.android.systemui.dagger.qualifiers.MainLooper;
import com.android.systemui.shared.system.ActivityManagerWrapper;
import com.android.systemui.shared.system.TaskStackChangeListener;
@@ -126,7 +129,7 @@ import javax.inject.Singleton;
* to be updated.
*/
@Singleton
-public class KeyguardUpdateMonitor implements TrustManager.TrustListener {
+public class KeyguardUpdateMonitor implements TrustManager.TrustListener, Dumpable {
private static final String TAG = "KeyguardUpdateMonitor";
private static final boolean DEBUG = KeyguardConstants.DEBUG;
@@ -1499,11 +1502,14 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener {
@VisibleForTesting
@Inject
- protected KeyguardUpdateMonitor(Context context, @MainLooper Looper mainLooper) {
+ protected KeyguardUpdateMonitor(Context context, @MainLooper Looper mainLooper,
+ BroadcastDispatcher broadcastDispatcher,
+ DumpController dumpController) {
mContext = context;
mSubscriptionManager = SubscriptionManager.from(context);
mDeviceProvisioned = isDeviceProvisionedInSettingsDb();
mStrongAuthTracker = new StrongAuthTracker(context, this::notifyStrongAuthStateChanged);
+ dumpController.registerDumpable(this);
mHandler = new Handler(mainLooper) {
@Override
@@ -1641,12 +1647,12 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener {
filter.addAction(TelephonyManager.ACTION_PHONE_STATE_CHANGED);
filter.addAction(AudioManager.RINGER_MODE_CHANGED_ACTION);
filter.addAction(DevicePolicyManager.ACTION_DEVICE_POLICY_MANAGER_STATE_CHANGED);
- context.registerReceiver(mBroadcastReceiver, filter, null, mHandler);
+ broadcastDispatcher.registerReceiver(mBroadcastReceiver, filter, mHandler);
final IntentFilter bootCompleteFilter = new IntentFilter();
bootCompleteFilter.setPriority(IntentFilter.SYSTEM_HIGH_PRIORITY);
bootCompleteFilter.addAction(Intent.ACTION_BOOT_COMPLETED);
- context.registerReceiver(mBroadcastReceiver, bootCompleteFilter, null, mHandler);
+ broadcastDispatcher.registerReceiver(mBroadcastReceiver, bootCompleteFilter, mHandler);
final IntentFilter allUserFilter = new IntentFilter();
allUserFilter.addAction(Intent.ACTION_USER_INFO_CHANGED);
@@ -1657,8 +1663,8 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener {
allUserFilter.addAction(ACTION_USER_UNLOCKED);
allUserFilter.addAction(ACTION_USER_STOPPED);
allUserFilter.addAction(ACTION_USER_REMOVED);
- context.registerReceiverAsUser(mBroadcastAllReceiver, UserHandle.ALL, allUserFilter,
- null, mHandler);
+ broadcastDispatcher.registerReceiver(mBroadcastAllReceiver, allUserFilter, mHandler,
+ UserHandle.ALL);
mSubscriptionManager.addOnSubscriptionsChangedListener(mSubscriptionListener);
try {
@@ -2787,6 +2793,7 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener {
}
}
+ @Override
public void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
pw.println("KeyguardUpdateMonitor state:");
pw.println(" SIM States:");
diff --git a/packages/SystemUI/src/com/android/keyguard/clock/ClockManager.java b/packages/SystemUI/src/com/android/keyguard/clock/ClockManager.java
index 9e2464ea4fbb..dfabe696cf71 100644
--- a/packages/SystemUI/src/com/android/keyguard/clock/ClockManager.java
+++ b/packages/SystemUI/src/com/android/keyguard/clock/ClockManager.java
@@ -32,6 +32,7 @@ import android.view.LayoutInflater;
import androidx.annotation.VisibleForTesting;
import androidx.lifecycle.Observer;
+import com.android.systemui.broadcast.BroadcastDispatcher;
import com.android.systemui.colorextraction.SysuiColorExtractor;
import com.android.systemui.dock.DockManager;
import com.android.systemui.dock.DockManager.DockEventListener;
@@ -125,9 +126,9 @@ public final class ClockManager {
@Inject
public ClockManager(Context context, InjectionInflationController injectionInflater,
PluginManager pluginManager, SysuiColorExtractor colorExtractor,
- @Nullable DockManager dockManager) {
+ @Nullable DockManager dockManager, BroadcastDispatcher broadcastDispatcher) {
this(context, injectionInflater, pluginManager, colorExtractor,
- context.getContentResolver(), new CurrentUserObservable(context),
+ context.getContentResolver(), new CurrentUserObservable(broadcastDispatcher),
new SettingsWrapper(context.getContentResolver()), dockManager);
}
diff --git a/packages/SystemUI/src/com/android/systemui/BatteryMeterView.java b/packages/SystemUI/src/com/android/systemui/BatteryMeterView.java
index ce61a00fefc3..2afcb12da730 100644
--- a/packages/SystemUI/src/com/android/systemui/BatteryMeterView.java
+++ b/packages/SystemUI/src/com/android/systemui/BatteryMeterView.java
@@ -51,9 +51,11 @@ import androidx.annotation.StyleRes;
import com.android.settingslib.Utils;
import com.android.settingslib.graph.ThemedBatteryDrawable;
+import com.android.systemui.broadcast.BroadcastDispatcher;
import com.android.systemui.plugins.DarkIconDispatcher;
import com.android.systemui.plugins.DarkIconDispatcher.DarkReceiver;
import com.android.systemui.settings.CurrentUserTracker;
+import com.android.systemui.statusbar.CommandQueue;
import com.android.systemui.statusbar.phone.StatusBarIconController;
import com.android.systemui.statusbar.policy.BatteryController;
import com.android.systemui.statusbar.policy.BatteryController.BatteryStateChangeCallback;
@@ -111,16 +113,13 @@ public class BatteryMeterView extends LinearLayout implements
private int mNonAdaptedForegroundColor;
private int mNonAdaptedBackgroundColor;
- public BatteryMeterView(Context context) {
- this(context, null, 0);
- }
-
public BatteryMeterView(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
public BatteryMeterView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
+ BroadcastDispatcher broadcastDispatcher = Dependency.get(BroadcastDispatcher.class);
setOrientation(LinearLayout.HORIZONTAL);
setGravity(Gravity.CENTER_VERTICAL | Gravity.START);
@@ -139,7 +138,8 @@ public class BatteryMeterView extends LinearLayout implements
addOnAttachStateChangeListener(
- new DisableStateTracker(DISABLE_NONE, DISABLE2_SYSTEM_ICONS));
+ new DisableStateTracker(DISABLE_NONE, DISABLE2_SYSTEM_ICONS,
+ Dependency.get(CommandQueue.class)));
setupLayoutTransition();
@@ -159,7 +159,7 @@ public class BatteryMeterView extends LinearLayout implements
// Init to not dark at all.
onDarkChanged(new Rect(), 0, DarkIconDispatcher.DEFAULT_ICON_TINT);
- mUserTracker = new CurrentUserTracker(mContext) {
+ mUserTracker = new CurrentUserTracker(broadcastDispatcher) {
@Override
public void onUserSwitched(int newUserId) {
mUser = newUserId;
diff --git a/packages/SystemUI/src/com/android/systemui/Dependency.java b/packages/SystemUI/src/com/android/systemui/Dependency.java
index 486d02c207db..b3f32afee43e 100644
--- a/packages/SystemUI/src/com/android/systemui/Dependency.java
+++ b/packages/SystemUI/src/com/android/systemui/Dependency.java
@@ -63,6 +63,7 @@ import com.android.systemui.shared.plugins.PluginManager;
import com.android.systemui.shared.system.ActivityManagerWrapper;
import com.android.systemui.shared.system.DevicePolicyManagerWrapper;
import com.android.systemui.shared.system.PackageManagerWrapper;
+import com.android.systemui.statusbar.CommandQueue;
import com.android.systemui.statusbar.NavigationBarController;
import com.android.systemui.statusbar.NotificationListener;
import com.android.systemui.statusbar.NotificationLockscreenUserManager;
@@ -326,6 +327,7 @@ public class Dependency {
@Inject Lazy<KeyguardSecurityModel> mKeyguardSecurityModel;
@Inject Lazy<DozeParameters> mDozeParameters;
@Inject Lazy<IWallpaperManager> mWallpaperManager;
+ @Inject Lazy<CommandQueue> mCommandQueue;
@Inject
public Dependency() {
@@ -514,6 +516,7 @@ public class Dependency {
mProviders.put(KeyguardSecurityModel.class, mKeyguardSecurityModel::get);
mProviders.put(DozeParameters.class, mDozeParameters::get);
mProviders.put(IWallpaperManager.class, mWallpaperManager::get);
+ mProviders.put(CommandQueue.class, mCommandQueue::get);
// TODO(b/118592525): to support multi-display , we start to add something which is
// per-display, while others may be global. I think it's time to add
diff --git a/packages/SystemUI/src/com/android/systemui/DumpController.kt b/packages/SystemUI/src/com/android/systemui/DumpController.kt
index 65f1abd863c7..8c7075bee6cc 100644
--- a/packages/SystemUI/src/com/android/systemui/DumpController.kt
+++ b/packages/SystemUI/src/com/android/systemui/DumpController.kt
@@ -47,6 +47,16 @@ class DumpController @Inject constructor() : Dumpable {
/**
* Adds a [Dumpable] dumpable to be dumped.
*
+ * @param dumpable the [Dumpable] to be added
+ */
+ fun registerDumpable(dumpable: Dumpable) {
+ Preconditions.checkNotNull(dumpable, "The dumpable to be added cannot be null")
+ registerDumpable(dumpable.javaClass.simpleName, dumpable)
+ }
+
+ /**
+ * Adds a [Dumpable] dumpable to be dumped.
+ *
* @param tag a string tag to associate with this dumpable. Tags must be globally unique; this
* method will throw if the same tag has already been registered. Tags can be used to
* filter output when debugging.
@@ -79,11 +89,11 @@ class DumpController @Inject constructor() : Dumpable {
/**
* Dump all the [Dumpable] registered with the controller
*/
- override fun dump(fd: FileDescriptor?, pw: PrintWriter, args: Array<String>?) {
+ override fun dump(fd: FileDescriptor, pw: PrintWriter, args: Array<String>) {
pw.println("DumpController state:")
- val filter = if (args != null && args.size >= 3 &&
- args[0] == "dependency" && args[1] == "DumpController") {
+ val filter = if (args.size >= 3 && args[0].toLowerCase() == "dependency" &&
+ args[1] == "DumpController") {
ArraySet(args[2].split(',').map { it.toLowerCase() })
} else {
null
diff --git a/packages/SystemUI/src/com/android/systemui/Dumpable.java b/packages/SystemUI/src/com/android/systemui/Dumpable.java
index 65a6844ede2d..10a064389384 100644
--- a/packages/SystemUI/src/com/android/systemui/Dumpable.java
+++ b/packages/SystemUI/src/com/android/systemui/Dumpable.java
@@ -14,9 +14,24 @@
package com.android.systemui;
+import androidx.annotation.NonNull;
+
import java.io.FileDescriptor;
import java.io.PrintWriter;
+/**
+ * Implemented by classes who want to be in:
+ * {@code adb shell dumpsys activity service com.android.systemui}
+ *
+ * @see DumpController
+ */
public interface Dumpable {
- void dump(FileDescriptor fd, PrintWriter pw, String[] args);
+
+ /**
+ * Called when it's time to dump the internal state
+ * @param fd A file descriptor.
+ * @param pw Where to write your dump to.
+ * @param args Arguments.
+ */
+ void dump(@NonNull FileDescriptor fd, @NonNull PrintWriter pw, @NonNull String[] args);
}
diff --git a/packages/SystemUI/src/com/android/systemui/GuestResumeSessionReceiver.java b/packages/SystemUI/src/com/android/systemui/GuestResumeSessionReceiver.java
index 3a8536b8127e..4afa96987499 100644
--- a/packages/SystemUI/src/com/android/systemui/GuestResumeSessionReceiver.java
+++ b/packages/SystemUI/src/com/android/systemui/GuestResumeSessionReceiver.java
@@ -32,6 +32,7 @@ import android.provider.Settings;
import android.util.Log;
import android.view.WindowManagerGlobal;
+import com.android.systemui.broadcast.BroadcastDispatcher;
import com.android.systemui.statusbar.phone.SystemUIDialog;
/**
@@ -45,10 +46,14 @@ public class GuestResumeSessionReceiver extends BroadcastReceiver {
private Dialog mNewSessionDialog;
- public void register(Context context) {
+ /**
+ * Register this receiver with the {@link BroadcastDispatcher}
+ *
+ * @param broadcastDispatcher to register the receiver.
+ */
+ public void register(BroadcastDispatcher broadcastDispatcher) {
IntentFilter f = new IntentFilter(Intent.ACTION_USER_SWITCHED);
- context.registerReceiverAsUser(this, UserHandle.SYSTEM,
- f, null /* permission */, null /* scheduler */);
+ broadcastDispatcher.registerReceiver(this, f, null /* handler */, UserHandle.SYSTEM);
}
@Override
diff --git a/packages/SystemUI/src/com/android/systemui/LatencyTester.java b/packages/SystemUI/src/com/android/systemui/LatencyTester.java
index 30a60abfcd86..1a47daceafcc 100644
--- a/packages/SystemUI/src/com/android/systemui/LatencyTester.java
+++ b/packages/SystemUI/src/com/android/systemui/LatencyTester.java
@@ -29,6 +29,7 @@ import android.os.SystemClock;
import com.android.internal.util.LatencyTracker;
import com.android.keyguard.KeyguardUpdateMonitor;
+import com.android.systemui.broadcast.BroadcastDispatcher;
import com.android.systemui.statusbar.phone.BiometricUnlockController;
import javax.inject.Inject;
@@ -49,13 +50,16 @@ public class LatencyTester extends SystemUI {
"com.android.systemui.latency.ACTION_TURN_ON_SCREEN";
private final BiometricUnlockController mBiometricUnlockController;
private final PowerManager mPowerManager;
+ private final BroadcastDispatcher mBroadcastDispatcher;
@Inject
public LatencyTester(Context context, BiometricUnlockController biometricUnlockController,
- PowerManager powerManager) {
+ PowerManager powerManager, BroadcastDispatcher broadcastDispatcher) {
super(context);
+
mBiometricUnlockController = biometricUnlockController;
mPowerManager = powerManager;
+ mBroadcastDispatcher = broadcastDispatcher;
}
@Override
@@ -67,7 +71,7 @@ public class LatencyTester extends SystemUI {
IntentFilter filter = new IntentFilter();
filter.addAction(ACTION_FINGERPRINT_WAKE);
filter.addAction(ACTION_TURN_ON_SCREEN);
- mContext.registerReceiver(new BroadcastReceiver() {
+ mBroadcastDispatcher.registerReceiver(new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
diff --git a/packages/SystemUI/src/com/android/systemui/ScreenDecorations.java b/packages/SystemUI/src/com/android/systemui/ScreenDecorations.java
index 8a99e451934e..ab7eec52a959 100644
--- a/packages/SystemUI/src/com/android/systemui/ScreenDecorations.java
+++ b/packages/SystemUI/src/com/android/systemui/ScreenDecorations.java
@@ -67,6 +67,8 @@ import androidx.annotation.VisibleForTesting;
import com.android.internal.util.Preconditions;
import com.android.systemui.RegionInterceptingFrameLayout.RegionInterceptableView;
+import com.android.systemui.broadcast.BroadcastDispatcher;
+import com.android.systemui.dagger.qualifiers.MainHandler;
import com.android.systemui.fragments.FragmentHostManager;
import com.android.systemui.fragments.FragmentHostManager.FragmentListener;
import com.android.systemui.plugins.qs.QS;
@@ -103,6 +105,9 @@ public class ScreenDecorations extends SystemUI implements Tunable {
private final Lazy<StatusBar> mStatusBarLazy;
private DisplayManager mDisplayManager;
+ private final BroadcastDispatcher mBroadcastDispatcher;
+ private final Handler mMainHandler;
+ private final TunerService mTunerService;
private DisplayManager.DisplayListener mDisplayListener;
@VisibleForTesting
@@ -140,9 +145,16 @@ public class ScreenDecorations extends SystemUI implements Tunable {
}
@Inject
- public ScreenDecorations(Context context, Lazy<StatusBar> statusBarLazy) {
+ public ScreenDecorations(Context context,
+ Lazy<StatusBar> statusBarLazy,
+ @MainHandler Handler handler,
+ BroadcastDispatcher broadcastDispatcher,
+ TunerService tunerService) {
super(context);
mStatusBarLazy = statusBarLazy;
+ mMainHandler = handler;
+ mBroadcastDispatcher = broadcastDispatcher;
+ mTunerService = tunerService;
}
@Override
@@ -239,8 +251,7 @@ public class ScreenDecorations extends SystemUI implements Tunable {
mWindowManager.getDefaultDisplay().getMetrics(metrics);
mDensity = metrics.density;
- Dependency.get(Dependency.MAIN_HANDLER).post(
- () -> Dependency.get(TunerService.class).addTunable(this, SIZE));
+ mMainHandler.post(() -> mTunerService.addTunable(this, SIZE));
// Watch color inversion and invert the overlay as needed.
mColorInversionSetting = new SecureSetting(mContext, mHandler,
@@ -255,7 +266,7 @@ public class ScreenDecorations extends SystemUI implements Tunable {
IntentFilter filter = new IntentFilter();
filter.addAction(Intent.ACTION_USER_SWITCHED);
- mContext.registerReceiver(mIntentReceiver, filter, null /* permission */, mHandler);
+ mBroadcastDispatcher.registerReceiver(mIntentReceiver, filter, mHandler);
mOverlay.addOnLayoutChangeListener(new OnLayoutChangeListener() {
@Override
diff --git a/packages/SystemUI/src/com/android/systemui/SizeCompatModeActivityController.java b/packages/SystemUI/src/com/android/systemui/SizeCompatModeActivityController.java
index 10009f5f5582..72a403035294 100644
--- a/packages/SystemUI/src/com/android/systemui/SizeCompatModeActivityController.java
+++ b/packages/SystemUI/src/com/android/systemui/SizeCompatModeActivityController.java
@@ -47,7 +47,11 @@ import com.android.systemui.statusbar.CommandQueue;
import java.lang.ref.WeakReference;
+import javax.inject.Inject;
+import javax.inject.Singleton;
+
/** Shows a restart-activity button when the foreground activity is in size compatibility mode. */
+@Singleton
public class SizeCompatModeActivityController extends SystemUI implements CommandQueue.Callbacks {
private static final String TAG = "SizeCompatMode";
@@ -55,17 +59,17 @@ public class SizeCompatModeActivityController extends SystemUI implements Comman
private final SparseArray<RestartActivityButton> mActiveButtons = new SparseArray<>(1);
/** Avoid creating display context frequently for non-default display. */
private final SparseArray<WeakReference<Context>> mDisplayContextCache = new SparseArray<>(0);
+ private final CommandQueue mCommandQueue;
/** Only show once automatically in the process life. */
private boolean mHasShownHint;
- public SizeCompatModeActivityController(Context context) {
- this(context, ActivityManagerWrapper.getInstance());
- }
-
@VisibleForTesting
- SizeCompatModeActivityController(Context context, ActivityManagerWrapper am) {
+ @Inject
+ SizeCompatModeActivityController(Context context, ActivityManagerWrapper am,
+ CommandQueue commandQueue) {
super(context);
+ mCommandQueue = commandQueue;
am.registerTaskStackListener(new TaskStackChangeListener() {
@Override
public void onSizeCompatModeActivityChanged(int displayId, IBinder activityToken) {
@@ -77,7 +81,7 @@ public class SizeCompatModeActivityController extends SystemUI implements Comman
@Override
public void start() {
- SysUiServiceProvider.getComponent(mContext, CommandQueue.class).addCallback(this);
+ mCommandQueue.addCallback(this);
}
@Override
diff --git a/packages/SystemUI/src/com/android/systemui/SliceBroadcastRelayHandler.java b/packages/SystemUI/src/com/android/systemui/SliceBroadcastRelayHandler.java
index 92fbd259b471..7a4ef2b7bbf2 100644
--- a/packages/SystemUI/src/com/android/systemui/SliceBroadcastRelayHandler.java
+++ b/packages/SystemUI/src/com/android/systemui/SliceBroadcastRelayHandler.java
@@ -28,19 +28,27 @@ import android.util.Log;
import com.android.internal.annotations.VisibleForTesting;
import com.android.settingslib.SliceBroadcastRelay;
+import com.android.systemui.broadcast.BroadcastDispatcher;
+
+import javax.inject.Inject;
+import javax.inject.Singleton;
/**
* Allows settings to register certain broadcasts to launch the settings app for pinned slices.
* @see SliceBroadcastRelay
*/
+@Singleton
public class SliceBroadcastRelayHandler extends SystemUI {
private static final String TAG = "SliceBroadcastRelay";
private static final boolean DEBUG = false;
private final ArrayMap<Uri, BroadcastRelay> mRelays = new ArrayMap<>();
+ private final BroadcastDispatcher mBroadcastDispatcher;
- public SliceBroadcastRelayHandler(Context context) {
+ @Inject
+ public SliceBroadcastRelayHandler(Context context, BroadcastDispatcher broadcastDispatcher) {
super(context);
+ mBroadcastDispatcher = broadcastDispatcher;
}
@Override
@@ -48,9 +56,10 @@ public class SliceBroadcastRelayHandler extends SystemUI {
if (DEBUG) Log.d(TAG, "Start");
IntentFilter filter = new IntentFilter(SliceBroadcastRelay.ACTION_REGISTER);
filter.addAction(SliceBroadcastRelay.ACTION_UNREGISTER);
- mContext.registerReceiver(mReceiver, filter);
+ mBroadcastDispatcher.registerReceiver(mReceiver, filter);
}
+ // This does not use BroadcastDispatcher as the filter may have schemas or mime types.
@VisibleForTesting
void handleIntent(Intent intent) {
if (SliceBroadcastRelay.ACTION_REGISTER.equals(intent.getAction())) {
diff --git a/packages/SystemUI/src/com/android/systemui/SystemUIAppComponentFactory.java b/packages/SystemUI/src/com/android/systemui/SystemUIAppComponentFactory.java
index 746515a816b3..cacbf969e562 100644
--- a/packages/SystemUI/src/com/android/systemui/SystemUIAppComponentFactory.java
+++ b/packages/SystemUI/src/com/android/systemui/SystemUIAppComponentFactory.java
@@ -19,6 +19,7 @@ package com.android.systemui;
import android.app.Activity;
import android.app.Application;
import android.app.Service;
+import android.content.BroadcastReceiver;
import android.content.ContentProvider;
import android.content.Context;
import android.content.Intent;
@@ -125,6 +126,25 @@ public class SystemUIAppComponentFactory extends AppComponentFactory {
return super.instantiateServiceCompat(cl, className, intent);
}
+ @NonNull
+ @Override
+ public BroadcastReceiver instantiateReceiverCompat(@NonNull ClassLoader cl,
+ @NonNull String className, @Nullable Intent intent)
+ throws InstantiationException, IllegalAccessException, ClassNotFoundException {
+ if (mComponentHelper == null) {
+ // This shouldn't happen, but does when a device is freshly formatted.
+ // Bug filed against framework to take a look: http://b/141008541
+ SystemUIFactory.getInstance().getRootComponent().inject(
+ SystemUIAppComponentFactory.this);
+ }
+ BroadcastReceiver receiver = mComponentHelper.resolveBroadcastReceiver(className);
+ if (receiver != null) {
+ return receiver;
+ }
+
+ return super.instantiateReceiverCompat(cl, className, intent);
+ }
+
/**
* A callback that receives a Context when one is ready.
*/
diff --git a/packages/SystemUI/src/com/android/systemui/SystemUIApplication.java b/packages/SystemUI/src/com/android/systemui/SystemUIApplication.java
index 022bf06838a6..aab4041aba5f 100644
--- a/packages/SystemUI/src/com/android/systemui/SystemUIApplication.java
+++ b/packages/SystemUI/src/com/android/systemui/SystemUIApplication.java
@@ -24,23 +24,14 @@ import android.content.Intent;
import android.content.IntentFilter;
import android.content.pm.ApplicationInfo;
import android.content.res.Configuration;
-import android.os.Handler;
-import android.os.Looper;
import android.os.Process;
import android.os.SystemProperties;
import android.os.Trace;
import android.os.UserHandle;
-import android.util.ArraySet;
import android.util.Log;
import android.util.TimingsTraceLog;
import com.android.systemui.dagger.ContextComponentHelper;
-import com.android.systemui.plugins.OverlayPlugin;
-import com.android.systemui.plugins.PluginListener;
-import com.android.systemui.shared.plugins.PluginManager;
-import com.android.systemui.statusbar.phone.DozeParameters;
-import com.android.systemui.statusbar.phone.StatusBar;
-import com.android.systemui.statusbar.phone.StatusBarWindowController;
import com.android.systemui.util.NotificationChannels;
import java.lang.reflect.Constructor;
@@ -224,65 +215,6 @@ public class SystemUIApplication extends Application implements SysUiServiceProv
}
Dependency.get(InitController.class).executePostInitTasks();
log.traceEnd();
- final Handler mainHandler = new Handler(Looper.getMainLooper());
- Dependency.get(PluginManager.class).addPluginListener(
- new PluginListener<OverlayPlugin>() {
- private ArraySet<OverlayPlugin> mOverlays = new ArraySet<>();
-
- @Override
- public void onPluginConnected(OverlayPlugin plugin, Context pluginContext) {
- mainHandler.post(new Runnable() {
- @Override
- public void run() {
- StatusBar statusBar = getComponent(StatusBar.class);
- if (statusBar != null) {
- plugin.setup(statusBar.getStatusBarWindow(),
- statusBar.getNavigationBarView(), new Callback(plugin),
- Dependency.get(DozeParameters.class));
- }
- }
- });
- }
-
- @Override
- public void onPluginDisconnected(OverlayPlugin plugin) {
- mainHandler.post(new Runnable() {
- @Override
- public void run() {
- mOverlays.remove(plugin);
- Dependency.get(StatusBarWindowController.class).setForcePluginOpen(
- mOverlays.size() != 0);
- }
- });
- }
-
- class Callback implements OverlayPlugin.Callback {
- private final OverlayPlugin mPlugin;
-
- Callback(OverlayPlugin plugin) {
- mPlugin = plugin;
- }
-
- @Override
- public void onHoldStatusBarOpenChange() {
- if (mPlugin.holdStatusBarOpen()) {
- mOverlays.add(mPlugin);
- } else {
- mOverlays.remove(mPlugin);
- }
- mainHandler.post(new Runnable() {
- @Override
- public void run() {
- Dependency.get(StatusBarWindowController.class)
- .setStateListener(b -> mOverlays.forEach(
- o -> o.setCollapseDesired(b)));
- Dependency.get(StatusBarWindowController.class)
- .setForcePluginOpen(mOverlays.size() != 0);
- }
- });
- }
- }
- }, OverlayPlugin.class, true /* Allow multiple plugins */);
mServicesStarted = true;
}
diff --git a/packages/SystemUI/src/com/android/systemui/assist/AssistHandleReminderExpBehavior.java b/packages/SystemUI/src/com/android/systemui/assist/AssistHandleReminderExpBehavior.java
index 3ff1b97c3753..9a277e8fa77c 100644
--- a/packages/SystemUI/src/com/android/systemui/assist/AssistHandleReminderExpBehavior.java
+++ b/packages/SystemUI/src/com/android/systemui/assist/AssistHandleReminderExpBehavior.java
@@ -34,6 +34,7 @@ import androidx.slice.Clock;
import com.android.internal.config.sysui.SystemUiDeviceConfigFlags;
import com.android.systemui.assist.AssistHandleBehaviorController.BehaviorController;
+import com.android.systemui.broadcast.BroadcastDispatcher;
import com.android.systemui.keyguard.WakefulnessLifecycle;
import com.android.systemui.model.SysUiState;
import com.android.systemui.plugins.statusbar.StatusBarStateController;
@@ -161,6 +162,7 @@ final class AssistHandleReminderExpBehavior implements BehaviorController {
private final Lazy<SysUiState> mSysUiFlagContainer;
private final Lazy<WakefulnessLifecycle> mWakefulnessLifecycle;
private final Lazy<PackageManagerWrapper> mPackageManagerWrapper;
+ private final Lazy<BroadcastDispatcher> mBroadcastDispatcher;
private boolean mOnLockscreen;
private boolean mIsDozing;
@@ -193,7 +195,8 @@ final class AssistHandleReminderExpBehavior implements BehaviorController {
Lazy<OverviewProxyService> overviewProxyService,
Lazy<SysUiState> sysUiFlagContainer,
Lazy<WakefulnessLifecycle> wakefulnessLifecycle,
- Lazy<PackageManagerWrapper> packageManagerWrapper) {
+ Lazy<PackageManagerWrapper> packageManagerWrapper,
+ Lazy<BroadcastDispatcher> broadcastDispatcher) {
mClock = clock;
mHandler = handler;
mPhenotypeHelper = phenotypeHelper;
@@ -207,6 +210,7 @@ final class AssistHandleReminderExpBehavior implements BehaviorController {
for (String action : DEFAULT_HOME_CHANGE_ACTIONS) {
mDefaultHomeIntentFilter.addAction(action);
}
+ mBroadcastDispatcher = broadcastDispatcher;
}
@Override
@@ -215,7 +219,8 @@ final class AssistHandleReminderExpBehavior implements BehaviorController {
mAssistHandleCallbacks = callbacks;
mConsecutiveTaskSwitches = 0;
mDefaultHome = getCurrentDefaultHome();
- context.registerReceiver(mDefaultHomeBroadcastReceiver, mDefaultHomeIntentFilter);
+ mBroadcastDispatcher.get()
+ .registerReceiver(mDefaultHomeBroadcastReceiver, mDefaultHomeIntentFilter);
mOnLockscreen = onLockscreen(mStatusBarStateController.get().getState());
mIsDozing = mStatusBarStateController.get().isDozing();
mStatusBarStateController.get().addCallback(mStatusBarStateListener);
diff --git a/packages/SystemUI/src/com/android/systemui/assist/AssistManager.java b/packages/SystemUI/src/com/android/systemui/assist/AssistManager.java
index 1f950f60fd6a..398826c552bd 100644
--- a/packages/SystemUI/src/com/android/systemui/assist/AssistManager.java
+++ b/packages/SystemUI/src/com/android/systemui/assist/AssistManager.java
@@ -44,8 +44,8 @@ import com.android.settingslib.applications.InterestingConfigChanges;
import com.android.systemui.ConfigurationChangedReceiver;
import com.android.systemui.Dependency;
import com.android.systemui.R;
-import com.android.systemui.SysUiServiceProvider;
import com.android.systemui.assist.ui.DefaultUiController;
+import com.android.systemui.broadcast.BroadcastDispatcher;
import com.android.systemui.recents.OverviewProxyService;
import com.android.systemui.statusbar.CommandQueue;
import com.android.systemui.statusbar.policy.DeviceProvisionedController;
@@ -130,6 +130,7 @@ public class AssistManager implements ConfigurationChangedReceiver {
private AssistOrbContainer mView;
private final DeviceProvisionedController mDeviceProvisionedController;
+ private final CommandQueue mCommandQueue;
protected final AssistUtils mAssistUtils;
private final boolean mShouldEnableOrb;
@@ -160,13 +161,16 @@ public class AssistManager implements ConfigurationChangedReceiver {
DeviceProvisionedController controller,
Context context,
AssistUtils assistUtils,
- AssistHandleBehaviorController handleController) {
+ AssistHandleBehaviorController handleController,
+ CommandQueue commandQueue,
+ BroadcastDispatcher broadcastDispatcher) {
mContext = context;
mDeviceProvisionedController = controller;
+ mCommandQueue = commandQueue;
mWindowManager = (WindowManager) mContext.getSystemService(Context.WINDOW_SERVICE);
mAssistUtils = assistUtils;
mAssistDisclosure = new AssistDisclosure(context, new Handler());
- mPhoneStateMonitor = new PhoneStateMonitor(context);
+ mPhoneStateMonitor = new PhoneStateMonitor(context, broadcastDispatcher);
mHandleController = handleController;
registerVoiceInteractionSessionListener();
@@ -339,7 +343,7 @@ public class AssistManager implements ConfigurationChangedReceiver {
}
// Close Recent Apps if needed
- SysUiServiceProvider.getComponent(mContext, CommandQueue.class).animateCollapsePanels(
+ mCommandQueue.animateCollapsePanels(
CommandQueue.FLAG_EXCLUDE_SEARCH_PANEL | CommandQueue.FLAG_EXCLUDE_RECENTS_PANEL,
false /* force */);
diff --git a/packages/SystemUI/src/com/android/systemui/assist/PhoneStateMonitor.java b/packages/SystemUI/src/com/android/systemui/assist/PhoneStateMonitor.java
index e73dc4a57bd7..95d611a605d2 100644
--- a/packages/SystemUI/src/com/android/systemui/assist/PhoneStateMonitor.java
+++ b/packages/SystemUI/src/com/android/systemui/assist/PhoneStateMonitor.java
@@ -29,6 +29,7 @@ import androidx.annotation.Nullable;
import com.android.systemui.Dependency;
import com.android.systemui.SysUiServiceProvider;
+import com.android.systemui.broadcast.BroadcastDispatcher;
import com.android.systemui.plugins.statusbar.StatusBarStateController;
import com.android.systemui.shared.system.ActivityManagerWrapper;
import com.android.systemui.shared.system.PackageManagerWrapper;
@@ -67,7 +68,7 @@ final class PhoneStateMonitor {
private boolean mLauncherShowing;
@Nullable private ComponentName mDefaultHome;
- PhoneStateMonitor(Context context) {
+ PhoneStateMonitor(Context context, BroadcastDispatcher broadcastDispatcher) {
mContext = context;
mStatusBarStateController = Dependency.get(StatusBarStateController.class);
@@ -77,7 +78,7 @@ final class PhoneStateMonitor {
for (String action : DEFAULT_HOME_CHANGE_ACTIONS) {
intentFilter.addAction(action);
}
- mContext.registerReceiver(new BroadcastReceiver() {
+ broadcastDispatcher.registerReceiver(new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
mDefaultHome = getCurrentDefaultHome();
diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/AuthController.java b/packages/SystemUI/src/com/android/systemui/biometrics/AuthController.java
index 446ed2572bab..516de709c34f 100644
--- a/packages/SystemUI/src/com/android/systemui/biometrics/AuthController.java
+++ b/packages/SystemUI/src/com/android/systemui/biometrics/AuthController.java
@@ -47,16 +47,21 @@ import com.android.systemui.statusbar.CommandQueue;
import java.util.List;
+import javax.inject.Inject;
+import javax.inject.Singleton;
+
/**
* Receives messages sent from {@link com.android.server.biometrics.BiometricService} and shows the
* appropriate biometric UI (e.g. BiometricDialogView).
*/
+@Singleton
public class AuthController extends SystemUI implements CommandQueue.Callbacks,
AuthDialogCallback {
private static final String TAG = "BiometricPrompt/AuthController";
private static final boolean DEBUG = true;
+ private final CommandQueue mCommandQueue;
private final Injector mInjector;
// TODO: These should just be saved from onSaveState
@@ -189,13 +194,15 @@ public class AuthController extends SystemUI implements CommandQueue.Callbacks,
}
}
- public AuthController(Context context) {
- this(context, new Injector());
+ @Inject
+ public AuthController(Context context, CommandQueue commandQueue) {
+ this(context, commandQueue, new Injector());
}
@VisibleForTesting
- AuthController(Context context, Injector injector) {
+ AuthController(Context context, CommandQueue commandQueue, Injector injector) {
super(context);
+ mCommandQueue = commandQueue;
mInjector = injector;
}
@@ -205,7 +212,7 @@ public class AuthController extends SystemUI implements CommandQueue.Callbacks,
if (pm.hasSystemFeature(PackageManager.FEATURE_FINGERPRINT)
|| pm.hasSystemFeature(PackageManager.FEATURE_FACE)
|| pm.hasSystemFeature(PackageManager.FEATURE_IRIS)) {
- getComponent(CommandQueue.class).addCallback(this);
+ mCommandQueue.addCallback(this);
mWindowManager = (WindowManager) mContext.getSystemService(Context.WINDOW_SERVICE);
mActivityTaskManager = mInjector.getActivityTaskManager();
diff --git a/packages/SystemUI/src/com/android/systemui/broadcast/BroadcastDispatcher.kt b/packages/SystemUI/src/com/android/systemui/broadcast/BroadcastDispatcher.kt
index 98d7f8b864fb..776189b716b1 100644
--- a/packages/SystemUI/src/com/android/systemui/broadcast/BroadcastDispatcher.kt
+++ b/packages/SystemUI/src/com/android/systemui/broadcast/BroadcastDispatcher.kt
@@ -133,10 +133,10 @@ open class BroadcastDispatcher @Inject constructor (
protected open fun createUBRForUser(userId: Int) =
UserBroadcastDispatcher(context, userId, mainHandler, bgLooper)
- override fun dump(fd: FileDescriptor?, pw: PrintWriter?, args: Array<out String>?) {
- pw?.println("Broadcast dispatcher:")
+ override fun dump(fd: FileDescriptor, pw: PrintWriter, args: Array<out String>) {
+ pw.println("Broadcast dispatcher:")
for (index in 0 until receiversByUser.size()) {
- pw?.println(" User ${receiversByUser.keyAt(index)}")
+ pw.println(" User ${receiversByUser.keyAt(index)}")
receiversByUser.valueAt(index).dump(fd, pw, args)
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/broadcast/UserBroadcastDispatcher.kt b/packages/SystemUI/src/com/android/systemui/broadcast/UserBroadcastDispatcher.kt
index 54f9950239c2..24357a740331 100644
--- a/packages/SystemUI/src/com/android/systemui/broadcast/UserBroadcastDispatcher.kt
+++ b/packages/SystemUI/src/com/android/systemui/broadcast/UserBroadcastDispatcher.kt
@@ -31,6 +31,7 @@ import com.android.systemui.Dumpable
import java.io.FileDescriptor
import java.io.PrintWriter
import java.util.concurrent.atomic.AtomicBoolean
+import java.util.concurrent.atomic.AtomicInteger
private const val MSG_REGISTER_RECEIVER = 0
private const val MSG_UNREGISTER_RECEIVER = 1
@@ -50,6 +51,13 @@ class UserBroadcastDispatcher(
private val bgLooper: Looper
) : BroadcastReceiver(), Dumpable {
+ companion object {
+ // Used only for debugging. If not debugging, this variable will not be accessed and all
+ // received broadcasts will be tagged with 0. However, as DEBUG is false, nothing will be
+ // logged
+ val index = AtomicInteger(0)
+ }
+
private val bgHandler = object : Handler(bgLooper) {
override fun handleMessage(msg: Message) {
when (msg.what) {
@@ -97,7 +105,10 @@ class UserBroadcastDispatcher(
private val receiverToReceiverData = ArrayMap<BroadcastReceiver, MutableSet<ReceiverData>>()
override fun onReceive(context: Context, intent: Intent) {
- bgHandler.post(HandleBroadcastRunnable(actionsToReceivers, context, intent, pendingResult))
+ val id = if (DEBUG) index.getAndIncrement() else 0
+ if (DEBUG) Log.w(TAG, "[$id] Received $intent")
+ bgHandler.post(
+ HandleBroadcastRunnable(actionsToReceivers, context, intent, pendingResult, id))
}
/**
@@ -149,11 +160,11 @@ class UserBroadcastDispatcher(
}
}
- override fun dump(fd: FileDescriptor?, pw: PrintWriter?, args: Array<out String>?) {
- pw?.println(" Registered=${registered.get()}")
+ override fun dump(fd: FileDescriptor, pw: PrintWriter, args: Array<out String>) {
+ pw.println(" Registered=${registered.get()}")
actionsToReceivers.forEach { (action, list) ->
- pw?.println(" $action:")
- list.forEach { pw?.println(" ${it.receiver}") }
+ pw.println(" $action:")
+ list.forEach { pw.println(" ${it.receiver}") }
}
}
@@ -161,17 +172,19 @@ class UserBroadcastDispatcher(
val actionsToReceivers: Map<String, Set<ReceiverData>>,
val context: Context,
val intent: Intent,
- val pendingResult: PendingResult
+ val pendingResult: PendingResult,
+ val index: Int
) : Runnable {
override fun run() {
- if (DEBUG) Log.w(TAG, "Dispatching $intent")
+ if (DEBUG) Log.w(TAG, "[$index] Dispatching $intent")
actionsToReceivers.get(intent.action)
?.filter {
it.filter.hasAction(intent.action) &&
it.filter.matchCategories(intent.categories) == null }
?.forEach {
it.handler.post {
- if (DEBUG) Log.w(TAG, "Dispatching to ${it.receiver}")
+ if (DEBUG) Log.w(TAG,
+ "[$index] Dispatching ${intent.action} to ${it.receiver}")
it.receiver.pendingResult = pendingResult
it.receiver.onReceive(context, intent)
}
diff --git a/packages/SystemUI/src/com/android/systemui/dagger/ContextComponentHelper.java b/packages/SystemUI/src/com/android/systemui/dagger/ContextComponentHelper.java
index d6d1e418240a..1e7449c64182 100644
--- a/packages/SystemUI/src/com/android/systemui/dagger/ContextComponentHelper.java
+++ b/packages/SystemUI/src/com/android/systemui/dagger/ContextComponentHelper.java
@@ -18,8 +18,10 @@ package com.android.systemui.dagger;
import android.app.Activity;
import android.app.Service;
+import android.content.BroadcastReceiver;
import com.android.systemui.SystemUI;
+import com.android.systemui.recents.RecentsImplementation;
/**
* Interface necessary to make Dagger happy. See {@link ContextComponentResolver}.
@@ -29,8 +31,14 @@ public interface ContextComponentHelper {
Activity resolveActivity(String className);
/** Turns a classname into an instance of the class or returns null. */
+ RecentsImplementation resolveRecents(String className);
+
+ /** Turns a classname into an instance of the class or returns null. */
Service resolveService(String className);
/** Turns a classname into an instance of the class or returns null. */
SystemUI resolveSystemUI(String className);
+
+ /** Turns a classname into an instance of the class or returns null. */
+ BroadcastReceiver resolveBroadcastReceiver(String className);
}
diff --git a/packages/SystemUI/src/com/android/systemui/dagger/ContextComponentResolver.java b/packages/SystemUI/src/com/android/systemui/dagger/ContextComponentResolver.java
index d7822c9fc6da..f91d79576395 100644
--- a/packages/SystemUI/src/com/android/systemui/dagger/ContextComponentResolver.java
+++ b/packages/SystemUI/src/com/android/systemui/dagger/ContextComponentResolver.java
@@ -18,8 +18,10 @@ package com.android.systemui.dagger;
import android.app.Activity;
import android.app.Service;
+import android.content.BroadcastReceiver;
import com.android.systemui.SystemUI;
+import com.android.systemui.recents.RecentsImplementation;
import java.util.Map;
@@ -35,15 +37,20 @@ public class ContextComponentResolver implements ContextComponentHelper {
private final Map<Class<?>, Provider<Activity>> mActivityCreators;
private final Map<Class<?>, Provider<Service>> mServiceCreators;
private final Map<Class<?>, Provider<SystemUI>> mSystemUICreators;
+ private final Map<Class<?>, Provider<RecentsImplementation>> mRecentsCreators;
+ private final Map<Class<?>, Provider<BroadcastReceiver>> mBroadcastReceiverCreators;
@Inject
- ContextComponentResolver(
- Map<Class<?>, Provider<Activity>> activityCreators,
+ ContextComponentResolver(Map<Class<?>, Provider<Activity>> activityCreators,
Map<Class<?>, Provider<Service>> serviceCreators,
- Map<Class<?>, Provider<SystemUI>> systemUICreators) {
+ Map<Class<?>, Provider<SystemUI>> systemUICreators,
+ Map<Class<?>, Provider<RecentsImplementation>> recentsCreators,
+ Map<Class<?>, Provider<BroadcastReceiver>> broadcastReceiverCreators) {
mActivityCreators = activityCreators;
mServiceCreators = serviceCreators;
mSystemUICreators = systemUICreators;
+ mRecentsCreators = recentsCreators;
+ mBroadcastReceiverCreators = broadcastReceiverCreators;
}
/**
@@ -55,6 +62,22 @@ public class ContextComponentResolver implements ContextComponentHelper {
}
/**
+ * Looks up the BroadcastReceiver class name to see if Dagger has an instance of it.
+ */
+ @Override
+ public BroadcastReceiver resolveBroadcastReceiver(String className) {
+ return resolve(className, mBroadcastReceiverCreators);
+ }
+
+ /**
+ * Looks up the RecentsImplementation class name to see if Dagger has an instance of it.
+ */
+ @Override
+ public RecentsImplementation resolveRecents(String className) {
+ return resolve(className, mRecentsCreators);
+ }
+
+ /**
* Looks up the Service class name to see if Dagger has an instance of it.
*/
@Override
diff --git a/packages/SystemUI/src/com/android/systemui/dagger/DefaultActivityBinder.java b/packages/SystemUI/src/com/android/systemui/dagger/DefaultActivityBinder.java
index 61ded138134c..4593164869fd 100644
--- a/packages/SystemUI/src/com/android/systemui/dagger/DefaultActivityBinder.java
+++ b/packages/SystemUI/src/com/android/systemui/dagger/DefaultActivityBinder.java
@@ -19,7 +19,11 @@ package com.android.systemui.dagger;
import android.app.Activity;
import com.android.systemui.ForegroundServicesDialog;
+import com.android.systemui.keyguard.WorkLockActivity;
+import com.android.systemui.settings.BrightnessDialog;
import com.android.systemui.tuner.TunerActivity;
+import com.android.systemui.usb.UsbDebuggingActivity;
+import com.android.systemui.usb.UsbDebuggingSecondaryUserActivity;
import dagger.Binds;
import dagger.Module;
@@ -42,4 +46,29 @@ public abstract class DefaultActivityBinder {
@IntoMap
@ClassKey(ForegroundServicesDialog.class)
public abstract Activity bindForegroundServicesDialog(ForegroundServicesDialog activity);
+
+ /** Inject into WorkLockActivity. */
+ @Binds
+ @IntoMap
+ @ClassKey(WorkLockActivity.class)
+ public abstract Activity bindWorkLockActivity(WorkLockActivity activity);
+
+ /** Inject into BrightnessDialog. */
+ @Binds
+ @IntoMap
+ @ClassKey(BrightnessDialog.class)
+ public abstract Activity bindBrightnessDialog(BrightnessDialog activity);
+
+ /** Inject into UsbDebuggingActivity. */
+ @Binds
+ @IntoMap
+ @ClassKey(UsbDebuggingActivity.class)
+ public abstract Activity bindUsbDebuggingActivity(UsbDebuggingActivity activity);
+
+ /** Inject into UsbDebuggingSecondaryUserActivity. */
+ @Binds
+ @IntoMap
+ @ClassKey(UsbDebuggingSecondaryUserActivity.class)
+ public abstract Activity bindUsbDebuggingSecondaryUserActivity(
+ UsbDebuggingSecondaryUserActivity activity);
}
diff --git a/packages/SystemUI/src/com/android/systemui/dagger/DefaultBroadcastReceiverBinder.java b/packages/SystemUI/src/com/android/systemui/dagger/DefaultBroadcastReceiverBinder.java
new file mode 100644
index 000000000000..56d0fa237b82
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/dagger/DefaultBroadcastReceiverBinder.java
@@ -0,0 +1,39 @@
+/*
+ * 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.dagger;
+
+import android.content.BroadcastReceiver;
+
+import com.android.systemui.screenshot.GlobalScreenshot.ActionProxyReceiver;
+
+import dagger.Binds;
+import dagger.Module;
+import dagger.multibindings.ClassKey;
+import dagger.multibindings.IntoMap;
+
+/**
+ * BroadcastReceivers that are injectable should go here.
+ */
+@Module
+public abstract class DefaultBroadcastReceiverBinder {
+ /** */
+ @Binds
+ @IntoMap
+ @ClassKey(ActionProxyReceiver.class)
+ public abstract BroadcastReceiver bindActionProxyReceiver(
+ ActionProxyReceiver broadcastReceiver);
+}
diff --git a/packages/SystemUI/src/com/android/systemui/dagger/DefaultComponentBinder.java b/packages/SystemUI/src/com/android/systemui/dagger/DefaultComponentBinder.java
index d8989ee624fa..18fe3ec92827 100644
--- a/packages/SystemUI/src/com/android/systemui/dagger/DefaultComponentBinder.java
+++ b/packages/SystemUI/src/com/android/systemui/dagger/DefaultComponentBinder.java
@@ -23,6 +23,9 @@ import dagger.Module;
*
* See {@link ContextComponentResolver}
*/
-@Module(includes = {DefaultActivityBinder.class, DefaultServiceBinder.class, SystemUIBinder.class})
+@Module(includes = {DefaultActivityBinder.class,
+ DefaultBroadcastReceiverBinder.class,
+ DefaultServiceBinder.class,
+ SystemUIBinder.class})
public abstract class DefaultComponentBinder {
}
diff --git a/packages/SystemUI/src/com/android/systemui/dagger/DefaultServiceBinder.java b/packages/SystemUI/src/com/android/systemui/dagger/DefaultServiceBinder.java
index 14bb80c79e27..85cd51c4e169 100644
--- a/packages/SystemUI/src/com/android/systemui/dagger/DefaultServiceBinder.java
+++ b/packages/SystemUI/src/com/android/systemui/dagger/DefaultServiceBinder.java
@@ -21,6 +21,7 @@ import android.app.Service;
import com.android.systemui.ImageWallpaper;
import com.android.systemui.doze.DozeService;
import com.android.systemui.keyguard.KeyguardService;
+import com.android.systemui.screenshot.TakeScreenshotService;
import dagger.Binds;
import dagger.Module;
@@ -49,4 +50,10 @@ public abstract class DefaultServiceBinder {
@IntoMap
@ClassKey(KeyguardService.class)
public abstract Service bindKeyguardService(KeyguardService service);
+
+ /** */
+ @Binds
+ @IntoMap
+ @ClassKey(TakeScreenshotService.class)
+ public abstract Service bindTakeScreenshotService(TakeScreenshotService service);
}
diff --git a/packages/SystemUI/src/com/android/systemui/dagger/DependencyProvider.java b/packages/SystemUI/src/com/android/systemui/dagger/DependencyProvider.java
index 87434f344729..6d61b2fb9990 100644
--- a/packages/SystemUI/src/com/android/systemui/dagger/DependencyProvider.java
+++ b/packages/SystemUI/src/com/android/systemui/dagger/DependencyProvider.java
@@ -27,12 +27,15 @@ import android.os.HandlerThread;
import android.os.Looper;
import android.os.Process;
import android.os.ServiceManager;
+import android.os.UserManager;
import android.util.DisplayMetrics;
import android.view.IWindowManager;
+import android.view.LayoutInflater;
import com.android.internal.logging.MetricsLogger;
import com.android.internal.statusbar.IStatusBarService;
import com.android.internal.widget.LockPatternUtils;
+import com.android.systemui.broadcast.BroadcastDispatcher;
import com.android.systemui.dagger.qualifiers.BgHandler;
import com.android.systemui.dagger.qualifiers.BgLooper;
import com.android.systemui.dagger.qualifiers.MainHandler;
@@ -43,6 +46,7 @@ import com.android.systemui.shared.plugins.PluginManager;
import com.android.systemui.shared.plugins.PluginManagerImpl;
import com.android.systemui.shared.system.ActivityManagerWrapper;
import com.android.systemui.shared.system.DevicePolicyManagerWrapper;
+import com.android.systemui.statusbar.CommandQueue;
import com.android.systemui.statusbar.NavigationBarController;
import com.android.systemui.statusbar.NotificationRemoteInputManager;
import com.android.systemui.statusbar.phone.AutoHideController;
@@ -152,6 +156,13 @@ public class DependencyProvider {
ServiceManager.getService(Context.NOTIFICATION_SERVICE));
}
+ /** */
+ @Singleton
+ @Provides
+ public LayoutInflater providerLayoutInflater(Context context) {
+ return LayoutInflater.from(context);
+ }
+
@Singleton
@Provides
public LeakDetector provideLeakDetector() {
@@ -181,8 +192,8 @@ public class DependencyProvider {
@Singleton
@Provides
public NavigationBarController provideNavigationBarController(Context context,
- @MainHandler Handler mainHandler) {
- return new NavigationBarController(context, mainHandler);
+ @MainHandler Handler mainHandler, CommandQueue commandQueue) {
+ return new NavigationBarController(context, mainHandler, commandQueue);
}
@Singleton
@@ -216,8 +227,8 @@ public class DependencyProvider {
@Singleton
@Provides
public DeviceProvisionedController provideDeviceProvisionedController(Context context,
- @MainHandler Handler mainHandler) {
- return new DeviceProvisionedControllerImpl(context, mainHandler);
+ @MainHandler Handler mainHandler, BroadcastDispatcher broadcastDispatcher) {
+ return new DeviceProvisionedControllerImpl(context, mainHandler, broadcastDispatcher);
}
/** */
@@ -231,4 +242,11 @@ public class DependencyProvider {
public AlwaysOnDisplayPolicy provideAlwaysOnDisplayPolicy(Context context) {
return new AlwaysOnDisplayPolicy(context);
}
+
+ /** */
+ @Singleton
+ @Provides
+ public UserManager providesUserManager(Context context) {
+ return context.getSystemService(UserManager.class);
+ }
}
diff --git a/packages/SystemUI/src/com/android/systemui/dagger/SystemUIBinder.java b/packages/SystemUI/src/com/android/systemui/dagger/SystemUIBinder.java
index 27c526b22283..3b0c9aebfe08 100644
--- a/packages/SystemUI/src/com/android/systemui/dagger/SystemUIBinder.java
+++ b/packages/SystemUI/src/com/android/systemui/dagger/SystemUIBinder.java
@@ -16,20 +16,102 @@
package com.android.systemui.dagger;
+import static com.android.systemui.Dependency.ALLOW_NOTIFICATION_LONG_PRESS_NAME;
+
+import android.content.Context;
+import android.os.PowerManager;
+import android.util.DisplayMetrics;
+
+import androidx.annotation.Nullable;
+
+import com.android.internal.logging.MetricsLogger;
+import com.android.keyguard.KeyguardUpdateMonitor;
+import com.android.systemui.ForegroundServiceController;
import com.android.systemui.LatencyTester;
import com.android.systemui.ScreenDecorations;
+import com.android.systemui.SizeCompatModeActivityController;
+import com.android.systemui.SliceBroadcastRelayHandler;
import com.android.systemui.SystemUI;
+import com.android.systemui.UiOffloadThread;
+import com.android.systemui.appops.AppOpsController;
+import com.android.systemui.assist.AssistManager;
+import com.android.systemui.biometrics.AuthController;
+import com.android.systemui.broadcast.BroadcastDispatcher;
+import com.android.systemui.bubbles.BubbleController;
+import com.android.systemui.colorextraction.SysuiColorExtractor;
+import com.android.systemui.doze.DozeLog;
+import com.android.systemui.globalactions.GlobalActionsComponent;
import com.android.systemui.keyguard.KeyguardViewMediator;
+import com.android.systemui.keyguard.ScreenLifecycle;
+import com.android.systemui.keyguard.WakefulnessLifecycle;
import com.android.systemui.pip.PipUI;
+import com.android.systemui.plugins.FalsingManager;
import com.android.systemui.power.PowerUI;
import com.android.systemui.recents.Recents;
import com.android.systemui.recents.RecentsModule;
+import com.android.systemui.shared.plugins.PluginManager;
+import com.android.systemui.statusbar.CommandQueue;
+import com.android.systemui.statusbar.FeatureFlags;
+import com.android.systemui.statusbar.NavigationBarController;
+import com.android.systemui.statusbar.NotificationListener;
+import com.android.systemui.statusbar.NotificationLockscreenUserManager;
+import com.android.systemui.statusbar.NotificationMediaManager;
+import com.android.systemui.statusbar.NotificationRemoteInputManager;
+import com.android.systemui.statusbar.NotificationViewHierarchyManager;
+import com.android.systemui.statusbar.PulseExpansionHandler;
+import com.android.systemui.statusbar.SysuiStatusBarStateController;
+import com.android.systemui.statusbar.VibratorHelper;
+import com.android.systemui.statusbar.notification.BypassHeadsUpNotifier;
+import com.android.systemui.statusbar.notification.DynamicPrivacyController;
+import com.android.systemui.statusbar.notification.InstantAppNotifier;
+import com.android.systemui.statusbar.notification.NewNotifPipeline;
+import com.android.systemui.statusbar.notification.NotificationAlertingManager;
+import com.android.systemui.statusbar.notification.NotificationEntryManager;
+import com.android.systemui.statusbar.notification.NotificationInterruptionStateProvider;
+import com.android.systemui.statusbar.notification.NotificationWakeUpCoordinator;
+import com.android.systemui.statusbar.notification.VisualStabilityManager;
+import com.android.systemui.statusbar.notification.logging.NotifLog;
+import com.android.systemui.statusbar.notification.logging.NotificationLogger;
+import com.android.systemui.statusbar.notification.row.NotificationGutsManager;
+import com.android.systemui.statusbar.phone.AutoHideController;
+import com.android.systemui.statusbar.phone.BiometricUnlockController;
+import com.android.systemui.statusbar.phone.DozeParameters;
+import com.android.systemui.statusbar.phone.DozeScrimController;
+import com.android.systemui.statusbar.phone.DozeServiceHost;
+import com.android.systemui.statusbar.phone.HeadsUpManagerPhone;
+import com.android.systemui.statusbar.phone.KeyguardBypassController;
+import com.android.systemui.statusbar.phone.KeyguardLiftController;
+import com.android.systemui.statusbar.phone.LightBarController;
+import com.android.systemui.statusbar.phone.LockscreenWallpaper;
+import com.android.systemui.statusbar.phone.NotificationGroupAlertTransferHelper;
+import com.android.systemui.statusbar.phone.NotificationGroupManager;
+import com.android.systemui.statusbar.phone.ScrimController;
import com.android.systemui.statusbar.phone.StatusBar;
+import com.android.systemui.statusbar.phone.StatusBarIconController;
+import com.android.systemui.statusbar.phone.StatusBarWindowController;
+import com.android.systemui.statusbar.phone.StatusBarWindowViewController;
+import com.android.systemui.statusbar.policy.BatteryController;
+import com.android.systemui.statusbar.policy.ConfigurationController;
+import com.android.systemui.statusbar.policy.DeviceProvisionedController;
+import com.android.systemui.statusbar.policy.KeyguardStateController;
+import com.android.systemui.statusbar.policy.NetworkController;
+import com.android.systemui.statusbar.policy.RemoteInputQuickSettingsDisabler;
+import com.android.systemui.statusbar.policy.RemoteInputUriController;
+import com.android.systemui.statusbar.policy.UserSwitcherController;
+import com.android.systemui.statusbar.policy.ZenModeController;
+import com.android.systemui.statusbar.tv.TvStatusBar;
+import com.android.systemui.theme.ThemeOverlayController;
+import com.android.systemui.util.InjectionInflationController;
import com.android.systemui.util.leak.GarbageMonitor;
import com.android.systemui.volume.VolumeUI;
+import javax.inject.Named;
+import javax.inject.Singleton;
+
import dagger.Binds;
+import dagger.Lazy;
import dagger.Module;
+import dagger.Provides;
import dagger.multibindings.ClassKey;
import dagger.multibindings.IntoMap;
@@ -38,6 +120,11 @@ import dagger.multibindings.IntoMap;
*/
@Module(includes = {RecentsModule.class})
public abstract class SystemUIBinder {
+ /** Inject into AuthController. */
+ @Binds
+ @IntoMap
+ @ClassKey(AuthController.class)
+ public abstract SystemUI bindAuthController(AuthController service);
/** Inject into GarbageMonitor.Service. */
@Binds
@@ -45,6 +132,18 @@ public abstract class SystemUIBinder {
@ClassKey(GarbageMonitor.Service.class)
public abstract SystemUI bindGarbageMonitorService(GarbageMonitor.Service service);
+ /** Inject into GlobalActionsComponent. */
+ @Binds
+ @IntoMap
+ @ClassKey(GlobalActionsComponent.class)
+ public abstract SystemUI bindGlobalActionsComponent(GlobalActionsComponent sysui);
+
+ /** Inject into InstantAppNotifier. */
+ @Binds
+ @IntoMap
+ @ClassKey(InstantAppNotifier.class)
+ public abstract SystemUI bindInstantAppNotifier(InstantAppNotifier sysui);
+
/** Inject into KeyguardViewMediator. */
@Binds
@IntoMap
@@ -81,16 +180,184 @@ public abstract class SystemUIBinder {
@ClassKey(ScreenDecorations.class)
public abstract SystemUI bindScreenDecorations(ScreenDecorations sysui);
+ /** Inject into SizeCompatModeActivityController. */
+ @Binds
+ @IntoMap
+ @ClassKey(SizeCompatModeActivityController.class)
+ public abstract SystemUI bindsSizeCompatModeActivityController(
+ SizeCompatModeActivityController sysui);
+
+ /** Inject into SliceBroadcastRelayHandler. */
+ @Binds
+ @IntoMap
+ @ClassKey(SliceBroadcastRelayHandler.class)
+ public abstract SystemUI bindSliceBroadcastRelayHandler(SliceBroadcastRelayHandler sysui);
+
/** Inject into StatusBar. */
@Binds
@IntoMap
@ClassKey(StatusBar.class)
public abstract SystemUI bindsStatusBar(StatusBar sysui);
+ /** Inject into ThemeOverlayController. */
+ @Binds
+ @IntoMap
+ @ClassKey(ThemeOverlayController.class)
+ public abstract SystemUI bindThemeOverlayController(ThemeOverlayController sysui);
+
+ /** Inject into TvStatusBar. */
+ @Binds
+ @IntoMap
+ @ClassKey(TvStatusBar.class)
+ public abstract SystemUI bindsTvStatusBar(TvStatusBar sysui);
+
/** Inject into VolumeUI. */
@Binds
@IntoMap
@ClassKey(VolumeUI.class)
public abstract SystemUI bindVolumeUI(VolumeUI sysui);
+ /**
+ * Provides our instance of StatusBar which is considered optional.
+ */
+ @Provides
+ @Singleton
+ static StatusBar provideStatusBar(
+ Context context,
+ FeatureFlags featureFlags,
+ LightBarController lightBarController,
+ AutoHideController autoHideController,
+ KeyguardUpdateMonitor keyguardUpdateMonitor,
+ StatusBarIconController statusBarIconController,
+ DozeLog dozeLog,
+ InjectionInflationController injectionInflationController,
+ PulseExpansionHandler pulseExpansionHandler,
+ NotificationWakeUpCoordinator notificationWakeUpCoordinator,
+ KeyguardBypassController keyguardBypassController,
+ KeyguardStateController keyguardStateController,
+ HeadsUpManagerPhone headsUpManagerPhone,
+ DynamicPrivacyController dynamicPrivacyController,
+ BypassHeadsUpNotifier bypassHeadsUpNotifier,
+ @Named(ALLOW_NOTIFICATION_LONG_PRESS_NAME) boolean allowNotificationLongPress,
+ Lazy<NewNotifPipeline> newNotifPipeline,
+ FalsingManager falsingManager,
+ BroadcastDispatcher broadcastDispatcher,
+ RemoteInputQuickSettingsDisabler remoteInputQuickSettingsDisabler,
+ NotificationGutsManager notificationGutsManager,
+ NotificationLogger notificationLogger,
+ NotificationEntryManager notificationEntryManager,
+ NotificationInterruptionStateProvider notificationInterruptionStateProvider,
+ NotificationViewHierarchyManager notificationViewHierarchyManager,
+ ForegroundServiceController foregroundServiceController,
+ AppOpsController appOpsController,
+ KeyguardViewMediator keyguardViewMediator,
+ ZenModeController zenModeController,
+ NotificationAlertingManager notificationAlertingManager,
+ DisplayMetrics displayMetrics,
+ MetricsLogger metricsLogger,
+ UiOffloadThread uiOffloadThread,
+ NotificationMediaManager notificationMediaManager,
+ NotificationLockscreenUserManager lockScreenUserManager,
+ NotificationRemoteInputManager remoteInputManager,
+ UserSwitcherController userSwitcherController,
+ NetworkController networkController,
+ BatteryController batteryController,
+ SysuiColorExtractor colorExtractor,
+ ScreenLifecycle screenLifecycle,
+ WakefulnessLifecycle wakefulnessLifecycle,
+ SysuiStatusBarStateController statusBarStateController,
+ VibratorHelper vibratorHelper,
+ BubbleController bubbleController,
+ NotificationGroupManager groupManager,
+ NotificationGroupAlertTransferHelper groupAlertTransferHelper,
+ VisualStabilityManager visualStabilityManager,
+ DeviceProvisionedController deviceProvisionedController,
+ NavigationBarController navigationBarController,
+ AssistManager assistManager,
+ NotificationListener notificationListener,
+ ConfigurationController configurationController,
+ StatusBarWindowController statusBarWindowController,
+ StatusBarWindowViewController.Builder statusBarWindowViewControllerBuilder,
+ NotifLog notifLog,
+ DozeParameters dozeParameters,
+ ScrimController scrimController,
+ @Nullable KeyguardLiftController keyguardLiftController,
+ Lazy<LockscreenWallpaper> lockscreenWallpaperLazy,
+ Lazy<BiometricUnlockController> biometricUnlockControllerLazy,
+ DozeServiceHost dozeServiceHost,
+ PowerManager powerManager,
+ DozeScrimController dozeScrimController,
+ CommandQueue commandQueue,
+ PluginManager pluginManager,
+ RemoteInputUriController remoteInputUriController) {
+ return new StatusBar(
+ context,
+ featureFlags,
+ lightBarController,
+ autoHideController,
+ keyguardUpdateMonitor,
+ statusBarIconController,
+ dozeLog,
+ injectionInflationController,
+ pulseExpansionHandler,
+ notificationWakeUpCoordinator,
+ keyguardBypassController,
+ keyguardStateController,
+ headsUpManagerPhone,
+ dynamicPrivacyController,
+ bypassHeadsUpNotifier,
+ allowNotificationLongPress,
+ newNotifPipeline,
+ falsingManager,
+ broadcastDispatcher,
+ remoteInputQuickSettingsDisabler,
+ notificationGutsManager,
+ notificationLogger,
+ notificationEntryManager,
+ notificationInterruptionStateProvider,
+ notificationViewHierarchyManager,
+ foregroundServiceController,
+ appOpsController,
+ keyguardViewMediator,
+ zenModeController,
+ notificationAlertingManager,
+ displayMetrics,
+ metricsLogger,
+ uiOffloadThread,
+ notificationMediaManager,
+ lockScreenUserManager,
+ remoteInputManager,
+ userSwitcherController,
+ networkController,
+ batteryController,
+ colorExtractor,
+ screenLifecycle,
+ wakefulnessLifecycle,
+ statusBarStateController,
+ vibratorHelper,
+ bubbleController,
+ groupManager,
+ groupAlertTransferHelper,
+ visualStabilityManager,
+ deviceProvisionedController,
+ navigationBarController,
+ assistManager,
+ notificationListener,
+ configurationController,
+ statusBarWindowController,
+ statusBarWindowViewControllerBuilder,
+ notifLog,
+ dozeParameters,
+ scrimController,
+ keyguardLiftController,
+ lockscreenWallpaperLazy,
+ biometricUnlockControllerLazy,
+ dozeServiceHost,
+ powerManager,
+ dozeScrimController,
+ commandQueue,
+ pluginManager,
+ remoteInputUriController);
+ }
+
}
diff --git a/packages/SystemUI/src/com/android/systemui/dagger/SystemUIModule.java b/packages/SystemUI/src/com/android/systemui/dagger/SystemUIModule.java
index ca8e53deffdc..9e7f6c683bbe 100644
--- a/packages/SystemUI/src/com/android/systemui/dagger/SystemUIModule.java
+++ b/packages/SystemUI/src/com/android/systemui/dagger/SystemUIModule.java
@@ -21,16 +21,19 @@ import android.content.Context;
import android.content.pm.PackageManager;
import com.android.keyguard.KeyguardUpdateMonitor;
+import com.android.systemui.DumpController;
import com.android.systemui.assist.AssistModule;
import com.android.systemui.model.SysUiState;
import com.android.systemui.plugins.statusbar.StatusBarStateController;
import com.android.systemui.statusbar.notification.people.PeopleHubModule;
import com.android.systemui.statusbar.phone.KeyguardLiftController;
+import com.android.systemui.statusbar.phone.StatusBar;
import com.android.systemui.util.sensors.AsyncSensorManager;
import javax.inject.Singleton;
import dagger.Binds;
+import dagger.BindsOptionalOf;
import dagger.Module;
import dagger.Provides;
@@ -52,12 +55,13 @@ public abstract class SystemUIModule {
static KeyguardLiftController provideKeyguardLiftController(Context context,
StatusBarStateController statusBarStateController,
AsyncSensorManager asyncSensorManager,
- KeyguardUpdateMonitor keyguardUpdateMonitor) {
+ KeyguardUpdateMonitor keyguardUpdateMonitor,
+ DumpController dumpController) {
if (!context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_FACE)) {
return null;
}
return new KeyguardLiftController(statusBarStateController, asyncSensorManager,
- keyguardUpdateMonitor);
+ keyguardUpdateMonitor, dumpController);
}
@Singleton
@@ -65,4 +69,7 @@ public abstract class SystemUIModule {
static SysUiState provideSysUiState() {
return new SysUiState();
}
+
+ @BindsOptionalOf
+ abstract StatusBar optionalStatusBar();
}
diff --git a/packages/SystemUI/src/com/android/systemui/doze/DozeFactory.java b/packages/SystemUI/src/com/android/systemui/doze/DozeFactory.java
index 33f68cfc1492..eaa72dc4fb8c 100644
--- a/packages/SystemUI/src/com/android/systemui/doze/DozeFactory.java
+++ b/packages/SystemUI/src/com/android/systemui/doze/DozeFactory.java
@@ -29,6 +29,7 @@ import android.os.Handler;
import com.android.keyguard.KeyguardUpdateMonitor;
import com.android.systemui.R;
import com.android.systemui.SystemUIApplication;
+import com.android.systemui.broadcast.BroadcastDispatcher;
import com.android.systemui.dock.DockManager;
import com.android.systemui.keyguard.WakefulnessLifecycle;
import com.android.systemui.plugins.FalsingManager;
@@ -58,6 +59,7 @@ public class DozeFactory {
private final DelayedWakeLock.Builder mDelayedWakeLockBuilder;
private final Handler mHandler;
private final BiometricUnlockController mBiometricUnlockController;
+ private final BroadcastDispatcher mBroadcastDispatcher;
@Inject
public DozeFactory(FalsingManager falsingManager, DozeLog dozeLog,
@@ -67,7 +69,8 @@ public class DozeFactory {
DockManager dockManager, @Nullable IWallpaperManager wallpaperManager,
ProximitySensor proximitySensor,
DelayedWakeLock.Builder delayedWakeLockBuilder, Handler handler,
- BiometricUnlockController biometricUnlockController) {
+ BiometricUnlockController biometricUnlockController,
+ BroadcastDispatcher broadcastDispatcher) {
mFalsingManager = falsingManager;
mDozeLog = dozeLog;
mDozeParameters = dozeParameters;
@@ -82,6 +85,7 @@ public class DozeFactory {
mDelayedWakeLockBuilder = delayedWakeLockBuilder;
mHandler = handler;
mBiometricUnlockController = biometricUnlockController;
+ mBroadcastDispatcher = broadcastDispatcher;
}
/** Creates a DozeMachine with its parts for {@code dozeService}. */
@@ -123,8 +127,8 @@ public class DozeFactory {
DozeParameters params, Handler handler) {
Sensor sensor = DozeSensors.findSensorWithType(sensorManager,
context.getString(R.string.doze_brightness_sensor_type));
- return new DozeScreenBrightness(context, service, sensorManager, sensor, host, handler,
- params.getPolicy());
+ return new DozeScreenBrightness(context, service, sensorManager, sensor,
+ mBroadcastDispatcher, host, handler, params.getPolicy());
}
private DozeTriggers createDozeTriggers(Context context, AsyncSensorManager sensorManager,
@@ -134,7 +138,7 @@ public class DozeFactory {
boolean allowPulseTriggers = true;
return new DozeTriggers(context, machine, host, alarmManager, config, params,
sensorManager, handler, wakeLock, allowPulseTriggers, dockManager,
- mProximitySensor, dozeLog);
+ mProximitySensor, dozeLog, mBroadcastDispatcher);
}
diff --git a/packages/SystemUI/src/com/android/systemui/doze/DozeScreenBrightness.java b/packages/SystemUI/src/com/android/systemui/doze/DozeScreenBrightness.java
index bd6882c01bbd..39a256248aae 100644
--- a/packages/SystemUI/src/com/android/systemui/doze/DozeScreenBrightness.java
+++ b/packages/SystemUI/src/com/android/systemui/doze/DozeScreenBrightness.java
@@ -31,6 +31,7 @@ import android.os.UserHandle;
import android.provider.Settings;
import com.android.internal.annotations.VisibleForTesting;
+import com.android.systemui.broadcast.BroadcastDispatcher;
/**
* Controls the screen brightness when dozing.
@@ -49,6 +50,7 @@ public class DozeScreenBrightness extends BroadcastReceiver implements DozeMachi
private final Handler mHandler;
private final SensorManager mSensorManager;
private final Sensor mLightSensor;
+ private final BroadcastDispatcher mBroadcastDispatcher;
private final int[] mSensorToBrightness;
private final int[] mSensorToScrimOpacity;
private final boolean mDebuggable;
@@ -69,13 +71,15 @@ public class DozeScreenBrightness extends BroadcastReceiver implements DozeMachi
@VisibleForTesting
public DozeScreenBrightness(Context context, DozeMachine.Service service,
- SensorManager sensorManager, Sensor lightSensor, DozeHost host,
+ SensorManager sensorManager, Sensor lightSensor,
+ BroadcastDispatcher broadcastDispatcher, DozeHost host,
Handler handler, int defaultDozeBrightness, int[] sensorToBrightness,
int[] sensorToScrimOpacity, boolean debuggable) {
mContext = context;
mDozeService = service;
mSensorManager = sensorManager;
mLightSensor = lightSensor;
+ mBroadcastDispatcher = broadcastDispatcher;
mDozeHost = host;
mHandler = handler;
mDebuggable = debuggable;
@@ -87,14 +91,15 @@ public class DozeScreenBrightness extends BroadcastReceiver implements DozeMachi
if (mDebuggable) {
IntentFilter filter = new IntentFilter();
filter.addAction(ACTION_AOD_BRIGHTNESS);
- mContext.registerReceiverAsUser(this, UserHandle.ALL, filter, null, handler);
+ mBroadcastDispatcher.registerReceiver(this, filter, handler, UserHandle.ALL);
}
}
public DozeScreenBrightness(Context context, DozeMachine.Service service,
- SensorManager sensorManager, Sensor lightSensor, DozeHost host,
- Handler handler, AlwaysOnDisplayPolicy policy) {
- this(context, service, sensorManager, lightSensor, host, handler,
+ SensorManager sensorManager, Sensor lightSensor,
+ BroadcastDispatcher broadcastDispatcher, DozeHost host, Handler handler,
+ AlwaysOnDisplayPolicy policy) {
+ this(context, service, sensorManager, lightSensor, broadcastDispatcher, host, handler,
context.getResources().getInteger(
com.android.internal.R.integer.config_screenBrightnessDoze),
policy.screenBrightnessArray, policy.dimmingScrimArray, DEBUG_AOD_BRIGHTNESS);
@@ -127,7 +132,7 @@ public class DozeScreenBrightness extends BroadcastReceiver implements DozeMachi
private void onDestroy() {
setLightSensorEnabled(false);
if (mDebuggable) {
- mContext.unregisterReceiver(this);
+ mBroadcastDispatcher.unregisterReceiver(this);
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/doze/DozeTriggers.java b/packages/SystemUI/src/com/android/systemui/doze/DozeTriggers.java
index b212884ebb98..1134268aa5c6 100644
--- a/packages/SystemUI/src/com/android/systemui/doze/DozeTriggers.java
+++ b/packages/SystemUI/src/com/android/systemui/doze/DozeTriggers.java
@@ -36,6 +36,7 @@ import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.logging.MetricsLogger;
import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
import com.android.systemui.Dependency;
+import com.android.systemui.broadcast.BroadcastDispatcher;
import com.android.systemui.dock.DockManager;
import com.android.systemui.statusbar.phone.DozeParameters;
import com.android.systemui.util.Assert;
@@ -80,6 +81,7 @@ public class DozeTriggers implements DozeMachine.Part {
private final DockEventListener mDockEventListener = new DockEventListener();
private final DockManager mDockManager;
private final ProximitySensor.ProximityCheck mProxCheck;
+ private final BroadcastDispatcher mBroadcastDispatcher;
private long mNotificationPulseTime;
private boolean mPulsePending;
@@ -91,7 +93,7 @@ public class DozeTriggers implements DozeMachine.Part {
DozeParameters dozeParameters, AsyncSensorManager sensorManager, Handler handler,
WakeLock wakeLock, boolean allowPulseTriggers, DockManager dockManager,
ProximitySensor proximitySensor,
- DozeLog dozeLog) {
+ DozeLog dozeLog, BroadcastDispatcher broadcastDispatcher) {
mContext = context;
mMachine = machine;
mDozeHost = dozeHost;
@@ -107,6 +109,7 @@ public class DozeTriggers implements DozeMachine.Part {
mDockManager = dockManager;
mProxCheck = new ProximitySensor.ProximityCheck(proximitySensor, handler);
mDozeLog = dozeLog;
+ mBroadcastDispatcher = broadcastDispatcher;
}
private void onNotification(Runnable onPulseSuppressedListener) {
@@ -299,7 +302,7 @@ public class DozeTriggers implements DozeMachine.Part {
public void transitionTo(DozeMachine.State oldState, DozeMachine.State newState) {
switch (newState) {
case INITIALIZED:
- mBroadcastReceiver.register(mContext);
+ mBroadcastReceiver.register(mBroadcastDispatcher);
mDozeHost.addCallback(mHostCallback);
if (mDockManager != null) {
mDockManager.addListener(mDockEventListener);
@@ -334,7 +337,7 @@ public class DozeTriggers implements DozeMachine.Part {
mDozeSensors.updateListening();
break;
case FINISH:
- mBroadcastReceiver.unregister(mContext);
+ mBroadcastReceiver.unregister(mBroadcastDispatcher);
mDozeHost.removeCallback(mHostCallback);
if (mDockManager != null) {
mDockManager.removeListener(mDockEventListener);
@@ -437,22 +440,22 @@ public class DozeTriggers implements DozeMachine.Part {
}
}
- public void register(Context context) {
+ public void register(BroadcastDispatcher broadcastDispatcher) {
if (mRegistered) {
return;
}
IntentFilter filter = new IntentFilter(PULSE_ACTION);
filter.addAction(UiModeManager.ACTION_ENTER_CAR_MODE);
filter.addAction(Intent.ACTION_USER_SWITCHED);
- context.registerReceiver(this, filter);
+ broadcastDispatcher.registerReceiver(this, filter);
mRegistered = true;
}
- public void unregister(Context context) {
+ public void unregister(BroadcastDispatcher broadcastDispatcher) {
if (!mRegistered) {
return;
}
- context.unregisterReceiver(this);
+ broadcastDispatcher.unregisterReceiver(this);
mRegistered = false;
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsComponent.java b/packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsComponent.java
index c11127d1dc0b..19b6f8232a9a 100644
--- a/packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsComponent.java
+++ b/packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsComponent.java
@@ -20,7 +20,6 @@ import android.os.ServiceManager;
import com.android.internal.statusbar.IStatusBarService;
import com.android.systemui.Dependency;
-import com.android.systemui.SysUiServiceProvider;
import com.android.systemui.SystemUI;
import com.android.systemui.plugins.GlobalActions;
import com.android.systemui.plugins.GlobalActions.GlobalActionsManager;
@@ -29,14 +28,24 @@ import com.android.systemui.statusbar.CommandQueue.Callbacks;
import com.android.systemui.statusbar.policy.ExtensionController;
import com.android.systemui.statusbar.policy.ExtensionController.Extension;
+import javax.inject.Inject;
+import javax.inject.Singleton;
+
+/**
+ * Manages power menu plugins and communicates power menu actions to the StatusBar.
+ */
+@Singleton
public class GlobalActionsComponent extends SystemUI implements Callbacks, GlobalActionsManager {
+ private final CommandQueue mCommandQueue;
private GlobalActions mPlugin;
private Extension<GlobalActions> mExtension;
private IStatusBarService mBarService;
- public GlobalActionsComponent(Context context) {
+ @Inject
+ public GlobalActionsComponent(Context context, CommandQueue commandQueue) {
super(context);
+ mCommandQueue = commandQueue;
}
@Override
@@ -45,11 +54,11 @@ public class GlobalActionsComponent extends SystemUI implements Callbacks, Globa
ServiceManager.getService(Context.STATUS_BAR_SERVICE));
mExtension = Dependency.get(ExtensionController.class).newExtension(GlobalActions.class)
.withPlugin(GlobalActions.class)
- .withDefault(() -> new GlobalActionsImpl(mContext))
+ .withDefault(() -> new GlobalActionsImpl(mContext, mCommandQueue))
.withCallback(this::onExtensionCallback)
.build();
mPlugin = mExtension.get();
- SysUiServiceProvider.getComponent(mContext, CommandQueue.class).addCallback(this);
+ mCommandQueue.addCallback(this);
}
private void onExtensionCallback(GlobalActions newPlugin) {
diff --git a/packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsDialog.java b/packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsDialog.java
index 22846bc02a38..bb2d142c11a1 100644
--- a/packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsDialog.java
+++ b/packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsDialog.java
@@ -52,6 +52,7 @@ import android.os.Vibrator;
import android.provider.Settings;
import android.service.dreams.DreamService;
import android.service.dreams.IDreamManager;
+import android.telecom.TelecomManager;
import android.telephony.PhoneStateListener;
import android.telephony.ServiceState;
import android.telephony.TelephonyManager;
@@ -145,6 +146,7 @@ public class GlobalActionsDialog implements DialogInterface.OnDismissListener,
private final DevicePolicyManager mDevicePolicyManager;
private final LockPatternUtils mLockPatternUtils;
private final KeyguardManager mKeyguardManager;
+ private final BroadcastDispatcher mBroadcastDispatcher;
private ArrayList<Action> mItems;
private ActionsDialog mDialog;
@@ -182,13 +184,14 @@ public class GlobalActionsDialog implements DialogInterface.OnDismissListener,
Context.DEVICE_POLICY_SERVICE);
mLockPatternUtils = new LockPatternUtils(mContext);
mKeyguardManager = (KeyguardManager) mContext.getSystemService(Context.KEYGUARD_SERVICE);
+ mBroadcastDispatcher = Dependency.get(BroadcastDispatcher.class);
// receive broadcasts
IntentFilter filter = new IntentFilter();
filter.addAction(Intent.ACTION_CLOSE_SYSTEM_DIALOGS);
filter.addAction(Intent.ACTION_SCREEN_OFF);
filter.addAction(TelephonyIntents.ACTION_EMERGENCY_CALLBACK_MODE_CHANGED);
- Dependency.get(BroadcastDispatcher.class).registerReceiver(mBroadcastReceiver, filter);
+ mBroadcastDispatcher.registerReceiver(mBroadcastReceiver, filter);
ConnectivityManager cm = (ConnectivityManager)
context.getSystemService(Context.CONNECTIVITY_SERVICE);
@@ -563,7 +566,8 @@ public class GlobalActionsDialog implements DialogInterface.OnDismissListener,
@Override
public void onPress() {
MetricsLogger.action(mContext, MetricsEvent.ACTION_EMERGENCY_DIALER_FROM_POWER_MENU);
- Intent intent = new Intent(EmergencyDialerConstants.ACTION_DIAL);
+ Intent intent = mContext.getSystemService(TelecomManager.class)
+ .createLaunchEmergencyDialerIntent(null /* number */);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK
| Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS
| Intent.FLAG_ACTIVITY_CLEAR_TOP);
@@ -899,7 +903,7 @@ public class GlobalActionsDialog implements DialogInterface.OnDismissListener,
mAdapter.notifyDataSetChanged();
if (mShowSilentToggle) {
IntentFilter filter = new IntentFilter(AudioManager.RINGER_MODE_CHANGED_ACTION);
- mContext.registerReceiver(mRingerModeReceiver, filter);
+ mBroadcastDispatcher.registerReceiver(mRingerModeReceiver, filter);
}
}
@@ -917,7 +921,7 @@ public class GlobalActionsDialog implements DialogInterface.OnDismissListener,
mWindowManagerFuncs.onGlobalActionsHidden();
if (mShowSilentToggle) {
try {
- mContext.unregisterReceiver(mRingerModeReceiver);
+ mBroadcastDispatcher.unregisterReceiver(mRingerModeReceiver);
} catch (IllegalArgumentException ie) {
// ignore this
Log.w(TAG, ie);
diff --git a/packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsImpl.java b/packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsImpl.java
index b9fe827bb1c9..d5f5a5a00500 100644
--- a/packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsImpl.java
+++ b/packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsImpl.java
@@ -33,16 +33,18 @@ import com.android.internal.colorextraction.drawable.ScrimDrawable;
import com.android.keyguard.KeyguardUpdateMonitor;
import com.android.settingslib.Utils;
import com.android.systemui.Dependency;
-import com.android.systemui.SysUiServiceProvider;
import com.android.systemui.colorextraction.SysuiColorExtractor;
import com.android.systemui.plugins.GlobalActions;
import com.android.systemui.plugins.GlobalActionsPanelPlugin;
+import com.android.systemui.plugins.PluginListener;
+import com.android.systemui.shared.plugins.PluginManager;
import com.android.systemui.statusbar.CommandQueue;
import com.android.systemui.statusbar.policy.DeviceProvisionedController;
import com.android.systemui.statusbar.policy.ExtensionController;
import com.android.systemui.statusbar.policy.KeyguardStateController;
-public class GlobalActionsImpl implements GlobalActions, CommandQueue.Callbacks {
+public class GlobalActionsImpl implements GlobalActions, CommandQueue.Callbacks,
+ PluginListener<GlobalActionsPanelPlugin> {
private static final float SHUTDOWN_SCRIM_ALPHA = 0.95f;
@@ -50,23 +52,35 @@ public class GlobalActionsImpl implements GlobalActions, CommandQueue.Callbacks
private final KeyguardStateController mKeyguardStateController;
private final DeviceProvisionedController mDeviceProvisionedController;
private final ExtensionController.Extension<GlobalActionsPanelPlugin> mPanelExtension;
+ private GlobalActionsPanelPlugin mPlugin;
+ private final CommandQueue mCommandQueue;
private GlobalActionsDialog mGlobalActions;
private boolean mDisabled;
+ private final PluginManager mPluginManager;
+ private final String mPluginPackageName;
- public GlobalActionsImpl(Context context) {
+ public GlobalActionsImpl(Context context, CommandQueue commandQueue) {
mContext = context;
mKeyguardStateController = Dependency.get(KeyguardStateController.class);
mDeviceProvisionedController = Dependency.get(DeviceProvisionedController.class);
- SysUiServiceProvider.getComponent(context, CommandQueue.class).addCallback(this);
+ mPluginManager = Dependency.get(PluginManager.class);
+ mCommandQueue = commandQueue;
+ mCommandQueue.addCallback(this);
mPanelExtension = Dependency.get(ExtensionController.class)
.newExtension(GlobalActionsPanelPlugin.class)
.withPlugin(GlobalActionsPanelPlugin.class)
.build();
+ mPluginPackageName = mContext.getString(
+ com.android.systemui.R.string.config_controlsPluginPackageName);
+ mPluginManager.addPluginListener(
+ GlobalActionsPanelPlugin.ACTION, this, GlobalActionsPanelPlugin.class, true);
}
@Override
public void destroy() {
- SysUiServiceProvider.getComponent(mContext, CommandQueue.class).removeCallback(this);
+ mCommandQueue.removeCallback(this);
+ mPluginManager.removePluginListener(this);
+ if (mPlugin != null) mPlugin.onDestroy();
if (mGlobalActions != null) {
mGlobalActions.destroy();
mGlobalActions = null;
@@ -81,7 +95,7 @@ public class GlobalActionsImpl implements GlobalActions, CommandQueue.Callbacks
}
mGlobalActions.showDialog(mKeyguardStateController.isShowing(),
mDeviceProvisionedController.isDeviceProvisioned(),
- mPanelExtension.get());
+ mPlugin != null ? mPlugin : mPanelExtension.get());
Dependency.get(KeyguardUpdateMonitor.class).requestFaceAuth();
}
@@ -144,4 +158,16 @@ public class GlobalActionsImpl implements GlobalActions, CommandQueue.Callbacks
mGlobalActions.dismissDialog();
}
}
+
+ @Override
+ public void onPluginConnected(GlobalActionsPanelPlugin plugin, Context pluginContext) {
+ if (pluginContext.getPackageName().equals(mPluginPackageName)) {
+ mPlugin = plugin;
+ }
+ }
+
+ @Override
+ public void onPluginDisconnected(GlobalActionsPanelPlugin plugin) {
+ mPlugin = null;
+ }
}
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java
index 411bf9a80dca..3b1edcca5b74 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java
@@ -87,6 +87,7 @@ import com.android.systemui.R;
import com.android.systemui.SystemUI;
import com.android.systemui.SystemUIFactory;
import com.android.systemui.UiOffloadThread;
+import com.android.systemui.broadcast.BroadcastDispatcher;
import com.android.systemui.plugins.FalsingManager;
import com.android.systemui.statusbar.phone.BiometricUnlockController;
import com.android.systemui.statusbar.phone.KeyguardBypassController;
@@ -319,6 +320,7 @@ public class KeyguardViewMediator extends SystemUI {
*/
private boolean mWaitingUntilKeyguardVisible = false;
private final LockPatternUtils mLockPatternUtils;
+ private final BroadcastDispatcher mBroadcastDispatcher;
private boolean mKeyguardDonePending = false;
private boolean mHideAnimationRun = false;
private boolean mHideAnimationRunning = false;
@@ -685,8 +687,10 @@ public class KeyguardViewMediator extends SystemUI {
public KeyguardViewMediator(
Context context,
FalsingManager falsingManager,
- LockPatternUtils lockPatternUtils) {
- this(context, falsingManager, lockPatternUtils, SystemUIFactory.getInstance());
+ LockPatternUtils lockPatternUtils,
+ BroadcastDispatcher broadcastDispatcher) {
+ this(context, falsingManager, lockPatternUtils, broadcastDispatcher,
+ SystemUIFactory.getInstance());
}
@VisibleForTesting
@@ -694,10 +698,12 @@ public class KeyguardViewMediator extends SystemUI {
Context context,
FalsingManager falsingManager,
LockPatternUtils lockPatternUtils,
+ BroadcastDispatcher broadcastDispatcher,
SystemUIFactory systemUIFactory) {
super(context);
mFalsingManager = falsingManager;
mLockPatternUtils = lockPatternUtils;
+ mBroadcastDispatcher = broadcastDispatcher;
mStatusBarKeyguardViewManager = systemUIFactory.createStatusBarKeyguardViewManager(
mContext,
mViewMediatorCallback,
@@ -722,7 +728,7 @@ public class KeyguardViewMediator extends SystemUI {
IntentFilter filter = new IntentFilter();
filter.addAction(Intent.ACTION_SHUTDOWN);
- mContext.registerReceiver(mBroadcastReceiver, filter);
+ mBroadcastDispatcher.registerReceiver(mBroadcastReceiver, filter);
final IntentFilter delayedActionFilter = new IntentFilter();
delayedActionFilter.addAction(DELAYED_KEYGUARD_ACTION);
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/WorkLockActivity.java b/packages/SystemUI/src/com/android/systemui/keyguard/WorkLockActivity.java
index 4d061e18ebba..86c532cdb773 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/WorkLockActivity.java
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/WorkLockActivity.java
@@ -36,6 +36,9 @@ import android.view.View;
import com.android.internal.annotations.VisibleForTesting;
import com.android.systemui.R;
+import com.android.systemui.broadcast.BroadcastDispatcher;
+
+import javax.inject.Inject;
/**
* Bouncer between work activities and the activity used to confirm credentials before unlocking
@@ -67,14 +70,21 @@ public class WorkLockActivity extends Activity {
* @see KeyguardManager
*/
private KeyguardManager mKgm;
+ private final BroadcastDispatcher mBroadcastDispatcher;
+
+ @Inject
+ public WorkLockActivity(BroadcastDispatcher broadcastDispatcher) {
+ super();
+ mBroadcastDispatcher = broadcastDispatcher;
+ }
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
- registerReceiverAsUser(mLockEventReceiver, UserHandle.ALL,
- new IntentFilter(Intent.ACTION_DEVICE_LOCKED_CHANGED), /* permission */ null,
- /* scheduler */ null);
+ mBroadcastDispatcher.registerReceiver(mLockEventReceiver,
+ new IntentFilter(Intent.ACTION_DEVICE_LOCKED_CHANGED), null /* handler */,
+ UserHandle.ALL);
// Once the receiver is registered, check whether anything happened between now and the time
// when this activity was launched. If it did and the user is unlocked now, just quit.
diff --git a/packages/SystemUI/src/com/android/systemui/pip/BasePipManager.java b/packages/SystemUI/src/com/android/systemui/pip/BasePipManager.java
index 05be4259dd3b..75e260e7fa70 100644
--- a/packages/SystemUI/src/com/android/systemui/pip/BasePipManager.java
+++ b/packages/SystemUI/src/com/android/systemui/pip/BasePipManager.java
@@ -19,10 +19,12 @@ package com.android.systemui.pip;
import android.content.Context;
import android.content.res.Configuration;
+import com.android.systemui.broadcast.BroadcastDispatcher;
+
import java.io.PrintWriter;
public interface BasePipManager {
- void initialize(Context context);
+ void initialize(Context context, BroadcastDispatcher broadcastDispatcher);
void showPictureInPictureMenu();
default void expandPip() {}
default void hidePipMenu(Runnable onStartCallback, Runnable onEndCallback) {}
diff --git a/packages/SystemUI/src/com/android/systemui/pip/PipUI.java b/packages/SystemUI/src/com/android/systemui/pip/PipUI.java
index f1e801b3a474..583ce67e26d4 100644
--- a/packages/SystemUI/src/com/android/systemui/pip/PipUI.java
+++ b/packages/SystemUI/src/com/android/systemui/pip/PipUI.java
@@ -26,6 +26,7 @@ import android.os.UserHandle;
import android.os.UserManager;
import com.android.systemui.SystemUI;
+import com.android.systemui.broadcast.BroadcastDispatcher;
import com.android.systemui.statusbar.CommandQueue;
import java.io.FileDescriptor;
@@ -40,13 +41,18 @@ import javax.inject.Singleton;
@Singleton
public class PipUI extends SystemUI implements CommandQueue.Callbacks {
+ private final CommandQueue mCommandQueue;
private BasePipManager mPipManager;
+ private final BroadcastDispatcher mBroadcastDispatcher;
private boolean mSupportsPip;
@Inject
- public PipUI(Context context) {
+ public PipUI(Context context, CommandQueue commandQueue,
+ BroadcastDispatcher broadcastDispatcher) {
super(context);
+ mBroadcastDispatcher = broadcastDispatcher;
+ mCommandQueue = commandQueue;
}
@Override
@@ -66,9 +72,9 @@ public class PipUI extends SystemUI implements CommandQueue.Callbacks {
mPipManager = pm.hasSystemFeature(FEATURE_LEANBACK_ONLY)
? com.android.systemui.pip.tv.PipManager.getInstance()
: com.android.systemui.pip.phone.PipManager.getInstance();
- mPipManager.initialize(mContext);
+ mPipManager.initialize(mContext, mBroadcastDispatcher);
- getComponent(CommandQueue.class).addCallback(this);
+ mCommandQueue.addCallback(this);
}
@Override
diff --git a/packages/SystemUI/src/com/android/systemui/pip/phone/PipManager.java b/packages/SystemUI/src/com/android/systemui/pip/phone/PipManager.java
index 369073c6564d..c33b8d9fbd90 100644
--- a/packages/SystemUI/src/com/android/systemui/pip/phone/PipManager.java
+++ b/packages/SystemUI/src/com/android/systemui/pip/phone/PipManager.java
@@ -37,6 +37,7 @@ import android.view.IPinnedStackController;
import com.android.systemui.Dependency;
import com.android.systemui.UiOffloadThread;
+import com.android.systemui.broadcast.BroadcastDispatcher;
import com.android.systemui.pip.BasePipManager;
import com.android.systemui.pip.PipBoundsHandler;
import com.android.systemui.shared.system.ActivityManagerWrapper;
@@ -200,7 +201,7 @@ public class PipManager implements BasePipManager {
/**
* Initializes {@link PipManager}.
*/
- public void initialize(Context context) {
+ public void initialize(Context context, BroadcastDispatcher broadcastDispatcher) {
mContext = context;
mActivityManager = ActivityManager.getService();
mActivityTaskManager = ActivityTaskManager.getService();
@@ -214,7 +215,7 @@ public class PipManager implements BasePipManager {
mPipBoundsHandler = new PipBoundsHandler(context);
mInputConsumerController = InputConsumerController.getPipInputConsumer();
- mMediaController = new PipMediaController(context, mActivityManager);
+ mMediaController = new PipMediaController(context, mActivityManager, broadcastDispatcher);
mMenuController = new PipMenuActivityController(context, mActivityManager, mMediaController,
mInputConsumerController);
mTouchHandler = new PipTouchHandler(context, mActivityManager, mActivityTaskManager,
diff --git a/packages/SystemUI/src/com/android/systemui/pip/phone/PipMediaController.java b/packages/SystemUI/src/com/android/systemui/pip/phone/PipMediaController.java
index 174a7ef19cbd..e57b4166937f 100644
--- a/packages/SystemUI/src/com/android/systemui/pip/phone/PipMediaController.java
+++ b/packages/SystemUI/src/com/android/systemui/pip/phone/PipMediaController.java
@@ -37,6 +37,7 @@ import android.os.UserHandle;
import com.android.systemui.Dependency;
import com.android.systemui.R;
+import com.android.systemui.broadcast.BroadcastDispatcher;
import com.android.systemui.statusbar.policy.UserInfoController;
import java.util.ArrayList;
@@ -109,7 +110,8 @@ public class PipMediaController {
private ArrayList<ActionListener> mListeners = new ArrayList<>();
- public PipMediaController(Context context, IActivityManager activityManager) {
+ public PipMediaController(Context context, IActivityManager activityManager,
+ BroadcastDispatcher broadcastDispatcher) {
mContext = context;
mActivityManager = activityManager;
IntentFilter mediaControlFilter = new IntentFilter();
@@ -117,7 +119,7 @@ public class PipMediaController {
mediaControlFilter.addAction(ACTION_PAUSE);
mediaControlFilter.addAction(ACTION_NEXT);
mediaControlFilter.addAction(ACTION_PREV);
- mContext.registerReceiver(mPlayPauseActionReceiver, mediaControlFilter);
+ broadcastDispatcher.registerReceiver(mPlayPauseActionReceiver, mediaControlFilter);
createMediaActions();
mMediaSessionManager =
diff --git a/packages/SystemUI/src/com/android/systemui/pip/tv/PipManager.java b/packages/SystemUI/src/com/android/systemui/pip/tv/PipManager.java
index 81d6973efb2a..195fca85a314 100644
--- a/packages/SystemUI/src/com/android/systemui/pip/tv/PipManager.java
+++ b/packages/SystemUI/src/com/android/systemui/pip/tv/PipManager.java
@@ -48,6 +48,7 @@ import android.view.DisplayInfo;
import com.android.systemui.Dependency;
import com.android.systemui.R;
import com.android.systemui.UiOffloadThread;
+import com.android.systemui.broadcast.BroadcastDispatcher;
import com.android.systemui.pip.BasePipManager;
import com.android.systemui.pip.PipBoundsHandler;
import com.android.systemui.shared.system.ActivityManagerWrapper;
@@ -227,7 +228,7 @@ public class PipManager implements BasePipManager {
/**
* Initializes {@link PipManager}.
*/
- public void initialize(Context context) {
+ public void initialize(Context context, BroadcastDispatcher broadcastDispatcher) {
if (mInitialized) {
return;
}
@@ -238,8 +239,8 @@ public class PipManager implements BasePipManager {
ActivityManagerWrapper.getInstance().registerTaskStackListener(mTaskStackListener);
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction(Intent.ACTION_MEDIA_RESOURCE_GRANTED);
- mContext.registerReceiverAsUser(mBroadcastReceiver, UserHandle.ALL, intentFilter,
- null, null);
+ broadcastDispatcher.registerReceiver(mBroadcastReceiver, intentFilter,
+ null /* handler */, UserHandle.ALL);
if (sSettingsPackageAndClassNamePairList == null) {
String[] settings = mContext.getResources().getStringArray(
@@ -286,7 +287,7 @@ public class PipManager implements BasePipManager {
Log.e(TAG, "Failed to register pinned stack listener", e);
}
- mPipNotification = new PipNotification(context);
+ mPipNotification = new PipNotification(context, broadcastDispatcher);
}
private void loadConfigurationsAndApply(Configuration newConfig) {
diff --git a/packages/SystemUI/src/com/android/systemui/pip/tv/PipNotification.java b/packages/SystemUI/src/com/android/systemui/pip/tv/PipNotification.java
index d50f294e4999..ca1513128e56 100644
--- a/packages/SystemUI/src/com/android/systemui/pip/tv/PipNotification.java
+++ b/packages/SystemUI/src/com/android/systemui/pip/tv/PipNotification.java
@@ -34,6 +34,7 @@ import android.util.Log;
import com.android.internal.messages.nano.SystemMessageProto.SystemMessage;
import com.android.systemui.R;
+import com.android.systemui.broadcast.BroadcastDispatcher;
import com.android.systemui.util.NotificationChannels;
/**
@@ -143,7 +144,7 @@ public class PipNotification {
}
};
- public PipNotification(Context context) {
+ public PipNotification(Context context, BroadcastDispatcher broadcastDispatcher) {
mNotificationManager = (NotificationManager) context.getSystemService(
Context.NOTIFICATION_SERVICE);
@@ -161,7 +162,7 @@ public class PipNotification {
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction(ACTION_MENU);
intentFilter.addAction(ACTION_CLOSE);
- context.registerReceiver(mEventReceiver, intentFilter);
+ broadcastDispatcher.registerReceiver(mEventReceiver, intentFilter);
onConfigurationChanged(context);
}
diff --git a/packages/SystemUI/src/com/android/systemui/privacy/PrivacyItemController.kt b/packages/SystemUI/src/com/android/systemui/privacy/PrivacyItemController.kt
index 22fb4c0dbdb5..d592492820c1 100644
--- a/packages/SystemUI/src/com/android/systemui/privacy/PrivacyItemController.kt
+++ b/packages/SystemUI/src/com/android/systemui/privacy/PrivacyItemController.kt
@@ -22,7 +22,11 @@ import android.content.BroadcastReceiver
import android.content.Context
import android.content.Intent
import android.content.IntentFilter
-import android.os.*
+import android.os.Handler
+import android.os.Looper
+import android.os.Message
+import android.os.UserHandle
+import android.os.UserManager
import android.provider.DeviceConfig
import com.android.internal.annotations.VisibleForTesting
import com.android.internal.config.sysui.SystemUiDeviceConfigFlags
@@ -30,6 +34,7 @@ import com.android.systemui.Dumpable
import com.android.systemui.R
import com.android.systemui.appops.AppOpItem
import com.android.systemui.appops.AppOpsController
+import com.android.systemui.broadcast.BroadcastDispatcher
import com.android.systemui.dagger.qualifiers.BgHandler
import com.android.systemui.dagger.qualifiers.MainHandler
import java.io.FileDescriptor
@@ -43,10 +48,11 @@ fun isPermissionsHubEnabled() = DeviceConfig.getBoolean(DeviceConfig.NAMESPACE_P
@Singleton
class PrivacyItemController @Inject constructor(
- val context: Context,
+ private val context: Context,
private val appOpsController: AppOpsController,
@MainHandler private val uiHandler: Handler,
- @BgHandler private val bgHandler: Handler
+ @BgHandler private val bgHandler: Handler,
+ private val broadcastDispatcher: BroadcastDispatcher
) : Dumpable {
@VisibleForTesting
@@ -134,15 +140,15 @@ class PrivacyItemController @Inject constructor(
}
private fun unregisterReceiver() {
- context.unregisterReceiver(userSwitcherReceiver)
+ broadcastDispatcher.unregisterReceiver(userSwitcherReceiver)
}
private fun registerReceiver() {
- context.registerReceiverAsUser(userSwitcherReceiver, UserHandle.ALL, IntentFilter().apply {
+ broadcastDispatcher.registerReceiver(userSwitcherReceiver, IntentFilter().apply {
intents.forEach {
addAction(it)
}
- }, null, null)
+ }, null /* handler */, UserHandle.ALL)
}
private fun update(updateUsers: Boolean) {
@@ -248,20 +254,20 @@ class PrivacyItemController @Inject constructor(
}
}
- override fun dump(fd: FileDescriptor?, pw: PrintWriter?, args: Array<out String>?) {
- pw?.println("PrivacyItemController state:")
- pw?.println(" Listening: $listening")
- pw?.println(" Current user ids: $currentUserIds")
- pw?.println(" Privacy Items:")
+ override fun dump(fd: FileDescriptor, pw: PrintWriter, args: Array<out String>) {
+ pw.println("PrivacyItemController state:")
+ pw.println(" Listening: $listening")
+ pw.println(" Current user ids: $currentUserIds")
+ pw.println(" Privacy Items:")
privacyList.forEach {
- pw?.print(" ")
- pw?.println(it.toString())
+ pw.print(" ")
+ pw.println(it.toString())
}
- pw?.println(" Callbacks:")
+ pw.println(" Callbacks:")
callbacks.forEach {
it.get()?.let {
- pw?.print(" ")
- pw?.println(it.toString())
+ pw.print(" ")
+ pw.println(it.toString())
}
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSAnimator.java b/packages/SystemUI/src/com/android/systemui/qs/QSAnimator.java
index a267bbb92ee7..a0ea7fae493d 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/QSAnimator.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/QSAnimator.java
@@ -14,7 +14,6 @@
package com.android.systemui.qs;
-import android.provider.Settings;
import android.util.Log;
import android.view.View;
import android.view.View.OnAttachStateChangeListener;
@@ -31,6 +30,7 @@ import com.android.systemui.qs.TouchAnimator.Builder;
import com.android.systemui.qs.TouchAnimator.Listener;
import com.android.systemui.tuner.TunerService;
import com.android.systemui.tuner.TunerService.Tunable;
+import com.android.systemui.util.Utils;
import java.util.ArrayList;
import java.util.Collection;
@@ -270,9 +270,7 @@ public class QSAnimator implements Callback, PageListener, Listener, OnLayoutCha
}
- int flag = Settings.System.getInt(mQsPanel.getContext().getContentResolver(),
- "qs_media_player", 0);
- if (flag == 1) {
+ if (Utils.useQsMediaPlayer(mQsPanel.getContext())) {
View qsMediaView = mQsPanel.getMediaPanel();
View qqsMediaView = mQuickQsPanel.getMediaPlayer().getView();
translationXBuilder.addFloat(qsMediaView, "alpha", 0, 1);
diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSDetail.java b/packages/SystemUI/src/com/android/systemui/qs/QSDetail.java
index 496aa0e572ae..60d30da431a5 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/QSDetail.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/QSDetail.java
@@ -38,7 +38,6 @@ import com.android.internal.logging.MetricsLogger;
import com.android.systemui.Dependency;
import com.android.systemui.FontSizeUtils;
import com.android.systemui.R;
-import com.android.systemui.SysUiServiceProvider;
import com.android.systemui.plugins.ActivityStarter;
import com.android.systemui.plugins.qs.DetailAdapter;
import com.android.systemui.statusbar.CommandQueue;
@@ -169,8 +168,7 @@ public class QSDetail extends LinearLayout {
setupDetailHeader(adapter);
if (toggleQs && !mFullyExpanded) {
mTriggeredExpand = true;
- SysUiServiceProvider.getComponent(mContext, CommandQueue.class)
- .animateExpandSettingsPanel(null);
+ Dependency.get(CommandQueue.class).animateExpandSettingsPanel(null);
} else {
mTriggeredExpand = false;
}
@@ -181,8 +179,7 @@ public class QSDetail extends LinearLayout {
x = mOpenX;
y = mOpenY;
if (toggleQs && mTriggeredExpand) {
- SysUiServiceProvider.getComponent(mContext, CommandQueue.class)
- .animateCollapsePanels();
+ Dependency.get(CommandQueue.class).animateCollapsePanels();
mTriggeredExpand = false;
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSFragment.java b/packages/SystemUI/src/com/android/systemui/qs/QSFragment.java
index 0a3b43a78f13..ccc836f50c7b 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/QSFragment.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/QSFragment.java
@@ -38,7 +38,6 @@ import androidx.annotation.VisibleForTesting;
import com.android.systemui.Interpolators;
import com.android.systemui.R;
import com.android.systemui.R.id;
-import com.android.systemui.SysUiServiceProvider;
import com.android.systemui.plugins.qs.QS;
import com.android.systemui.plugins.statusbar.StatusBarStateController;
import com.android.systemui.qs.customize.QSCustomizer;
@@ -97,11 +96,10 @@ public class QSFragment extends LifecycleFragment implements QS, CommandQueue.Ca
InjectionInflationController injectionInflater,
Context context,
QSTileHost qsTileHost,
- StatusBarStateController statusBarStateController) {
+ StatusBarStateController statusBarStateController, CommandQueue commandQueue) {
mRemoteInputQuickSettingsDisabler = remoteInputQsDisabler;
mInjectionInflater = injectionInflater;
- SysUiServiceProvider.getComponent(context, CommandQueue.class)
- .observe(getLifecycle(), this);
+ commandQueue.observe(getLifecycle(), this);
mHost = qsTileHost;
mStatusBarStateController = statusBarStateController;
}
diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSPanel.java b/packages/SystemUI/src/com/android/systemui/qs/QSPanel.java
index b48814bfd6bd..cac90257cd43 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/QSPanel.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/QSPanel.java
@@ -18,6 +18,7 @@ package com.android.systemui.qs;
import static com.android.systemui.qs.tileimpl.QSTileImpl.getColorForState;
import static com.android.systemui.util.InjectionInflationController.VIEW_CONTEXT;
+import static com.android.systemui.util.Utils.useQsMediaPlayer;
import android.annotation.Nullable;
import android.content.ComponentName;
@@ -49,6 +50,7 @@ import com.android.systemui.Dependency;
import com.android.systemui.DumpController;
import com.android.systemui.Dumpable;
import com.android.systemui.R;
+import com.android.systemui.broadcast.BroadcastDispatcher;
import com.android.systemui.plugins.qs.DetailAdapter;
import com.android.systemui.plugins.qs.QSTile;
import com.android.systemui.plugins.qs.QSTileView;
@@ -124,12 +126,13 @@ public class QSPanel extends LinearLayout implements Tunable, Callback, Brightne
}
public QSPanel(Context context, AttributeSet attrs, DumpController dumpController) {
- this(context, attrs, dumpController, null);
+ this(context, attrs, dumpController, null, Dependency.get(BroadcastDispatcher.class));
}
@Inject
public QSPanel(@Named(VIEW_CONTEXT) Context context, AttributeSet attrs,
- DumpController dumpController, PluginManager pluginManager) {
+ DumpController dumpController, PluginManager pluginManager,
+ BroadcastDispatcher broadcastDispatcher) {
super(context, attrs);
mContext = context;
@@ -150,8 +153,7 @@ public class QSPanel extends LinearLayout implements Tunable, Callback, Brightne
addDivider();
// Add media carousel
- int flag = Settings.System.getInt(context.getContentResolver(), "qs_media_player", 0);
- if (flag == 1) {
+ if (useQsMediaPlayer(context)) {
HorizontalScrollView mediaScrollView = new HorizontalScrollView(mContext);
mediaScrollView.setHorizontalScrollBarEnabled(false);
int playerHeight = (int) getResources().getDimension(R.dimen.qs_media_height);
@@ -177,7 +179,7 @@ public class QSPanel extends LinearLayout implements Tunable, Callback, Brightne
updateResources();
mBrightnessController = new BrightnessController(getContext(),
- findViewById(R.id.brightness_slider));
+ findViewById(R.id.brightness_slider), broadcastDispatcher);
mDumpController = dumpController;
mPluginManager = pluginManager;
if (mPluginManager != null && Settings.System.getInt(
@@ -201,8 +203,7 @@ public class QSPanel extends LinearLayout implements Tunable, Callback, Brightne
*/
public void addMediaSession(MediaSession.Token token, Icon icon, int iconColor, int bgColor,
View actionsContainer, StatusBarNotification notif) {
- int flag = Settings.System.getInt(mContext.getContentResolver(), "qs_media_player", 0);
- if (flag != 1) {
+ if (!useQsMediaPlayer(mContext)) {
// Shouldn't happen, but just in case
Log.e(TAG, "Tried to add media session without player!");
return;
diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSTileHost.java b/packages/SystemUI/src/com/android/systemui/qs/QSTileHost.java
index b395c3c336d3..6d434b19d3a3 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/QSTileHost.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/QSTileHost.java
@@ -34,6 +34,7 @@ import com.android.systemui.DumpController;
import com.android.systemui.Dumpable;
import com.android.systemui.R;
import com.android.systemui.SysUiServiceProvider;
+import com.android.systemui.broadcast.BroadcastDispatcher;
import com.android.systemui.dagger.qualifiers.BgLooper;
import com.android.systemui.dagger.qualifiers.MainHandler;
import com.android.systemui.plugins.PluginListener;
@@ -80,6 +81,7 @@ public class QSTileHost implements QSHost, Tunable, PluginListener<QSFactory>, D
private final TunerService mTunerService;
private final PluginManager mPluginManager;
private final DumpController mDumpController;
+ private final BroadcastDispatcher mBroadcastDispatcher;
private final List<Callback> mCallbacks = new ArrayList<>();
private AutoTileManager mAutoTiles;
@@ -99,14 +101,16 @@ public class QSTileHost implements QSHost, Tunable, PluginListener<QSFactory>, D
PluginManager pluginManager,
TunerService tunerService,
Provider<AutoTileManager> autoTiles,
- DumpController dumpController) {
+ DumpController dumpController,
+ BroadcastDispatcher broadcastDispatcher) {
mIconController = iconController;
mContext = context;
mTunerService = tunerService;
mPluginManager = pluginManager;
mDumpController = dumpController;
+ mBroadcastDispatcher = broadcastDispatcher;
- mServices = new TileServices(this, bgLooper);
+ mServices = new TileServices(this, bgLooper, mBroadcastDispatcher);
defaultFactory.setHost(this);
mQsFactories.add(defaultFactory);
@@ -334,7 +338,8 @@ public class QSTileHost implements QSHost, Tunable, PluginListener<QSFactory>, D
Intent intent = new Intent().setComponent(component);
TileLifecycleManager lifecycleManager = new TileLifecycleManager(new Handler(),
mContext, mServices, new Tile(), intent,
- new UserHandle(ActivityManager.getCurrentUser()));
+ new UserHandle(ActivityManager.getCurrentUser()),
+ mBroadcastDispatcher);
lifecycleManager.onStopListening();
lifecycleManager.onTileRemoved();
TileLifecycleManager.setTileAdded(mContext, component, false);
diff --git a/packages/SystemUI/src/com/android/systemui/qs/QuickQSPanel.java b/packages/SystemUI/src/com/android/systemui/qs/QuickQSPanel.java
index dcd4633a79d2..94a1cf0c4e35 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/QuickQSPanel.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/QuickQSPanel.java
@@ -21,7 +21,6 @@ import static com.android.systemui.util.InjectionInflationController.VIEW_CONTEX
import android.content.Context;
import android.content.res.Configuration;
import android.graphics.Rect;
-import android.provider.Settings;
import android.util.AttributeSet;
import android.view.Gravity;
import android.view.View;
@@ -36,6 +35,7 @@ import com.android.systemui.plugins.qs.QSTile.State;
import com.android.systemui.qs.customize.QSCustomizer;
import com.android.systemui.tuner.TunerService;
import com.android.systemui.tuner.TunerService.Tunable;
+import com.android.systemui.util.Utils;
import java.util.ArrayList;
import java.util.Collection;
@@ -72,8 +72,7 @@ public class QuickQSPanel extends QSPanel {
removeView((View) mTileLayout);
}
- int flag = Settings.System.getInt(context.getContentResolver(), "qs_media_player", 0);
- if (flag == 1) {
+ if (Utils.useQsMediaPlayer(context)) {
LinearLayout mHorizontalLinearLayout = new LinearLayout(mContext);
mHorizontalLinearLayout.setOrientation(LinearLayout.HORIZONTAL);
mHorizontalLinearLayout.setClipChildren(false);
diff --git a/packages/SystemUI/src/com/android/systemui/qs/QuickStatusBarHeader.java b/packages/SystemUI/src/com/android/systemui/qs/QuickStatusBarHeader.java
index 592e3881ea97..19af235b4f68 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/QuickStatusBarHeader.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/QuickStatusBarHeader.java
@@ -17,6 +17,7 @@ package com.android.systemui.qs;
import static android.app.StatusBarManager.DISABLE2_QUICK_SETTINGS;
import static com.android.systemui.util.InjectionInflationController.VIEW_CONTEXT;
+import static com.android.systemui.util.Utils.useQsMediaPlayer;
import android.annotation.ColorInt;
import android.app.ActivityManager;
@@ -60,6 +61,7 @@ import com.android.settingslib.Utils;
import com.android.systemui.BatteryMeterView;
import com.android.systemui.DualToneHandler;
import com.android.systemui.R;
+import com.android.systemui.broadcast.BroadcastDispatcher;
import com.android.systemui.plugins.ActivityStarter;
import com.android.systemui.plugins.DarkIconDispatcher;
import com.android.systemui.plugins.DarkIconDispatcher.DarkReceiver;
@@ -69,6 +71,7 @@ import com.android.systemui.privacy.PrivacyItem;
import com.android.systemui.privacy.PrivacyItemController;
import com.android.systemui.privacy.PrivacyItemControllerKt;
import com.android.systemui.qs.QSDetail.Callback;
+import com.android.systemui.statusbar.CommandQueue;
import com.android.systemui.statusbar.phone.PhoneStatusBarView;
import com.android.systemui.statusbar.phone.StatusBarIconController;
import com.android.systemui.statusbar.phone.StatusBarIconController.TintedIconManager;
@@ -123,6 +126,7 @@ public class QuickStatusBarHeader extends RelativeLayout implements
private TouchAnimator mHeaderTextContainerAlphaAnimator;
private TouchAnimator mPrivacyChipAlphaAnimator;
private DualToneHandler mDualToneHandler;
+ private final CommandQueue mCommandQueue;
private View mSystemIconsView;
private View mQuickQsStatusIcons;
@@ -147,6 +151,7 @@ public class QuickStatusBarHeader extends RelativeLayout implements
private boolean mPermissionsHubEnabled;
private PrivacyItemController mPrivacyItemController;
+ private BroadcastDispatcher mBroadcastDispatcher;
private final BroadcastReceiver mRingerReceiver = new BroadcastReceiver() {
@Override
@@ -185,7 +190,8 @@ public class QuickStatusBarHeader extends RelativeLayout implements
public QuickStatusBarHeader(@Named(VIEW_CONTEXT) Context context, AttributeSet attrs,
NextAlarmController nextAlarmController, ZenModeController zenModeController,
StatusBarIconController statusBarIconController,
- ActivityStarter activityStarter, PrivacyItemController privacyItemController) {
+ ActivityStarter activityStarter, PrivacyItemController privacyItemController,
+ CommandQueue commandQueue, BroadcastDispatcher broadcastDispatcher) {
super(context, attrs);
mAlarmController = nextAlarmController;
mZenController = zenModeController;
@@ -194,6 +200,8 @@ public class QuickStatusBarHeader extends RelativeLayout implements
mPrivacyItemController = privacyItemController;
mDualToneHandler = new DualToneHandler(
new ContextThemeWrapper(context, R.style.QSHeaderTheme));
+ mBroadcastDispatcher = broadcastDispatcher;
+ mCommandQueue = commandQueue;
}
@Override
@@ -207,7 +215,7 @@ public class QuickStatusBarHeader extends RelativeLayout implements
// Ignore privacy icons because they show in the space above QQS
iconContainer.addIgnoredSlots(getIgnoredIconSlots());
iconContainer.setShouldRestrictIcons(false);
- mIconManager = new TintedIconManager(iconContainer);
+ mIconManager = new TintedIconManager(iconContainer, mCommandQueue);
// Views corresponding to the header info section (e.g. ringer and next alarm).
mHeaderTextContainerView = findViewById(R.id.header_text_container);
@@ -393,11 +401,10 @@ public class QuickStatusBarHeader extends RelativeLayout implements
FrameLayout.LayoutParams lp = (FrameLayout.LayoutParams) getLayoutParams();
- int flag = Settings.System.getInt(mContext.getContentResolver(), "qs_media_player", 0);
if (mQsDisabled) {
lp.height = resources.getDimensionPixelSize(
com.android.internal.R.dimen.quick_qs_offset_height);
- } else if (flag == 1) {
+ } else if (useQsMediaPlayer(mContext)) {
lp.height = Math.max(getMinimumHeight(),
resources.getDimensionPixelSize(
com.android.internal.R.dimen.quick_qs_total_height_with_media));
@@ -547,14 +554,14 @@ public class QuickStatusBarHeader extends RelativeLayout implements
if (listening) {
mZenController.addCallback(this);
mAlarmController.addCallback(this);
- mContext.registerReceiver(mRingerReceiver,
+ mBroadcastDispatcher.registerReceiver(mRingerReceiver,
new IntentFilter(AudioManager.INTERNAL_RINGER_MODE_CHANGED_ACTION));
mPrivacyItemController.addCallback(mPICCallback);
} else {
mZenController.removeCallback(this);
mAlarmController.removeCallback(this);
mPrivacyItemController.removeCallback(mPICCallback);
- mContext.unregisterReceiver(mRingerReceiver);
+ mBroadcastDispatcher.unregisterReceiver(mRingerReceiver);
mPrivacyChipLogged = false;
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/qs/external/TileLifecycleManager.java b/packages/SystemUI/src/com/android/systemui/qs/external/TileLifecycleManager.java
index f59e0c2d9bc2..926141297add 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/external/TileLifecycleManager.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/external/TileLifecycleManager.java
@@ -38,6 +38,8 @@ import android.util.Log;
import androidx.annotation.VisibleForTesting;
+import com.android.systemui.broadcast.BroadcastDispatcher;
+
import java.util.Objects;
import java.util.Set;
@@ -72,6 +74,7 @@ public class TileLifecycleManager extends BroadcastReceiver implements
private final UserHandle mUser;
private final IBinder mToken = new Binder();
private final PackageManagerAdapter mPackageManagerAdapter;
+ private final BroadcastDispatcher mBroadcastDispatcher;
private Set<Integer> mQueuedMessages = new ArraySet<>();
private QSTileServiceWrapper mWrapper;
@@ -88,13 +91,15 @@ public class TileLifecycleManager extends BroadcastReceiver implements
private boolean mIsBound;
public TileLifecycleManager(Handler handler, Context context, IQSService service, Tile tile,
- Intent intent, UserHandle user) {
- this(handler, context, service, tile, intent, user, new PackageManagerAdapter(context));
+ Intent intent, UserHandle user, BroadcastDispatcher broadcastDispatcher) {
+ this(handler, context, service, tile, intent, user, new PackageManagerAdapter(context),
+ broadcastDispatcher);
}
@VisibleForTesting
TileLifecycleManager(Handler handler, Context context, IQSService service, Tile tile,
- Intent intent, UserHandle user, PackageManagerAdapter packageManagerAdapter) {
+ Intent intent, UserHandle user, PackageManagerAdapter packageManagerAdapter,
+ BroadcastDispatcher broadcastDispatcher) {
mContext = context;
mHandler = handler;
mIntent = intent;
@@ -102,6 +107,7 @@ public class TileLifecycleManager extends BroadcastReceiver implements
mIntent.putExtra(TileService.EXTRA_TOKEN, mToken);
mUser = user;
mPackageManagerAdapter = packageManagerAdapter;
+ mBroadcastDispatcher = broadcastDispatcher;
if (DEBUG) Log.d(TAG, "Creating " + mIntent + " " + mUser);
}
@@ -306,13 +312,14 @@ public class TileLifecycleManager extends BroadcastReceiver implements
filter.addDataScheme("package");
mContext.registerReceiverAsUser(this, mUser, filter, null, mHandler);
filter = new IntentFilter(Intent.ACTION_USER_UNLOCKED);
- mContext.registerReceiverAsUser(this, mUser, filter, null, mHandler);
+ mBroadcastDispatcher.registerReceiver(this, filter, mHandler, mUser);
mReceiverRegistered = true;
}
private void stopPackageListening() {
if (DEBUG) Log.d(TAG, "stopPackageListening");
mContext.unregisterReceiver(this);
+ mBroadcastDispatcher.unregisterReceiver(this);
mReceiverRegistered = false;
}
diff --git a/packages/SystemUI/src/com/android/systemui/qs/external/TileServiceManager.java b/packages/SystemUI/src/com/android/systemui/qs/external/TileServiceManager.java
index 0b4e6485551c..1902d655abc3 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/external/TileServiceManager.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/external/TileServiceManager.java
@@ -34,6 +34,7 @@ import android.util.Log;
import androidx.annotation.VisibleForTesting;
+import com.android.systemui.broadcast.BroadcastDispatcher;
import com.android.systemui.qs.external.TileLifecycleManager.TileChangeListener;
import java.util.List;
@@ -72,10 +73,10 @@ public class TileServiceManager {
private boolean mStarted = false;
TileServiceManager(TileServices tileServices, Handler handler, ComponentName component,
- Tile tile) {
+ Tile tile, BroadcastDispatcher broadcastDispatcher) {
this(tileServices, handler, new TileLifecycleManager(handler,
tileServices.getContext(), tileServices, tile, new Intent().setComponent(component),
- new UserHandle(ActivityManager.getCurrentUser())));
+ new UserHandle(ActivityManager.getCurrentUser()), broadcastDispatcher));
}
@VisibleForTesting
diff --git a/packages/SystemUI/src/com/android/systemui/qs/external/TileServices.java b/packages/SystemUI/src/com/android/systemui/qs/external/TileServices.java
index 13cfa78b7c1e..db7c6ad69d23 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/external/TileServices.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/external/TileServices.java
@@ -37,6 +37,7 @@ import android.util.Log;
import com.android.internal.statusbar.StatusBarIcon;
import com.android.systemui.Dependency;
+import com.android.systemui.broadcast.BroadcastDispatcher;
import com.android.systemui.qs.QSTileHost;
import com.android.systemui.statusbar.phone.StatusBarIconController;
import com.android.systemui.statusbar.policy.KeyguardStateController;
@@ -60,13 +61,15 @@ public class TileServices extends IQSService.Stub {
private final Handler mHandler;
private final Handler mMainHandler;
private final QSTileHost mHost;
+ private final BroadcastDispatcher mBroadcastDispatcher;
private int mMaxBound = DEFAULT_MAX_BOUND;
- public TileServices(QSTileHost host, Looper looper) {
+ public TileServices(QSTileHost host, Looper looper, BroadcastDispatcher broadcastDispatcher) {
mHost = host;
mContext = mHost.getContext();
- mContext.registerReceiver(mRequestListeningReceiver,
+ mBroadcastDispatcher = broadcastDispatcher;
+ mBroadcastDispatcher.registerReceiver(mRequestListeningReceiver,
new IntentFilter(TileService.ACTION_REQUEST_LISTENING));
mHandler = new Handler(looper);
mMainHandler = new Handler(Looper.getMainLooper());
@@ -82,7 +85,8 @@ public class TileServices extends IQSService.Stub {
public TileServiceManager getTileWrapper(CustomTile tile) {
ComponentName component = tile.getComponent();
- TileServiceManager service = onCreateTileService(component, tile.getQsTile());
+ TileServiceManager service = onCreateTileService(component, tile.getQsTile(),
+ mBroadcastDispatcher);
synchronized (mServices) {
mServices.put(tile, service);
mTiles.put(component, tile);
@@ -93,8 +97,10 @@ public class TileServices extends IQSService.Stub {
return service;
}
- protected TileServiceManager onCreateTileService(ComponentName component, Tile tile) {
- return new TileServiceManager(this, mHandler, component, tile);
+ protected TileServiceManager onCreateTileService(ComponentName component, Tile tile,
+ BroadcastDispatcher broadcastDispatcher) {
+ return new TileServiceManager(this, mHandler, component, tile,
+ broadcastDispatcher);
}
public void freeService(CustomTile tile, TileServiceManager service) {
@@ -323,7 +329,7 @@ public class TileServices extends IQSService.Stub {
public void destroy() {
synchronized (mServices) {
mServices.values().forEach(service -> service.handleDestroy());
- mContext.unregisterReceiver(mRequestListeningReceiver);
+ mBroadcastDispatcher.unregisterReceiver(mRequestListeningReceiver);
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/AirplaneModeTile.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/AirplaneModeTile.java
index 19e20a93ce66..da74663191f2 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/tiles/AirplaneModeTile.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/AirplaneModeTile.java
@@ -33,6 +33,7 @@ import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
import com.android.internal.telephony.TelephonyIntents;
import com.android.internal.telephony.TelephonyProperties;
import com.android.systemui.R;
+import com.android.systemui.broadcast.BroadcastDispatcher;
import com.android.systemui.plugins.ActivityStarter;
import com.android.systemui.plugins.qs.QSTile.BooleanState;
import com.android.systemui.qs.GlobalSetting;
@@ -46,13 +47,16 @@ public class AirplaneModeTile extends QSTileImpl<BooleanState> {
private final Icon mIcon = ResourceIcon.get(com.android.internal.R.drawable.ic_qs_airplane);
private final GlobalSetting mSetting;
private final ActivityStarter mActivityStarter;
+ private final BroadcastDispatcher mBroadcastDispatcher;
private boolean mListening;
@Inject
- public AirplaneModeTile(QSHost host, ActivityStarter activityStarter) {
+ public AirplaneModeTile(QSHost host, ActivityStarter activityStarter,
+ BroadcastDispatcher broadcastDispatcher) {
super(host);
mActivityStarter = activityStarter;
+ mBroadcastDispatcher = broadcastDispatcher;
mSetting = new GlobalSetting(mContext, mHandler, Global.AIRPLANE_MODE_ON) {
@Override
@@ -133,9 +137,9 @@ public class AirplaneModeTile extends QSTileImpl<BooleanState> {
if (listening) {
final IntentFilter filter = new IntentFilter();
filter.addAction(Intent.ACTION_AIRPLANE_MODE_CHANGED);
- mContext.registerReceiver(mReceiver, filter);
+ mBroadcastDispatcher.registerReceiver(mReceiver, filter);
} else {
- mContext.unregisterReceiver(mReceiver);
+ mBroadcastDispatcher.unregisterReceiver(mReceiver);
}
mSetting.setListening(listening);
}
diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/DndTile.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/DndTile.java
index 869fa6b18245..52d1a5b3b991 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/tiles/DndTile.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/DndTile.java
@@ -52,6 +52,7 @@ import com.android.settingslib.notification.EnableZenModeDialog;
import com.android.systemui.Prefs;
import com.android.systemui.R;
import com.android.systemui.SysUIToast;
+import com.android.systemui.broadcast.BroadcastDispatcher;
import com.android.systemui.plugins.ActivityStarter;
import com.android.systemui.plugins.qs.DetailAdapter;
import com.android.systemui.plugins.qs.QSTile.BooleanState;
@@ -78,6 +79,7 @@ public class DndTile extends QSTileImpl<BooleanState> {
private final ZenModeController mController;
private final DndDetailAdapter mDetailAdapter;
private final ActivityStarter mActivityStarter;
+ private final BroadcastDispatcher mBroadcastDispatcher;
private boolean mListening;
private boolean mShowingDetail;
@@ -85,12 +87,13 @@ public class DndTile extends QSTileImpl<BooleanState> {
@Inject
public DndTile(QSHost host, ZenModeController zenModeController,
- ActivityStarter activityStarter) {
+ ActivityStarter activityStarter, BroadcastDispatcher broadcastDispatcher) {
super(host);
mController = zenModeController;
mActivityStarter = activityStarter;
mDetailAdapter = new DndDetailAdapter();
- mContext.registerReceiver(mReceiver, new IntentFilter(ACTION_SET_VISIBLE));
+ mBroadcastDispatcher = broadcastDispatcher;
+ broadcastDispatcher.registerReceiver(mReceiver, new IntentFilter(ACTION_SET_VISIBLE));
mReceiverRegistered = true;
mController.observe(getLifecycle(), mZenCallback);
}
@@ -99,7 +102,7 @@ public class DndTile extends QSTileImpl<BooleanState> {
protected void handleDestroy() {
super.handleDestroy();
if (mReceiverRegistered) {
- mContext.unregisterReceiver(mReceiver);
+ mBroadcastDispatcher.unregisterReceiver(mReceiver);
mReceiverRegistered = false;
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/NfcTile.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/NfcTile.java
index 476a239de721..8bbfd243bd42 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/tiles/NfcTile.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/NfcTile.java
@@ -29,6 +29,7 @@ import android.widget.Switch;
import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
import com.android.systemui.R;
+import com.android.systemui.broadcast.BroadcastDispatcher;
import com.android.systemui.plugins.qs.QSTile.BooleanState;
import com.android.systemui.qs.QSHost;
import com.android.systemui.qs.tileimpl.QSTileImpl;
@@ -39,12 +40,14 @@ import javax.inject.Inject;
public class NfcTile extends QSTileImpl<BooleanState> {
private NfcAdapter mAdapter;
+ private BroadcastDispatcher mBroadcastDispatcher;
private boolean mListening;
@Inject
- public NfcTile(QSHost host) {
+ public NfcTile(QSHost host, BroadcastDispatcher broadcastDispatcher) {
super(host);
+ mBroadcastDispatcher = broadcastDispatcher;
}
@Override
@@ -56,10 +59,10 @@ public class NfcTile extends QSTileImpl<BooleanState> {
public void handleSetListening(boolean listening) {
mListening = listening;
if (mListening) {
- mContext.registerReceiver(mNfcReceiver,
+ mBroadcastDispatcher.registerReceiver(mNfcReceiver,
new IntentFilter(NfcAdapter.ACTION_ADAPTER_STATE_CHANGED));
} else {
- mContext.unregisterReceiver(mNfcReceiver);
+ mBroadcastDispatcher.unregisterReceiver(mNfcReceiver);
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/recents/OverviewProxyRecentsImpl.java b/packages/SystemUI/src/com/android/systemui/recents/OverviewProxyRecentsImpl.java
index 958695d3b2ee..7f11e56ba168 100644
--- a/packages/SystemUI/src/com/android/systemui/recents/OverviewProxyRecentsImpl.java
+++ b/packages/SystemUI/src/com/android/systemui/recents/OverviewProxyRecentsImpl.java
@@ -20,6 +20,7 @@ import static android.app.WindowConfiguration.ACTIVITY_TYPE_HOME;
import static android.app.WindowConfiguration.ACTIVITY_TYPE_RECENTS;
import static android.app.WindowConfiguration.ACTIVITY_TYPE_UNDEFINED;
+import android.annotation.Nullable;
import android.app.ActivityManager;
import android.app.trust.TrustManager;
import android.content.Context;
@@ -40,12 +41,22 @@ import com.android.systemui.shared.system.ActivityManagerWrapper;
import com.android.systemui.stackdivider.Divider;
import com.android.systemui.statusbar.phone.StatusBar;
+import java.util.Optional;
+
+import javax.inject.Inject;
+import javax.inject.Singleton;
+
+import dagger.Lazy;
+
/**
* An implementation of the Recents interface which proxies to the OverviewProxyService.
*/
+@Singleton
public class OverviewProxyRecentsImpl implements RecentsImplementation {
private final static String TAG = "OverviewProxyRecentsImpl";
+ @Nullable
+ private final Lazy<StatusBar> mStatusBarLazy;
private SysUiServiceProvider mSysUiServiceProvider;
private Context mContext;
@@ -53,6 +64,12 @@ public class OverviewProxyRecentsImpl implements RecentsImplementation {
private TrustManager mTrustManager;
private OverviewProxyService mOverviewProxyService;
+ @SuppressWarnings("OptionalUsedAsFieldOrParameterType")
+ @Inject
+ public OverviewProxyRecentsImpl(Optional<Lazy<StatusBar>> statusBarLazy) {
+ mStatusBarLazy = statusBarLazy.orElse(null);
+ }
+
@Override
public void onStart(Context context, SysUiServiceProvider sysUiServiceProvider) {
mContext = context;
@@ -107,9 +124,8 @@ public class OverviewProxyRecentsImpl implements RecentsImplementation {
}
};
// Preload only if device for current user is unlocked
- final StatusBar statusBar = mSysUiServiceProvider.getComponent(StatusBar.class);
- if (statusBar != null && statusBar.isKeyguardShowing()) {
- statusBar.executeRunnableDismissingKeyguard(() -> {
+ if (mStatusBarLazy != null && mStatusBarLazy.get().isKeyguardShowing()) {
+ mStatusBarLazy.get().executeRunnableDismissingKeyguard(() -> {
// Flush trustmanager before checking device locked per user
mTrustManager.reportKeyguardShowingChanged();
mHandler.post(toggleRecents);
diff --git a/packages/SystemUI/src/com/android/systemui/recents/Recents.java b/packages/SystemUI/src/com/android/systemui/recents/Recents.java
index 0a8264bcef87..a8ecc1275221 100644
--- a/packages/SystemUI/src/com/android/systemui/recents/Recents.java
+++ b/packages/SystemUI/src/com/android/systemui/recents/Recents.java
@@ -29,23 +29,27 @@ import java.io.FileDescriptor;
import java.io.PrintWriter;
import javax.inject.Inject;
+import javax.inject.Singleton;
/**
* A proxy to a Recents implementation.
*/
+@Singleton
public class Recents extends SystemUI implements CommandQueue.Callbacks {
private final RecentsImplementation mImpl;
+ private final CommandQueue mCommandQueue;
@Inject
- public Recents(Context context, RecentsImplementation impl) {
+ public Recents(Context context, RecentsImplementation impl, CommandQueue commandQueue) {
super(context);
mImpl = impl;
+ mCommandQueue = commandQueue;
}
@Override
public void start() {
- getComponent(CommandQueue.class).addCallback(this);
+ mCommandQueue.addCallback(this);
putComponent(Recents.class, this);
mImpl.onStart(mContext, this);
}
diff --git a/packages/SystemUI/src/com/android/systemui/recents/RecentsImplementation.java b/packages/SystemUI/src/com/android/systemui/recents/RecentsImplementation.java
index 3efed3fe2c4d..8cd17e9a1728 100644
--- a/packages/SystemUI/src/com/android/systemui/recents/RecentsImplementation.java
+++ b/packages/SystemUI/src/com/android/systemui/recents/RecentsImplementation.java
@@ -23,7 +23,10 @@ import com.android.systemui.SysUiServiceProvider;
import java.io.PrintWriter;
-interface RecentsImplementation {
+/**
+ * API for creating a Recents view.
+ */
+public interface RecentsImplementation {
default void onStart(Context context, SysUiServiceProvider sysUiServiceProvider) {}
default void onBootCompleted() {}
default void onAppTransitionFinished() {}
diff --git a/packages/SystemUI/src/com/android/systemui/recents/RecentsModule.java b/packages/SystemUI/src/com/android/systemui/recents/RecentsModule.java
index 55552850890f..f57bfad890ff 100644
--- a/packages/SystemUI/src/com/android/systemui/recents/RecentsModule.java
+++ b/packages/SystemUI/src/com/android/systemui/recents/RecentsModule.java
@@ -19,35 +19,53 @@ package com.android.systemui.recents;
import android.content.Context;
import com.android.systemui.R;
+import com.android.systemui.dagger.ContextComponentHelper;
+import dagger.Binds;
import dagger.Module;
import dagger.Provides;
+import dagger.multibindings.ClassKey;
+import dagger.multibindings.IntoMap;
/**
* Dagger injection module for {@link RecentsImplementation}
*/
@Module
-public class RecentsModule {
+public abstract class RecentsModule {
+
/**
* @return The {@link RecentsImplementation} from the config.
*/
@Provides
- public RecentsImplementation provideRecentsImpl(Context context) {
+ public static RecentsImplementation provideRecentsImpl(Context context,
+ ContextComponentHelper componentHelper) {
final String clsName = context.getString(R.string.config_recentsComponent);
if (clsName == null || clsName.length() == 0) {
throw new RuntimeException("No recents component configured", null);
}
- Class<?> cls = null;
- try {
- cls = context.getClassLoader().loadClass(clsName);
- } catch (Throwable t) {
- throw new RuntimeException("Error loading recents component: " + clsName, t);
- }
- try {
- RecentsImplementation impl = (RecentsImplementation) cls.newInstance();
- return impl;
- } catch (Throwable t) {
- throw new RuntimeException("Error creating recents component: " + clsName, t);
+ RecentsImplementation impl = componentHelper.resolveRecents(clsName);
+
+ if (impl == null) {
+ Class<?> cls = null;
+ try {
+ cls = context.getClassLoader().loadClass(clsName);
+ } catch (Throwable t) {
+ throw new RuntimeException("Error loading recents component: " + clsName, t);
+ }
+ try {
+ impl = (RecentsImplementation) cls.newInstance();
+ } catch (Throwable t) {
+ throw new RuntimeException("Error creating recents component: " + clsName, t);
+ }
}
+
+ return impl;
}
+
+ /** */
+ @Binds
+ @IntoMap
+ @ClassKey(OverviewProxyRecentsImpl.class)
+ public abstract RecentsImplementation bindOverviewProxyRecentsImpl(
+ OverviewProxyRecentsImpl impl);
}
diff --git a/packages/SystemUI/src/com/android/systemui/screenshot/GlobalScreenshot.java b/packages/SystemUI/src/com/android/systemui/screenshot/GlobalScreenshot.java
index 8670d1bd0ce9..264d644f9057 100644
--- a/packages/SystemUI/src/com/android/systemui/screenshot/GlobalScreenshot.java
+++ b/packages/SystemUI/src/com/android/systemui/screenshot/GlobalScreenshot.java
@@ -17,8 +17,10 @@
package com.android.systemui.screenshot;
import static android.content.Context.NOTIFICATION_SERVICE;
+import static android.provider.DeviceConfig.NAMESPACE_SYSTEMUI;
import static android.view.WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS;
+import static com.android.internal.config.sysui.SystemUiDeviceConfigFlags.SCREENSHOT_CORNER_FLOW;
import static com.android.systemui.screenshot.GlobalScreenshot.EXTRA_ACTION_INTENT;
import static com.android.systemui.screenshot.GlobalScreenshot.EXTRA_CANCEL_NOTIFICATION;
import static com.android.systemui.screenshot.GlobalScreenshot.EXTRA_DISALLOW_ENTER_PIP;
@@ -29,6 +31,7 @@ import android.animation.AnimatorListenerAdapter;
import android.animation.AnimatorSet;
import android.animation.ValueAnimator;
import android.animation.ValueAnimator.AnimatorUpdateListener;
+import android.annotation.Nullable;
import android.app.ActivityOptions;
import android.app.Notification;
import android.app.Notification.BigPictureStyle;
@@ -59,12 +62,17 @@ import android.media.MediaActionSound;
import android.net.Uri;
import android.os.AsyncTask;
import android.os.Environment;
+import android.os.Handler;
+import android.os.Looper;
+import android.os.Message;
import android.os.PowerManager;
import android.os.Process;
import android.os.UserHandle;
+import android.provider.DeviceConfig;
import android.provider.MediaStore;
import android.text.TextUtils;
import android.util.DisplayMetrics;
+import android.util.Log;
import android.util.Slog;
import android.view.Display;
import android.view.LayoutInflater;
@@ -79,8 +87,8 @@ import android.widget.Toast;
import com.android.internal.messages.nano.SystemMessageProto.SystemMessage;
import com.android.systemui.R;
-import com.android.systemui.SysUiServiceProvider;
import com.android.systemui.SystemUI;
+import com.android.systemui.dagger.qualifiers.MainResources;
import com.android.systemui.shared.system.ActivityManagerWrapper;
import com.android.systemui.statusbar.phone.StatusBar;
import com.android.systemui.util.NotificationChannels;
@@ -96,7 +104,10 @@ import java.util.Date;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;
+import java.util.function.Function;
+import javax.inject.Inject;
+import javax.inject.Singleton;
/**
@@ -107,6 +118,7 @@ class SaveImageInBackgroundData {
Bitmap image;
Uri imageUri;
Runnable finisher;
+ Function<PendingIntent, Void> onEditReady;
int iconSize;
int previewWidth;
int previewheight;
@@ -341,6 +353,9 @@ class SaveImageInBackgroundTask extends AsyncTask<Void, Void, Void> {
R.drawable.ic_screenshot_edit,
r.getString(com.android.internal.R.string.screenshot_edit), editAction);
mNotificationBuilder.addAction(editActionBuilder.build());
+ if (editAction != null && mParams.onEditReady != null) {
+ mParams.onEditReady.apply(editAction);
+ }
// Create a delete action for the notification
PendingIntent deleteAction = PendingIntent.getBroadcast(context, requestCode,
@@ -378,40 +393,46 @@ class SaveImageInBackgroundTask extends AsyncTask<Void, Void, Void> {
GlobalScreenshot.notifyScreenshotError(mParams.context, mNotificationManager,
mParams.errorMsgResId);
} else {
- // Show the final notification to indicate screenshot saved
- Context context = mParams.context;
- Resources r = context.getResources();
-
- // Create the intent to show the screenshot in gallery
- Intent launchIntent = new Intent(Intent.ACTION_VIEW);
- launchIntent.setDataAndType(mParams.imageUri, "image/png");
- launchIntent.setFlags(
- Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_GRANT_READ_URI_PERMISSION);
-
- final long now = System.currentTimeMillis();
-
- // Update the text and the icon for the existing notification
- mPublicNotificationBuilder
+ if (mParams.onEditReady != null) {
+ // Cancel the "saving screenshot" notification
+ mNotificationManager.cancel(SystemMessage.NOTE_GLOBAL_SCREENSHOT);
+ } else {
+ // Show the final notification to indicate screenshot saved
+ Context context = mParams.context;
+ Resources r = context.getResources();
+
+ // Create the intent to show the screenshot in gallery
+ Intent launchIntent = new Intent(Intent.ACTION_VIEW);
+ launchIntent.setDataAndType(mParams.imageUri, "image/png");
+ launchIntent.setFlags(
+ Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_GRANT_READ_URI_PERMISSION);
+
+ final long now = System.currentTimeMillis();
+
+ // Update the text and the icon for the existing notification
+ mPublicNotificationBuilder
+ .setContentTitle(r.getString(R.string.screenshot_saved_title))
+ .setContentText(r.getString(R.string.screenshot_saved_text))
+ .setContentIntent(
+ PendingIntent.getActivity(mParams.context, 0, launchIntent, 0))
+ .setWhen(now)
+ .setAutoCancel(true)
+ .setColor(context.getColor(
+ com.android.internal.R.color.system_notification_accent_color));
+ mNotificationBuilder
.setContentTitle(r.getString(R.string.screenshot_saved_title))
.setContentText(r.getString(R.string.screenshot_saved_text))
.setContentIntent(PendingIntent.getActivity(mParams.context, 0, launchIntent, 0))
.setWhen(now)
.setAutoCancel(true)
.setColor(context.getColor(
- com.android.internal.R.color.system_notification_accent_color));
- mNotificationBuilder
- .setContentTitle(r.getString(R.string.screenshot_saved_title))
- .setContentText(r.getString(R.string.screenshot_saved_text))
- .setContentIntent(PendingIntent.getActivity(mParams.context, 0, launchIntent, 0))
- .setWhen(now)
- .setAutoCancel(true)
- .setColor(context.getColor(
- com.android.internal.R.color.system_notification_accent_color))
- .setPublicVersion(mPublicNotificationBuilder.build())
- .setFlag(Notification.FLAG_NO_CLEAR, false);
-
- mNotificationManager.notify(SystemMessage.NOTE_GLOBAL_SCREENSHOT,
- mNotificationBuilder.build());
+ com.android.internal.R.color.system_notification_accent_color))
+ .setPublicVersion(mPublicNotificationBuilder.build())
+ .setFlag(Notification.FLAG_NO_CLEAR, false);
+
+ mNotificationManager.notify(SystemMessage.NOTE_GLOBAL_SCREENSHOT,
+ mNotificationBuilder.build());
+ }
}
mParams.finisher.run();
mParams.clearContext();
@@ -452,7 +473,8 @@ class DeleteImageInBackgroundTask extends AsyncTask<Uri, Void, Void> {
}
}
-class GlobalScreenshot {
+@Singleton
+public class GlobalScreenshot {
static final String SCREENSHOT_URI_ID = "android:screenshot_uri_id";
static final String EXTRA_ACTION_INTENT = "android:screenshot_action_intent";
static final String EXTRA_CANCEL_NOTIFICATION = "android:screenshot_cancel_notification";
@@ -470,8 +492,12 @@ class GlobalScreenshot {
private static final float SCREENSHOT_SCALE = 1f;
private static final float SCREENSHOT_DROP_IN_MIN_SCALE = SCREENSHOT_SCALE * 0.725f;
private static final float SCREENSHOT_DROP_OUT_MIN_SCALE = SCREENSHOT_SCALE * 0.45f;
+ private static final float SCREENSHOT_CORNER_MIN_SCALE = SCREENSHOT_SCALE * 0.2f;
private static final float SCREENSHOT_FAST_DROP_OUT_MIN_SCALE = SCREENSHOT_SCALE * 0.6f;
private static final float SCREENSHOT_DROP_OUT_MIN_SCALE_OFFSET = 0f;
+ private static final float SCREENSHOT_CORNER_MIN_SCALE_OFFSET = .1f;
+ private static final long SCREENSHOT_CORNER_TIMEOUT_MILLIS = 8000;
+ private static final int MESSAGE_CORNER_TIMEOUT = 2;
private final int mPreviewWidth;
private final int mPreviewHeight;
@@ -499,23 +525,34 @@ class GlobalScreenshot {
private MediaActionSound mCameraSound;
+ private final Handler mScreenshotHandler = new Handler(Looper.getMainLooper()) {
+ @Override
+ public void handleMessage(Message msg) {
+ switch (msg.what) {
+ case MESSAGE_CORNER_TIMEOUT:
+ GlobalScreenshot.this.clearScreenshot();
+ break;
+ default:
+ break;
+ }
+ }
+ };
+
/**
* @param context everything needs a context :(
*/
- public GlobalScreenshot(Context context) {
- Resources r = context.getResources();
+ @Inject
+ public GlobalScreenshot(Context context, @MainResources Resources resources,
+ LayoutInflater layoutInflater) {
mContext = context;
- LayoutInflater layoutInflater = (LayoutInflater)
- context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
// Inflate the screenshot layout
mScreenshotLayout = layoutInflater.inflate(R.layout.global_screenshot, null);
- mBackgroundView = (ImageView) mScreenshotLayout.findViewById(R.id.global_screenshot_background);
- mScreenshotView = (ImageView) mScreenshotLayout.findViewById(R.id.global_screenshot);
- mScreenshotFlash = (ImageView) mScreenshotLayout.findViewById(R.id.global_screenshot_flash);
- mScreenshotSelectorView = (ScreenshotSelectorView) mScreenshotLayout.findViewById(
- R.id.global_screenshot_selector);
+ mBackgroundView = mScreenshotLayout.findViewById(R.id.global_screenshot_background);
+ mScreenshotView = mScreenshotLayout.findViewById(R.id.global_screenshot);
+ mScreenshotFlash = mScreenshotLayout.findViewById(R.id.global_screenshot_flash);
+ mScreenshotSelectorView = mScreenshotLayout.findViewById(R.id.global_screenshot_selector);
mScreenshotLayout.setFocusable(true);
mScreenshotSelectorView.setFocusable(true);
mScreenshotSelectorView.setFocusableInTouchMode(true);
@@ -546,16 +583,16 @@ class GlobalScreenshot {
// Get the various target sizes
mNotificationIconSize =
- r.getDimensionPixelSize(android.R.dimen.notification_large_icon_height);
+ resources.getDimensionPixelSize(android.R.dimen.notification_large_icon_height);
// Scale has to account for both sides of the bg
- mBgPadding = (float) r.getDimensionPixelSize(R.dimen.global_screenshot_bg_padding);
+ mBgPadding = (float) resources.getDimensionPixelSize(R.dimen.global_screenshot_bg_padding);
mBgPaddingScale = mBgPadding / mDisplayMetrics.widthPixels;
// determine the optimal preview size
int panelWidth = 0;
try {
- panelWidth = r.getDimensionPixelSize(R.dimen.notification_panel_width);
+ panelWidth = resources.getDimensionPixelSize(R.dimen.notification_panel_width);
} catch (Resources.NotFoundException e) {
}
if (panelWidth <= 0) {
@@ -563,7 +600,7 @@ class GlobalScreenshot {
panelWidth = mDisplayMetrics.widthPixels;
}
mPreviewWidth = panelWidth;
- mPreviewHeight = r.getDimensionPixelSize(R.dimen.notification_max_height);
+ mPreviewHeight = resources.getDimensionPixelSize(R.dimen.notification_max_height);
// Setup the Camera shutter sound
mCameraSound = new MediaActionSound();
@@ -573,12 +610,14 @@ class GlobalScreenshot {
/**
* Creates a new worker thread and saves the screenshot to the media store.
*/
- private void saveScreenshotInWorkerThread(Runnable finisher) {
+ private void saveScreenshotInWorkerThread(
+ Runnable finisher, @Nullable Function<PendingIntent, Void> onEditReady) {
SaveImageInBackgroundData data = new SaveImageInBackgroundData();
data.context = mContext;
data.image = mScreenBitmap;
data.iconSize = mNotificationIconSize;
data.finisher = finisher;
+ data.onEditReady = onEditReady;
data.previewWidth = mPreviewWidth;
data.previewheight = mPreviewHeight;
if (mSaveInBgTask != null) {
@@ -588,6 +627,10 @@ class GlobalScreenshot {
.execute();
}
+ private void saveScreenshotInWorkerThread(Runnable finisher) {
+ saveScreenshotInWorkerThread(finisher, null);
+ }
+
/**
* Takes a screenshot of the current display and shows an animation.
*/
@@ -682,6 +725,22 @@ class GlobalScreenshot {
}
/**
+ * Clears current screenshot
+ */
+ private void clearScreenshot() {
+ if (mScreenshotLayout.isAttachedToWindow()) {
+ mWindowManager.removeView(mScreenshotLayout);
+ }
+
+ // Clear any references to the bitmap
+ mScreenBitmap = null;
+ mScreenshotView.setImageBitmap(null);
+ mBackgroundView.setVisibility(View.GONE);
+ mScreenshotView.setVisibility(View.GONE);
+ mScreenshotView.setLayerType(View.LAYER_TYPE_NONE, null);
+ }
+
+ /**
* Starts the animation after taking the screenshot
*/
private void startAnimation(final Runnable finisher, int w, int h, boolean statusBarVisible,
@@ -705,34 +764,55 @@ class GlobalScreenshot {
mScreenshotAnimation.removeAllListeners();
}
+ boolean useCornerFlow =
+ DeviceConfig.getBoolean(NAMESPACE_SYSTEMUI, SCREENSHOT_CORNER_FLOW, false);
mWindowManager.addView(mScreenshotLayout, mWindowLayoutParams);
ValueAnimator screenshotDropInAnim = createScreenshotDropInAnimation();
- ValueAnimator screenshotFadeOutAnim = createScreenshotDropOutAnimation(w, h,
- statusBarVisible, navBarVisible);
+ ValueAnimator screenshotFadeOutAnim = useCornerFlow
+ ? createScreenshotToCornerAnimation(w, h)
+ : createScreenshotDropOutAnimation(w, h, statusBarVisible, navBarVisible);
mScreenshotAnimation = new AnimatorSet();
mScreenshotAnimation.playSequentially(screenshotDropInAnim, screenshotFadeOutAnim);
mScreenshotAnimation.addListener(new AnimatorListenerAdapter() {
@Override
public void onAnimationEnd(Animator animation) {
// Save the screenshot once we have a bit of time now
- saveScreenshotInWorkerThread(finisher);
- mWindowManager.removeView(mScreenshotLayout);
-
- // Clear any references to the bitmap
- mScreenBitmap = null;
- mScreenshotView.setImageBitmap(null);
+ if (!useCornerFlow) {
+ saveScreenshotInWorkerThread(finisher);
+ clearScreenshot();
+ } else {
+ mScreenshotView.requestFocus();
+ mScreenshotView.setOnClickListener((v) -> {
+ // TODO: remove once we have a better UI to show that we aren't ready yet
+ Toast notReadyToast = Toast.makeText(
+ mContext, "Screenshot is not ready yet", Toast.LENGTH_SHORT);
+ notReadyToast.show();
+ });
+ saveScreenshotInWorkerThread(finisher, intent -> {
+ mScreenshotHandler.post(() -> mScreenshotView.setOnClickListener(v -> {
+ try {
+ intent.send();
+ clearScreenshot();
+ } catch (PendingIntent.CanceledException e) {
+ Log.e(TAG, "Edit intent cancelled", e);
+ }
+ mScreenshotHandler.removeMessages(MESSAGE_CORNER_TIMEOUT);
+ }));
+ return null;
+ });
+ mScreenshotHandler.sendMessageDelayed(
+ mScreenshotHandler.obtainMessage(MESSAGE_CORNER_TIMEOUT),
+ SCREENSHOT_CORNER_TIMEOUT_MILLIS);
+ }
}
});
- mScreenshotLayout.post(new Runnable() {
- @Override
- public void run() {
- // Play the shutter sound to notify that we've taken a screenshot
- mCameraSound.play(MediaActionSound.SHUTTER_CLICK);
+ mScreenshotHandler.post(() -> {
+ // Play the shutter sound to notify that we've taken a screenshot
+ mCameraSound.play(MediaActionSound.SHUTTER_CLICK);
- mScreenshotView.setLayerType(View.LAYER_TYPE_HARDWARE, null);
- mScreenshotView.buildLayer();
- mScreenshotAnimation.start();
- }
+ mScreenshotView.setLayerType(View.LAYER_TYPE_HARDWARE, null);
+ mScreenshotView.buildLayer();
+ mScreenshotAnimation.start();
});
}
private ValueAnimator createScreenshotDropInAnimation() {
@@ -877,6 +957,47 @@ class GlobalScreenshot {
return anim;
}
+ private ValueAnimator createScreenshotToCornerAnimation(int w, int h) {
+ ValueAnimator anim = ValueAnimator.ofFloat(0f, 1f);
+ anim.setStartDelay(SCREENSHOT_DROP_OUT_DELAY);
+
+ final float scaleDurationPct =
+ (float) SCREENSHOT_DROP_OUT_SCALE_DURATION / SCREENSHOT_DROP_OUT_DURATION;
+ final Interpolator scaleInterpolator = new Interpolator() {
+ @Override
+ public float getInterpolation(float x) {
+ if (x < scaleDurationPct) {
+ // Decelerate, and scale the input accordingly
+ return (float) (1f - Math.pow(1f - (x / scaleDurationPct), 2f));
+ }
+ return 1f;
+ }
+ };
+
+ // Determine the bounds of how to scale
+ float halfScreenWidth = (w - 2f * mBgPadding) / 2f;
+ float halfScreenHeight = (h - 2f * mBgPadding) / 2f;
+ final float offsetPct = SCREENSHOT_CORNER_MIN_SCALE_OFFSET;
+ final PointF finalPos = new PointF(
+ -halfScreenWidth + (SCREENSHOT_CORNER_MIN_SCALE + offsetPct) * halfScreenWidth,
+ halfScreenHeight - (SCREENSHOT_CORNER_MIN_SCALE + offsetPct) * halfScreenHeight);
+
+ // Animate the screenshot to the bottom left corner
+ anim.setDuration(SCREENSHOT_DROP_OUT_DURATION);
+ anim.addUpdateListener(animation -> {
+ float t = (Float) animation.getAnimatedValue();
+ float scaleT = (SCREENSHOT_DROP_IN_MIN_SCALE + mBgPaddingScale)
+ - scaleInterpolator.getInterpolation(t)
+ * (SCREENSHOT_DROP_IN_MIN_SCALE - SCREENSHOT_CORNER_MIN_SCALE);
+ mBackgroundView.setAlpha((1f - t) * BACKGROUND_ALPHA);
+ mScreenshotView.setScaleX(scaleT);
+ mScreenshotView.setScaleY(scaleT);
+ mScreenshotView.setTranslationX(t * finalPos.x);
+ mScreenshotView.setTranslationY(t * finalPos.y);
+ });
+ return anim;
+ }
+
static void notifyScreenshotError(Context context, NotificationManager nManager, int msgResId) {
Resources r = context.getResources();
String errorMsg = r.getString(msgResId);
@@ -917,6 +1038,12 @@ class GlobalScreenshot {
*/
public static class ActionProxyReceiver extends BroadcastReceiver {
static final int CLOSE_WINDOWS_TIMEOUT_MILLIS = 3000;
+ private final StatusBar mStatusBar;
+
+ @Inject
+ public ActionProxyReceiver(StatusBar statusBar) {
+ mStatusBar = statusBar;
+ }
@Override
public void onReceive(Context context, final Intent intent) {
@@ -939,8 +1066,8 @@ class GlobalScreenshot {
intent.getBooleanExtra(EXTRA_DISALLOW_ENTER_PIP, false));
context.startActivityAsUser(actionIntent, opts.toBundle(), UserHandle.CURRENT);
};
- StatusBar statusBar = SysUiServiceProvider.getComponent(context, StatusBar.class);
- statusBar.executeRunnableDismissingKeyguard(startActivityRunnable, null,
+
+ mStatusBar.executeRunnableDismissingKeyguard(startActivityRunnable, null,
true /* dismissShade */, true /* afterKeyguardGone */, true /* deferred */);
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/screenshot/TakeScreenshotService.java b/packages/SystemUI/src/com/android/systemui/screenshot/TakeScreenshotService.java
index 34b8bfe59e7e..20d24e62fc0a 100644
--- a/packages/SystemUI/src/com/android/systemui/screenshot/TakeScreenshotService.java
+++ b/packages/SystemUI/src/com/android/systemui/screenshot/TakeScreenshotService.java
@@ -27,10 +27,15 @@ import android.os.UserManager;
import android.util.Log;
import android.view.WindowManager;
+import javax.inject.Inject;
+import javax.inject.Singleton;
+
+@Singleton
public class TakeScreenshotService extends Service {
private static final String TAG = "TakeScreenshotService";
- private static GlobalScreenshot mScreenshot;
+ private final GlobalScreenshot mScreenshot;
+ private final UserManager mUserManager;
private Handler mHandler = new Handler() {
@Override
@@ -50,16 +55,12 @@ public class TakeScreenshotService extends Service {
// If the storage for this user is locked, we have no place to store
// the screenshot, so skip taking it instead of showing a misleading
// animation and error notification.
- if (!getSystemService(UserManager.class).isUserUnlocked()) {
+ if (!mUserManager.isUserUnlocked()) {
Log.w(TAG, "Skipping screenshot because storage is locked!");
post(finisher);
return;
}
- if (mScreenshot == null) {
- mScreenshot = new GlobalScreenshot(TakeScreenshotService.this);
- }
-
switch (msg.what) {
case WindowManager.TAKE_SCREENSHOT_FULLSCREEN:
mScreenshot.takeScreenshot(finisher, msg.arg1 > 0, msg.arg2 > 0);
@@ -73,6 +74,12 @@ public class TakeScreenshotService extends Service {
}
};
+ @Inject
+ public TakeScreenshotService(GlobalScreenshot globalScreenshot, UserManager userManager) {
+ mScreenshot = globalScreenshot;
+ mUserManager = userManager;
+ }
+
@Override
public IBinder onBind(Intent intent) {
return new Messenger(mHandler).getBinder();
diff --git a/packages/SystemUI/src/com/android/systemui/settings/BrightnessController.java b/packages/SystemUI/src/com/android/systemui/settings/BrightnessController.java
index 176676fcb9b3..b1f1f3844cac 100644
--- a/packages/SystemUI/src/com/android/systemui/settings/BrightnessController.java
+++ b/packages/SystemUI/src/com/android/systemui/settings/BrightnessController.java
@@ -44,6 +44,7 @@ import com.android.internal.logging.MetricsLogger;
import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
import com.android.settingslib.RestrictedLockUtilsInternal;
import com.android.systemui.Dependency;
+import com.android.systemui.broadcast.BroadcastDispatcher;
import java.util.ArrayList;
@@ -281,12 +282,13 @@ public class BrightnessController implements ToggleSlider.Listener {
}
};
- public BrightnessController(Context context, ToggleSlider control) {
+ public BrightnessController(Context context, ToggleSlider control,
+ BroadcastDispatcher broadcastDispatcher) {
mContext = context;
mControl = control;
mControl.setMax(GAMMA_SPACE_MAX);
mBackgroundHandler = new Handler((Looper) Dependency.get(Dependency.BG_LOOPER));
- mUserTracker = new CurrentUserTracker(mContext) {
+ mUserTracker = new CurrentUserTracker(broadcastDispatcher) {
@Override
public void onUserSwitched(int newUserId) {
mBackgroundHandler.post(mUpdateModeRunnable);
diff --git a/packages/SystemUI/src/com/android/systemui/settings/BrightnessDialog.java b/packages/SystemUI/src/com/android/systemui/settings/BrightnessDialog.java
index d8b4df5e94d8..70c2531ca6d4 100644
--- a/packages/SystemUI/src/com/android/systemui/settings/BrightnessDialog.java
+++ b/packages/SystemUI/src/com/android/systemui/settings/BrightnessDialog.java
@@ -28,11 +28,21 @@ import android.view.WindowManager;
import com.android.internal.logging.MetricsLogger;
import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
import com.android.systemui.R;
+import com.android.systemui.broadcast.BroadcastDispatcher;
+
+import javax.inject.Inject;
/** A dialog that provides controls for adjusting the screen brightness. */
public class BrightnessDialog extends Activity {
private BrightnessController mBrightnessController;
+ private final BroadcastDispatcher mBroadcastDispatcher;
+
+ @Inject
+ public BrightnessDialog(BroadcastDispatcher broadcastDispatcher) {
+ mBroadcastDispatcher = broadcastDispatcher;
+ }
+
@Override
protected void onCreate(Bundle savedInstanceState) {
@@ -49,7 +59,7 @@ public class BrightnessDialog extends Activity {
setContentView(v);
final ToggleSliderView slider = findViewById(R.id.brightness_slider);
- mBrightnessController = new BrightnessController(this, slider);
+ mBrightnessController = new BrightnessController(this, slider, mBroadcastDispatcher);
}
@Override
diff --git a/packages/SystemUI/src/com/android/systemui/settings/CurrentUserObservable.java b/packages/SystemUI/src/com/android/systemui/settings/CurrentUserObservable.java
index 3cf08b4b866e..3cdc01d95f58 100644
--- a/packages/SystemUI/src/com/android/systemui/settings/CurrentUserObservable.java
+++ b/packages/SystemUI/src/com/android/systemui/settings/CurrentUserObservable.java
@@ -16,11 +16,11 @@
package com.android.systemui.settings;
-import android.content.Context;
-
import androidx.lifecycle.LiveData;
import androidx.lifecycle.MutableLiveData;
+import com.android.systemui.broadcast.BroadcastDispatcher;
+
/**
* A class that has an observable for the current user.
*/
@@ -42,8 +42,8 @@ public class CurrentUserObservable {
}
};
- public CurrentUserObservable(Context context) {
- mTracker = new CurrentUserTracker(context) {
+ public CurrentUserObservable(BroadcastDispatcher broadcastDispatcher) {
+ mTracker = new CurrentUserTracker(broadcastDispatcher) {
@Override
public void onUserSwitched(int newUserId) {
mCurrentUser.setValue(newUserId);
diff --git a/packages/SystemUI/src/com/android/systemui/settings/CurrentUserTracker.java b/packages/SystemUI/src/com/android/systemui/settings/CurrentUserTracker.java
index 0b89dc1070e1..9f79785be56e 100644
--- a/packages/SystemUI/src/com/android/systemui/settings/CurrentUserTracker.java
+++ b/packages/SystemUI/src/com/android/systemui/settings/CurrentUserTracker.java
@@ -23,6 +23,7 @@ import android.content.Intent;
import android.content.IntentFilter;
import com.android.internal.annotations.VisibleForTesting;
+import com.android.systemui.broadcast.BroadcastDispatcher;
import java.util.ArrayList;
import java.util.List;
@@ -33,8 +34,8 @@ public abstract class CurrentUserTracker {
private Consumer<Integer> mCallback = this::onUserSwitched;
- public CurrentUserTracker(Context context) {
- this(UserReceiver.getInstance(context));
+ public CurrentUserTracker(BroadcastDispatcher broadcastDispatcher) {
+ this(UserReceiver.getInstance(broadcastDispatcher));
}
@VisibleForTesting
@@ -60,20 +61,20 @@ public abstract class CurrentUserTracker {
static class UserReceiver extends BroadcastReceiver {
private static UserReceiver sInstance;
- private Context mAppContext;
private boolean mReceiverRegistered;
private int mCurrentUserId;
+ private final BroadcastDispatcher mBroadcastDispatcher;
private List<Consumer<Integer>> mCallbacks = new ArrayList<>();
@VisibleForTesting
- UserReceiver(Context context) {
- mAppContext = context.getApplicationContext();
+ UserReceiver(BroadcastDispatcher broadcastDispatcher) {
+ mBroadcastDispatcher = broadcastDispatcher;
}
- static UserReceiver getInstance(Context context) {
+ static UserReceiver getInstance(BroadcastDispatcher broadcastDispatcher) {
if (sInstance == null) {
- sInstance = new UserReceiver(context);
+ sInstance = new UserReceiver(broadcastDispatcher);
}
return sInstance;
}
@@ -96,7 +97,7 @@ public abstract class CurrentUserTracker {
if (!mReceiverRegistered) {
mCurrentUserId = ActivityManager.getCurrentUser();
IntentFilter filter = new IntentFilter(Intent.ACTION_USER_SWITCHED);
- mAppContext.registerReceiver(this, filter);
+ mBroadcastDispatcher.registerReceiver(this, filter);
mReceiverRegistered = true;
}
}
@@ -105,7 +106,7 @@ public abstract class CurrentUserTracker {
if (mCallbacks.contains(callback)) {
mCallbacks.remove(callback);
if (mCallbacks.size() == 0 && mReceiverRegistered) {
- mAppContext.unregisterReceiver(this);
+ mBroadcastDispatcher.unregisterReceiver(this);
mReceiverRegistered = false;
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/CommandQueue.java b/packages/SystemUI/src/com/android/systemui/statusbar/CommandQueue.java
index 34f543702d96..eb6ea13a6690 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/CommandQueue.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/CommandQueue.java
@@ -56,12 +56,14 @@ import com.android.internal.os.SomeArgs;
import com.android.internal.statusbar.IStatusBar;
import com.android.internal.statusbar.StatusBarIcon;
import com.android.internal.view.AppearanceRegion;
-import com.android.systemui.SystemUI;
import com.android.systemui.statusbar.CommandQueue.Callbacks;
import com.android.systemui.statusbar.policy.CallbackController;
import java.util.ArrayList;
+import javax.inject.Inject;
+import javax.inject.Singleton;
+
/**
* This class takes the functions from IStatusBar that come in on
* binder pool threads and posts messages to get them onto the main
@@ -69,6 +71,7 @@ import java.util.ArrayList;
* coalescing these calls so they don't stack up. For the calls
* are coalesced, note that they are all idempotent.
*/
+@Singleton
public class CommandQueue extends IStatusBar.Stub implements CallbackController<Callbacks>,
DisplayManager.DisplayListener {
private static final int INDEX_MASK = 0xffff;
@@ -305,6 +308,7 @@ public class CommandQueue extends IStatusBar.Stub implements CallbackController<
}
@VisibleForTesting
+ @Inject
public CommandQueue(Context context) {
context.getSystemService(DisplayManager.class).registerDisplayListener(this, mHandler);
// We always have default display.
@@ -1186,17 +1190,4 @@ public class CommandQueue extends IStatusBar.Stub implements CallbackController<
}
}
}
-
- // Need this class since CommandQueue already extends IStatusBar.Stub, so CommandQueueStart
- // is needed so it can extend SystemUI.
- public static class CommandQueueStart extends SystemUI {
- public CommandQueueStart(Context context) {
- super(context);
- }
-
- @Override
- public void start() {
- putComponent(CommandQueue.class, new CommandQueue(mContext));
- }
- }
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/NavigationBarController.java b/packages/SystemUI/src/com/android/systemui/statusbar/NavigationBarController.java
index 1f389049f423..9f5cf684b3b4 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/NavigationBarController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/NavigationBarController.java
@@ -18,8 +18,6 @@ package com.android.systemui.statusbar;
import static android.view.Display.DEFAULT_DISPLAY;
-import static com.android.systemui.SysUiServiceProvider.getComponent;
-
import android.content.Context;
import android.hardware.display.DisplayManager;
import android.os.Handler;
@@ -66,14 +64,12 @@ public class NavigationBarController implements Callbacks {
SparseArray<NavigationBarFragment> mNavigationBars = new SparseArray<>();
@Inject
- public NavigationBarController(Context context, @MainHandler Handler handler) {
+ public NavigationBarController(Context context, @MainHandler Handler handler,
+ CommandQueue commandQueue) {
mContext = context;
mHandler = handler;
mDisplayManager = (DisplayManager) mContext.getSystemService(Context.DISPLAY_SERVICE);
- CommandQueue commandQueue = getComponent(mContext, CommandQueue.class);
- if (commandQueue != null) {
- commandQueue.addCallback(this);
- }
+ commandQueue.addCallback(this);
}
@Override
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationLockscreenUserManagerImpl.java b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationLockscreenUserManagerImpl.java
index 7adf7af89f0d..571d3d7a11be 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationLockscreenUserManagerImpl.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationLockscreenUserManagerImpl.java
@@ -46,6 +46,7 @@ import com.android.internal.widget.LockPatternUtils;
import com.android.keyguard.KeyguardUpdateMonitor;
import com.android.systemui.Dependency;
import com.android.systemui.Dumpable;
+import com.android.systemui.broadcast.BroadcastDispatcher;
import com.android.systemui.plugins.statusbar.StatusBarStateController;
import com.android.systemui.plugins.statusbar.StatusBarStateController.StateListener;
import com.android.systemui.recents.OverviewProxyService;
@@ -90,6 +91,7 @@ public class NotificationLockscreenUserManagerImpl implements
private final UserManager mUserManager;
private final IStatusBarService mBarService;
private final List<UserChangedListener> mListeners = new ArrayList<>();
+ private final BroadcastDispatcher mBroadcastDispatcher;
private boolean mShowLockscreenNotifications;
private boolean mAllowLockscreenRemoteInput;
@@ -180,7 +182,8 @@ public class NotificationLockscreenUserManagerImpl implements
}
@Inject
- public NotificationLockscreenUserManagerImpl(Context context) {
+ public NotificationLockscreenUserManagerImpl(Context context,
+ BroadcastDispatcher broadcastDispatcher) {
mContext = context;
mDevicePolicyManager = (DevicePolicyManager) mContext.getSystemService(
Context.DEVICE_POLICY_SERVICE);
@@ -191,6 +194,7 @@ public class NotificationLockscreenUserManagerImpl implements
Dependency.get(StatusBarStateController.class).addCallback(this);
mLockPatternUtils = new LockPatternUtils(context);
mKeyguardManager = context.getSystemService(KeyguardManager.class);
+ mBroadcastDispatcher = broadcastDispatcher;
}
public void setUpWithPresenter(NotificationPresenter presenter) {
@@ -244,15 +248,15 @@ public class NotificationLockscreenUserManagerImpl implements
UserHandle.USER_ALL);
}
- mContext.registerReceiverAsUser(mAllUsersReceiver, UserHandle.ALL,
+ mBroadcastDispatcher.registerReceiver(mAllUsersReceiver,
new IntentFilter(ACTION_DEVICE_POLICY_MANAGER_STATE_CHANGED),
- null, null);
+ null /* handler */, UserHandle.ALL);
IntentFilter filter = new IntentFilter();
filter.addAction(Intent.ACTION_USER_SWITCHED);
filter.addAction(Intent.ACTION_USER_ADDED);
filter.addAction(Intent.ACTION_USER_UNLOCKED);
- mContext.registerReceiver(mBaseBroadcastReceiver, filter);
+ mBroadcastDispatcher.registerReceiver(mBaseBroadcastReceiver, filter);
IntentFilter internalFilter = new IntentFilter();
internalFilter.addAction(NOTIFICATION_UNLOCKED_BY_WORK_CHALLENGE_ACTION);
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationRemoteInputManager.java b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationRemoteInputManager.java
index c838ac5315a7..35f06f9d95c8 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationRemoteInputManager.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationRemoteInputManager.java
@@ -59,6 +59,7 @@ import com.android.systemui.statusbar.notification.collection.NotificationEntry.
import com.android.systemui.statusbar.notification.logging.NotificationLogger;
import com.android.systemui.statusbar.notification.row.ExpandableNotificationRow;
import com.android.systemui.statusbar.phone.ShadeController;
+import com.android.systemui.statusbar.policy.RemoteInputUriController;
import com.android.systemui.statusbar.policy.RemoteInputView;
import java.io.FileDescriptor;
@@ -121,6 +122,7 @@ public class NotificationRemoteInputManager implements Dumpable {
private final UserManager mUserManager;
private final KeyguardManager mKeyguardManager;
private final StatusBarStateController mStatusBarStateController;
+ private final RemoteInputUriController mRemoteInputUriController;
protected RemoteInputController mRemoteInputController;
protected NotificationLifetimeExtender.NotificationSafeToRemoveCallback
@@ -260,7 +262,8 @@ public class NotificationRemoteInputManager implements Dumpable {
NotificationEntryManager notificationEntryManager,
Lazy<ShadeController> shadeController,
StatusBarStateController statusBarStateController,
- @MainHandler Handler mainHandler) {
+ @MainHandler Handler mainHandler,
+ RemoteInputUriController remoteInputUriController) {
mContext = context;
mLockscreenUserManager = lockscreenUserManager;
mSmartReplyController = smartReplyController;
@@ -273,6 +276,7 @@ public class NotificationRemoteInputManager implements Dumpable {
addLifetimeExtenders();
mKeyguardManager = context.getSystemService(KeyguardManager.class);
mStatusBarStateController = statusBarStateController;
+ mRemoteInputUriController = remoteInputUriController;
notificationEntryManager.addNotificationEntryListener(new NotificationEntryListener() {
@Override
@@ -300,7 +304,7 @@ public class NotificationRemoteInputManager implements Dumpable {
/** Initializes this component with the provided dependencies. */
public void setUpWithCallback(Callback callback, RemoteInputController.Delegate delegate) {
mCallback = callback;
- mRemoteInputController = new RemoteInputController(delegate);
+ mRemoteInputController = new RemoteInputController(delegate, mRemoteInputUriController);
mRemoteInputController.addCallback(new RemoteInputController.Callback() {
@Override
public void onRemoteInputSent(NotificationEntry entry) {
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationViewHierarchyManager.java b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationViewHierarchyManager.java
index d6b87afc53b9..20a3e35791c4 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationViewHierarchyManager.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationViewHierarchyManager.java
@@ -21,7 +21,6 @@ import android.content.res.Resources;
import android.os.Handler;
import android.os.Trace;
import android.os.UserHandle;
-import android.provider.Settings;
import android.util.Log;
import android.view.View;
import android.view.ViewGroup;
@@ -40,6 +39,7 @@ import com.android.systemui.statusbar.phone.KeyguardBypassController;
import com.android.systemui.statusbar.phone.NotificationGroupManager;
import com.android.systemui.statusbar.phone.ShadeController;
import com.android.systemui.util.Assert;
+import com.android.systemui.util.Utils;
import java.util.ArrayList;
import java.util.HashMap;
@@ -146,9 +146,7 @@ public class NotificationViewHierarchyManager implements DynamicPrivacyControlle
final int N = activeNotifications.size();
for (int i = 0; i < N; i++) {
NotificationEntry ent = activeNotifications.get(i);
- int flag = Settings.System.getInt(mContext.getContentResolver(),
- "qs_media_player", 0);
- boolean hideMedia = (flag == 1);
+ boolean hideMedia = Utils.useQsMediaPlayer(mContext);
if (ent.isRowDismissed() || ent.isRowRemoved()
|| (ent.isMediaNotification() && hideMedia)
|| mBubbleController.isBubbleNotificationSuppressedFromShade(ent.getKey())) {
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/RemoteInputController.java b/packages/SystemUI/src/com/android/systemui/statusbar/RemoteInputController.java
index 998cf523d3df..778443c4bddf 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/RemoteInputController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/RemoteInputController.java
@@ -19,12 +19,15 @@ package com.android.systemui.statusbar;
import android.app.Notification;
import android.app.RemoteInput;
import android.content.Context;
+import android.net.Uri;
import android.os.SystemProperties;
+import android.service.notification.StatusBarNotification;
import android.util.ArrayMap;
import android.util.Pair;
import com.android.internal.util.Preconditions;
import com.android.systemui.statusbar.notification.collection.NotificationEntry;
+import com.android.systemui.statusbar.policy.RemoteInputUriController;
import com.android.systemui.statusbar.policy.RemoteInputView;
import java.lang.ref.WeakReference;
@@ -43,9 +46,12 @@ public class RemoteInputController {
private final ArrayMap<String, Object> mSpinning = new ArrayMap<>();
private final ArrayList<Callback> mCallbacks = new ArrayList<>(3);
private final Delegate mDelegate;
+ private final RemoteInputUriController mRemoteInputUriController;
- public RemoteInputController(Delegate delegate) {
+ public RemoteInputController(Delegate delegate,
+ RemoteInputUriController remoteInputUriController) {
mDelegate = delegate;
+ mRemoteInputUriController = remoteInputUriController;
}
/**
@@ -272,6 +278,14 @@ public class RemoteInputController {
mDelegate.lockScrollTo(entry);
}
+ /**
+ * Create a temporary grant which allows the app that submitted the notification access to the
+ * specified URI.
+ */
+ public void grantInlineReplyUriPermission(StatusBarNotification sbn, Uri data) {
+ mRemoteInputUriController.grantInlineReplyUriPermission(sbn, data);
+ }
+
public interface Callback {
default void onRemoteInputActive(boolean active) {}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/InstantAppNotifier.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/InstantAppNotifier.java
index 53fbe5b57d7e..49bed15c79a8 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/InstantAppNotifier.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/InstantAppNotifier.java
@@ -53,7 +53,6 @@ import com.android.internal.messages.nano.SystemMessageProto.SystemMessage;
import com.android.systemui.Dependency;
import com.android.systemui.DockedStackExistsListener;
import com.android.systemui.R;
-import com.android.systemui.SysUiServiceProvider;
import com.android.systemui.SystemUI;
import com.android.systemui.UiOffloadThread;
import com.android.systemui.statusbar.CommandQueue;
@@ -62,9 +61,13 @@ import com.android.systemui.util.NotificationChannels;
import java.util.List;
+import javax.inject.Inject;
+import javax.inject.Singleton;
+
/** The class to show notification(s) of instant apps. This may show multiple notifications on
* splitted screen.
*/
+@Singleton
public class InstantAppNotifier extends SystemUI
implements CommandQueue.Callbacks, KeyguardStateController.Callback {
private static final String TAG = "InstantAppNotifier";
@@ -73,11 +76,14 @@ public class InstantAppNotifier extends SystemUI
private final Handler mHandler = new Handler();
private final UiOffloadThread mUiOffloadThread = Dependency.get(UiOffloadThread.class);
private final ArraySet<Pair<String, Integer>> mCurrentNotifs = new ArraySet<>();
+ private final CommandQueue mCommandQueue;
private boolean mDockedStackExists;
private KeyguardStateController mKeyguardStateController;
- public InstantAppNotifier(Context context) {
+ @Inject
+ public InstantAppNotifier(Context context, CommandQueue commandQueue) {
super(context);
+ mCommandQueue = commandQueue;
}
@Override
@@ -91,7 +97,7 @@ public class InstantAppNotifier extends SystemUI
// Ignore
}
- SysUiServiceProvider.getComponent(mContext, CommandQueue.class).addCallback(this);
+ mCommandQueue.addCallback(this);
mKeyguardStateController.addCallback(this);
DockedStackExistsListener.register(
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 9bc0ca440893..d0122c2b59b2 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
@@ -28,7 +28,6 @@ import android.media.session.MediaSession;
import android.media.session.PlaybackState;
import android.metrics.LogMaker;
import android.os.Handler;
-import android.provider.Settings;
import android.text.format.DateUtils;
import android.view.LayoutInflater;
import android.view.View;
@@ -48,6 +47,7 @@ import com.android.systemui.statusbar.NotificationMediaManager;
import com.android.systemui.statusbar.TransformableView;
import com.android.systemui.statusbar.notification.row.ExpandableNotificationRow;
import com.android.systemui.statusbar.phone.StatusBarWindowController;
+import com.android.systemui.util.Utils;
import java.util.Timer;
import java.util.TimerTask;
@@ -182,8 +182,7 @@ public class NotificationMediaTemplateViewWrapper extends NotificationTemplateVi
final MediaSession.Token token = mRow.getEntry().getSbn().getNotification().extras
.getParcelable(Notification.EXTRA_MEDIA_SESSION);
- int flag = Settings.System.getInt(mContext.getContentResolver(), "qs_media_player", 0);
- if (flag == 1) {
+ if (Utils.useQsMediaPlayer(mContext)) {
StatusBarWindowController ctrl = Dependency.get(StatusBarWindowController.class);
QuickQSPanel panel = ctrl.getStatusBarView().findViewById(
com.android.systemui.R.id.quick_qs_panel);
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/BiometricUnlockController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/BiometricUnlockController.java
index 1e8e28fd1614..865d7e7a6560 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/BiometricUnlockController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/BiometricUnlockController.java
@@ -35,6 +35,8 @@ import com.android.keyguard.KeyguardConstants;
import com.android.keyguard.KeyguardUpdateMonitor;
import com.android.keyguard.KeyguardUpdateMonitorCallback;
import com.android.systemui.Dependency;
+import com.android.systemui.DumpController;
+import com.android.systemui.Dumpable;
import com.android.systemui.dagger.qualifiers.MainResources;
import com.android.systemui.keyguard.KeyguardViewMediator;
import com.android.systemui.keyguard.ScreenLifecycle;
@@ -42,6 +44,7 @@ import com.android.systemui.keyguard.WakefulnessLifecycle;
import com.android.systemui.statusbar.NotificationMediaManager;
import com.android.systemui.statusbar.policy.KeyguardStateController;
+import java.io.FileDescriptor;
import java.io.PrintWriter;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
@@ -53,7 +56,7 @@ import javax.inject.Singleton;
* Controller which coordinates all the biometric unlocking actions with the UI.
*/
@Singleton
-public class BiometricUnlockController extends KeyguardUpdateMonitorCallback {
+public class BiometricUnlockController extends KeyguardUpdateMonitorCallback implements Dumpable {
private static final String TAG = "BiometricUnlockCtrl";
private static final boolean DEBUG_BIO_WAKELOCK = KeyguardConstants.DEBUG_BIOMETRIC_WAKELOCK;
@@ -160,7 +163,7 @@ public class BiometricUnlockController extends KeyguardUpdateMonitorCallback {
KeyguardUpdateMonitor keyguardUpdateMonitor,
@MainResources Resources resources,
KeyguardBypassController keyguardBypassController, DozeParameters dozeParameters,
- MetricsLogger metricsLogger) {
+ MetricsLogger metricsLogger, DumpController dumpController) {
mContext = context;
mPowerManager = context.getSystemService(PowerManager.class);
mUpdateMonitor = keyguardUpdateMonitor;
@@ -180,6 +183,7 @@ public class BiometricUnlockController extends KeyguardUpdateMonitorCallback {
mKeyguardBypassController = keyguardBypassController;
mKeyguardBypassController.setUnlockController(this);
mMetricsLogger = metricsLogger;
+ dumpController.registerDumpable(this);
}
public void setStatusBarKeyguardViewManager(
@@ -543,7 +547,8 @@ public class BiometricUnlockController extends KeyguardUpdateMonitorCallback {
return mHasScreenTurnedOnSinceAuthenticating;
}
- public void dump(PrintWriter pw) {
+ @Override
+ public void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
pw.println(" BiometricUnlockController:");
pw.print(" mMode="); pw.println(mMode);
pw.print(" mWakeLock="); pw.println(mWakeLock);
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/CollapsedStatusBarFragment.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/CollapsedStatusBarFragment.java
index e78b85e5fd57..0092cc949194 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/CollapsedStatusBarFragment.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/CollapsedStatusBarFragment.java
@@ -83,7 +83,7 @@ public class CollapsedStatusBarFragment extends Fragment implements CommandQueue
mNetworkController = Dependency.get(NetworkController.class);
mStatusBarStateController = Dependency.get(StatusBarStateController.class);
mStatusBarComponent = SysUiServiceProvider.getComponent(getContext(), StatusBar.class);
- mCommandQueue = SysUiServiceProvider.getComponent(getContext(), CommandQueue.class);
+ mCommandQueue = Dependency.get(CommandQueue.class);
}
@Override
@@ -100,7 +100,8 @@ public class CollapsedStatusBarFragment extends Fragment implements CommandQueue
mStatusBar.restoreHierarchyState(
savedInstanceState.getSparseParcelableArray(EXTRA_PANEL_STATE));
}
- mDarkIconManager = new DarkIconManager(view.findViewById(R.id.statusIcons));
+ mDarkIconManager = new DarkIconManager(view.findViewById(R.id.statusIcons),
+ Dependency.get(CommandQueue.class));
mDarkIconManager.setShouldLog(true);
Dependency.get(StatusBarIconController.class).addIconGroup(mDarkIconManager);
mSystemIconArea = mStatusBar.findViewById(R.id.system_icon_area);
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/DarkIconDispatcherImpl.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/DarkIconDispatcherImpl.java
index ac58e681dbbc..ef0f7cddba24 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/DarkIconDispatcherImpl.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/DarkIconDispatcherImpl.java
@@ -26,6 +26,7 @@ import android.widget.ImageView;
import com.android.systemui.R;
import com.android.systemui.plugins.DarkIconDispatcher.DarkReceiver;
+import com.android.systemui.statusbar.CommandQueue;
import java.io.FileDescriptor;
import java.io.PrintWriter;
@@ -51,11 +52,11 @@ public class DarkIconDispatcherImpl implements SysuiDarkIconDispatcher,
/**
*/
@Inject
- public DarkIconDispatcherImpl(Context context) {
+ public DarkIconDispatcherImpl(Context context, CommandQueue commandQueue) {
mDarkModeIconColorSingleTone = context.getColor(R.color.dark_mode_icon_color_single_tone);
mLightModeIconColorSingleTone = context.getColor(R.color.light_mode_icon_color_single_tone);
- mTransitionsController = new LightBarTransitionsController(context, this);
+ mTransitionsController = new LightBarTransitionsController(context, this, commandQueue);
}
public LightBarTransitionsController getTransitionsController() {
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/HeadsUpAppearanceController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/HeadsUpAppearanceController.java
index ce96005aa306..8e5a9126f08a 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/HeadsUpAppearanceController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/HeadsUpAppearanceController.java
@@ -16,8 +16,6 @@
package com.android.systemui.statusbar.phone;
-import static com.android.systemui.SysUiServiceProvider.getComponent;
-
import android.graphics.Point;
import android.graphics.Rect;
import android.view.DisplayCutout;
@@ -94,14 +92,14 @@ public class HeadsUpAppearanceController implements OnHeadsUpChangedListener,
public HeadsUpAppearanceController(
NotificationIconAreaController notificationIconAreaController,
- HeadsUpManagerPhone headsUpManager,
- View statusbarView,
+ HeadsUpManagerPhone headsUpManager, View statusbarView,
SysuiStatusBarStateController statusBarStateController,
KeyguardBypassController keyguardBypassController,
KeyguardStateController keyguardStateController,
- NotificationWakeUpCoordinator wakeUpCoordinator) {
+ NotificationWakeUpCoordinator wakeUpCoordinator, CommandQueue commandQueue) {
this(notificationIconAreaController, headsUpManager, statusBarStateController,
keyguardBypassController, wakeUpCoordinator, keyguardStateController,
+ commandQueue,
statusbarView.findViewById(R.id.heads_up_status_bar_view),
statusbarView.findViewById(R.id.notification_stack_scroller),
statusbarView.findViewById(R.id.notification_panel),
@@ -118,6 +116,7 @@ public class HeadsUpAppearanceController implements OnHeadsUpChangedListener,
KeyguardBypassController bypassController,
NotificationWakeUpCoordinator wakeUpCoordinator,
KeyguardStateController keyguardStateController,
+ CommandQueue commandQueue,
HeadsUpStatusBarView headsUpStatusBarView,
NotificationStackScrollLayout stackScroller,
NotificationPanelView panelView,
@@ -161,7 +160,7 @@ public class HeadsUpAppearanceController implements OnHeadsUpChangedListener,
mStatusBarStateController = stateController;
mWakeUpCoordinator = wakeUpCoordinator;
wakeUpCoordinator.addListener(this);
- mCommandQueue = getComponent(headsUpStatusBarView.getContext(), CommandQueue.class);
+ mCommandQueue = commandQueue;
mKeyguardStateController = keyguardStateController;
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBypassController.kt b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBypassController.kt
index aca7f443ea0c..f7d52b5f5ab0 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBypassController.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBypassController.kt
@@ -20,17 +20,20 @@ import android.content.Context
import android.content.pm.PackageManager
import android.hardware.biometrics.BiometricSourceType
import android.provider.Settings
+import com.android.systemui.DumpController
+import com.android.systemui.Dumpable
import com.android.systemui.plugins.statusbar.StatusBarStateController
import com.android.systemui.statusbar.NotificationLockscreenUserManager
import com.android.systemui.statusbar.StatusBarState
import com.android.systemui.statusbar.policy.KeyguardStateController
import com.android.systemui.tuner.TunerService
+import java.io.FileDescriptor
import java.io.PrintWriter
import javax.inject.Inject
import javax.inject.Singleton
@Singleton
-class KeyguardBypassController {
+class KeyguardBypassController : Dumpable {
private val mKeyguardStateController: KeyguardStateController
private val statusBarStateController: StatusBarStateController
@@ -68,7 +71,8 @@ class KeyguardBypassController {
tunerService: TunerService,
statusBarStateController: StatusBarStateController,
lockscreenUserManager: NotificationLockscreenUserManager,
- keyguardStateController: KeyguardStateController
+ keyguardStateController: KeyguardStateController,
+ dumpController: DumpController
) {
this.mKeyguardStateController = keyguardStateController
this.statusBarStateController = statusBarStateController
@@ -78,6 +82,7 @@ class KeyguardBypassController {
return
}
+ dumpController.registerDumpable("KeyguardBypassController", this)
statusBarStateController.addCallback(object : StatusBarStateController.StateListener {
override fun onStateChanged(newState: Int) {
if (newState != StatusBarState.KEYGUARD) {
@@ -155,16 +160,16 @@ class KeyguardBypassController {
pendingUnlockType = null
}
- fun dump(pw: PrintWriter) {
+ override fun dump(fd: FileDescriptor, pw: PrintWriter, args: Array<out String>) {
pw.println("KeyguardBypassController:")
- pw.print(" pendingUnlockType: "); pw.println(pendingUnlockType)
- pw.print(" bypassEnabled: "); pw.println(bypassEnabled)
- pw.print(" canBypass: "); pw.println(canBypass())
- pw.print(" bouncerShowing: "); pw.println(bouncerShowing)
- pw.print(" isPulseExpanding: "); pw.println(isPulseExpanding)
- pw.print(" launchingAffordance: "); pw.println(launchingAffordance)
- pw.print(" qSExpanded: "); pw.println(qSExpanded)
- pw.print(" hasFaceFeature: "); pw.println(hasFaceFeature)
+ pw.println(" pendingUnlockType: $pendingUnlockType")
+ pw.println(" bypassEnabled: $bypassEnabled")
+ pw.println(" canBypass: ${canBypass()}")
+ pw.println(" bouncerShowing: $bouncerShowing")
+ pw.println(" isPulseExpanding: $isPulseExpanding")
+ pw.println(" launchingAffordance: $launchingAffordance")
+ pw.println(" qSExpanded: $qSExpanded")
+ pw.println(" hasFaceFeature: $hasFaceFeature")
}
companion object {
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardLiftController.kt b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardLiftController.kt
index bf887044e05b..2258c7789822 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardLiftController.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardLiftController.kt
@@ -21,21 +21,27 @@ import android.hardware.TriggerEvent
import android.hardware.TriggerEventListener
import com.android.keyguard.KeyguardUpdateMonitor
import com.android.keyguard.KeyguardUpdateMonitorCallback
+import com.android.systemui.DumpController
+import com.android.systemui.Dumpable
import com.android.systemui.plugins.statusbar.StatusBarStateController
import com.android.systemui.util.Assert
import com.android.systemui.util.sensors.AsyncSensorManager
+import java.io.FileDescriptor
+import java.io.PrintWriter
class KeyguardLiftController constructor(
private val statusBarStateController: StatusBarStateController,
private val asyncSensorManager: AsyncSensorManager,
- private val keyguardUpdateMonitor: KeyguardUpdateMonitor
-) : StatusBarStateController.StateListener, KeyguardUpdateMonitorCallback() {
+ private val keyguardUpdateMonitor: KeyguardUpdateMonitor,
+ dumpController: DumpController
+) : StatusBarStateController.StateListener, Dumpable, KeyguardUpdateMonitorCallback() {
private val pickupSensor = asyncSensorManager.getDefaultSensor(Sensor.TYPE_PICK_UP_GESTURE)
private var isListening = false
private var bouncerVisible = false
init {
+ dumpController.registerDumpable(this)
statusBarStateController.addCallback(this)
keyguardUpdateMonitor.registerCallback(this)
updateListeningState()
@@ -64,6 +70,13 @@ class KeyguardLiftController constructor(
updateListeningState()
}
+ override fun dump(fd: FileDescriptor, pw: PrintWriter, args: Array<out String>) {
+ pw.println("KeyguardLiftController:")
+ pw.println(" pickupSensor: $pickupSensor")
+ pw.println(" isListening: $isListening")
+ pw.println(" bouncerVisible: $bouncerVisible")
+ }
+
private fun updateListeningState() {
if (pickupSensor == null) {
return
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardStatusBarView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardStatusBarView.java
index 6ee031a2f505..b24942ab22b3 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardStatusBarView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardStatusBarView.java
@@ -46,6 +46,7 @@ import com.android.systemui.Interpolators;
import com.android.systemui.R;
import com.android.systemui.plugins.DarkIconDispatcher.DarkReceiver;
import com.android.systemui.qs.QSPanel;
+import com.android.systemui.statusbar.CommandQueue;
import com.android.systemui.statusbar.phone.StatusBarIconController.TintedIconManager;
import com.android.systemui.statusbar.policy.BatteryController;
import com.android.systemui.statusbar.policy.BatteryController.BatteryStateChangeCallback;
@@ -329,7 +330,8 @@ public class KeyguardStatusBarView extends RelativeLayout
mMultiUserSwitch.setUserSwitcherController(mUserSwitcherController);
userInfoController.reloadUserInfo();
Dependency.get(ConfigurationController.class).addCallback(this);
- mIconManager = new TintedIconManager(findViewById(R.id.statusIcons));
+ mIconManager = new TintedIconManager(findViewById(R.id.statusIcons),
+ Dependency.get(CommandQueue.class));
Dependency.get(StatusBarIconController.class).addIconGroup(mIconManager);
onThemeChanged();
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/LightBarTransitionsController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/LightBarTransitionsController.java
index de660ce18263..092dd49ba617 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/LightBarTransitionsController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/LightBarTransitionsController.java
@@ -27,7 +27,6 @@ import android.util.TimeUtils;
import com.android.systemui.Dependency;
import com.android.systemui.Dumpable;
import com.android.systemui.Interpolators;
-import com.android.systemui.SysUiServiceProvider;
import com.android.systemui.plugins.statusbar.StatusBarStateController;
import com.android.systemui.statusbar.CommandQueue;
import com.android.systemui.statusbar.CommandQueue.Callbacks;
@@ -49,6 +48,7 @@ public class LightBarTransitionsController implements Dumpable, Callbacks,
private final DarkIntensityApplier mApplier;
private final KeyguardStateController mKeyguardStateController;
private final StatusBarStateController mStatusBarStateController;
+ private final CommandQueue mCommandQueue;
private boolean mTransitionDeferring;
private long mTransitionDeferringStartTime;
@@ -70,13 +70,14 @@ public class LightBarTransitionsController implements Dumpable, Callbacks,
private final Context mContext;
- public LightBarTransitionsController(Context context, DarkIntensityApplier applier) {
+ public LightBarTransitionsController(Context context, DarkIntensityApplier applier,
+ CommandQueue commandQueue) {
mApplier = applier;
mHandler = new Handler();
mKeyguardStateController = Dependency.get(KeyguardStateController.class);
mStatusBarStateController = Dependency.get(StatusBarStateController.class);
- SysUiServiceProvider.getComponent(context, CommandQueue.class)
- .addCallback(this);
+ mCommandQueue = commandQueue;
+ mCommandQueue.addCallback(this);
mStatusBarStateController.addCallback(this);
mDozeAmount = mStatusBarStateController.getDozeAmount();
mContext = context;
@@ -84,8 +85,7 @@ public class LightBarTransitionsController implements Dumpable, Callbacks,
}
public void destroy(Context context) {
- SysUiServiceProvider.getComponent(context, CommandQueue.class)
- .removeCallback(this);
+ mCommandQueue.removeCallback(this);
mStatusBarStateController.removeCallback(this);
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/ManagedProfileControllerImpl.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/ManagedProfileControllerImpl.java
index fbd8d8a76d26..07e9f944b802 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/ManagedProfileControllerImpl.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/ManagedProfileControllerImpl.java
@@ -24,6 +24,8 @@ import android.content.pm.UserInfo;
import android.os.UserHandle;
import android.os.UserManager;
+import com.android.systemui.broadcast.BroadcastDispatcher;
+
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
@@ -40,6 +42,7 @@ public class ManagedProfileControllerImpl implements ManagedProfileController {
private final Context mContext;
private final UserManager mUserManager;
+ private final BroadcastDispatcher mBroadcastDispatcher;
private final LinkedList<UserInfo> mProfiles;
private boolean mListening;
private int mCurrentUser;
@@ -47,9 +50,10 @@ public class ManagedProfileControllerImpl implements ManagedProfileController {
/**
*/
@Inject
- public ManagedProfileControllerImpl(Context context) {
+ public ManagedProfileControllerImpl(Context context, BroadcastDispatcher broadcastDispatcher) {
mContext = context;
mUserManager = UserManager.get(mContext);
+ mBroadcastDispatcher = broadcastDispatcher;
mProfiles = new LinkedList<UserInfo>();
}
@@ -129,9 +133,10 @@ public class ManagedProfileControllerImpl implements ManagedProfileController {
filter.addAction(Intent.ACTION_MANAGED_PROFILE_REMOVED);
filter.addAction(Intent.ACTION_MANAGED_PROFILE_AVAILABLE);
filter.addAction(Intent.ACTION_MANAGED_PROFILE_UNAVAILABLE);
- mContext.registerReceiverAsUser(mReceiver, UserHandle.ALL, filter, null, null);
+ mBroadcastDispatcher.registerReceiver(
+ mReceiver, filter, null /* handler */, UserHandle.ALL);
} else {
- mContext.unregisterReceiver(mReceiver);
+ mBroadcastDispatcher.unregisterReceiver(mReceiver);
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarFragment.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarFragment.java
index 7030dfc4c33b..816327fe19bd 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarFragment.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarFragment.java
@@ -165,7 +165,7 @@ public class NavigationBarFragment extends LifecycleFragment implements Callback
private Recents mRecents;
private Divider mDivider;
private WindowManager mWindowManager;
- private CommandQueue mCommandQueue;
+ private final CommandQueue mCommandQueue;
private long mLastLockToAppLongPress;
private Locale mLocale;
@@ -265,7 +265,8 @@ public class NavigationBarFragment extends LifecycleFragment implements Callback
NavigationModeController navigationModeController,
StatusBarStateController statusBarStateController,
SysUiState sysUiFlagsContainer,
- BroadcastDispatcher broadcastDispatcher) {
+ BroadcastDispatcher broadcastDispatcher,
+ CommandQueue commandQueue) {
mAccessibilityManagerWrapper = accessibilityManagerWrapper;
mDeviceProvisionedController = deviceProvisionedController;
mStatusBarStateController = statusBarStateController;
@@ -277,6 +278,7 @@ public class NavigationBarFragment extends LifecycleFragment implements Callback
mNavigationModeController = navigationModeController;
mNavBarMode = navigationModeController.addListener(this);
mBroadcastDispatcher = broadcastDispatcher;
+ mCommandQueue = commandQueue;
}
// ----- Fragment Lifecycle Callbacks -----
@@ -284,7 +286,6 @@ public class NavigationBarFragment extends LifecycleFragment implements Callback
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
- mCommandQueue = SysUiServiceProvider.getComponent(getContext(), CommandQueue.class);
mCommandQueue.observe(getLifecycle(), this);
mStatusBar = SysUiServiceProvider.getComponent(getContext(), StatusBar.class);
mRecents = SysUiServiceProvider.getComponent(getContext(), Recents.class);
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarTransitions.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarTransitions.java
index 3b590315a5ca..1a6d3d770f9f 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarTransitions.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarTransitions.java
@@ -34,6 +34,7 @@ import android.view.View;
import com.android.internal.statusbar.IStatusBarService;
import com.android.systemui.Dependency;
import com.android.systemui.R;
+import com.android.systemui.statusbar.CommandQueue;
import java.util.ArrayList;
import java.util.List;
@@ -78,12 +79,13 @@ public final class NavigationBarTransitions extends BarTransitions implements
}
};
- public NavigationBarTransitions(NavigationBarView view) {
+ public NavigationBarTransitions(NavigationBarView view, CommandQueue commandQueue) {
super(view, R.drawable.nav_background);
mView = view;
mBarService = IStatusBarService.Stub.asInterface(
ServiceManager.getService(Context.STATUS_BAR_SERVICE));
- mLightTransitionsController = new LightBarTransitionsController(view.getContext(), this);
+ mLightTransitionsController = new LightBarTransitionsController(
+ view.getContext(), this, commandQueue);
mAllowAutoDimWallpaperNotVisible = view.getContext().getResources()
.getBoolean(R.bool.config_navigation_bar_enable_auto_dim_no_visible_wallpaper);
mDarkIntensityListeners = new ArrayList();
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarView.java
index 4b4a35bae05d..159a829fc47d 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarView.java
@@ -76,6 +76,7 @@ import com.android.systemui.recents.RecentsOnboarding;
import com.android.systemui.shared.system.ActivityManagerWrapper;
import com.android.systemui.shared.system.QuickStepContract;
import com.android.systemui.shared.system.WindowManagerWrapper;
+import com.android.systemui.statusbar.CommandQueue;
import com.android.systemui.statusbar.NavigationBarController;
import com.android.systemui.statusbar.policy.DeadZone;
import com.android.systemui.statusbar.policy.KeyButtonDrawable;
@@ -300,7 +301,7 @@ public class NavigationBarView extends FrameLayout implements
mConfiguration.updateFrom(context.getResources().getConfiguration());
mScreenPinningNotify = new ScreenPinningNotify(mContext);
- mBarTransitions = new NavigationBarTransitions(this);
+ mBarTransitions = new NavigationBarTransitions(this, Dependency.get(CommandQueue.class));
mButtonDispatchers.put(R.id.back, backButton);
mButtonDispatchers.put(R.id.home, new ButtonDispatcher(R.id.home));
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java
index e00cfb16bd67..6839fb432c0a 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java
@@ -16,7 +16,6 @@
package com.android.systemui.statusbar.phone;
-import static com.android.systemui.SysUiServiceProvider.getComponent;
import static com.android.systemui.statusbar.notification.ActivityLaunchAnimator.ExpandAnimationParameters;
import static com.android.systemui.statusbar.notification.stack.NotificationStackScrollLayout.ROWS_ALL;
import static com.android.systemui.util.InjectionInflationController.VIEW_CONTEXT;
@@ -109,6 +108,7 @@ import com.android.systemui.statusbar.policy.KeyguardUserSwitcher;
import com.android.systemui.statusbar.policy.OnHeadsUpChangedListener;
import com.android.systemui.statusbar.policy.ZenModeController;
import com.android.systemui.util.InjectionInflationController;
+import com.android.systemui.util.Utils;
import java.io.FileDescriptor;
import java.io.PrintWriter;
@@ -462,7 +462,7 @@ public class NotificationPanelView extends PanelView implements
NotificationEntryManager notificationEntryManager,
KeyguardStateController keyguardStateController,
StatusBarStateController statusBarStateController, DozeLog dozeLog,
- DozeParameters dozeParameters) {
+ DozeParameters dozeParameters, CommandQueue commandQueue) {
super(context, attrs, falsingManager, dozeLog, keyguardStateController,
(SysuiStatusBarStateController) statusBarStateController);
setWillNotDraw(!DEBUG);
@@ -474,7 +474,7 @@ public class NotificationPanelView extends PanelView implements
setAccessibilityPaneTitle(determineAccessibilityPaneTitle());
mAlphaPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.MULTIPLY));
setPanelAlpha(255, false /* animate */);
- mCommandQueue = getComponent(context, CommandQueue.class);
+ mCommandQueue = commandQueue;
mDisplayId = context.getDisplayId();
mPulseExpansionHandler = pulseExpansionHandler;
mDozeParameters = dozeParameters;
@@ -769,8 +769,7 @@ public class NotificationPanelView extends PanelView implements
int sideMargin = res.getDimensionPixelOffset(R.dimen.notification_side_paddings);
int topMargin =
res.getDimensionPixelOffset(com.android.internal.R.dimen.quick_qs_total_height);
- int flag = Settings.System.getInt(mContext.getContentResolver(), "qs_media_player", 0);
- if (flag == 1) {
+ if (Utils.useQsMediaPlayer(mContext)) {
topMargin = res.getDimensionPixelOffset(
com.android.internal.R.dimen.quick_qs_total_height_with_media);
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarPolicy.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarPolicy.java
index 294111c2bb76..01cd2b49d059 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarPolicy.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarPolicy.java
@@ -40,8 +40,8 @@ import com.android.internal.telephony.IccCardConstants;
import com.android.internal.telephony.TelephonyIntents;
import com.android.systemui.Dependency;
import com.android.systemui.R;
-import com.android.systemui.SysUiServiceProvider;
import com.android.systemui.UiOffloadThread;
+import com.android.systemui.broadcast.BroadcastDispatcher;
import com.android.systemui.privacy.PrivacyItem;
import com.android.systemui.privacy.PrivacyItemController;
import com.android.systemui.privacy.PrivacyItemControllerKt;
@@ -138,7 +138,8 @@ public class PhoneStatusBarPolicy
private BluetoothController mBluetooth;
private AlarmManager.AlarmClockInfo mNextAlarm;
- public PhoneStatusBarPolicy(Context context, StatusBarIconController iconController) {
+ public PhoneStatusBarPolicy(Context context, StatusBarIconController iconController,
+ CommandQueue commandQueue, BroadcastDispatcher broadcastDispatcher) {
mContext = context;
mIconController = iconController;
mCast = Dependency.get(CastController.class);
@@ -184,7 +185,7 @@ public class PhoneStatusBarPolicy
filter.addAction(Intent.ACTION_MANAGED_PROFILE_AVAILABLE);
filter.addAction(Intent.ACTION_MANAGED_PROFILE_UNAVAILABLE);
filter.addAction(Intent.ACTION_MANAGED_PROFILE_REMOVED);
- mContext.registerReceiver(mIntentReceiver, filter, null, mHandler);
+ broadcastDispatcher.registerReceiver(mIntentReceiver, filter, mHandler);
// listen for user / profile change.
try {
@@ -261,7 +262,7 @@ public class PhoneStatusBarPolicy
mSensorPrivacyController.addCallback(mSensorPrivacyListener);
mLocationController.addCallback(this);
- SysUiServiceProvider.getComponent(mContext, CommandQueue.class).addCallback(this);
+ commandQueue.addCallback(this);
}
@Override
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarView.java
index 53e146758116..312ca26c1bc4 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarView.java
@@ -19,7 +19,6 @@ package com.android.systemui.statusbar.phone;
import static android.content.res.Configuration.ORIENTATION_PORTRAIT;
import static com.android.systemui.ScreenDecorations.DisplayCutoutView.boundsFromDirection;
-import static com.android.systemui.SysUiServiceProvider.getComponent;
import android.annotation.Nullable;
import android.content.Context;
@@ -95,7 +94,7 @@ public class PhoneStatusBarView extends PanelBar {
super(context, attrs);
mBarTransitions = new PhoneStatusBarTransitions(this);
- mCommandQueue = getComponent(context, CommandQueue.class);
+ mCommandQueue = Dependency.get(CommandQueue.class);
}
public BarTransitions getBarTransitions() {
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimController.java
index 35039a0d74f9..f21a9a2eba88 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimController.java
@@ -750,6 +750,11 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener, OnCo
}
private void onFinished(Callback callback) {
+ if (mPendingFrameCallback != null) {
+ // No animations can finish while we're waiting on the blanking to finish
+ return;
+
+ }
if (isAnimating(mScrimBehind)
|| isAnimating(mScrimInFront)
|| isAnimating(mScrimForBubble)) {
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java
index afc147a75c56..4148a73e579c 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java
@@ -100,6 +100,7 @@ import android.provider.Settings;
import android.service.dreams.DreamService;
import android.service.dreams.IDreamManager;
import android.service.notification.StatusBarNotification;
+import android.util.ArraySet;
import android.util.DisplayMetrics;
import android.util.EventLog;
import android.util.Log;
@@ -156,6 +157,7 @@ import com.android.systemui.bubbles.BubbleController;
import com.android.systemui.charging.WirelessChargingAnimation;
import com.android.systemui.classifier.FalsingLog;
import com.android.systemui.colorextraction.SysuiColorExtractor;
+import com.android.systemui.dagger.SystemUIBinder;
import com.android.systemui.doze.DozeHost;
import com.android.systemui.doze.DozeLog;
import com.android.systemui.fragments.ExtensionFragmentListener;
@@ -167,7 +169,9 @@ import com.android.systemui.keyguard.WakefulnessLifecycle;
import com.android.systemui.plugins.ActivityStarter;
import com.android.systemui.plugins.DarkIconDispatcher;
import com.android.systemui.plugins.FalsingManager;
+import com.android.systemui.plugins.OverlayPlugin;
import com.android.systemui.plugins.PluginDependencyProvider;
+import com.android.systemui.plugins.PluginListener;
import com.android.systemui.plugins.qs.QS;
import com.android.systemui.plugins.statusbar.NotificationSwipeActionHelper.SnoozeOption;
import com.android.systemui.plugins.statusbar.StatusBarStateController;
@@ -175,6 +179,7 @@ import com.android.systemui.qs.QSFragment;
import com.android.systemui.qs.QSPanel;
import com.android.systemui.recents.Recents;
import com.android.systemui.recents.ScreenPinningRequest;
+import com.android.systemui.shared.plugins.PluginManager;
import com.android.systemui.shared.system.WindowManagerWrapper;
import com.android.systemui.stackdivider.Divider;
import com.android.systemui.stackdivider.WindowManagerProxy;
@@ -233,6 +238,7 @@ import com.android.systemui.statusbar.policy.KeyguardUserSwitcher;
import com.android.systemui.statusbar.policy.NetworkController;
import com.android.systemui.statusbar.policy.OnHeadsUpChangedListener;
import com.android.systemui.statusbar.policy.RemoteInputQuickSettingsDisabler;
+import com.android.systemui.statusbar.policy.RemoteInputUriController;
import com.android.systemui.statusbar.policy.UserInfoController;
import com.android.systemui.statusbar.policy.UserInfoControllerImpl;
import com.android.systemui.statusbar.policy.UserSwitcherController;
@@ -246,14 +252,11 @@ import java.io.StringWriter;
import java.util.ArrayList;
import java.util.Map;
-import javax.inject.Inject;
import javax.inject.Named;
-import javax.inject.Singleton;
import dagger.Lazy;
import dagger.Subcomponent;
-@Singleton
public class StatusBar extends SystemUI implements DemoMode,
ActivityStarter, KeyguardStateController.Callback,
OnHeadsUpChangedListener, CommandQueue.Callbacks, ZenModeController.Callback,
@@ -358,6 +361,8 @@ public class StatusBar extends SystemUI implements DemoMode,
private final Lazy<LockscreenWallpaper> mLockscreenWallpaperLazy;
protected LockscreenWallpaper mLockscreenWallpaper;
private final AutoHideController mAutoHideController;
+ @Nullable
+ private final KeyguardLiftController mKeyguardLiftController;
private int mNaturalBarHeight = -1;
@@ -396,6 +401,8 @@ public class StatusBar extends SystemUI implements DemoMode,
private final NotifLog mNotifLog;
private final DozeParameters mDozeParameters;
private final Lazy<BiometricUnlockController> mBiometricUnlockControllerLazy;
+ private final PluginManager mPluginManager;
+ private final RemoteInputUriController mRemoteInputUriController;
// expanded notifications
protected NotificationPanelView mNotificationPanel; // the sliding/resizing panel within the notification window
@@ -626,7 +633,12 @@ public class StatusBar extends SystemUI implements DemoMode,
AppOpsManager.OP_COARSE_LOCATION,
AppOpsManager.OP_FINE_LOCATION};
- @Inject
+ /**
+ * Public constructor for StatusBar.
+ *
+ * StatusBar is considered optional, and therefore can not be marked as @Inject directly.
+ * Instead, an @Provide method is included in {@link SystemUIBinder}.
+ */
public StatusBar(
Context context,
FeatureFlags featureFlags,
@@ -686,11 +698,15 @@ public class StatusBar extends SystemUI implements DemoMode,
NotifLog notifLog,
DozeParameters dozeParameters,
ScrimController scrimController,
+ @Nullable KeyguardLiftController keyguardLiftController,
Lazy<LockscreenWallpaper> lockscreenWallpaperLazy,
Lazy<BiometricUnlockController> biometricUnlockControllerLazy,
DozeServiceHost dozeServiceHost,
PowerManager powerManager,
- DozeScrimController dozeScrimController) {
+ DozeScrimController dozeScrimController,
+ CommandQueue commandQueue,
+ PluginManager pluginManager,
+ RemoteInputUriController remoteInputUriController) {
super(context);
mFeatureFlags = featureFlags;
mLightBarController = lightBarController;
@@ -751,10 +767,13 @@ public class StatusBar extends SystemUI implements DemoMode,
mPowerManager = powerManager;
mDozeParameters = dozeParameters;
mScrimController = scrimController;
+ mKeyguardLiftController = keyguardLiftController;
mLockscreenWallpaperLazy = lockscreenWallpaperLazy;
mDozeScrimController = dozeScrimController;
mBiometricUnlockControllerLazy = biometricUnlockControllerLazy;
-
+ mCommandQueue = commandQueue;
+ mPluginManager = pluginManager;
+ mRemoteInputUriController = remoteInputUriController;
mBubbleExpandListener =
(isExpanding, key) -> {
mEntryManager.updateNotifications("onBubbleExpandChanged");
@@ -814,7 +833,6 @@ public class StatusBar extends SystemUI implements DemoMode,
mKeyguardManager = (KeyguardManager) mContext.getSystemService(Context.KEYGUARD_SERVICE);
// Connect in to the status bar manager service
- mCommandQueue = getComponent(CommandQueue.class);
mCommandQueue.addCallback(this);
RegisterStatusBarResult result = null;
@@ -832,8 +850,8 @@ public class StatusBar extends SystemUI implements DemoMode,
if (mWallpaperSupported) {
// Make sure we always have the most current wallpaper info.
IntentFilter wallpaperChangedFilter = new IntentFilter(Intent.ACTION_WALLPAPER_CHANGED);
- mContext.registerReceiverAsUser(mWallpaperChangedReceiver, UserHandle.ALL,
- wallpaperChangedFilter, null /* broadcastPermission */, null /* scheduler */);
+ mBroadcastDispatcher.registerReceiver(mWallpaperChangedReceiver, wallpaperChangedFilter,
+ null /* handler */, UserHandle.ALL);
mWallpaperChangedReceiver.onReceive(mContext, null);
} else if (DEBUG) {
Log.v(TAG, "start(): no wallpaper service ");
@@ -897,7 +915,8 @@ public class StatusBar extends SystemUI implements DemoMode,
// end old BaseStatusBar.start().
// Lastly, call to the icon policy to install/update all the icons.
- mIconPolicy = new PhoneStatusBarPolicy(mContext, mIconController);
+ mIconPolicy = new PhoneStatusBarPolicy(mContext, mIconController, mCommandQueue,
+ mBroadcastDispatcher);
mSignalPolicy = new StatusBarSignalPolicy(mContext, mIconController);
mKeyguardStateController.addCallback(this);
@@ -921,6 +940,50 @@ public class StatusBar extends SystemUI implements DemoMode,
int disabledFlags2 = result.mDisabledFlags2;
Dependency.get(InitController.class).addPostInitTask(
() -> setUpDisableFlags(disabledFlags1, disabledFlags2));
+
+ mPluginManager.addPluginListener(
+ new PluginListener<OverlayPlugin>() {
+ private ArraySet<OverlayPlugin> mOverlays = new ArraySet<>();
+
+ @Override
+ public void onPluginConnected(OverlayPlugin plugin, Context pluginContext) {
+ mMainThreadHandler.post(
+ () -> plugin.setup(getStatusBarWindow(), getNavigationBarView(),
+ new Callback(plugin), mDozeParameters));
+ }
+
+ @Override
+ public void onPluginDisconnected(OverlayPlugin plugin) {
+ mMainThreadHandler.post(() -> {
+ mOverlays.remove(plugin);
+ mStatusBarWindowController.setForcePluginOpen(mOverlays.size() != 0);
+ });
+ }
+
+ class Callback implements OverlayPlugin.Callback {
+ private final OverlayPlugin mPlugin;
+
+ Callback(OverlayPlugin plugin) {
+ mPlugin = plugin;
+ }
+
+ @Override
+ public void onHoldStatusBarOpenChange() {
+ if (mPlugin.holdStatusBarOpen()) {
+ mOverlays.add(mPlugin);
+ } else {
+ mOverlays.remove(mPlugin);
+ }
+ mMainThreadHandler.post(() -> {
+ mStatusBarWindowController
+ .setStateListener(b -> mOverlays.forEach(
+ o -> o.setCollapseDesired(b)));
+ mStatusBarWindowController
+ .setForcePluginOpen(mOverlays.size() != 0);
+ });
+ }
+ }
+ }, OverlayPlugin.class, true /* Allow multiple plugins */);
}
// ================================================================================
@@ -999,7 +1062,7 @@ public class StatusBar extends SystemUI implements DemoMode,
mHeadsUpAppearanceController = new HeadsUpAppearanceController(
mNotificationIconAreaController, mHeadsUpManager, mStatusBarWindow,
mStatusBarStateController, mKeyguardBypassController,
- mKeyguardStateController, mWakeUpCoordinator);
+ mKeyguardStateController, mWakeUpCoordinator, mCommandQueue);
mHeadsUpAppearanceController.readFrom(oldController);
mStatusBarWindowViewController.setStatusBarView(mStatusBarView);
updateAreThereNotifications();
@@ -1205,7 +1268,7 @@ public class StatusBar extends SystemUI implements DemoMode,
mPresenter = new StatusBarNotificationPresenter(mContext, mNotificationPanel,
mHeadsUpManager, mStatusBarWindow, mStackScroller, mDozeScrimController,
mScrimController, mActivityLaunchAnimator, mDynamicPrivacyController,
- mNotificationAlertingManager, rowBinder, mKeyguardStateController);
+ mNotificationAlertingManager, rowBinder, mKeyguardStateController, mCommandQueue);
mNotificationListController =
new NotificationListController(
@@ -1236,6 +1299,8 @@ public class StatusBar extends SystemUI implements DemoMode,
mGutsManager.setNotificationActivityStarter(mNotificationActivityStarter);
mEntryManager.setRowBinder(rowBinder);
+ mRemoteInputUriController.attach(mEntryManager);
+
rowBinder.setNotificationClicker(new NotificationClicker(
this, mBubbleController, mNotificationActivityStarter));
@@ -2515,10 +2580,6 @@ public class StatusBar extends SystemUI implements DemoMode,
mDozeLog.dump(pw);
- if (mBiometricUnlockController != null) {
- mBiometricUnlockController.dump(pw);
- }
-
if (mKeyguardIndicationController != null) {
mKeyguardIndicationController.dump(fd, pw, args);
}
@@ -2572,14 +2633,6 @@ public class StatusBar extends SystemUI implements DemoMode,
mLightBarController.dump(fd, pw, args);
}
- if (mKeyguardBypassController != null) {
- mKeyguardBypassController.dump(pw);
- }
-
- if (mKeyguardUpdateMonitor != null) {
- mKeyguardUpdateMonitor.dump(fd, pw, args);
- }
-
mFalsingManager.dump(pw);
FalsingLog.dump(pw);
@@ -4087,7 +4140,7 @@ public class StatusBar extends SystemUI implements DemoMode,
// Begin Extra BaseStatusBar methods.
- protected CommandQueue mCommandQueue;
+ protected final CommandQueue mCommandQueue;
protected IStatusBarService mBarService;
// all notifications
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarIconController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarIconController.java
index 2e2ff1a5750e..5daef24cbad2 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarIconController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarIconController.java
@@ -40,6 +40,7 @@ import com.android.systemui.Dependency;
import com.android.systemui.R;
import com.android.systemui.plugins.DarkIconDispatcher;
import com.android.systemui.plugins.DarkIconDispatcher.DarkReceiver;
+import com.android.systemui.statusbar.CommandQueue;
import com.android.systemui.statusbar.StatusBarIconView;
import com.android.systemui.statusbar.StatusBarMobileView;
import com.android.systemui.statusbar.StatusBarWifiView;
@@ -96,8 +97,8 @@ public interface StatusBarIconController {
private final DarkIconDispatcher mDarkIconDispatcher;
private int mIconHPadding;
- public DarkIconManager(LinearLayout linearLayout) {
- super(linearLayout);
+ public DarkIconManager(LinearLayout linearLayout, CommandQueue commandQueue) {
+ super(linearLayout, commandQueue);
mIconHPadding = mContext.getResources().getDimensionPixelSize(
R.dimen.status_bar_icon_padding);
mDarkIconDispatcher = Dependency.get(DarkIconDispatcher.class);
@@ -156,8 +157,8 @@ public interface StatusBarIconController {
public static class TintedIconManager extends IconManager {
private int mColor;
- public TintedIconManager(ViewGroup group) {
- super(group);
+ public TintedIconManager(ViewGroup group, CommandQueue commandQueue) {
+ super(group, commandQueue);
}
@Override
@@ -203,14 +204,14 @@ public interface StatusBarIconController {
private boolean mIsInDemoMode;
protected DemoStatusIcons mDemoStatusIcons;
- public IconManager(ViewGroup group) {
+ public IconManager(ViewGroup group, CommandQueue commandQueue) {
mGroup = group;
mContext = group.getContext();
mIconSize = mContext.getResources().getDimensionPixelSize(
com.android.internal.R.dimen.status_bar_icon_size);
DisableStateTracker tracker =
- new DisableStateTracker(DISABLE_NONE, DISABLE2_SYSTEM_ICONS);
+ new DisableStateTracker(DISABLE_NONE, DISABLE2_SYSTEM_ICONS, commandQueue);
mGroup.addOnAttachStateChangeListener(tracker);
if (mGroup.isAttachedToWindow()) {
// In case we miss the first onAttachedToWindow event
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 e0b1846fa7d0..aa062eb2e051 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarIconControllerImpl.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarIconControllerImpl.java
@@ -29,7 +29,6 @@ import com.android.internal.statusbar.StatusBarIcon;
import com.android.systemui.Dependency;
import com.android.systemui.Dumpable;
import com.android.systemui.R;
-import com.android.systemui.SysUiServiceProvider;
import com.android.systemui.statusbar.CommandQueue;
import com.android.systemui.statusbar.StatusIconDisplayable;
import com.android.systemui.statusbar.phone.StatusBarSignalPolicy.MobileIconState;
@@ -70,7 +69,7 @@ public class StatusBarIconControllerImpl extends StatusBarIconList implements Tu
private boolean mIsDark = false;
@Inject
- public StatusBarIconControllerImpl(Context context) {
+ public StatusBarIconControllerImpl(Context context, CommandQueue commandQueue) {
super(context.getResources().getStringArray(
com.android.internal.R.array.config_statusBarIcons));
Dependency.get(ConfigurationController.class).addCallback(this);
@@ -79,8 +78,7 @@ public class StatusBarIconControllerImpl extends StatusBarIconList implements Tu
loadDimens();
- SysUiServiceProvider.getComponent(context, CommandQueue.class)
- .addCallback(this);
+ commandQueue.addCallback(this);
Dependency.get(TunerService.class).addTunable(this, ICON_BLACKLIST);
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarNotificationPresenter.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarNotificationPresenter.java
index b01a8d4b82e4..02e5ebfe5705 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarNotificationPresenter.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarNotificationPresenter.java
@@ -14,7 +14,6 @@
package com.android.systemui.statusbar.phone;
-import static com.android.systemui.SysUiServiceProvider.getComponent;
import static com.android.systemui.statusbar.phone.StatusBar.CLOSE_PANEL_WHEN_EMPTIED;
import static com.android.systemui.statusbar.phone.StatusBar.DEBUG;
import static com.android.systemui.statusbar.phone.StatusBar.MULTIUSER_DEBUG;
@@ -139,13 +138,14 @@ public class StatusBarNotificationPresenter implements NotificationPresenter,
DynamicPrivacyController dynamicPrivacyController,
NotificationAlertingManager notificationAlertingManager,
NotificationRowBinderImpl notificationRowBinder,
- KeyguardStateController keyguardStateController) {
+ KeyguardStateController keyguardStateController,
+ CommandQueue commandQueue) {
mContext = context;
mKeyguardStateController = keyguardStateController;
mNotificationPanel = panel;
mHeadsUpManager = headsUp;
mDynamicPrivacyController = dynamicPrivacyController;
- mCommandQueue = getComponent(context, CommandQueue.class);
+ mCommandQueue = commandQueue;
mAboveShelfObserver = new AboveShelfObserver(stackScroller);
mActivityLaunchAnimator = activityLaunchAnimator;
mAboveShelfObserver.setListener(statusBarWindow.findViewById(
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarRemoteInputCallback.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarRemoteInputCallback.java
index 1def89b3af54..b5a7847a2747 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarRemoteInputCallback.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarRemoteInputCallback.java
@@ -16,7 +16,6 @@ package com.android.systemui.statusbar.phone;
import static android.content.Intent.ACTION_DEVICE_LOCKED_CHANGED;
-import static com.android.systemui.SysUiServiceProvider.getComponent;
import static com.android.systemui.statusbar.NotificationLockscreenUserManager.NOTIFICATION_UNLOCKED_BY_WORK_CHALLENGE_ACTION;
import android.app.ActivityManager;
@@ -80,7 +79,8 @@ public class StatusBarRemoteInputCallback implements Callback, Callbacks,
NotificationLockscreenUserManager notificationLockscreenUserManager,
KeyguardStateController keyguardStateController,
StatusBarStateController statusBarStateController,
- ActivityStarter activityStarter, ShadeController shadeController) {
+ ActivityStarter activityStarter, ShadeController shadeController,
+ CommandQueue commandQueue) {
mContext = context;
mContext.registerReceiverAsUser(mChallengeReceiver, UserHandle.ALL,
new IntentFilter(ACTION_DEVICE_LOCKED_CHANGED), null, null);
@@ -91,7 +91,7 @@ public class StatusBarRemoteInputCallback implements Callback, Callbacks,
mActivityStarter = activityStarter;
mStatusBarStateController.addCallback(this);
mKeyguardManager = context.getSystemService(KeyguardManager.class);
- mCommandQueue = getComponent(context, CommandQueue.class);
+ mCommandQueue = commandQueue;
mCommandQueue.addCallback(this);
mActivityIntentHelper = new ActivityIntentHelper(mContext);
mGroupManager = groupManager;
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarWindowViewController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarWindowViewController.java
index fd3f9c803c12..b7ada5d35a08 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarWindowViewController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarWindowViewController.java
@@ -39,6 +39,7 @@ import com.android.systemui.doze.DozeLog;
import com.android.systemui.plugins.FalsingManager;
import com.android.systemui.plugins.statusbar.StatusBarStateController;
import com.android.systemui.shared.plugins.PluginManager;
+import com.android.systemui.statusbar.CommandQueue;
import com.android.systemui.statusbar.DragDownHelper;
import com.android.systemui.statusbar.NotificationLockscreenUserManager;
import com.android.systemui.statusbar.PulseExpansionHandler;
@@ -94,7 +95,8 @@ public class StatusBarWindowViewController {
KeyguardStateController keyguardStateController,
SysuiStatusBarStateController statusBarStateController,
DozeLog dozeLog,
- DozeParameters dozeParameters) {
+ DozeParameters dozeParameters,
+ CommandQueue commandQueue) {
mView = view;
mFalsingManager = falsingManager;
@@ -115,7 +117,8 @@ public class StatusBarWindowViewController {
keyguardStateController,
statusBarStateController,
dozeLog,
- dozeParameters);
+ dozeParameters,
+ commandQueue);
ViewGroup.LayoutParams lp = new ViewGroup.LayoutParams(
ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);
notificationPanelView.setVisibility(View.INVISIBLE);
@@ -488,6 +491,7 @@ public class StatusBarWindowViewController {
private final NotificationEntryManager mNotificationEntryManager;
private final DozeLog mDozeLog;
private final DozeParameters mDozeParameters;
+ private final CommandQueue mCommandQueue;
private StatusBarWindowView mView;
@Inject
@@ -505,7 +509,8 @@ public class StatusBarWindowViewController {
KeyguardStateController keyguardStateController,
StatusBarStateController statusBarStateController,
DozeLog dozeLog,
- DozeParameters dozeParameters) {
+ DozeParameters dozeParameters,
+ CommandQueue commandQueue) {
mInjectionInflationController = injectionInflationController;
mCoordinator = coordinator;
mPulseExpansionHandler = pulseExpansionHandler;
@@ -520,6 +525,7 @@ public class StatusBarWindowViewController {
mStatusBarStateController = (SysuiStatusBarStateController) statusBarStateController;
mDozeLog = dozeLog;
mDozeParameters = dozeParameters;
+ mCommandQueue = commandQueue;
}
/**
@@ -558,7 +564,8 @@ public class StatusBarWindowViewController {
mKeyguardStateController,
mStatusBarStateController,
mDozeLog,
- mDozeParameters);
+ mDozeParameters,
+ mCommandQueue);
}
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/BatteryControllerImpl.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/BatteryControllerImpl.java
index 3fc9b44f3850..f0f94201f3af 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/BatteryControllerImpl.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/BatteryControllerImpl.java
@@ -34,6 +34,7 @@ import com.android.settingslib.fuelgauge.BatterySaverUtils;
import com.android.settingslib.fuelgauge.Estimate;
import com.android.settingslib.utils.PowerUtil;
import com.android.systemui.Dependency;
+import com.android.systemui.broadcast.BroadcastDispatcher;
import com.android.systemui.power.EnhancedEstimates;
import java.io.FileDescriptor;
@@ -58,6 +59,7 @@ public class BatteryControllerImpl extends BroadcastReceiver implements BatteryC
private static final int UPDATE_GRANULARITY_MSEC = 1000 * 60;
private final EnhancedEstimates mEstimates;
+ private final BroadcastDispatcher mBroadcastDispatcher;
private final ArrayList<BatteryController.BatteryStateChangeCallback> mChangeCallbacks = new ArrayList<>();
private final ArrayList<EstimateFetchCompletion> mFetchCallbacks = new ArrayList<>();
private final PowerManager mPowerManager;
@@ -76,17 +78,20 @@ public class BatteryControllerImpl extends BroadcastReceiver implements BatteryC
private boolean mFetchingEstimate = false;
@Inject
- public BatteryControllerImpl(Context context, EnhancedEstimates enhancedEstimates) {
- this(context, enhancedEstimates, context.getSystemService(PowerManager.class));
+ public BatteryControllerImpl(Context context, EnhancedEstimates enhancedEstimates,
+ BroadcastDispatcher broadcastDispatcher) {
+ this(context, enhancedEstimates, context.getSystemService(PowerManager.class),
+ broadcastDispatcher);
}
@VisibleForTesting
BatteryControllerImpl(Context context, EnhancedEstimates enhancedEstimates,
- PowerManager powerManager) {
+ PowerManager powerManager, BroadcastDispatcher broadcastDispatcher) {
mContext = context;
mHandler = new Handler();
mPowerManager = powerManager;
mEstimates = enhancedEstimates;
+ mBroadcastDispatcher = broadcastDispatcher;
registerReceiver();
updatePowerSave();
@@ -99,7 +104,7 @@ public class BatteryControllerImpl extends BroadcastReceiver implements BatteryC
filter.addAction(PowerManager.ACTION_POWER_SAVE_MODE_CHANGED);
filter.addAction(PowerManager.ACTION_POWER_SAVE_MODE_CHANGING);
filter.addAction(ACTION_LEVEL_TEST);
- mContext.registerReceiver(this, filter);
+ mBroadcastDispatcher.registerReceiver(this, filter);
}
@Override
@@ -306,7 +311,7 @@ public class BatteryControllerImpl extends BroadcastReceiver implements BatteryC
public void dispatchDemoCommand(String command, Bundle args) {
if (!mDemoMode && command.equals(COMMAND_ENTER)) {
mDemoMode = true;
- mContext.unregisterReceiver(this);
+ mBroadcastDispatcher.unregisterReceiver(this);
} else if (mDemoMode && command.equals(COMMAND_EXIT)) {
mDemoMode = false;
registerReceiver();
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/Clock.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/Clock.java
index b331fc3bf0ce..dba3b923db4f 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/Clock.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/Clock.java
@@ -16,8 +16,6 @@
package com.android.systemui.statusbar.policy;
-import static com.android.systemui.util.InjectionInflationController.VIEW_CONTEXT;
-
import android.app.StatusBarManager;
import android.content.BroadcastReceiver;
import android.content.Context;
@@ -45,7 +43,6 @@ import com.android.systemui.DemoMode;
import com.android.systemui.Dependency;
import com.android.systemui.FontSizeUtils;
import com.android.systemui.R;
-import com.android.systemui.SysUiServiceProvider;
import com.android.systemui.broadcast.BroadcastDispatcher;
import com.android.systemui.plugins.DarkIconDispatcher;
import com.android.systemui.plugins.DarkIconDispatcher.DarkReceiver;
@@ -63,9 +60,6 @@ import java.util.Calendar;
import java.util.Locale;
import java.util.TimeZone;
-import javax.inject.Inject;
-import javax.inject.Named;
-
/**
* Digital clock for the status bar.
*/
@@ -81,6 +75,7 @@ public class Clock extends TextView implements DemoMode, Tunable, CommandQueue.C
private static final String VISIBILITY = "visibility";
private final CurrentUserTracker mCurrentUserTracker;
+ private final CommandQueue mCommandQueue;
private int mCurrentUserId;
private boolean mClockVisibleByPolicy = true;
@@ -116,18 +111,12 @@ public class Clock extends TextView implements DemoMode, Tunable, CommandQueue.C
private final BroadcastDispatcher mBroadcastDispatcher;
public Clock(Context context, AttributeSet attrs) {
- this(context, attrs, null);
- }
-
- @Inject
- public Clock(@Named(VIEW_CONTEXT) Context context, AttributeSet attrs,
- BroadcastDispatcher broadcastDispatcher) {
- this(context, attrs, 0, broadcastDispatcher);
+ this(context, attrs, 0);
}
- public Clock(Context context, AttributeSet attrs, int defStyle,
- BroadcastDispatcher broadcastDispatcher) {
+ public Clock(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
+ mCommandQueue = Dependency.get(CommandQueue.class);
TypedArray a = context.getTheme().obtainStyledAttributes(
attrs,
R.styleable.Clock,
@@ -139,13 +128,13 @@ public class Clock extends TextView implements DemoMode, Tunable, CommandQueue.C
} finally {
a.recycle();
}
- mCurrentUserTracker = new CurrentUserTracker(context) {
+ mBroadcastDispatcher = Dependency.get(BroadcastDispatcher.class);
+ mCurrentUserTracker = new CurrentUserTracker(mBroadcastDispatcher) {
@Override
public void onUserSwitched(int newUserId) {
mCurrentUserId = newUserId;
}
};
- mBroadcastDispatcher = broadcastDispatcher;
}
@Override
@@ -196,11 +185,11 @@ public class Clock extends TextView implements DemoMode, Tunable, CommandQueue.C
filter.addAction(Intent.ACTION_CONFIGURATION_CHANGED);
filter.addAction(Intent.ACTION_USER_SWITCHED);
- getContext().registerReceiverAsUser(mIntentReceiver, UserHandle.ALL, filter,
- null, Dependency.get(Dependency.TIME_TICK_HANDLER));
+ mBroadcastDispatcher.registerReceiver(mIntentReceiver, filter,
+ Dependency.get(Dependency.TIME_TICK_HANDLER), UserHandle.ALL);
Dependency.get(TunerService.class).addTunable(this, CLOCK_SECONDS,
StatusBarIconController.ICON_BLACKLIST);
- SysUiServiceProvider.getComponent(getContext(), CommandQueue.class).addCallback(this);
+ mCommandQueue.addCallback(this);
if (mShowDark) {
Dependency.get(DarkIconDispatcher.class).addDarkReceiver(this);
}
@@ -224,11 +213,10 @@ public class Clock extends TextView implements DemoMode, Tunable, CommandQueue.C
protected void onDetachedFromWindow() {
super.onDetachedFromWindow();
if (mAttached) {
- getContext().unregisterReceiver(mIntentReceiver);
+ mBroadcastDispatcher.unregisterReceiver(mIntentReceiver);
mAttached = false;
Dependency.get(TunerService.class).removeTunable(this);
- SysUiServiceProvider.getComponent(getContext(), CommandQueue.class)
- .removeCallback(this);
+ mCommandQueue.removeCallback(this);
if (mShowDark) {
Dependency.get(DarkIconDispatcher.class).removeDarkReceiver(this);
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/DateView.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/DateView.java
index 74a30fa8094f..d48876778590 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/DateView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/DateView.java
@@ -29,6 +29,7 @@ import android.widget.TextView;
import com.android.systemui.Dependency;
import com.android.systemui.R;
+import com.android.systemui.broadcast.BroadcastDispatcher;
import java.util.Date;
import java.util.Locale;
@@ -41,6 +42,7 @@ public class DateView extends TextView {
private DateFormat mDateFormat;
private String mLastText;
private String mDatePattern;
+ private final BroadcastDispatcher mBroadcastDispatcher;
private BroadcastReceiver mIntentReceiver = new BroadcastReceiver() {
@Override
@@ -75,6 +77,7 @@ public class DateView extends TextView {
if (mDatePattern == null) {
mDatePattern = getContext().getString(R.string.system_ui_date_pattern);
}
+ mBroadcastDispatcher = Dependency.get(BroadcastDispatcher.class);
}
@Override
@@ -86,7 +89,7 @@ public class DateView extends TextView {
filter.addAction(Intent.ACTION_TIME_CHANGED);
filter.addAction(Intent.ACTION_TIMEZONE_CHANGED);
filter.addAction(Intent.ACTION_LOCALE_CHANGED);
- getContext().registerReceiver(mIntentReceiver, filter, null,
+ mBroadcastDispatcher.registerReceiver(mIntentReceiver, filter,
Dependency.get(Dependency.TIME_TICK_HANDLER));
updateClock();
@@ -97,7 +100,7 @@ public class DateView extends TextView {
super.onDetachedFromWindow();
mDateFormat = null; // reload the locale next time
- getContext().unregisterReceiver(mIntentReceiver);
+ mBroadcastDispatcher.unregisterReceiver(mIntentReceiver);
}
protected void updateClock() {
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/DeviceProvisionedControllerImpl.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/DeviceProvisionedControllerImpl.java
index 0a40b3c4831c..b6ffd58be816 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/DeviceProvisionedControllerImpl.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/DeviceProvisionedControllerImpl.java
@@ -24,6 +24,7 @@ import android.provider.Settings.Global;
import android.provider.Settings.Secure;
import android.util.Log;
+import com.android.systemui.broadcast.BroadcastDispatcher;
import com.android.systemui.dagger.qualifiers.MainHandler;
import com.android.systemui.settings.CurrentUserTracker;
@@ -49,8 +50,9 @@ public class DeviceProvisionedControllerImpl extends CurrentUserTracker implemen
/**
*/
@Inject
- public DeviceProvisionedControllerImpl(Context context, @MainHandler Handler mainHandler) {
- super(context);
+ public DeviceProvisionedControllerImpl(Context context, @MainHandler Handler mainHandler,
+ BroadcastDispatcher broadcastDispatcher) {
+ super(broadcastDispatcher);
mContext = context;
mContentResolver = context.getContentResolver();
mDeviceProvisionedUri = Global.getUriFor(Global.DEVICE_PROVISIONED);
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/LocationControllerImpl.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/LocationControllerImpl.java
index 5a97eedd9b2c..3d51be7c02f4 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/LocationControllerImpl.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/LocationControllerImpl.java
@@ -35,6 +35,7 @@ import android.provider.Settings;
import androidx.annotation.VisibleForTesting;
+import com.android.systemui.broadcast.BroadcastDispatcher;
import com.android.systemui.dagger.qualifiers.BgLooper;
import com.android.systemui.util.Utils;
@@ -57,6 +58,7 @@ public class LocationControllerImpl extends BroadcastReceiver implements Locatio
private AppOpsManager mAppOpsManager;
private StatusBarManager mStatusBarManager;
+ private BroadcastDispatcher mBroadcastDispatcher;
private boolean mAreActiveLocationRequests;
@@ -65,14 +67,16 @@ public class LocationControllerImpl extends BroadcastReceiver implements Locatio
private final H mHandler = new H();
@Inject
- public LocationControllerImpl(Context context, @BgLooper Looper bgLooper) {
+ public LocationControllerImpl(Context context, @BgLooper Looper bgLooper,
+ BroadcastDispatcher broadcastDispatcher) {
mContext = context;
+ mBroadcastDispatcher = broadcastDispatcher;
// Register to listen for changes in location settings.
IntentFilter filter = new IntentFilter();
filter.addAction(LocationManager.HIGH_POWER_REQUEST_CHANGE_ACTION);
filter.addAction(LocationManager.MODE_CHANGED_ACTION);
- context.registerReceiverAsUser(this, UserHandle.ALL, filter, null, new Handler(bgLooper));
+ mBroadcastDispatcher.registerReceiver(this, filter, new Handler(bgLooper), UserHandle.ALL);
mAppOpsManager = (AppOpsManager) context.getSystemService(Context.APP_OPS_SERVICE);
mStatusBarManager
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkControllerImpl.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkControllerImpl.java
index 60784c91ee62..e5898eded11e 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkControllerImpl.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkControllerImpl.java
@@ -64,6 +64,7 @@ import com.android.systemui.ConfigurationChangedReceiver;
import com.android.systemui.DemoMode;
import com.android.systemui.Dumpable;
import com.android.systemui.R;
+import com.android.systemui.broadcast.BroadcastDispatcher;
import com.android.systemui.dagger.qualifiers.BgLooper;
import com.android.systemui.settings.CurrentUserTracker;
import com.android.systemui.statusbar.policy.DeviceProvisionedController.DeviceProvisionedListener;
@@ -109,6 +110,7 @@ public class NetworkControllerImpl extends BroadcastReceiver
private final SubscriptionDefaults mSubDefaults;
private final DataSaverController mDataSaverController;
private final CurrentUserTracker mUserTracker;
+ private final BroadcastDispatcher mBroadcastDispatcher;
private final Object mLock = new Object();
private Config mConfig;
@@ -170,7 +172,8 @@ public class NetworkControllerImpl extends BroadcastReceiver
*/
@Inject
public NetworkControllerImpl(Context context, @BgLooper Looper bgLooper,
- DeviceProvisionedController deviceProvisionedController) {
+ DeviceProvisionedController deviceProvisionedController,
+ BroadcastDispatcher broadcastDispatcher) {
this(context, (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE),
(TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE),
(WifiManager) context.getSystemService(Context.WIFI_SERVICE),
@@ -179,7 +182,8 @@ public class NetworkControllerImpl extends BroadcastReceiver
new AccessPointControllerImpl(context),
new DataUsageController(context),
new SubscriptionDefaults(),
- deviceProvisionedController);
+ deviceProvisionedController,
+ broadcastDispatcher);
mReceiverHandler.post(mRegisterListeners);
}
@@ -191,12 +195,14 @@ public class NetworkControllerImpl extends BroadcastReceiver
AccessPointControllerImpl accessPointController,
DataUsageController dataUsageController,
SubscriptionDefaults defaultsHandler,
- DeviceProvisionedController deviceProvisionedController) {
+ DeviceProvisionedController deviceProvisionedController,
+ BroadcastDispatcher broadcastDispatcher) {
mContext = context;
mConfig = config;
mReceiverHandler = new Handler(bgLooper);
mCallbackHandler = callbackHandler;
mDataSaverController = new DataSaverControllerImpl(context);
+ mBroadcastDispatcher = broadcastDispatcher;
mSubscriptionManager = subManager;
mSubDefaults = defaultsHandler;
@@ -229,7 +235,7 @@ public class NetworkControllerImpl extends BroadcastReceiver
// AIRPLANE_MODE_CHANGED is sent at boot; we've probably already missed it
updateAirplaneMode(true /* force callback */);
- mUserTracker = new CurrentUserTracker(mContext) {
+ mUserTracker = new CurrentUserTracker(broadcastDispatcher) {
@Override
public void onUserSwitched(int newUserId) {
NetworkControllerImpl.this.onUserSwitched(newUserId);
@@ -315,7 +321,7 @@ public class NetworkControllerImpl extends BroadcastReceiver
filter.addAction(Intent.ACTION_AIRPLANE_MODE_CHANGED);
filter.addAction(Intent.ACTION_BOOT_COMPLETED);
filter.addAction(CarrierConfigManager.ACTION_CARRIER_CONFIG_CHANGED);
- mContext.registerReceiver(this, filter, null, mReceiverHandler);
+ mBroadcastDispatcher.registerReceiver(this, filter, mReceiverHandler);
mListening = true;
updateMobileControllers();
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/RemoteInputQuickSettingsDisabler.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/RemoteInputQuickSettingsDisabler.java
index 2b602742e309..7ef9945b4d0e 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/RemoteInputQuickSettingsDisabler.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/RemoteInputQuickSettingsDisabler.java
@@ -21,7 +21,6 @@ import android.content.Context;
import android.content.res.Configuration;
import com.android.internal.annotations.VisibleForTesting;
-import com.android.systemui.SysUiServiceProvider;
import com.android.systemui.qs.QSFragment;
import com.android.systemui.statusbar.CommandQueue;
import com.android.systemui.statusbar.phone.StatusBar;
@@ -40,13 +39,13 @@ public class RemoteInputQuickSettingsDisabler
@VisibleForTesting boolean mRemoteInputActive;
@VisibleForTesting boolean misLandscape;
private int mLastOrientation;
- @VisibleForTesting CommandQueue mCommandQueue;
+ private final CommandQueue mCommandQueue;
@Inject
public RemoteInputQuickSettingsDisabler(Context context,
- ConfigurationController configController) {
+ ConfigurationController configController, CommandQueue commandQueue) {
mContext = context;
- mCommandQueue = SysUiServiceProvider.getComponent(context, CommandQueue.class);
+ mCommandQueue = commandQueue;
mLastOrientation = mContext.getResources().getConfiguration().orientation;
configController.addCallback(this);
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/RemoteInputUriController.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/RemoteInputUriController.java
new file mode 100644
index 000000000000..4d912deb7d41
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/RemoteInputUriController.java
@@ -0,0 +1,84 @@
+/*
+ * 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.net.Uri;
+import android.os.RemoteException;
+import android.service.notification.StatusBarNotification;
+import android.util.Log;
+
+import com.android.internal.statusbar.IStatusBarService;
+import com.android.internal.statusbar.NotificationVisibility;
+import com.android.systemui.statusbar.notification.NotificationEntryListener;
+import com.android.systemui.statusbar.notification.NotificationEntryManager;
+import com.android.systemui.statusbar.notification.collection.NotificationEntry;
+
+import javax.inject.Inject;
+import javax.inject.Singleton;
+
+/**
+ * Handles granting and revoking inline URI grants associated with RemoteInputs.
+ */
+@Singleton
+public class RemoteInputUriController {
+
+ private final IStatusBarService mStatusBarManagerService;
+ private static final String TAG = "RemoteInputUriController";
+
+ @Inject
+ public RemoteInputUriController(IStatusBarService statusBarService) {
+ mStatusBarManagerService = statusBarService;
+ }
+
+ /**
+ * Attach this controller as a listener to the provided NotificationEntryManager to ensure
+ * that RemoteInput URI grants are cleaned up when the notification entry is removed from
+ * the shade.
+ */
+ public void attach(NotificationEntryManager manager) {
+ manager.addNotificationEntryListener(mInlineUriListener);
+ }
+
+ /**
+ * Create a temporary grant which allows the app that submitted the notification access to the
+ * specified URI.
+ */
+ public void grantInlineReplyUriPermission(StatusBarNotification sbn, Uri data) {
+ try {
+ mStatusBarManagerService.grantInlineReplyUriPermission(
+ sbn.getKey(), data, sbn.getUser(), sbn.getPackageName());
+ } catch (Exception e) {
+ Log.e(TAG, "Failed to grant URI permissions:" + e.getMessage(), e);
+ }
+ }
+
+ /**
+ * Ensures that inline URI permissions are cleared when notification entries are removed from
+ * the shade.
+ */
+ private final NotificationEntryListener mInlineUriListener = new NotificationEntryListener() {
+ @Override
+ public void onEntryRemoved(NotificationEntry entry, NotificationVisibility visibility,
+ boolean removedByUser) {
+ try {
+ mStatusBarManagerService.clearInlineReplyUriPermissions(entry.getKey());
+ } catch (RemoteException ex) {
+ ex.rethrowFromSystemServer();
+ }
+ }
+ };
+}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/RemoteInputView.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/RemoteInputView.java
index 502a9bd34b12..307e3bcbaba5 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/RemoteInputView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/RemoteInputView.java
@@ -173,12 +173,7 @@ public class RemoteInputView extends LinearLayout implements View.OnClickListene
protected Intent prepareRemoteInputFromData(String contentType, Uri data) {
HashMap<String, Uri> results = new HashMap<>();
results.put(contentType, data);
- try {
- mStatusBarManagerService.grantInlineReplyUriPermission(
- mEntry.getSbn().getKey(), data);
- } catch (Exception e) {
- Log.e(TAG, "Failed to grant URI permissions:" + e.getMessage(), e);
- }
+ mController.grantInlineReplyUriPermission(mEntry.getSbn(), data);
Intent fillInIntent = new Intent().addFlags(Intent.FLAG_RECEIVER_FOREGROUND);
RemoteInput.addDataResultToIntent(mRemoteInput, fillInIntent, results);
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/SecurityControllerImpl.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/SecurityControllerImpl.java
index 0c68383649ab..c1614587ea35 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/SecurityControllerImpl.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/SecurityControllerImpl.java
@@ -48,6 +48,7 @@ import com.android.internal.annotations.GuardedBy;
import com.android.internal.net.LegacyVpnInfo;
import com.android.internal.net.VpnConfig;
import com.android.systemui.R;
+import com.android.systemui.broadcast.BroadcastDispatcher;
import com.android.systemui.dagger.qualifiers.BgHandler;
import com.android.systemui.settings.CurrentUserTracker;
@@ -100,13 +101,14 @@ public class SecurityControllerImpl extends CurrentUserTracker implements Securi
/**
*/
@Inject
- public SecurityControllerImpl(Context context, @BgHandler Handler bgHandler) {
- this(context, bgHandler, null);
+ public SecurityControllerImpl(Context context, @BgHandler Handler bgHandler,
+ BroadcastDispatcher broadcastDispatcher) {
+ this(context, bgHandler, broadcastDispatcher, null);
}
public SecurityControllerImpl(Context context, Handler bgHandler,
- SecurityControllerCallback callback) {
- super(context);
+ BroadcastDispatcher broadcastDispatcher, SecurityControllerCallback callback) {
+ super(broadcastDispatcher);
mContext = context;
mBgHandler = bgHandler;
mDevicePolicyManager = (DevicePolicyManager)
@@ -124,8 +126,7 @@ public class SecurityControllerImpl extends CurrentUserTracker implements Securi
IntentFilter filter = new IntentFilter();
filter.addAction(KeyChain.ACTION_TRUST_STORE_CHANGED);
filter.addAction(Intent.ACTION_USER_UNLOCKED);
- context.registerReceiverAsUser(mBroadcastReceiver, UserHandle.ALL, filter, null,
- bgHandler);
+ broadcastDispatcher.registerReceiver(mBroadcastReceiver, filter, bgHandler, UserHandle.ALL);
// TODO: re-register network callback on user change.
mConnectivityManager.registerNetworkCallback(REQUEST, mNetworkCallback);
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/UserSwitcherController.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/UserSwitcherController.java
index 2c996684f437..075c6d40ca31 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/UserSwitcherController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/UserSwitcherController.java
@@ -59,6 +59,7 @@ import com.android.systemui.Prefs;
import com.android.systemui.Prefs.Key;
import com.android.systemui.R;
import com.android.systemui.SystemUISecondaryUserService;
+import com.android.systemui.broadcast.BroadcastDispatcher;
import com.android.systemui.dagger.qualifiers.MainHandler;
import com.android.systemui.plugins.ActivityStarter;
import com.android.systemui.plugins.qs.DetailAdapter;
@@ -96,6 +97,7 @@ public class UserSwitcherController implements Dumpable {
private final KeyguardStateController mKeyguardStateController;
protected final Handler mHandler;
private final ActivityStarter mActivityStarter;
+ private final BroadcastDispatcher mBroadcastDispatcher;
private ArrayList<UserRecord> mUsers = new ArrayList<>();
private Dialog mExitGuestDialog;
@@ -111,10 +113,12 @@ public class UserSwitcherController implements Dumpable {
@Inject
public UserSwitcherController(Context context, KeyguardStateController keyguardStateController,
- @MainHandler Handler handler, ActivityStarter activityStarter) {
+ @MainHandler Handler handler, ActivityStarter activityStarter,
+ BroadcastDispatcher broadcastDispatcher) {
mContext = context;
+ mBroadcastDispatcher = broadcastDispatcher;
if (!UserManager.isGuestUserEphemeral()) {
- mGuestResumeSessionReceiver.register(context);
+ mGuestResumeSessionReceiver.register(mBroadcastDispatcher);
}
mKeyguardStateController = keyguardStateController;
mHandler = handler;
@@ -127,8 +131,8 @@ public class UserSwitcherController implements Dumpable {
filter.addAction(Intent.ACTION_USER_SWITCHED);
filter.addAction(Intent.ACTION_USER_STOPPED);
filter.addAction(Intent.ACTION_USER_UNLOCKED);
- mContext.registerReceiverAsUser(mReceiver, UserHandle.SYSTEM, filter,
- null /* permission */, null /* scheduler */);
+ mBroadcastDispatcher.registerReceiver(
+ mReceiver, filter, null /* handler */, UserHandle.SYSTEM);
mSecondaryUserServiceIntent = new Intent(context, SystemUISecondaryUserService.class);
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/ZenModeControllerImpl.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/ZenModeControllerImpl.java
index 1c7a1951b27d..a2028e6c0c33 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/ZenModeControllerImpl.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/ZenModeControllerImpl.java
@@ -39,6 +39,7 @@ import android.util.Log;
import com.android.internal.annotations.VisibleForTesting;
import com.android.systemui.Dumpable;
+import com.android.systemui.broadcast.BroadcastDispatcher;
import com.android.systemui.dagger.qualifiers.MainHandler;
import com.android.systemui.qs.GlobalSetting;
import com.android.systemui.settings.CurrentUserTracker;
@@ -77,8 +78,9 @@ public class ZenModeControllerImpl extends CurrentUserTracker
private NotificationManager.Policy mConsolidatedNotificationPolicy;
@Inject
- public ZenModeControllerImpl(Context context, @MainHandler Handler handler) {
- super(context);
+ public ZenModeControllerImpl(Context context, @MainHandler Handler handler,
+ BroadcastDispatcher broadcastDispatcher) {
+ super(broadcastDispatcher);
mContext = context;
mModeSetting = new GlobalSetting(mContext, handler, Global.ZEN_MODE) {
@Override
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/tv/TvStatusBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/tv/TvStatusBar.java
index c2ed7df7cb2e..379cf1f273e5 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/tv/TvStatusBar.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/tv/TvStatusBar.java
@@ -24,6 +24,9 @@ import com.android.internal.statusbar.IStatusBarService;
import com.android.systemui.SystemUI;
import com.android.systemui.statusbar.CommandQueue;
+import javax.inject.Inject;
+import javax.inject.Singleton;
+
/**
* Status bar implementation for "large screen" products that mostly present no on-screen nav.
@@ -34,10 +37,15 @@ import com.android.systemui.statusbar.CommandQueue;
* recording, discloses the responsible applications </li>
* </ul>
*/
+@Singleton
public class TvStatusBar extends SystemUI implements CommandQueue.Callbacks {
- public TvStatusBar(Context context) {
+ private final CommandQueue mCommandQueue;
+
+ @Inject
+ public TvStatusBar(Context context, CommandQueue commandQueue) {
super(context);
+ mCommandQueue = commandQueue;
}
@Override
@@ -46,10 +54,9 @@ public class TvStatusBar extends SystemUI implements CommandQueue.Callbacks {
final IStatusBarService barService = IStatusBarService.Stub.asInterface(
ServiceManager.getService(Context.STATUS_BAR_SERVICE));
- final CommandQueue commandQueue = getComponent(CommandQueue.class);
- commandQueue.addCallback(this);
+ mCommandQueue.addCallback(this);
try {
- barService.registerStatusBar(commandQueue);
+ barService.registerStatusBar(mCommandQueue);
} catch (RemoteException ex) {
// If the system process isn't there we're doomed anyway.
}
diff --git a/packages/SystemUI/src/com/android/systemui/theme/ThemeOverlayController.java b/packages/SystemUI/src/com/android/systemui/theme/ThemeOverlayController.java
index 9a58a355c586..128bb213c9d1 100644
--- a/packages/SystemUI/src/com/android/systemui/theme/ThemeOverlayController.java
+++ b/packages/SystemUI/src/com/android/systemui/theme/ThemeOverlayController.java
@@ -36,6 +36,7 @@ import android.util.Log;
import com.android.systemui.Dependency;
import com.android.systemui.R;
import com.android.systemui.SystemUI;
+import com.android.systemui.broadcast.BroadcastDispatcher;
import com.google.android.collect.Sets;
@@ -45,6 +46,9 @@ import org.json.JSONObject;
import java.util.Map;
import java.util.Set;
+import javax.inject.Inject;
+import javax.inject.Singleton;
+
/**
* Controls the application of theme overlays across the system for all users.
* This service is responsible for:
@@ -54,15 +58,19 @@ import java.util.Set;
* - Observing work profile changes and applying overlays from the primary user to their
* associated work profiles
*/
+@Singleton
public class ThemeOverlayController extends SystemUI {
private static final String TAG = "ThemeOverlayController";
private static final boolean DEBUG = false;
private ThemeOverlayManager mThemeManager;
private UserManager mUserManager;
+ private BroadcastDispatcher mBroadcastDispatcher;
- public ThemeOverlayController(Context context) {
+ @Inject
+ public ThemeOverlayController(Context context, BroadcastDispatcher broadcastDispatcher) {
super(context);
+ mBroadcastDispatcher = broadcastDispatcher;
}
@Override
@@ -78,13 +86,13 @@ public class ThemeOverlayController extends SystemUI {
final IntentFilter filter = new IntentFilter();
filter.addAction(Intent.ACTION_USER_SWITCHED);
filter.addAction(Intent.ACTION_MANAGED_PROFILE_ADDED);
- mContext.registerReceiverAsUser(new BroadcastReceiver() {
+ mBroadcastDispatcher.registerReceiver(new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
if (DEBUG) Log.d(TAG, "Updating overlays for user switch / profile added.");
updateThemeOverlays();
}
- }, UserHandle.ALL, filter, null, bgHandler);
+ }, filter, bgHandler, UserHandle.ALL);
mContext.getContentResolver().registerContentObserver(
Settings.Secure.getUriFor(Settings.Secure.THEME_CUSTOMIZATION_OVERLAY_PACKAGES),
false,
diff --git a/packages/SystemUI/src/com/android/systemui/tuner/TunerServiceImpl.java b/packages/SystemUI/src/com/android/systemui/tuner/TunerServiceImpl.java
index 2d6027cb324d..ce0032e619e7 100644
--- a/packages/SystemUI/src/com/android/systemui/tuner/TunerServiceImpl.java
+++ b/packages/SystemUI/src/com/android/systemui/tuner/TunerServiceImpl.java
@@ -34,6 +34,7 @@ import android.util.ArraySet;
import com.android.internal.util.ArrayUtils;
import com.android.systemui.DejankUtils;
import com.android.systemui.DemoMode;
+import com.android.systemui.broadcast.BroadcastDispatcher;
import com.android.systemui.dagger.qualifiers.MainHandler;
import com.android.systemui.qs.QSTileHost;
import com.android.systemui.settings.CurrentUserTracker;
@@ -82,7 +83,7 @@ public class TunerServiceImpl extends TunerService {
*/
@Inject
public TunerServiceImpl(Context context, @MainHandler Handler mainHandler,
- LeakDetector leakDetector) {
+ LeakDetector leakDetector, BroadcastDispatcher broadcastDispatcher) {
mContext = context;
mContentResolver = mContext.getContentResolver();
mLeakDetector = leakDetector;
@@ -95,7 +96,7 @@ public class TunerServiceImpl extends TunerService {
}
mCurrentUser = ActivityManager.getCurrentUser();
- mUserTracker = new CurrentUserTracker(mContext) {
+ mUserTracker = new CurrentUserTracker(broadcastDispatcher) {
@Override
public void onUserSwitched(int newUserId) {
mCurrentUser = newUserId;
diff --git a/packages/SystemUI/src/com/android/systemui/usb/UsbDebuggingActivity.java b/packages/SystemUI/src/com/android/systemui/usb/UsbDebuggingActivity.java
index 4d12cc9ebcff..2f13f395d057 100644
--- a/packages/SystemUI/src/com/android/systemui/usb/UsbDebuggingActivity.java
+++ b/packages/SystemUI/src/com/android/systemui/usb/UsbDebuggingActivity.java
@@ -42,6 +42,9 @@ import android.widget.Toast;
import com.android.internal.app.AlertActivity;
import com.android.internal.app.AlertController;
import com.android.systemui.R;
+import com.android.systemui.broadcast.BroadcastDispatcher;
+
+import javax.inject.Inject;
public class UsbDebuggingActivity extends AlertActivity
implements DialogInterface.OnClickListener {
@@ -49,12 +52,20 @@ public class UsbDebuggingActivity extends AlertActivity
private CheckBox mAlwaysAllow;
private UsbDisconnectedReceiver mDisconnectedReceiver;
+ private final BroadcastDispatcher mBroadcastDispatcher;
private String mKey;
+ @Inject
+ public UsbDebuggingActivity(BroadcastDispatcher broadcastDispatcher) {
+ super();
+ mBroadcastDispatcher = broadcastDispatcher;
+ }
+
@Override
public void onCreate(Bundle icicle) {
Window window = getWindow();
- window.addSystemFlags(WindowManager.LayoutParams.SYSTEM_FLAG_HIDE_NON_SYSTEM_OVERLAY_WINDOWS);
+ window.addSystemFlags(
+ WindowManager.LayoutParams.SYSTEM_FLAG_HIDE_NON_SYSTEM_OVERLAY_WINDOWS);
window.setType(WindowManager.LayoutParams.TYPE_SYSTEM_DIALOG);
super.onCreate(icicle);
@@ -138,13 +149,13 @@ public class UsbDebuggingActivity extends AlertActivity
public void onStart() {
super.onStart();
IntentFilter filter = new IntentFilter(UsbManager.ACTION_USB_STATE);
- registerReceiver(mDisconnectedReceiver, filter);
+ mBroadcastDispatcher.registerReceiver(mDisconnectedReceiver, filter);
}
@Override
protected void onStop() {
if (mDisconnectedReceiver != null) {
- unregisterReceiver(mDisconnectedReceiver);
+ mBroadcastDispatcher.unregisterReceiver(mDisconnectedReceiver);
}
super.onStop();
}
diff --git a/packages/SystemUI/src/com/android/systemui/usb/UsbDebuggingSecondaryUserActivity.java b/packages/SystemUI/src/com/android/systemui/usb/UsbDebuggingSecondaryUserActivity.java
index bafd1f1c25a4..032b72ebff7d 100644
--- a/packages/SystemUI/src/com/android/systemui/usb/UsbDebuggingSecondaryUserActivity.java
+++ b/packages/SystemUI/src/com/android/systemui/usb/UsbDebuggingSecondaryUserActivity.java
@@ -29,10 +29,19 @@ import android.os.SystemProperties;
import com.android.internal.app.AlertActivity;
import com.android.internal.app.AlertController;
import com.android.systemui.R;
+import com.android.systemui.broadcast.BroadcastDispatcher;
+
+import javax.inject.Inject;
public class UsbDebuggingSecondaryUserActivity extends AlertActivity
implements DialogInterface.OnClickListener {
private UsbDisconnectedReceiver mDisconnectedReceiver;
+ private final BroadcastDispatcher mBroadcastDispatcher;
+
+ @Inject
+ public UsbDebuggingSecondaryUserActivity(BroadcastDispatcher broadcastDispatcher) {
+ mBroadcastDispatcher = broadcastDispatcher;
+ }
@Override
public void onCreate(Bundle icicle) {
@@ -74,13 +83,13 @@ public class UsbDebuggingSecondaryUserActivity extends AlertActivity
super.onStart();
IntentFilter filter = new IntentFilter(UsbManager.ACTION_USB_STATE);
- registerReceiver(mDisconnectedReceiver, filter);
+ mBroadcastDispatcher.registerReceiver(mDisconnectedReceiver, filter);
}
@Override
protected void onStop() {
if (mDisconnectedReceiver != null) {
- unregisterReceiver(mDisconnectedReceiver);
+ mBroadcastDispatcher.unregisterReceiver(mDisconnectedReceiver);
}
super.onStop();
}
diff --git a/packages/SystemUI/src/com/android/systemui/util/EmergencyDialerConstants.java b/packages/SystemUI/src/com/android/systemui/util/EmergencyDialerConstants.java
index d101ccbe30ea..e93e24129aad 100644
--- a/packages/SystemUI/src/com/android/systemui/util/EmergencyDialerConstants.java
+++ b/packages/SystemUI/src/com/android/systemui/util/EmergencyDialerConstants.java
@@ -21,11 +21,10 @@ package com.android.systemui.util;
* Please keep these constants being consistent with those in com.android.phone.EmergencyDialer.
*/
public class EmergencyDialerConstants {
- // Intent action for emergency dialer activity.
- public static final String ACTION_DIAL = "com.android.phone.EmergencyDialer.DIAL";
/**
- * Extra included in {@link #ACTION_DIAL} to indicate the entry type that user starts
+ * Extra included in {@link android.telecom.TelecomManager#createLaunchEmergencyDialerIntent}
+ * to indicate the entry type that user starts
* the emergency dialer.
*/
public static final String EXTRA_ENTRY_TYPE =
diff --git a/packages/SystemUI/src/com/android/systemui/util/InjectionInflationController.java b/packages/SystemUI/src/com/android/systemui/util/InjectionInflationController.java
index 5ed027d37def..60d76789ff63 100644
--- a/packages/SystemUI/src/com/android/systemui/util/InjectionInflationController.java
+++ b/packages/SystemUI/src/com/android/systemui/util/InjectionInflationController.java
@@ -37,7 +37,6 @@ import com.android.systemui.statusbar.NotificationShelf;
import com.android.systemui.statusbar.notification.stack.NotificationStackScrollLayout;
import com.android.systemui.statusbar.phone.LockIcon;
import com.android.systemui.statusbar.phone.NotificationPanelView;
-import com.android.systemui.statusbar.policy.Clock;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
@@ -179,11 +178,6 @@ public class InjectionInflationController {
* Creates the QSCustomizer.
*/
QSCustomizer createQSCustomizer();
-
- /**
- * Creates a Clock.
- */
- Clock createClock();
}
/**
diff --git a/packages/SystemUI/src/com/android/systemui/util/Utils.java b/packages/SystemUI/src/com/android/systemui/util/Utils.java
index 92a8d8482e87..47454cb5aca1 100644
--- a/packages/SystemUI/src/com/android/systemui/util/Utils.java
+++ b/packages/SystemUI/src/com/android/systemui/util/Utils.java
@@ -20,9 +20,9 @@ import android.Manifest;
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager;
+import android.provider.Settings;
import android.view.View;
-import com.android.systemui.SysUiServiceProvider;
import com.android.systemui.shared.system.QuickStepContract;
import com.android.systemui.statusbar.CommandQueue;
@@ -52,25 +52,25 @@ public class Utils {
View.OnAttachStateChangeListener {
private final int mMask1;
private final int mMask2;
+ private final CommandQueue mCommandQueue;
private View mView;
private boolean mDisabled;
- public DisableStateTracker(int disableMask, int disable2Mask) {
+ public DisableStateTracker(int disableMask, int disable2Mask, CommandQueue commandQueue) {
mMask1 = disableMask;
mMask2 = disable2Mask;
+ mCommandQueue = commandQueue;
}
@Override
public void onViewAttachedToWindow(View v) {
mView = v;
- SysUiServiceProvider.getComponent(v.getContext(), CommandQueue.class)
- .addCallback(this);
+ mCommandQueue.addCallback(this);
}
@Override
public void onViewDetachedFromWindow(View v) {
- SysUiServiceProvider.getComponent(mView.getContext(), CommandQueue.class)
- .removeCallback(this);
+ mCommandQueue.removeCallback(this);
mView = null;
}
@@ -124,4 +124,13 @@ public class Utils {
&& QuickStepContract.isGesturalMode(navMode);
}
+ /**
+ * Allow the media player to be shown in the QS area, controlled by 2 flags.
+ */
+ public static boolean useQsMediaPlayer(Context context) {
+ int flag = Settings.System.getInt(context.getContentResolver(), "qs_media_player", 0);
+ flag |= Settings.System.getInt(context.getContentResolver(), "npv_plugin_flag", 0);
+
+ return flag > 0;
+ }
}
diff --git a/packages/SystemUI/tests/src/com/android/keyguard/KeyguardUpdateMonitorTest.java b/packages/SystemUI/tests/src/com/android/keyguard/KeyguardUpdateMonitorTest.java
index 57b09872f9c1..c1da53b09cfc 100644
--- a/packages/SystemUI/tests/src/com/android/keyguard/KeyguardUpdateMonitorTest.java
+++ b/packages/SystemUI/tests/src/com/android/keyguard/KeyguardUpdateMonitorTest.java
@@ -26,6 +26,7 @@ import static org.mockito.ArgumentMatchers.anyBoolean;
import static org.mockito.ArgumentMatchers.anyInt;
import static org.mockito.ArgumentMatchers.anyString;
import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.Mockito.atLeastOnce;
import static org.mockito.Mockito.clearInvocations;
import static org.mockito.Mockito.doAnswer;
import static org.mockito.Mockito.never;
@@ -37,6 +38,7 @@ import android.app.admin.DevicePolicyManager;
import android.app.trust.TrustManager;
import android.content.Context;
import android.content.Intent;
+import android.content.IntentFilter;
import android.content.pm.PackageManager;
import android.hardware.biometrics.BiometricManager;
import android.hardware.biometrics.BiometricSourceType;
@@ -44,6 +46,8 @@ import android.hardware.biometrics.IBiometricEnabledOnKeyguardCallback;
import android.hardware.face.FaceManager;
import android.hardware.fingerprint.FingerprintManager;
import android.os.Bundle;
+import android.os.Handler;
+import android.os.UserHandle;
import android.os.UserManager;
import android.telephony.ServiceState;
import android.telephony.SubscriptionInfo;
@@ -56,7 +60,9 @@ import android.testing.TestableLooper;
import com.android.internal.telephony.IccCardConstants;
import com.android.internal.telephony.PhoneConstants;
import com.android.internal.telephony.TelephonyIntents;
+import com.android.systemui.DumpController;
import com.android.systemui.SysuiTestCase;
+import com.android.systemui.broadcast.BroadcastDispatcher;
import com.android.systemui.statusbar.phone.KeyguardBypassController;
import org.junit.Assert;
@@ -87,6 +93,8 @@ public class KeyguardUpdateMonitorTest extends SysuiTestCase {
DATA_ROAMING_DISABLE, null, null, null, null, false, null, "", true, TEST_GROUP_UUID,
TEST_CARRIER_ID, 0);
@Mock
+ private DumpController mDumpController;
+ @Mock
private KeyguardUpdateMonitor.StrongAuthTracker mStrongAuthTracker;
@Mock
private TrustManager mTrustManager;
@@ -106,6 +114,8 @@ public class KeyguardUpdateMonitorTest extends SysuiTestCase {
private KeyguardBypassController mKeyguardBypassController;
@Mock
private SubscriptionManager mSubscriptionManager;
+ @Mock
+ private BroadcastDispatcher mBroadcastDispatcher;
private TestableLooper mTestableLooper;
private TestableKeyguardUpdateMonitor mKeyguardUpdateMonitor;
@@ -140,6 +150,16 @@ public class KeyguardUpdateMonitorTest extends SysuiTestCase {
}
@Test
+ public void testReceiversRegistered() {
+ verify(mBroadcastDispatcher, atLeastOnce()).registerReceiver(
+ eq(mKeyguardUpdateMonitor.mBroadcastReceiver),
+ any(IntentFilter.class), any(Handler.class));
+ verify(mBroadcastDispatcher, atLeastOnce()).registerReceiver(
+ eq(mKeyguardUpdateMonitor.mBroadcastAllReceiver),
+ any(IntentFilter.class), any(Handler.class), eq(UserHandle.ALL));
+ }
+
+ @Test
public void testIgnoresSimStateCallback_rebroadcast() {
Intent intent = new Intent(TelephonyIntents.ACTION_SIM_STATE_CHANGED);
@@ -515,9 +535,9 @@ public class KeyguardUpdateMonitorTest extends SysuiTestCase {
AtomicBoolean mSimStateChanged = new AtomicBoolean(false);
protected TestableKeyguardUpdateMonitor(Context context) {
- super(context, TestableLooper.get(KeyguardUpdateMonitorTest.this).getLooper());
- context.unregisterReceiver(mBroadcastReceiver);
- context.unregisterReceiver(mBroadcastAllReceiver);
+ super(context,
+ TestableLooper.get(KeyguardUpdateMonitorTest.this).getLooper(),
+ mBroadcastDispatcher, mDumpController);
mStrongAuthTracker = KeyguardUpdateMonitorTest.this.mStrongAuthTracker;
}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/DependencyTest.java b/packages/SystemUI/tests/src/com/android/systemui/DependencyTest.java
index 939df10724ca..c020514d06a4 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/DependencyTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/DependencyTest.java
@@ -30,6 +30,7 @@ import com.android.systemui.statusbar.policy.FlashlightController;
import org.junit.Assert;
import org.junit.Test;
+import java.io.FileDescriptor;
import java.io.PrintWriter;
@SmallTest
@@ -56,10 +57,12 @@ public class DependencyTest extends SysuiTestCase {
@Test
public void testDump() {
Dumpable d = mock(Dumpable.class);
+ String[] args = new String[0];
+ FileDescriptor fd = mock(FileDescriptor.class);
mDependency.injectTestDependency(DUMPABLE, d);
Dependency.get(DUMPABLE);
- mDependency.dump(null, mock(PrintWriter.class), null);
- verify(d).dump(eq(null), any(), eq(null));
+ mDependency.dump(fd, mock(PrintWriter.class), args);
+ verify(d).dump(eq(fd), any(), eq(args));
}
@Test
diff --git a/packages/SystemUI/tests/src/com/android/systemui/ScreenDecorationsTest.java b/packages/SystemUI/tests/src/com/android/systemui/ScreenDecorationsTest.java
index 7359fdce462d..1e9000b76c3f 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/ScreenDecorationsTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/ScreenDecorationsTest.java
@@ -50,6 +50,7 @@ import androidx.test.filters.SmallTest;
import com.android.systemui.R.dimen;
import com.android.systemui.ScreenDecorations.TunablePaddingTagListener;
+import com.android.systemui.broadcast.BroadcastDispatcher;
import com.android.systemui.fragments.FragmentHostManager;
import com.android.systemui.fragments.FragmentService;
import com.android.systemui.statusbar.phone.StatusBar;
@@ -79,9 +80,13 @@ public class ScreenDecorationsTest extends SysuiTestCase {
private WindowManager mWindowManager;
private FragmentService mFragmentService;
private FragmentHostManager mFragmentHostManager;
- private TunerService mTunerService;
private StatusBarWindowView mView;
private TunablePaddingService mTunablePaddingService;
+ private Handler mMainHandler;
+ @Mock
+ private TunerService mTunerService;
+ @Mock
+ private BroadcastDispatcher mBroadcastDispatcher;
@Mock private Lazy<StatusBar> mStatusBarLazy;
@Before
@@ -89,10 +94,8 @@ public class ScreenDecorationsTest extends SysuiTestCase {
MockitoAnnotations.initMocks(this);
mTestableLooper = TestableLooper.get(this);
- mDependency.injectTestDependency(Dependency.MAIN_HANDLER,
- new Handler(mTestableLooper.getLooper()));
+ mMainHandler = new Handler(mTestableLooper.getLooper());
mTunablePaddingService = mDependency.injectMockDependency(TunablePaddingService.class);
- mTunerService = mDependency.injectMockDependency(TunerService.class);
mFragmentService = mDependency.injectMockDependency(FragmentService.class);
mWindowManager = mock(WindowManager.class);
@@ -108,7 +111,8 @@ public class ScreenDecorationsTest extends SysuiTestCase {
when(mFragmentService.getFragmentHostManager(any())).thenReturn(mFragmentHostManager);
- mScreenDecorations = new ScreenDecorations(mContext, mStatusBarLazy) {
+ mScreenDecorations = new ScreenDecorations(mContext, mStatusBarLazy, mMainHandler,
+ mBroadcastDispatcher, mTunerService) {
@Override
public void start() {
super.start();
diff --git a/packages/SystemUI/tests/src/com/android/systemui/SizeCompatModeActivityControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/SizeCompatModeActivityControllerTest.java
index 06999bc45e17..1638ea1ca843 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/SizeCompatModeActivityControllerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/SizeCompatModeActivityControllerTest.java
@@ -31,6 +31,7 @@ import androidx.test.filters.SmallTest;
import com.android.systemui.SizeCompatModeActivityController.RestartActivityButton;
import com.android.systemui.shared.system.ActivityManagerWrapper;
import com.android.systemui.shared.system.TaskStackChangeListener;
+import com.android.systemui.statusbar.CommandQueue;
import org.junit.Before;
import org.junit.Test;
@@ -58,7 +59,8 @@ public class SizeCompatModeActivityControllerTest extends SysuiTestCase {
MockitoAnnotations.initMocks(this);
doReturn(true).when(mMockButton).show();
- mController = new SizeCompatModeActivityController(mContext, mMockAm) {
+ mController = new SizeCompatModeActivityController(mContext, mMockAm,
+ new CommandQueue(mContext)) {
@Override
RestartActivityButton createRestartButton(Context context) {
return mMockButton;
diff --git a/packages/SystemUI/tests/src/com/android/systemui/SliceBroadcastRelayHandlerTest.java b/packages/SystemUI/tests/src/com/android/systemui/SliceBroadcastRelayHandlerTest.java
index a766885297fa..7d556236b518 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/SliceBroadcastRelayHandlerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/SliceBroadcastRelayHandlerTest.java
@@ -17,6 +17,7 @@ package com.android.systemui;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.never;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.timeout;
import static org.mockito.Mockito.verify;
@@ -34,11 +35,14 @@ import android.testing.AndroidTestingRunner;
import androidx.test.filters.SmallTest;
import com.android.settingslib.SliceBroadcastRelay;
+import com.android.systemui.broadcast.BroadcastDispatcher;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.ArgumentCaptor;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
@RunWith(AndroidTestingRunner.class)
@SmallTest
@@ -47,11 +51,15 @@ public class SliceBroadcastRelayHandlerTest extends SysuiTestCase {
private static final String TEST_ACTION = "com.android.systemui.action.TEST_ACTION";
private SliceBroadcastRelayHandler mRelayHandler;
private Context mSpyContext;
+ @Mock
+ private BroadcastDispatcher mBroadcastDispatcher;
+
@Before
public void setup() {
+ MockitoAnnotations.initMocks(this);
mSpyContext = spy(mContext);
- mRelayHandler = new SliceBroadcastRelayHandler(mSpyContext);
+ mRelayHandler = new SliceBroadcastRelayHandler(mSpyContext, mBroadcastDispatcher);
}
@Test
@@ -136,6 +144,16 @@ public class SliceBroadcastRelayHandlerTest extends SysuiTestCase {
verify(Receiver.sReceiver, timeout(2000)).onReceive(any(), any());
}
+ @Test
+ public void testRegisteredWithDispatcher() {
+ mRelayHandler.start();
+
+ verify(mBroadcastDispatcher)
+ .registerReceiver(any(BroadcastReceiver.class), any(IntentFilter.class));
+ verify(mSpyContext, never())
+ .registerReceiver(any(BroadcastReceiver.class), any(IntentFilter.class));
+ }
+
public static class Receiver extends BroadcastReceiver {
private static BroadcastReceiver sReceiver;
diff --git a/packages/SystemUI/tests/src/com/android/systemui/biometrics/AuthControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/biometrics/AuthControllerTest.java
index 85d818ac8be3..c215a43e0f3e 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/biometrics/AuthControllerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/biometrics/AuthControllerTest.java
@@ -88,7 +88,6 @@ public class AuthControllerTest extends SysuiTestCase {
TestableContext context = spy(mContext);
mContext.putComponent(StatusBar.class, mock(StatusBar.class));
- mContext.putComponent(CommandQueue.class, mock(CommandQueue.class));
when(context.getPackageManager()).thenReturn(mPackageManager);
when(mPackageManager.hasSystemFeature(PackageManager.FEATURE_FACE))
@@ -102,7 +101,8 @@ public class AuthControllerTest extends SysuiTestCase {
when(mDialog1.isAllowDeviceCredentials()).thenReturn(false);
when(mDialog2.isAllowDeviceCredentials()).thenReturn(false);
- mAuthController = new TestableAuthController(context, new MockInjector());
+ mAuthController = new TestableAuthController(
+ context, mock(CommandQueue.class), new MockInjector());
mAuthController.mComponents = mContext.getComponents();
mAuthController.start();
@@ -435,8 +435,8 @@ public class AuthControllerTest extends SysuiTestCase {
private int mBuildCount = 0;
private Bundle mLastBiometricPromptBundle;
- TestableAuthController(Context context, Injector injector) {
- super(context, injector);
+ TestableAuthController(Context context, CommandQueue commandQueue, Injector injector) {
+ super(context, commandQueue, injector);
}
@Override
diff --git a/packages/SystemUI/tests/src/com/android/systemui/doze/DozeScreenBrightnessTest.java b/packages/SystemUI/tests/src/com/android/systemui/doze/DozeScreenBrightnessTest.java
index 316b891080ce..2ed0b4ffa0f4 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/doze/DozeScreenBrightnessTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/doze/DozeScreenBrightnessTest.java
@@ -45,6 +45,7 @@ import androidx.test.filters.SmallTest;
import androidx.test.runner.AndroidJUnit4;
import com.android.systemui.SysuiTestCase;
+import com.android.systemui.broadcast.BroadcastDispatcher;
import com.android.systemui.util.sensors.FakeSensorManager;
import org.junit.Before;
@@ -66,6 +67,8 @@ public class DozeScreenBrightnessTest extends SysuiTestCase {
FakeSensorManager mSensorManager;
@Mock
DozeHost mDozeHost;
+ @Mock
+ BroadcastDispatcher mBroadcastDispatcher;
DozeScreenBrightness mScreen;
@Before
@@ -82,7 +85,7 @@ public class DozeScreenBrightnessTest extends SysuiTestCase {
mSensorManager = new FakeSensorManager(mContext);
mSensor = mSensorManager.getFakeLightSensor();
mScreen = new DozeScreenBrightness(mContext, mServiceFake, mSensorManager,
- mSensor.getSensor(), mDozeHost, null /* handler */,
+ mSensor.getSensor(), mBroadcastDispatcher, mDozeHost, null /* handler */,
DEFAULT_BRIGHTNESS, SENSOR_TO_BRIGHTNESS, SENSOR_TO_OPACITY,
true /* debuggable */);
}
@@ -185,7 +188,7 @@ public class DozeScreenBrightnessTest extends SysuiTestCase {
@Test
public void testNullSensor() throws Exception {
mScreen = new DozeScreenBrightness(mContext, mServiceFake, mSensorManager,
- null /* sensor */, mDozeHost, null /* handler */,
+ null /* sensor */, mBroadcastDispatcher, mDozeHost, null /* handler */,
DEFAULT_BRIGHTNESS, SENSOR_TO_BRIGHTNESS, SENSOR_TO_OPACITY,
true /* debuggable */);
diff --git a/packages/SystemUI/tests/src/com/android/systemui/doze/DozeTriggersTest.java b/packages/SystemUI/tests/src/com/android/systemui/doze/DozeTriggersTest.java
index 756227e58ec2..226bf6b3abce 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/doze/DozeTriggersTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/doze/DozeTriggersTest.java
@@ -39,6 +39,7 @@ import android.testing.TestableLooper.RunWithLooper;
import androidx.test.filters.SmallTest;
import com.android.systemui.SysuiTestCase;
+import com.android.systemui.broadcast.BroadcastDispatcher;
import com.android.systemui.dock.DockManager;
import com.android.systemui.statusbar.phone.DozeParameters;
import com.android.systemui.util.sensors.AsyncSensorManager;
@@ -66,6 +67,8 @@ public class DozeTriggersTest extends SysuiTestCase {
private DozeHost mHost;
@Mock
private AlarmManager mAlarmManager;
+ @Mock
+ private BroadcastDispatcher mBroadcastDispatcher;
private DozeTriggers mTriggers;
private FakeSensorManager mSensors;
private Sensor mTapSensor;
@@ -87,7 +90,7 @@ public class DozeTriggersTest extends SysuiTestCase {
mTriggers = new DozeTriggers(mContext, mMachine, mHost, mAlarmManager, config, parameters,
asyncSensorManager, Handler.createAsync(Looper.myLooper()), wakeLock, true,
- mDockManagerFake, mProximitySensor, mock(DozeLog.class));
+ mDockManagerFake, mProximitySensor, mock(DozeLog.class), mBroadcastDispatcher);
waitForSensorManager();
}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/keyguard/KeyguardViewMediatorTest.java b/packages/SystemUI/tests/src/com/android/systemui/keyguard/KeyguardViewMediatorTest.java
index 9312ed26c217..c8152792be91 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/keyguard/KeyguardViewMediatorTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/keyguard/KeyguardViewMediatorTest.java
@@ -37,6 +37,7 @@ import com.android.keyguard.KeyguardUpdateMonitor;
import com.android.keyguard.ViewMediatorCallback;
import com.android.systemui.SystemUIFactory;
import com.android.systemui.SysuiTestCase;
+import com.android.systemui.broadcast.BroadcastDispatcher;
import com.android.systemui.classifier.FalsingManagerFake;
import com.android.systemui.plugins.FalsingManager;
import com.android.systemui.statusbar.phone.StatusBarKeyguardViewManager;
@@ -60,6 +61,7 @@ public class KeyguardViewMediatorTest extends SysuiTestCase {
private @Mock StatusBarKeyguardViewManager mStatusBarKeyguardViewManager;
private @Mock StatusBarWindowController mStatusBarWindowController;
private @Mock SystemUIFactory mSystemUIFactory;
+ private @Mock BroadcastDispatcher mBroadcastDispatcher;
private FalsingManagerFake mFalsingManager;
@@ -81,7 +83,8 @@ public class KeyguardViewMediatorTest extends SysuiTestCase {
TestableLooper.get(this).runWithLooper(() -> {
mViewMediator = new KeyguardViewMediator(
- mContext, mFalsingManager, mLockPatternUtils, mSystemUIFactory);
+ mContext, mFalsingManager, mLockPatternUtils, mBroadcastDispatcher,
+ mSystemUIFactory);
});
}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/keyguard/WorkLockActivityTest.java b/packages/SystemUI/tests/src/com/android/systemui/keyguard/WorkLockActivityTest.java
index 6e726cf6bf8d..187c72a065a7 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/keyguard/WorkLockActivityTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/keyguard/WorkLockActivityTest.java
@@ -35,6 +35,7 @@ import androidx.test.filters.SmallTest;
import androidx.test.runner.AndroidJUnit4;
import com.android.systemui.SysuiTestCase;
+import com.android.systemui.broadcast.BroadcastDispatcher;
import com.android.systemui.keyguard.WorkLockActivity;
import org.junit.Before;
@@ -55,12 +56,13 @@ public class WorkLockActivityTest extends SysuiTestCase {
private @Mock DevicePolicyManager mDevicePolicyManager;
private @Mock KeyguardManager mKeyguardManager;
private @Mock Context mContext;
+ private @Mock BroadcastDispatcher mBroadcastDispatcher;
private WorkLockActivity mActivity;
private static class WorkLockActivityTestable extends WorkLockActivity {
- WorkLockActivityTestable(Context baseContext) {
- super();
+ WorkLockActivityTestable(Context baseContext, BroadcastDispatcher broadcastDispatcher) {
+ super(broadcastDispatcher);
attachBaseContext(baseContext);
}
}
@@ -77,7 +79,7 @@ public class WorkLockActivityTest extends SysuiTestCase {
if (Looper.myLooper() == null) {
Looper.prepare();
}
- mActivity = new WorkLockActivityTestable(mContext);
+ mActivity = new WorkLockActivityTestable(mContext, mBroadcastDispatcher);
}
@Test
diff --git a/packages/SystemUI/tests/src/com/android/systemui/privacy/PrivacyItemControllerTest.kt b/packages/SystemUI/tests/src/com/android/systemui/privacy/PrivacyItemControllerTest.kt
index 462c82ee0b36..098521fbda51 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/privacy/PrivacyItemControllerTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/privacy/PrivacyItemControllerTest.kt
@@ -36,6 +36,7 @@ import com.android.systemui.R
import com.android.systemui.SysuiTestCase
import com.android.systemui.appops.AppOpItem
import com.android.systemui.appops.AppOpsController
+import com.android.systemui.broadcast.BroadcastDispatcher
import org.hamcrest.Matchers.hasItem
import org.hamcrest.Matchers.not
import org.hamcrest.Matchers.nullValue
@@ -62,7 +63,6 @@ import org.mockito.Mockito.doReturn
import org.mockito.Mockito.mock
import org.mockito.Mockito.never
import org.mockito.Mockito.reset
-import org.mockito.Mockito.spy
import org.mockito.Mockito.verify
import org.mockito.Mockito.verifyNoMoreInteractions
import org.mockito.MockitoAnnotations
@@ -89,6 +89,8 @@ class PrivacyItemControllerTest : SysuiTestCase() {
private lateinit var callback: PrivacyItemController.Callback
@Mock
private lateinit var userManager: UserManager
+ @Mock
+ private lateinit var broadcastDispatcher: BroadcastDispatcher
@Captor
private lateinit var argCaptor: ArgumentCaptor<List<PrivacyItem>>
@Captor
@@ -99,7 +101,7 @@ class PrivacyItemControllerTest : SysuiTestCase() {
private lateinit var handler: Handler
fun PrivacyItemController(context: Context) =
- PrivacyItemController(context, appOpsController, handler, handler)
+ PrivacyItemController(context, appOpsController, handler, handler, broadcastDispatcher)
@Before
fun setup() {
@@ -180,14 +182,12 @@ class PrivacyItemControllerTest : SysuiTestCase() {
@Test
fun testRegisterReceiver_allUsers() {
- val spiedContext = spy(mContext)
- val itemController = PrivacyItemController(spiedContext)
- itemController.addCallback(callback)
+ privacyItemController.addCallback(callback)
testableLooper.processAllMessages()
- verify(spiedContext, atLeastOnce()).registerReceiverAsUser(
- eq(itemController.userSwitcherReceiver), eq(UserHandle.ALL), any(), eq(null),
- eq(null))
- verify(spiedContext, never()).unregisterReceiver(eq(itemController.userSwitcherReceiver))
+ verify(broadcastDispatcher, atLeastOnce()).registerReceiver(
+ eq(privacyItemController.userSwitcherReceiver), any(), eq(null), eq(UserHandle.ALL))
+ verify(broadcastDispatcher, never())
+ .unregisterReceiver(eq(privacyItemController.userSwitcherReceiver))
}
@Test
diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/QSFragmentTest.java b/packages/SystemUI/tests/src/com/android/systemui/qs/QSFragmentTest.java
index 4eee23056bc2..a31fc3a611cf 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/qs/QSFragmentTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/qs/QSFragmentTest.java
@@ -39,9 +39,11 @@ import com.android.systemui.DumpController;
import com.android.systemui.R;
import com.android.systemui.SystemUIFactory;
import com.android.systemui.SysuiBaseFragmentTest;
+import com.android.systemui.broadcast.BroadcastDispatcher;
import com.android.systemui.plugins.statusbar.StatusBarStateController;
import com.android.systemui.qs.tileimpl.QSFactoryImpl;
import com.android.systemui.shared.plugins.PluginManager;
+import com.android.systemui.statusbar.CommandQueue;
import com.android.systemui.statusbar.phone.AutoTileManager;
import com.android.systemui.statusbar.phone.StatusBarIconController;
import com.android.systemui.statusbar.policy.Clock;
@@ -97,7 +99,8 @@ public class QSFragmentTest extends SysuiBaseFragmentTest {
QSTileHost host = new QSTileHost(mContext, mock(StatusBarIconController.class),
mock(QSFactoryImpl.class), new Handler(), Looper.myLooper(),
mock(PluginManager.class), mock(TunerService.class),
- () -> mock(AutoTileManager.class), mock(DumpController.class));
+ () -> mock(AutoTileManager.class), mock(DumpController.class),
+ mock(BroadcastDispatcher.class));
qs.setHost(host);
qs.setListening(true);
@@ -136,11 +139,14 @@ public class QSFragmentTest extends SysuiBaseFragmentTest {
@Override
protected Fragment instantiate(Context context, String className, Bundle arguments) {
+ CommandQueue commandQueue = new CommandQueue(context);
return new QSFragment(
- new RemoteInputQuickSettingsDisabler(context, mock(ConfigurationController.class)),
+ new RemoteInputQuickSettingsDisabler(context, mock(ConfigurationController.class),
+ commandQueue),
new InjectionInflationController(SystemUIFactory.getInstance().getRootComponent()),
context,
mock(QSTileHost.class),
- mock(StatusBarStateController.class));
+ mock(StatusBarStateController.class),
+ commandQueue);
}
}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/QSTileHostTest.java b/packages/SystemUI/tests/src/com/android/systemui/qs/QSTileHostTest.java
index 77520140b1a3..0247c2f79ee7 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/qs/QSTileHostTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/qs/QSTileHostTest.java
@@ -41,6 +41,7 @@ import com.android.internal.util.CollectionUtils;
import com.android.systemui.DumpController;
import com.android.systemui.R;
import com.android.systemui.SysuiTestCase;
+import com.android.systemui.broadcast.BroadcastDispatcher;
import com.android.systemui.plugins.qs.QSFactory;
import com.android.systemui.plugins.qs.QSTile;
import com.android.systemui.qs.tileimpl.QSFactoryImpl;
@@ -84,6 +85,8 @@ public class QSTileHostTest extends SysuiTestCase {
@Mock
private DumpController mDumpController;
@Mock
+ private BroadcastDispatcher mBroadcastDispatcher;
+ @Mock
private QSTile.State mMockState;
private Handler mHandler;
private TestableLooper mLooper;
@@ -96,7 +99,7 @@ public class QSTileHostTest extends SysuiTestCase {
mHandler = new Handler(mLooper.getLooper());
mQSTileHost = new TestQSTileHost(mContext, mIconController, mDefaultFactory, mHandler,
mLooper.getLooper(),
- mPluginManager, mTunerService, mAutoTiles, mDumpController);
+ mPluginManager, mTunerService, mAutoTiles, mDumpController, mBroadcastDispatcher);
setUpTileFactory();
Settings.Secure.putStringForUser(mContext.getContentResolver(), QSTileHost.TILES_SETTING,
"", ActivityManager.getCurrentUser());
@@ -168,9 +171,10 @@ public class QSTileHostTest extends SysuiTestCase {
TestQSTileHost(Context context, StatusBarIconController iconController,
QSFactoryImpl defaultFactory, Handler mainHandler, Looper bgLooper,
PluginManager pluginManager, TunerService tunerService,
- Provider<AutoTileManager> autoTiles, DumpController dumpController) {
+ Provider<AutoTileManager> autoTiles, DumpController dumpController,
+ BroadcastDispatcher broadcastDispatcher) {
super(context, iconController, defaultFactory, mainHandler, bgLooper, pluginManager,
- tunerService, autoTiles, dumpController);
+ tunerService, autoTiles, dumpController, broadcastDispatcher);
}
@Override
diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/external/TileLifecycleManagerTest.java b/packages/SystemUI/tests/src/com/android/systemui/qs/external/TileLifecycleManagerTest.java
index 11b0c69e8a41..9e5e582bf5e7 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/qs/external/TileLifecycleManagerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/qs/external/TileLifecycleManagerTest.java
@@ -45,6 +45,7 @@ import android.test.suitebuilder.annotation.SmallTest;
import androidx.test.runner.AndroidJUnit4;
import com.android.systemui.SysuiTestCase;
+import com.android.systemui.broadcast.BroadcastDispatcher;
import org.junit.After;
import org.junit.Before;
@@ -59,6 +60,8 @@ public class TileLifecycleManagerTest extends SysuiTestCase {
private final PackageManagerAdapter mMockPackageManagerAdapter =
Mockito.mock(PackageManagerAdapter.class);
+ private final BroadcastDispatcher mMockBroadcastDispatcher =
+ Mockito.mock(BroadcastDispatcher.class);
private final IQSTileService.Stub mMockTileService = Mockito.mock(IQSTileService.Stub.class);
private ComponentName mTileServiceComponentName;
private Intent mTileServiceIntent;
@@ -87,7 +90,8 @@ public class TileLifecycleManagerTest extends SysuiTestCase {
Mockito.mock(IQSService.class), new Tile(),
mTileServiceIntent,
mUser,
- mMockPackageManagerAdapter);
+ mMockPackageManagerAdapter,
+ mMockBroadcastDispatcher);
}
@After
diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/external/TileServicesTest.java b/packages/SystemUI/tests/src/com/android/systemui/qs/external/TileServicesTest.java
index d18cebba62b4..824c50dc82bb 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/qs/external/TileServicesTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/qs/external/TileServicesTest.java
@@ -32,6 +32,7 @@ import android.testing.TestableLooper.RunWithLooper;
import com.android.systemui.DumpController;
import com.android.systemui.SysuiTestCase;
+import com.android.systemui.broadcast.BroadcastDispatcher;
import com.android.systemui.qs.QSTileHost;
import com.android.systemui.qs.tileimpl.QSFactoryImpl;
import com.android.systemui.shared.plugins.PluginManager;
@@ -45,7 +46,9 @@ import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.ArgumentCaptor;
+import org.mockito.Mock;
import org.mockito.Mockito;
+import org.mockito.MockitoAnnotations;
import java.util.ArrayList;
@@ -57,21 +60,37 @@ public class TileServicesTest extends SysuiTestCase {
private TileServices mTileService;
private ArrayList<TileServiceManager> mManagers;
+ @Mock
+ private BroadcastDispatcher mBroadcastDispatcher;
+ @Mock
+ private StatusBarIconController mStatusBarIconController;
+ @Mock
+ private QSFactoryImpl mQSFactory;
+ @Mock
+ private PluginManager mPluginManager;
+ @Mock
+ private TunerService mTunerService;
+ @Mock
+ private AutoTileManager mAutoTileManager;
+ @Mock
+ private DumpController mDumpController;
@Before
public void setUp() throws Exception {
+ MockitoAnnotations.initMocks(this);
mDependency.injectMockDependency(BluetoothController.class);
mManagers = new ArrayList<>();
QSTileHost host = new QSTileHost(mContext,
- mock(StatusBarIconController.class),
- mock(QSFactoryImpl.class),
+ mStatusBarIconController,
+ mQSFactory,
new Handler(),
Looper.myLooper(),
- mock(PluginManager.class),
- mock(TunerService.class),
- () -> mock(AutoTileManager.class),
- mock(DumpController.class));
- mTileService = new TestTileServices(host, Looper.getMainLooper());
+ mPluginManager,
+ mTunerService,
+ () -> mAutoTileManager,
+ mDumpController,
+ mBroadcastDispatcher);
+ mTileService = new TestTileServices(host, Looper.getMainLooper(), mBroadcastDispatcher);
}
@After
@@ -138,12 +157,14 @@ public class TileServicesTest extends SysuiTestCase {
}
private class TestTileServices extends TileServices {
- public TestTileServices(QSTileHost host, Looper looper) {
- super(host, looper);
+ TestTileServices(QSTileHost host, Looper looper,
+ BroadcastDispatcher broadcastDispatcher) {
+ super(host, looper, broadcastDispatcher);
}
@Override
- protected TileServiceManager onCreateTileService(ComponentName component, Tile qsTile) {
+ protected TileServiceManager onCreateTileService(ComponentName component, Tile qsTile,
+ BroadcastDispatcher broadcastDispatcher) {
TileServiceManager manager = mock(TileServiceManager.class);
mManagers.add(manager);
when(manager.isLifecycleStarted()).thenReturn(true);
diff --git a/packages/SystemUI/tests/src/com/android/systemui/settings/CurrentUserTrackerTest.java b/packages/SystemUI/tests/src/com/android/systemui/settings/CurrentUserTrackerTest.java
index 4162bc1da479..1b515c6bbdbd 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/settings/CurrentUserTrackerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/settings/CurrentUserTrackerTest.java
@@ -21,9 +21,12 @@ import android.content.Intent;
import androidx.test.filters.SmallTest;
import com.android.systemui.SysuiTestCase;
+import com.android.systemui.broadcast.BroadcastDispatcher;
import org.junit.Before;
import org.junit.Test;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
/**
* Testing functionality of the current user tracker
@@ -33,10 +36,13 @@ public class CurrentUserTrackerTest extends SysuiTestCase {
private CurrentUserTracker mTracker;
private CurrentUserTracker.UserReceiver mReceiver;
+ @Mock
+ private BroadcastDispatcher mBroadcastDispatcher;
@Before
public void setUp() {
- mReceiver = new CurrentUserTracker.UserReceiver(getContext());
+ MockitoAnnotations.initMocks(this);
+ mReceiver = new CurrentUserTracker.UserReceiver(mBroadcastDispatcher);
mTracker = new CurrentUserTracker(mReceiver) {
@Override
public void onUserSwitched(int newUserId) {
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/NavigationBarControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/NavigationBarControllerTest.java
index cfa4065aed62..3c66ac6acd04 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/NavigationBarControllerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/NavigationBarControllerTest.java
@@ -62,9 +62,9 @@ public class NavigationBarControllerTest extends SysuiTestCase {
@Before
public void setUp() {
- mContext.putComponent(CommandQueue.class, mock(CommandQueue.class));
mNavigationBarController = spy(
- new NavigationBarController(mContext, Dependency.get(Dependency.MAIN_HANDLER)));
+ new NavigationBarController(mContext, Dependency.get(Dependency.MAIN_HANDLER),
+ mock(CommandQueue.class)));
initializeNavigationBars();
}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationLockscreenUserManagerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationLockscreenUserManagerTest.java
index 85a0fbd74550..548f7a86adf3 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationLockscreenUserManagerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationLockscreenUserManagerTest.java
@@ -47,6 +47,7 @@ import androidx.test.filters.SmallTest;
import com.android.systemui.Dependency;
import com.android.systemui.SysuiTestCase;
+import com.android.systemui.broadcast.BroadcastDispatcher;
import com.android.systemui.statusbar.notification.NotificationEntryManager;
import com.android.systemui.statusbar.notification.collection.NotificationData;
import com.android.systemui.statusbar.notification.collection.NotificationEntry;
@@ -74,6 +75,7 @@ public class NotificationLockscreenUserManagerTest extends SysuiTestCase {
@Mock private NotificationData mNotificationData;
@Mock private DeviceProvisionedController mDeviceProvisionedController;
@Mock private StatusBarKeyguardViewManager mKeyguardViewManager;
+ @Mock private BroadcastDispatcher mBroadcastDispatcher;
private int mCurrentUserId;
private TestNotificationLockscreenUserManager mLockscreenUserManager;
@@ -194,7 +196,7 @@ public class NotificationLockscreenUserManagerTest extends SysuiTestCase {
private class TestNotificationLockscreenUserManager
extends NotificationLockscreenUserManagerImpl {
public TestNotificationLockscreenUserManager(Context context) {
- super(context);
+ super(context, mBroadcastDispatcher);
}
public BroadcastReceiver getBaseBroadcastReceiverForTest() {
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationRemoteInputManagerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationRemoteInputManagerTest.java
index 2514c9382e44..a754a00df940 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationRemoteInputManagerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationRemoteInputManagerTest.java
@@ -31,6 +31,7 @@ import com.android.systemui.statusbar.notification.NotificationEntryManager;
import com.android.systemui.statusbar.notification.collection.NotificationEntry;
import com.android.systemui.statusbar.notification.row.ExpandableNotificationRow;
import com.android.systemui.statusbar.phone.ShadeController;
+import com.android.systemui.statusbar.policy.RemoteInputUriController;
import com.google.android.collect.Sets;
@@ -57,6 +58,7 @@ public class NotificationRemoteInputManagerTest extends SysuiTestCase {
@Mock private NotificationListenerService.RankingMap mRanking;
@Mock private ExpandableNotificationRow mRow;
@Mock private StatusBarStateController mStateController;
+ @Mock private RemoteInputUriController mRemoteInputUriController;
// Dependency mocks:
@Mock private NotificationEntryManager mEntryManager;
@@ -76,7 +78,8 @@ public class NotificationRemoteInputManagerTest extends SysuiTestCase {
mLockscreenUserManager, mSmartReplyController, mEntryManager,
() -> mock(ShadeController.class),
mStateController,
- Handler.createAsync(Looper.myLooper()));
+ Handler.createAsync(Looper.myLooper()),
+ mRemoteInputUriController);
mEntry = new NotificationEntryBuilder()
.setPkg(TEST_PACKAGE_NAME)
.setOpPkg(TEST_PACKAGE_NAME)
@@ -211,9 +214,11 @@ public class NotificationRemoteInputManagerTest extends SysuiTestCase {
NotificationEntryManager notificationEntryManager,
Lazy<ShadeController> shadeController,
StatusBarStateController statusBarStateController,
- Handler mainHandler) {
+ Handler mainHandler,
+ RemoteInputUriController remoteInputUriController) {
super(context, lockscreenUserManager, smartReplyController, notificationEntryManager,
- shadeController, statusBarStateController, mainHandler);
+ shadeController, statusBarStateController, mainHandler,
+ remoteInputUriController);
}
public void setUpWithPresenterForTest(Callback callback,
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/SmartReplyControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/SmartReplyControllerTest.java
index 88fb3e1d5c19..95ce53c58e95 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/SmartReplyControllerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/SmartReplyControllerTest.java
@@ -42,6 +42,7 @@ import com.android.systemui.plugins.statusbar.StatusBarStateController;
import com.android.systemui.statusbar.notification.NotificationEntryManager;
import com.android.systemui.statusbar.notification.collection.NotificationEntry;
import com.android.systemui.statusbar.phone.ShadeController;
+import com.android.systemui.statusbar.policy.RemoteInputUriController;
import org.junit.Before;
import org.junit.Test;
@@ -72,6 +73,7 @@ public class SmartReplyControllerTest extends SysuiTestCase {
@Mock private NotificationEntryManager mNotificationEntryManager;
@Mock private IStatusBarService mIStatusBarService;
@Mock private StatusBarStateController mStatusBarStateController;
+ @Mock private RemoteInputUriController mRemoteInputUriController;
@Before
public void setUp() {
@@ -88,7 +90,8 @@ public class SmartReplyControllerTest extends SysuiTestCase {
mock(NotificationLockscreenUserManager.class), mSmartReplyController,
mNotificationEntryManager, () -> mock(ShadeController.class),
mStatusBarStateController,
- Handler.createAsync(Looper.myLooper()));
+ Handler.createAsync(Looper.myLooper()),
+ mRemoteInputUriController);
mRemoteInputManager.setUpWithCallback(mCallback, mDelegate);
mNotification = new Notification.Builder(mContext, "")
.setSmallIcon(R.drawable.ic_person)
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/BiometricsUnlockControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/BiometricsUnlockControllerTest.java
index 4a0b3718db6c..4451fa416912 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/BiometricsUnlockControllerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/BiometricsUnlockControllerTest.java
@@ -38,6 +38,7 @@ import android.testing.TestableResources;
import com.android.internal.logging.MetricsLogger;
import com.android.keyguard.KeyguardUpdateMonitor;
+import com.android.systemui.DumpController;
import com.android.systemui.SysuiTestCase;
import com.android.systemui.keyguard.KeyguardViewMediator;
import com.android.systemui.statusbar.NotificationMediaManager;
@@ -55,6 +56,8 @@ import org.mockito.MockitoAnnotations;
public class BiometricsUnlockControllerTest extends SysuiTestCase {
@Mock
+ private DumpController mDumpController;
+ @Mock
private NotificationMediaManager mMediaManager;
@Mock
private PowerManager mPowerManager;
@@ -101,7 +104,7 @@ public class BiometricsUnlockControllerTest extends SysuiTestCase {
mBiometricUnlockController = new BiometricUnlockController(mContext, mDozeScrimController,
mKeyguardViewMediator, mScrimController, mStatusBar, mKeyguardStateController,
mHandler, mUpdateMonitor, res.getResources(), mKeyguardBypassController,
- mDozeParameters, mMetricsLogger);
+ mDozeParameters, mMetricsLogger, mDumpController);
mBiometricUnlockController.setStatusBarKeyguardViewManager(mStatusBarKeyguardViewManager);
}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/HeadsUpAppearanceControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/HeadsUpAppearanceControllerTest.java
index 0216d2effef3..026026949467 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/HeadsUpAppearanceControllerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/HeadsUpAppearanceControllerTest.java
@@ -33,6 +33,7 @@ import androidx.test.filters.SmallTest;
import com.android.systemui.SysuiTestCase;
import com.android.systemui.plugins.DarkIconDispatcher;
import com.android.systemui.plugins.statusbar.StatusBarStateController;
+import com.android.systemui.statusbar.CommandQueue;
import com.android.systemui.statusbar.HeadsUpStatusBarView;
import com.android.systemui.statusbar.NotificationTestHelper;
import com.android.systemui.statusbar.notification.NotificationWakeUpCoordinator;
@@ -63,6 +64,7 @@ public class HeadsUpAppearanceControllerTest extends SysuiTestCase {
private KeyguardBypassController mBypassController;
private NotificationWakeUpCoordinator mWakeUpCoordinator;
private KeyguardStateController mKeyguardStateController;
+ private CommandQueue mCommandQueue;
@Before
public void setUp() throws Exception {
@@ -78,6 +80,7 @@ public class HeadsUpAppearanceControllerTest extends SysuiTestCase {
mBypassController = mock(KeyguardBypassController.class);
mWakeUpCoordinator = mock(NotificationWakeUpCoordinator.class);
mKeyguardStateController = mock(KeyguardStateController.class);
+ mCommandQueue = mock(CommandQueue.class);
mHeadsUpAppearanceController = new HeadsUpAppearanceController(
mock(NotificationIconAreaController.class),
mHeadsUpManager,
@@ -85,6 +88,7 @@ public class HeadsUpAppearanceControllerTest extends SysuiTestCase {
mBypassController,
mWakeUpCoordinator,
mKeyguardStateController,
+ mCommandQueue,
mHeadsUpStatusBarView,
mStackScroller,
mPanelView,
@@ -163,6 +167,7 @@ public class HeadsUpAppearanceControllerTest extends SysuiTestCase {
mBypassController,
mWakeUpCoordinator,
mKeyguardStateController,
+ mCommandQueue,
mHeadsUpStatusBarView,
mStackScroller,
mPanelView,
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/LightBarTransitionsControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/LightBarTransitionsControllerTest.java
index b1580eedc43c..0bcc3afe027d 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/LightBarTransitionsControllerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/LightBarTransitionsControllerTest.java
@@ -17,7 +17,6 @@
package com.android.systemui.statusbar.phone;
import static org.mockito.ArgumentMatchers.eq;
-import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.reset;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
@@ -51,10 +50,10 @@ public class LightBarTransitionsControllerTest extends SysuiTestCase {
@Before
public void setup() {
MockitoAnnotations.initMocks(this);
- mContext.putComponent(CommandQueue.class, mock(CommandQueue.class));
mDependency.injectMockDependency(KeyguardStateController.class);
mDependency.injectMockDependency(StatusBarStateController.class);
- mLightBarTransitionsController = new LightBarTransitionsController(mContext, mApplier);
+ mLightBarTransitionsController = new LightBarTransitionsController(mContext, mApplier,
+ new CommandQueue(mContext));
}
@Test
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NavigationBarFragmentTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NavigationBarFragmentTest.java
index 237f6ac0f420..125500178d30 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NavigationBarFragmentTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NavigationBarFragmentTest.java
@@ -124,6 +124,7 @@ public class NavigationBarFragmentTest extends SysuiBaseFragmentTest {
public void setupFragment() throws Exception {
MockitoAnnotations.initMocks(this);
+ mCommandQueue = new CommandQueue(mContext);
setupSysuiDependency();
createRootView();
mOverviewProxyService =
@@ -150,8 +151,6 @@ public class NavigationBarFragmentTest extends SysuiBaseFragmentTest {
}
private void setupSysuiDependency() {
- mCommandQueue = new CommandQueue(mContext);
- mSysuiContext.putComponent(CommandQueue.class, mCommandQueue);
mSysuiContext.putComponent(StatusBar.class, mock(StatusBar.class));
mSysuiContext.putComponent(Recents.class, mock(Recents.class));
mSysuiContext.putComponent(Divider.class, mock(Divider.class));
@@ -160,7 +159,6 @@ public class NavigationBarFragmentTest extends SysuiBaseFragmentTest {
new DisplayInfo(), DEFAULT_DISPLAY_ADJUSTMENTS);
mSysuiTestableContextExternal = (SysuiTestableContext) mSysuiContext.createDisplayContext(
display);
- mSysuiTestableContextExternal.putComponent(CommandQueue.class, mCommandQueue);
mSysuiTestableContextExternal.putComponent(StatusBar.class, mock(StatusBar.class));
mSysuiTestableContextExternal.putComponent(Recents.class, mock(Recents.class));
mSysuiTestableContextExternal.putComponent(Divider.class, mock(Divider.class));
@@ -252,7 +250,8 @@ public class NavigationBarFragmentTest extends SysuiBaseFragmentTest {
mock(NavigationModeController.class),
mock(StatusBarStateController.class),
mMockSysUiState,
- mBroadcastDispatcher);
+ mBroadcastDispatcher,
+ mCommandQueue);
}
private class HostCallbacksForExternalDisplay extends
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NavigationBarTransitionsTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NavigationBarTransitionsTest.java
index 1e9378aea075..27a50027cfe2 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NavigationBarTransitionsTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NavigationBarTransitionsTest.java
@@ -54,11 +54,10 @@ public class NavigationBarTransitionsTest extends SysuiTestCase {
mDependency.injectMockDependency(StatusBarStateController.class);
mDependency.injectMockDependency(KeyguardStateController.class);
- mContext.putComponent(CommandQueue.class, mock(CommandQueue.class));
NavigationBarView navBar = spy(new NavigationBarView(mContext, null));
when(navBar.getCurrentView()).thenReturn(navBar);
when(navBar.findViewById(anyInt())).thenReturn(navBar);
- mTransitions = new NavigationBarTransitions(navBar);
+ mTransitions = new NavigationBarTransitions(navBar, mock(CommandQueue.class));
}
@Test
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NotificationPanelViewTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NotificationPanelViewTest.java
index 4853f2023172..280cc90c0ca4 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NotificationPanelViewTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NotificationPanelViewTest.java
@@ -45,6 +45,7 @@ import com.android.systemui.doze.DozeLog;
import com.android.systemui.plugins.FalsingManager;
import com.android.systemui.plugins.statusbar.StatusBarStateController;
import com.android.systemui.shared.plugins.PluginManager;
+import com.android.systemui.statusbar.CommandQueue;
import com.android.systemui.statusbar.KeyguardAffordanceView;
import com.android.systemui.statusbar.NotificationLockscreenUserManager;
import com.android.systemui.statusbar.NotificationShelf;
@@ -246,7 +247,8 @@ public class NotificationPanelViewTest extends SysuiTestCase {
mock(KeyguardStateController.class),
statusBarStateController,
mock(DozeLog.class),
- mDozeParameters);
+ mDozeParameters,
+ new CommandQueue(NotificationPanelViewTest.this.mContext));
mNotificationStackScroller = mNotificationStackScrollLayout;
mKeyguardStatusView = NotificationPanelViewTest.this.mKeyguardStatusView;
mKeyguardStatusBar = NotificationPanelViewTest.this.mKeyguardStatusBar;
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarIconControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarIconControllerTest.java
index a27ed1eba726..7b7e2d3e34df 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarIconControllerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarIconControllerTest.java
@@ -31,6 +31,7 @@ import androidx.test.filters.SmallTest;
import com.android.internal.statusbar.StatusBarIcon;
import com.android.systemui.plugins.DarkIconDispatcher;
+import com.android.systemui.statusbar.CommandQueue;
import com.android.systemui.statusbar.StatusBarIconView;
import com.android.systemui.statusbar.StatusBarMobileView;
import com.android.systemui.statusbar.StatusBarWifiView;
@@ -59,14 +60,14 @@ public class StatusBarIconControllerTest extends LeakCheckedTest {
@Test
public void testSetCalledOnAdd_IconManager() {
LinearLayout layout = new LinearLayout(mContext);
- TestIconManager manager = new TestIconManager(layout);
+ TestIconManager manager = new TestIconManager(layout, new CommandQueue(mContext));
testCallOnAdd_forManager(manager);
}
@Test
public void testSetCalledOnAdd_DarkIconManager() {
LinearLayout layout = new LinearLayout(mContext);
- TestDarkIconManager manager = new TestDarkIconManager(layout);
+ TestDarkIconManager manager = new TestDarkIconManager(layout, new CommandQueue(mContext));
testCallOnAdd_forManager(manager);
}
@@ -103,8 +104,8 @@ public class StatusBarIconControllerTest extends LeakCheckedTest {
private static class TestDarkIconManager extends DarkIconManager
implements TestableIconManager {
- public TestDarkIconManager(LinearLayout group) {
- super(group);
+ TestDarkIconManager(LinearLayout group, CommandQueue commandQueue) {
+ super(group, commandQueue);
}
@Override
@@ -138,8 +139,8 @@ public class StatusBarIconControllerTest extends LeakCheckedTest {
}
private static class TestIconManager extends IconManager implements TestableIconManager {
- public TestIconManager(ViewGroup group) {
- super(group);
+ TestIconManager(ViewGroup group, CommandQueue commandQueue) {
+ super(group, commandQueue);
}
@Override
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarNotificationPresenterTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarNotificationPresenterTest.java
index c0c42ef9c1bf..de87d3197ef6 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarNotificationPresenterTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarNotificationPresenterTest.java
@@ -86,7 +86,6 @@ public class StatusBarNotificationPresenterTest extends SysuiTestCase {
mMetricsLogger = new FakeMetricsLogger();
mDependency.injectTestDependency(MetricsLogger.class, mMetricsLogger);
mCommandQueue = new CommandQueue(mContext);
- mContext.putComponent(CommandQueue.class, mCommandQueue);
mDependency.injectTestDependency(StatusBarStateController.class,
mock(SysuiStatusBarStateController.class));
mDependency.injectTestDependency(ShadeController.class, mShadeController);
@@ -115,7 +114,8 @@ public class StatusBarNotificationPresenterTest extends SysuiTestCase {
mock(DozeScrimController.class), mock(ScrimController.class),
mock(ActivityLaunchAnimator.class), mock(DynamicPrivacyController.class),
mock(NotificationAlertingManager.class),
- mock(NotificationRowBinderImpl.class), mock(KeyguardStateController.class));
+ mock(NotificationRowBinderImpl.class), mock(KeyguardStateController.class),
+ mCommandQueue);
}
@Test
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarRemoteInputCallbackTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarRemoteInputCallbackTest.java
index a65f5a503375..b1b66b5360e3 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarRemoteInputCallbackTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarRemoteInputCallbackTest.java
@@ -68,12 +68,11 @@ public class StatusBarRemoteInputCallbackTest extends SysuiTestCase {
mDependency.injectTestDependency(ShadeController.class, mShadeController);
mDependency.injectTestDependency(NotificationLockscreenUserManager.class,
mNotificationLockscreenUserManager);
- mContext.putComponent(CommandQueue.class, mock(CommandQueue.class));
mRemoteInputCallback = spy(new StatusBarRemoteInputCallback(mContext,
mock(NotificationGroupManager.class), mNotificationLockscreenUserManager,
mKeyguardStateController, mStatusBarStateController, mActivityStarter,
- mShadeController));
+ mShadeController, new CommandQueue(mContext)));
mRemoteInputCallback.mChallengeReceiver = mRemoteInputCallback.new ChallengeReceiver();
}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarTest.java
index 66c01ca58491..c21e3ab079ff 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarTest.java
@@ -91,6 +91,7 @@ import com.android.systemui.keyguard.ScreenLifecycle;
import com.android.systemui.keyguard.WakefulnessLifecycle;
import com.android.systemui.plugins.ActivityStarter.OnDismissAction;
import com.android.systemui.plugins.statusbar.StatusBarStateController;
+import com.android.systemui.shared.plugins.PluginManager;
import com.android.systemui.statusbar.CommandQueue;
import com.android.systemui.statusbar.FeatureFlags;
import com.android.systemui.statusbar.KeyguardIndicationController;
@@ -130,6 +131,7 @@ import com.android.systemui.statusbar.policy.DeviceProvisionedController;
import com.android.systemui.statusbar.policy.KeyguardStateController;
import com.android.systemui.statusbar.policy.NetworkController;
import com.android.systemui.statusbar.policy.RemoteInputQuickSettingsDisabler;
+import com.android.systemui.statusbar.policy.RemoteInputUriController;
import com.android.systemui.statusbar.policy.UserSwitcherController;
import com.android.systemui.statusbar.policy.ZenModeController;
import com.android.systemui.util.InjectionInflationController;
@@ -155,7 +157,6 @@ public class StatusBarTest extends SysuiTestCase {
private FakeMetricsLogger mMetricsLogger;
private PowerManager mPowerManager;
private TestableNotificationInterruptionStateProvider mNotificationInterruptionStateProvider;
- private CommandQueue mCommandQueue;
@Mock private FeatureFlags mFeatureFlags;
@Mock private LightBarController mLightBarController;
@@ -181,6 +182,7 @@ public class StatusBarTest extends SysuiTestCase {
@Mock private NotificationLockscreenUserManager mLockscreenUserManager;
@Mock private NotificationRemoteInputManager mRemoteInputManager;
@Mock private RemoteInputController mRemoteInputController;
+ @Mock private RemoteInputUriController mRemoteInputUriController;
@Mock private StatusBarStateControllerImpl mStatusBarStateController;
@Mock private BatteryController mBatteryController;
@Mock private DeviceProvisionedController mDeviceProvisionedController;
@@ -229,6 +231,9 @@ public class StatusBarTest extends SysuiTestCase {
@Mock private DozeServiceHost mDozeServiceHost;
@Mock private LinearLayout mLockIconContainer;
@Mock private ViewMediatorCallback mKeyguardVieMediatorCallback;
+ @Mock private KeyguardLiftController mKeyguardLiftController;
+ @Mock private CommandQueue mCommandQueue;
+ @Mock private PluginManager mPluginManager;
@Before
public void setup() throws Exception {
@@ -256,9 +261,7 @@ public class StatusBarTest extends SysuiTestCase {
mExpansionStateLogger);
notificationLogger.setVisibilityReporter(mock(Runnable.class));
- mCommandQueue = mock(CommandQueue.class);
when(mCommandQueue.asBinder()).thenReturn(new Binder());
- mContext.putComponent(CommandQueue.class, mCommandQueue);
mContext.setTheme(R.style.Theme_SystemUI_Light);
@@ -320,7 +323,8 @@ public class StatusBarTest extends SysuiTestCase {
mBroadcastDispatcher,
new RemoteInputQuickSettingsDisabler(
mContext,
- configurationController
+ configurationController,
+ mCommandQueue
),
mNotificationGutsManager,
notificationLogger,
@@ -360,11 +364,15 @@ public class StatusBarTest extends SysuiTestCase {
mNotifLog,
mDozeParameters,
mScrimController,
+ mKeyguardLiftController,
mLockscreenWallpaperLazy,
mBiometricUnlockControllerLazy,
mDozeServiceHost,
mPowerManager,
- mDozeScrimController);
+ mDozeScrimController,
+ mCommandQueue,
+ mPluginManager,
+ mRemoteInputUriController);
when(mStatusBarWindowView.findViewById(R.id.lock_icon_container)).thenReturn(
mLockIconContainer);
@@ -382,7 +390,6 @@ public class StatusBarTest extends SysuiTestCase {
mStatusBar.mComponents = mContext.getComponents();
mStatusBar.mStatusBarWindow = mStatusBarWindowView;
mStatusBar.mNotificationPanel = mNotificationPanelView;
- mStatusBar.mCommandQueue = mCommandQueue;
mStatusBar.mDozeScrimController = mDozeScrimController;
mStatusBar.mNotificationIconAreaController = mNotificationIconAreaController;
mStatusBar.mPresenter = mNotificationPresenter;
@@ -391,7 +398,6 @@ public class StatusBarTest extends SysuiTestCase {
mStatusBar.mStackScroller = mStackScroller;
mStatusBar.mStatusBarWindowViewController = mStatusBarWindowViewController;
mStatusBar.startKeyguard();
- mStatusBar.putComponent(StatusBar.class, mStatusBar);
Dependency.get(InitController.class).executePostInitTasks();
entryManager.setUpForTest(mock(NotificationPresenter.class), mStackScroller,
mHeadsUpManager);
@@ -401,7 +407,6 @@ public class StatusBarTest extends SysuiTestCase {
@Test
public void testSetBouncerShowing_noCrash() {
- mStatusBar.mCommandQueue = mock(CommandQueue.class);
mStatusBar.setBouncerShowing(true);
}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarWindowViewTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarWindowViewTest.java
index 7c1dfa6c4f54..20fb6599f66e 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarWindowViewTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarWindowViewTest.java
@@ -31,6 +31,7 @@ import com.android.systemui.SysuiTestCase;
import com.android.systemui.classifier.FalsingManagerFake;
import com.android.systemui.doze.DozeLog;
import com.android.systemui.shared.plugins.PluginManager;
+import com.android.systemui.statusbar.CommandQueue;
import com.android.systemui.statusbar.DragDownHelper;
import com.android.systemui.statusbar.NotificationLockscreenUserManager;
import com.android.systemui.statusbar.PulseExpansionHandler;
@@ -96,7 +97,8 @@ public class StatusBarWindowViewTest extends SysuiTestCase {
mKeyguardStateController,
mStatusBarStateController,
mDozeLog,
- mDozeParameters)
+ mDozeParameters,
+ new CommandQueue(mContext))
.setShadeController(mShadeController)
.setStatusBarWindowView(mView)
.build();
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/BatteryControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/BatteryControllerTest.java
index e626d083d366..48ed4ba2224c 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/BatteryControllerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/BatteryControllerTest.java
@@ -27,6 +27,7 @@ import android.testing.AndroidTestingRunner;
import android.testing.TestableLooper;
import com.android.systemui.SysuiTestCase;
+import com.android.systemui.broadcast.BroadcastDispatcher;
import com.android.systemui.power.EnhancedEstimates;
import org.junit.Assert;
@@ -44,13 +45,15 @@ public class BatteryControllerTest extends SysuiTestCase {
@Mock
private PowerManager mPowerManager;
+ @Mock
+ private BroadcastDispatcher mBroadcastDispatcher;
private BatteryControllerImpl mBatteryController;
@Before
public void setUp() {
MockitoAnnotations.initMocks(this);
mBatteryController = new BatteryControllerImpl(getContext(), mock(EnhancedEstimates.class),
- mPowerManager);
+ mPowerManager, mBroadcastDispatcher);
}
@Test
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/LocationControllerImplTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/LocationControllerImplTest.java
index 3dcb34aac814..5f772b2548ff 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/LocationControllerImplTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/LocationControllerImplTest.java
@@ -27,6 +27,7 @@ import android.testing.TestableLooper.RunWithLooper;
import androidx.test.filters.SmallTest;
import com.android.systemui.SysuiTestCase;
+import com.android.systemui.broadcast.BroadcastDispatcher;
import com.android.systemui.statusbar.policy.LocationController.LocationChangeCallback;
import org.junit.Before;
@@ -44,7 +45,8 @@ public class LocationControllerImplTest extends SysuiTestCase {
@Before
public void setup() {
mLocationController = spy(new LocationControllerImpl(mContext,
- TestableLooper.get(this).getLooper()));
+ TestableLooper.get(this).getLooper(),
+ mock(BroadcastDispatcher.class)));
}
@Test
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerBaseTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerBaseTest.java
index c03f07e59129..4d866136c915 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerBaseTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerBaseTest.java
@@ -56,6 +56,7 @@ import com.android.settingslib.graph.SignalDrawable;
import com.android.settingslib.net.DataUsageController;
import com.android.systemui.R;
import com.android.systemui.SysuiTestCase;
+import com.android.systemui.broadcast.BroadcastDispatcher;
import com.android.systemui.statusbar.policy.DeviceProvisionedController.DeviceProvisionedListener;
import com.android.systemui.statusbar.policy.NetworkController.IconState;
import com.android.systemui.statusbar.policy.NetworkController.SignalCallback;
@@ -93,6 +94,7 @@ public class NetworkControllerBaseTest extends SysuiTestCase {
protected WifiManager mMockWm;
protected SubscriptionManager mMockSm;
protected TelephonyManager mMockTm;
+ protected BroadcastDispatcher mMockBd;
protected Config mConfig;
protected CallbackHandler mCallbackHandler;
protected SubscriptionDefaults mMockSubDefaults;
@@ -130,6 +132,7 @@ public class NetworkControllerBaseTest extends SysuiTestCase {
mMockTm = mock(TelephonyManager.class);
mMockSm = mock(SubscriptionManager.class);
mMockCm = mock(ConnectivityManager.class);
+ mMockBd = mock(BroadcastDispatcher.class);
mMockSubDefaults = mock(SubscriptionDefaults.class);
mNetCapabilities = new NetworkCapabilities();
when(mMockCm.isNetworkSupported(ConnectivityManager.TYPE_MOBILE)).thenReturn(true);
@@ -157,7 +160,7 @@ public class NetworkControllerBaseTest extends SysuiTestCase {
mNetworkController = new NetworkControllerImpl(mContext, mMockCm, mMockTm, mMockWm, mMockSm,
mConfig, TestableLooper.get(this).getLooper(), mCallbackHandler,
mock(AccessPointControllerImpl.class), mock(DataUsageController.class),
- mMockSubDefaults, mMockProvisionController);
+ mMockSubDefaults, mMockProvisionController, mMockBd);
setupNetworkController();
// Trigger blank callbacks to always get the current state (some tests don't trigger
@@ -208,7 +211,7 @@ public class NetworkControllerBaseTest extends SysuiTestCase {
mConfig, TestableLooper.get(this).getLooper(), mCallbackHandler,
mock(AccessPointControllerImpl.class),
mock(DataUsageController.class), mMockSubDefaults,
- mock(DeviceProvisionedController.class));
+ mock(DeviceProvisionedController.class), mMockBd);
setupNetworkController();
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerDataTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerDataTest.java
index aa4723acba62..ab74caa95e61 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerDataTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerDataTest.java
@@ -108,7 +108,7 @@ public class NetworkControllerDataTest extends NetworkControllerBaseTest {
mConfig, Looper.getMainLooper(), mCallbackHandler,
mock(AccessPointControllerImpl.class),
mock(DataUsageController.class), mMockSubDefaults,
- mock(DeviceProvisionedController.class));
+ mock(DeviceProvisionedController.class), mMockBd);
setupNetworkController();
setupDefaultSignal();
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerSignalTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerSignalTest.java
index 0b53c486356f..57dcbf21e147 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerSignalTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerSignalTest.java
@@ -61,7 +61,7 @@ public class NetworkControllerSignalTest extends NetworkControllerBaseTest {
mNetworkController = new NetworkControllerImpl(mContext, mMockCm, mMockTm, mMockWm, mMockSm,
mConfig, Looper.getMainLooper(), mCallbackHandler,
mock(AccessPointControllerImpl.class), mock(DataUsageController.class),
- mMockSubDefaults, mock(DeviceProvisionedController.class));
+ mMockSubDefaults, mock(DeviceProvisionedController.class), mMockBd);
setupNetworkController();
verifyLastMobileDataIndicators(false, -1, 0);
@@ -123,7 +123,7 @@ public class NetworkControllerSignalTest extends NetworkControllerBaseTest {
mNetworkController = new NetworkControllerImpl(mContext, mMockCm, mMockTm, mMockWm, mMockSm,
mConfig, Looper.getMainLooper(), mCallbackHandler,
mock(AccessPointControllerImpl.class), mock(DataUsageController.class),
- mMockSubDefaults, mock(DeviceProvisionedController.class));
+ mMockSubDefaults, mock(DeviceProvisionedController.class), mMockBd);
setupNetworkController();
// No Subscriptions.
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/RemoteInputQuickSettingsDisablerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/RemoteInputQuickSettingsDisablerTest.java
index fea3a08663e1..b359b9ce6287 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/RemoteInputQuickSettingsDisablerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/RemoteInputQuickSettingsDisablerTest.java
@@ -35,12 +35,14 @@ import com.android.systemui.statusbar.policy.ConfigurationController;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
+import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
@SmallTest
@RunWith(AndroidJUnit4.class)
public class RemoteInputQuickSettingsDisablerTest extends SysuiTestCase {
+ @Mock
private CommandQueue mCommandQueue;
private RemoteInputQuickSettingsDisabler mRemoteInputQuickSettingsDisabler;
@@ -48,11 +50,8 @@ public class RemoteInputQuickSettingsDisablerTest extends SysuiTestCase {
public void setUp() throws Exception {
MockitoAnnotations.initMocks(this);
- mCommandQueue = mock(CommandQueue.class);
- mContext.putComponent(CommandQueue.class, mCommandQueue);
-
mRemoteInputQuickSettingsDisabler = new RemoteInputQuickSettingsDisabler(mContext,
- mock(ConfigurationController.class));
+ mock(ConfigurationController.class), mCommandQueue);
}
@Test
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/SecurityControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/SecurityControllerTest.java
index 97542a9e5966..0c9130d08d6d 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/SecurityControllerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/SecurityControllerTest.java
@@ -45,6 +45,7 @@ import android.test.suitebuilder.annotation.SmallTest;
import androidx.test.runner.AndroidJUnit4;
import com.android.systemui.SysuiTestCase;
+import com.android.systemui.broadcast.BroadcastDispatcher;
import com.android.systemui.statusbar.policy.SecurityController.SecurityControllerCallback;
import org.junit.After;
@@ -99,7 +100,7 @@ public class SecurityControllerTest extends SysuiTestCase implements SecurityCon
// TODO: Migrate this test to TestableLooper and use a handler attached
// to that.
mSecurityController = new SecurityControllerImpl(mContext,
- new Handler(Looper.getMainLooper()), this);
+ new Handler(Looper.getMainLooper()), mock(BroadcastDispatcher.class), this);
}
@After
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/ZenModeControllerImplTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/ZenModeControllerImplTest.java
index 47e449212fa5..dcf0ef781b07 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/ZenModeControllerImplTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/ZenModeControllerImplTest.java
@@ -33,6 +33,7 @@ import android.testing.TestableLooper.RunWithLooper;
import androidx.test.filters.SmallTest;
import com.android.systemui.SysuiTestCase;
+import com.android.systemui.broadcast.BroadcastDispatcher;
import com.android.systemui.statusbar.policy.ZenModeController.Callback;
import org.junit.Before;
@@ -51,6 +52,8 @@ public class ZenModeControllerImplTest extends SysuiTestCase {
NotificationManager mNm;
@Mock
ZenModeConfig mConfig;
+ @Mock
+ BroadcastDispatcher mBroadcastDispatcher;
private ZenModeControllerImpl mController;
@@ -60,7 +63,8 @@ public class ZenModeControllerImplTest extends SysuiTestCase {
mContext.addMockSystemService(NotificationManager.class, mNm);
when(mNm.getZenModeConfig()).thenReturn(mConfig);
- mController = new ZenModeControllerImpl(mContext, Handler.createAsync(Looper.myLooper()));
+ mController = new ZenModeControllerImpl(mContext, Handler.createAsync(Looper.myLooper()),
+ mBroadcastDispatcher);
}
@Test
diff --git a/packages/Tethering/Android.bp b/packages/Tethering/Android.bp
index 2bfe287c82b3..998572fc5679 100644
--- a/packages/Tethering/Android.bp
+++ b/packages/Tethering/Android.bp
@@ -72,6 +72,7 @@ filegroup {
srcs: [
"src/com/android/server/connectivity/tethering/EntitlementManager.java",
"src/com/android/server/connectivity/tethering/TetheringConfiguration.java",
+ "src/com/android/server/connectivity/tethering/UpstreamNetworkMonitor.java",
],
}
@@ -84,5 +85,6 @@ filegroup {
"src/android/net/ip/IpServer.java",
"src/android/net/ip/RouterAdvertisementDaemon.java",
"src/android/net/util/InterfaceSet.java",
+ "src/android/net/util/PrefixUtils.java",
],
}
diff --git a/packages/Tethering/AndroidManifestBase.xml b/packages/Tethering/AndroidManifestBase.xml
index b9cac1994359..dc013da33869 100644
--- a/packages/Tethering/AndroidManifestBase.xml
+++ b/packages/Tethering/AndroidManifestBase.xml
@@ -23,7 +23,6 @@
<application
android:label="Tethering"
android:defaultToDeviceProtectedStorage="true"
- android:directBootAware="true"
- android:usesCleartextTraffic="true">
+ android:directBootAware="true">
</application>
</manifest>
diff --git a/services/net/java/android/net/util/PrefixUtils.java b/packages/Tethering/src/android/net/util/PrefixUtils.java
index f60694aaedc9..f203e9995f3d 100644
--- a/services/net/java/android/net/util/PrefixUtils.java
+++ b/packages/Tethering/src/android/net/util/PrefixUtils.java
@@ -42,16 +42,19 @@ public class PrefixUtils {
public static final IpPrefix DEFAULT_WIFI_P2P_PREFIX = pfx("192.168.49.0/24");
+ /** Get non forwardable prefixes. */
public static Set<IpPrefix> getNonForwardablePrefixes() {
final HashSet<IpPrefix> prefixes = new HashSet<>();
addNonForwardablePrefixes(prefixes);
return prefixes;
}
+ /** Add non forwardable prefixes. */
public static void addNonForwardablePrefixes(Set<IpPrefix> prefixes) {
Collections.addAll(prefixes, MIN_NON_FORWARDABLE_PREFIXES);
}
+ /** Get local prefixes from |lp|. */
public static Set<IpPrefix> localPrefixesFrom(LinkProperties lp) {
final HashSet<IpPrefix> localPrefixes = new HashSet<>();
if (lp == null) return localPrefixes;
@@ -66,10 +69,12 @@ public class PrefixUtils {
return localPrefixes;
}
+ /** Convert LinkAddress |addr| to IpPrefix. */
public static IpPrefix asIpPrefix(LinkAddress addr) {
return new IpPrefix(addr.getAddress(), addr.getPrefixLength());
}
+ /** Convert InetAddress |ip| to IpPrefix. */
public static IpPrefix ipAddressAsPrefix(InetAddress ip) {
final int bitLength = (ip instanceof Inet4Address)
? NetworkConstants.IPV4_ADDR_BITS
diff --git a/services/core/java/com/android/server/connectivity/tethering/UpstreamNetworkMonitor.java b/packages/Tethering/src/com/android/server/connectivity/tethering/UpstreamNetworkMonitor.java
index 3a9e21f943d8..9769596ab1d0 100644
--- a/services/core/java/com/android/server/connectivity/tethering/UpstreamNetworkMonitor.java
+++ b/packages/Tethering/src/com/android/server/connectivity/tethering/UpstreamNetworkMonitor.java
@@ -146,6 +146,7 @@ public class UpstreamNetworkMonitor {
}
}
+ /** Listen all networks. */
public void startObserveAllNetworks() {
stop();
@@ -155,6 +156,13 @@ public class UpstreamNetworkMonitor {
cm().registerNetworkCallback(listenAllRequest, mListenAllCallback, mHandler);
}
+ /**
+ * Stop tracking candidate tethering upstreams and release mobile network request.
+ * Note: this function is used when tethering is stopped because tethering do not need to
+ * choose upstream anymore. But it would not stop default network tracking because
+ * EntitlementManager may need to know default network to decide whether to request entitlement
+ * check even tethering is not active yet.
+ */
public void stop() {
releaseMobileNetworkRequest();
@@ -165,6 +173,7 @@ public class UpstreamNetworkMonitor {
mNetworkMap.clear();
}
+ /** Setup or teardown DUN connection according to |dunRequired|. */
public void updateMobileRequiresDun(boolean dunRequired) {
final boolean valueChanged = (mDunRequired != dunRequired);
mDunRequired = dunRequired;
@@ -174,10 +183,12 @@ public class UpstreamNetworkMonitor {
}
}
+ /** Whether mobile network is requested. */
public boolean mobileNetworkRequested() {
return (mMobileNetworkCallback != null);
}
+ /** Request mobile network if mobile upstream is permitted. */
public void registerMobileNetworkRequest() {
if (!isCellularUpstreamPermitted()) {
mLog.i("registerMobileNetworkRequest() is not permitted");
@@ -209,6 +220,7 @@ public class UpstreamNetworkMonitor {
cm().requestNetwork(mobileUpstreamRequest, mMobileNetworkCallback, 0, legacyType, mHandler);
}
+ /** Release mobile network request. */
public void releaseMobileNetworkRequest() {
if (mMobileNetworkCallback == null) return;
@@ -221,6 +233,9 @@ public class UpstreamNetworkMonitor {
// becomes available and useful we (a) file a request to keep it up as
// necessary and (b) change all upstream tracking state accordingly (by
// passing LinkProperties up to Tethering).
+ /**
+ * Select the first available network from |perferredTypes|.
+ */
public NetworkState selectPreferredUpstreamType(Iterable<Integer> preferredTypes) {
final TypeStatePair typeStatePair = findFirstAvailableUpstreamByType(
mNetworkMap.values(), preferredTypes, isCellularUpstreamPermitted());
@@ -254,7 +269,11 @@ public class UpstreamNetworkMonitor {
return typeStatePair.ns;
}
- // Returns null if no current upstream available.
+ /**
+ * Get current preferred upstream network. If default network is cellular and DUN is required,
+ * preferred upstream would be DUN otherwise preferred upstream is the same as default network.
+ * Returns null if no current upstream is available.
+ */
public NetworkState getCurrentPreferredUpstream() {
final NetworkState dfltState = (mDefaultInternetNetwork != null)
? mNetworkMap.get(mDefaultInternetNetwork)
@@ -270,10 +289,12 @@ public class UpstreamNetworkMonitor {
return findFirstDunNetwork(mNetworkMap.values());
}
+ /** Tell UpstreamNetworkMonitor which network is the current upstream of tethering. */
public void setCurrentUpstream(Network upstream) {
mTetheringUpstreamNetwork = upstream;
}
+ /** Return local prefixes. */
public Set<IpPrefix> getLocalPrefixes() {
return (Set<IpPrefix>) mLocalPrefixes.clone();
}
@@ -501,8 +522,8 @@ public class UpstreamNetworkMonitor {
try {
nc = ConnectivityManager.networkCapabilitiesForType(type);
} catch (IllegalArgumentException iae) {
- Log.e(TAG, "No NetworkCapabilities mapping for legacy type: " +
- ConnectivityManager.getNetworkTypeName(type));
+ Log.e(TAG, "No NetworkCapabilities mapping for legacy type: "
+ + ConnectivityManager.getNetworkTypeName(type));
continue;
}
if (!isCellularUpstreamPermitted && isCellular(nc)) {
@@ -547,18 +568,18 @@ public class UpstreamNetworkMonitor {
}
private static boolean isCellular(NetworkCapabilities nc) {
- return (nc != null) && nc.hasTransport(TRANSPORT_CELLULAR) &&
- nc.hasCapability(NET_CAPABILITY_NOT_VPN);
+ return (nc != null) && nc.hasTransport(TRANSPORT_CELLULAR)
+ && nc.hasCapability(NET_CAPABILITY_NOT_VPN);
}
private static boolean hasCapability(NetworkState ns, int netCap) {
- return (ns != null) && (ns.networkCapabilities != null) &&
- ns.networkCapabilities.hasCapability(netCap);
+ return (ns != null) && (ns.networkCapabilities != null)
+ && ns.networkCapabilities.hasCapability(netCap);
}
private static boolean isNetworkUsableAndNotCellular(NetworkState ns) {
- return (ns != null) && (ns.networkCapabilities != null) && (ns.linkProperties != null) &&
- !isCellular(ns.networkCapabilities);
+ return (ns != null) && (ns.networkCapabilities != null) && (ns.linkProperties != null)
+ && !isCellular(ns.networkCapabilities);
}
private static NetworkState findFirstDunNetwork(Iterable<NetworkState> netStates) {
diff --git a/packages/Tethering/tests/unit/Android.bp b/packages/Tethering/tests/unit/Android.bp
index 5564bd6ecbca..7c06e5f0d7ce 100644
--- a/packages/Tethering/tests/unit/Android.bp
+++ b/packages/Tethering/tests/unit/Android.bp
@@ -47,6 +47,7 @@ filegroup {
srcs: [
"src/com/android/server/connectivity/tethering/EntitlementManagerTest.java",
"src/com/android/server/connectivity/tethering/TetheringConfigurationTest.java",
+ "src/com/android/server/connectivity/tethering/UpstreamNetworkMonitorTest.java",
"src/android/net/dhcp/DhcpServingParamsParcelExtTest.java",
"src/android/net/ip/IpServerTest.java",
"src/android/net/util/InterfaceSetTest.java",
diff --git a/tests/net/java/com/android/server/connectivity/tethering/UpstreamNetworkMonitorTest.java b/packages/Tethering/tests/unit/src/com/android/server/connectivity/tethering/UpstreamNetworkMonitorTest.java
index 0d276cbd1b85..c028d6d9cadc 100644
--- a/tests/net/java/com/android/server/connectivity/tethering/UpstreamNetworkMonitorTest.java
+++ b/packages/Tethering/tests/unit/src/com/android/server/connectivity/tethering/UpstreamNetworkMonitorTest.java
@@ -87,7 +87,7 @@ public class UpstreamNetworkMonitorTest {
// Actual contents of the request don't matter for this test. The lack of
// any specific TRANSPORT_* is sufficient to identify this request.
- private static final NetworkRequest mDefaultRequest = new NetworkRequest.Builder().build();
+ private static final NetworkRequest sDefaultRequest = new NetworkRequest.Builder().build();
@Mock private Context mContext;
@Mock private EntitlementManager mEntitleMgr;
@@ -140,7 +140,7 @@ public class UpstreamNetworkMonitorTest {
@Test
public void testDefaultNetworkIsTracked() throws Exception {
assertTrue(mCM.hasNoCallbacks());
- mUNM.startTrackDefaultNetwork(mDefaultRequest, mEntitleMgr);
+ mUNM.startTrackDefaultNetwork(sDefaultRequest, mEntitleMgr);
mUNM.startObserveAllNetworks();
assertEquals(1, mCM.trackingDefault.size());
@@ -153,7 +153,7 @@ public class UpstreamNetworkMonitorTest {
public void testListensForAllNetworks() throws Exception {
assertTrue(mCM.listening.isEmpty());
- mUNM.startTrackDefaultNetwork(mDefaultRequest, mEntitleMgr);
+ mUNM.startTrackDefaultNetwork(sDefaultRequest, mEntitleMgr);
mUNM.startObserveAllNetworks();
assertFalse(mCM.listening.isEmpty());
assertTrue(mCM.isListeningForAll());
@@ -164,9 +164,9 @@ public class UpstreamNetworkMonitorTest {
@Test
public void testCallbacksRegistered() {
- mUNM.startTrackDefaultNetwork(mDefaultRequest, mEntitleMgr);
+ mUNM.startTrackDefaultNetwork(sDefaultRequest, mEntitleMgr);
verify(mCM, times(1)).requestNetwork(
- eq(mDefaultRequest), any(NetworkCallback.class), any(Handler.class));
+ eq(sDefaultRequest), any(NetworkCallback.class), any(Handler.class));
mUNM.startObserveAllNetworks();
verify(mCM, times(1)).registerNetworkCallback(
any(NetworkRequest.class), any(NetworkCallback.class), any(Handler.class));
@@ -191,7 +191,7 @@ public class UpstreamNetworkMonitorTest {
mUNM.registerMobileNetworkRequest();
assertTrue(mUNM.mobileNetworkRequested());
assertUpstreamTypeRequested(TYPE_MOBILE_HIPRI);
- assertFalse(mCM.isDunRequested());
+ assertFalse(isDunRequested());
mUNM.stop();
assertFalse(mUNM.mobileNetworkRequested());
@@ -217,7 +217,7 @@ public class UpstreamNetworkMonitorTest {
assertTrue(mUNM.mobileNetworkRequested());
assertUpstreamTypeRequested(TYPE_MOBILE_DUN);
- assertTrue(mCM.isDunRequested());
+ assertTrue(isDunRequested());
// Try a few things that must not result in any state change.
mUNM.registerMobileNetworkRequest();
@@ -226,7 +226,7 @@ public class UpstreamNetworkMonitorTest {
assertTrue(mUNM.mobileNetworkRequested());
assertUpstreamTypeRequested(TYPE_MOBILE_DUN);
- assertTrue(mCM.isDunRequested());
+ assertTrue(isDunRequested());
mUNM.stop();
verify(mCM, times(2)).unregisterNetworkCallback(any(NetworkCallback.class));
@@ -250,7 +250,7 @@ public class UpstreamNetworkMonitorTest {
mUNM.registerMobileNetworkRequest();
assertTrue(mUNM.mobileNetworkRequested());
assertUpstreamTypeRequested(TYPE_MOBILE_DUN);
- assertTrue(mCM.isDunRequested());
+ assertTrue(isDunRequested());
mUNM.stop();
assertFalse(mUNM.mobileNetworkRequested());
@@ -266,17 +266,17 @@ public class UpstreamNetworkMonitorTest {
mUNM.registerMobileNetworkRequest();
assertTrue(mUNM.mobileNetworkRequested());
assertUpstreamTypeRequested(TYPE_MOBILE_HIPRI);
- assertFalse(mCM.isDunRequested());
+ assertFalse(isDunRequested());
mUNM.updateMobileRequiresDun(true);
assertTrue(mUNM.mobileNetworkRequested());
assertUpstreamTypeRequested(TYPE_MOBILE_DUN);
- assertTrue(mCM.isDunRequested());
+ assertTrue(isDunRequested());
// Test going from DUN to no-DUN correctly re-registers callbacks.
mUNM.updateMobileRequiresDun(false);
assertTrue(mUNM.mobileNetworkRequested());
assertUpstreamTypeRequested(TYPE_MOBILE_HIPRI);
- assertFalse(mCM.isDunRequested());
+ assertFalse(isDunRequested());
mUNM.stop();
assertFalse(mUNM.mobileNetworkRequested());
@@ -287,7 +287,7 @@ public class UpstreamNetworkMonitorTest {
final Collection<Integer> preferredTypes = new ArrayList<>();
preferredTypes.add(TYPE_WIFI);
- mUNM.startTrackDefaultNetwork(mDefaultRequest, mEntitleMgr);
+ mUNM.startTrackDefaultNetwork(sDefaultRequest, mEntitleMgr);
mUNM.startObserveAllNetworks();
// There are no networks, so there is nothing to select.
assertSatisfiesLegacyType(TYPE_NONE, mUNM.selectPreferredUpstreamType(preferredTypes));
@@ -369,7 +369,7 @@ public class UpstreamNetworkMonitorTest {
@Test
public void testGetCurrentPreferredUpstream() throws Exception {
- mUNM.startTrackDefaultNetwork(mDefaultRequest, mEntitleMgr);
+ mUNM.startTrackDefaultNetwork(sDefaultRequest, mEntitleMgr);
mUNM.startObserveAllNetworks();
mUNM.updateMobileRequiresDun(false);
@@ -418,7 +418,7 @@ public class UpstreamNetworkMonitorTest {
@Test
public void testLocalPrefixes() throws Exception {
- mUNM.startTrackDefaultNetwork(mDefaultRequest, mEntitleMgr);
+ mUNM.startTrackDefaultNetwork(sDefaultRequest, mEntitleMgr);
mUNM.startObserveAllNetworks();
// [0] Test minimum set of local prefixes.
@@ -431,13 +431,13 @@ public class UpstreamNetworkMonitorTest {
final TestNetworkAgent wifiAgent = new TestNetworkAgent(mCM, TRANSPORT_WIFI);
final LinkProperties wifiLp = wifiAgent.linkProperties;
wifiLp.setInterfaceName("wlan0");
- final String[] WIFI_ADDRS = {
+ final String[] wifi_addrs = {
"fe80::827a:bfff:fe6f:374d", "100.112.103.18",
"2001:db8:4:fd00:827a:bfff:fe6f:374d",
"2001:db8:4:fd00:6dea:325a:fdae:4ef4",
"fd6a:a640:60bf:e985::123", // ULA address for good measure.
};
- for (String addrStr : WIFI_ADDRS) {
+ for (String addrStr : wifi_addrs) {
final String cidr = addrStr.contains(":") ? "/64" : "/20";
wifiLp.addLinkAddress(new LinkAddress(addrStr + cidr));
}
@@ -458,10 +458,10 @@ public class UpstreamNetworkMonitorTest {
final TestNetworkAgent cellAgent = new TestNetworkAgent(mCM, TRANSPORT_CELLULAR);
final LinkProperties cellLp = cellAgent.linkProperties;
cellLp.setInterfaceName("rmnet_data0");
- final String[] CELL_ADDRS = {
+ final String[] cell_addrs = {
"10.102.211.48", "2001:db8:0:1:b50e:70d9:10c9:433d",
};
- for (String addrStr : CELL_ADDRS) {
+ for (String addrStr : cell_addrs) {
final String cidr = addrStr.contains(":") ? "/64" : "/27";
cellLp.addLinkAddress(new LinkAddress(addrStr + cidr));
}
@@ -481,10 +481,10 @@ public class UpstreamNetworkMonitorTest {
dunAgent.networkCapabilities.removeCapability(NET_CAPABILITY_INTERNET);
final LinkProperties dunLp = dunAgent.linkProperties;
dunLp.setInterfaceName("rmnet_data1");
- final String[] DUN_ADDRS = {
+ final String[] dun_addrs = {
"192.0.2.48", "2001:db8:1:2:b50e:70d9:10c9:433d",
};
- for (String addrStr : DUN_ADDRS) {
+ for (String addrStr : dun_addrs) {
final String cidr = addrStr.contains(":") ? "/64" : "/27";
dunLp.addLinkAddress(new LinkAddress(addrStr + cidr));
}
@@ -525,7 +525,7 @@ public class UpstreamNetworkMonitorTest {
// Mobile has higher pirority than wifi.
preferredTypes.add(TYPE_MOBILE_HIPRI);
preferredTypes.add(TYPE_WIFI);
- mUNM.startTrackDefaultNetwork(mDefaultRequest, mEntitleMgr);
+ mUNM.startTrackDefaultNetwork(sDefaultRequest, mEntitleMgr);
mUNM.startObserveAllNetworks();
// Setup wifi and make wifi as default network.
final TestNetworkAgent wifiAgent = new TestNetworkAgent(mCM, TRANSPORT_WIFI);
@@ -556,6 +556,15 @@ public class UpstreamNetworkMonitorTest {
mCM.legacyTypeMap.values().iterator().next());
}
+ private boolean isDunRequested() {
+ for (NetworkRequest req : mCM.requested.values()) {
+ if (req.networkCapabilities.hasCapability(NET_CAPABILITY_DUN)) {
+ return true;
+ }
+ }
+ return false;
+ }
+
public static class TestConnectivityManager extends ConnectivityManager {
public Map<NetworkCallback, Handler> allCallbacks = new HashMap<>();
public Set<NetworkCallback> trackingDefault = new HashSet<>();
@@ -598,17 +607,10 @@ public class UpstreamNetworkMonitorTest {
return false;
}
- boolean isDunRequested() {
- for (NetworkRequest req : requested.values()) {
- if (req.networkCapabilities.hasCapability(NET_CAPABILITY_DUN)) {
- return true;
- }
- }
- return false;
+ int getNetworkId() {
+ return ++mNetworkId;
}
- int getNetworkId() { return ++mNetworkId; }
-
void makeDefaultNetwork(TestNetworkAgent agent) {
if (Objects.equals(defaultNetwork, agent)) return;
@@ -630,7 +632,7 @@ public class UpstreamNetworkMonitorTest {
public void requestNetwork(NetworkRequest req, NetworkCallback cb, Handler h) {
assertFalse(allCallbacks.containsKey(cb));
allCallbacks.put(cb, h);
- if (mDefaultRequest.equals(req)) {
+ if (sDefaultRequest.equals(req)) {
assertFalse(trackingDefault.contains(cb));
trackingDefault.add(cb);
} else {
@@ -749,9 +751,13 @@ public class UpstreamNetworkMonitorTest {
private final State mLoggingState = new LoggingState();
class LoggingState extends State {
- @Override public void enter() { messages.clear(); }
+ @Override public void enter() {
+ messages.clear();
+ }
- @Override public void exit() { messages.clear(); }
+ @Override public void exit() {
+ messages.clear();
+ }
@Override public boolean processMessage(Message msg) {
messages.add(msg);
diff --git a/services/Android.bp b/services/Android.bp
index 60dd8959fc39..6953e862f68b 100644
--- a/services/Android.bp
+++ b/services/Android.bp
@@ -47,11 +47,6 @@ java_library {
"compat-changeid-annotation-processor",
],
- required: [
- // Required by services.backup
- "BackupEncryption",
- ],
-
// Uncomment to enable output of certain warnings (deprecated, unchecked)
//javacflags: ["-Xlint"],
diff --git a/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java b/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java
index 68e11df32d79..6f435294268f 100644
--- a/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java
+++ b/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java
@@ -67,8 +67,6 @@ import android.os.UserHandle;
import android.os.UserManager;
import android.os.UserManagerInternal;
import android.provider.Settings;
-import android.provider.SettingsStringUtil;
-import android.provider.SettingsStringUtil.ComponentNameSet;
import android.provider.SettingsStringUtil.SettingStringHelper;
import android.text.TextUtils;
import android.text.TextUtils.SimpleStringSplitter;
@@ -2219,12 +2217,12 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub
* Enables accessibility service specified by {@param componentName} for the {@param userId}.
*/
private void enableAccessibilityServiceLocked(ComponentName componentName, int userId) {
- final SettingStringHelper setting =
- new SettingStringHelper(
- mContext.getContentResolver(),
- Settings.Secure.ENABLED_ACCESSIBILITY_SERVICES,
- userId);
- setting.write(ComponentNameSet.add(setting.read(), componentName));
+ mTempComponentNameSet.clear();
+ readComponentNamesFromSettingLocked(Settings.Secure.ENABLED_ACCESSIBILITY_SERVICES,
+ userId, mTempComponentNameSet);
+ mTempComponentNameSet.add(componentName);
+ persistComponentNamesToSettingLocked(Settings.Secure.ENABLED_ACCESSIBILITY_SERVICES,
+ mTempComponentNameSet, userId);
AccessibilityUserState userState = getUserStateLocked(userId);
if (userState.mEnabledServices.add(componentName)) {
@@ -2236,12 +2234,12 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub
* Disables accessibility service specified by {@param componentName} for the {@param userId}.
*/
private void disableAccessibilityServiceLocked(ComponentName componentName, int userId) {
- final SettingsStringUtil.SettingStringHelper setting =
- new SettingStringHelper(
- mContext.getContentResolver(),
- Settings.Secure.ENABLED_ACCESSIBILITY_SERVICES,
- userId);
- setting.write(ComponentNameSet.remove(setting.read(), componentName));
+ mTempComponentNameSet.clear();
+ readComponentNamesFromSettingLocked(Settings.Secure.ENABLED_ACCESSIBILITY_SERVICES,
+ userId, mTempComponentNameSet);
+ mTempComponentNameSet.remove(componentName);
+ persistComponentNamesToSettingLocked(Settings.Secure.ENABLED_ACCESSIBILITY_SERVICES,
+ mTempComponentNameSet, userId);
AccessibilityUserState userState = getUserStateLocked(userId);
if (userState.mEnabledServices.remove(componentName)) {
diff --git a/services/core/Android.bp b/services/core/Android.bp
index c86538438835..770de09382fe 100644
--- a/services/core/Android.bp
+++ b/services/core/Android.bp
@@ -115,7 +115,6 @@ java_library_static {
"android.hardware.contexthub-V1.0-java",
"android.hidl.manager-V1.2-java",
"dnsresolver_aidl_interface-V2-java",
- "netd_aidl_interface-java",
"netd_event_listener_interface-java",
],
}
diff --git a/core/java/android/os/BatteryStatsInternal.java b/services/core/java/android/os/BatteryStatsInternal.java
index 679f18e1e860..679f18e1e860 100644
--- a/core/java/android/os/BatteryStatsInternal.java
+++ b/services/core/java/android/os/BatteryStatsInternal.java
diff --git a/services/core/java/com/android/server/AlarmManagerService.java b/services/core/java/com/android/server/AlarmManagerService.java
index ff0044f6f1ad..e757b4e1a070 100644
--- a/services/core/java/com/android/server/AlarmManagerService.java
+++ b/services/core/java/com/android/server/AlarmManagerService.java
@@ -154,7 +154,7 @@ class AlarmManagerService extends SystemService {
static final int TICK_HISTORY_DEPTH = 10;
static final long MILLIS_IN_DAY = 24 * 60 * 60 * 1000;
- // Indices into the APP_STANDBY_MIN_DELAYS and KEYS_APP_STANDBY_DELAY arrays
+ // Indices into the KEYS_APP_STANDBY_QUOTAS array.
static final int ACTIVE_INDEX = 0;
static final int WORKING_INDEX = 1;
static final int FREQUENT_INDEX = 2;
@@ -401,8 +401,6 @@ class AlarmManagerService extends SystemService {
static final String KEY_LISTENER_TIMEOUT = "listener_timeout";
@VisibleForTesting
static final String KEY_MAX_ALARMS_PER_UID = "max_alarms_per_uid";
- @VisibleForTesting
- static final String KEY_APP_STANDBY_QUOTAS_ENABLED = "app_standby_quotas_enabled";
private static final String KEY_APP_STANDBY_WINDOW = "app_standby_window";
@VisibleForTesting
final String[] KEYS_APP_STANDBY_QUOTAS = {
@@ -413,15 +411,6 @@ class AlarmManagerService extends SystemService {
"standby_never_quota",
};
- // Keys for specifying throttling delay based on app standby bucketing
- private final String[] KEYS_APP_STANDBY_DELAY = {
- "standby_active_delay",
- "standby_working_delay",
- "standby_frequent_delay",
- "standby_rare_delay",
- "standby_never_delay",
- };
-
private static final long DEFAULT_MIN_FUTURITY = 5 * 1000;
private static final long DEFAULT_MIN_INTERVAL = 60 * 1000;
private static final long DEFAULT_MAX_INTERVAL = 365 * DateUtils.DAY_IN_MILLIS;
@@ -430,7 +419,6 @@ class AlarmManagerService extends SystemService {
private static final long DEFAULT_ALLOW_WHILE_IDLE_WHITELIST_DURATION = 10*1000;
private static final long DEFAULT_LISTENER_TIMEOUT = 5 * 1000;
private static final int DEFAULT_MAX_ALARMS_PER_UID = 500;
- private static final boolean DEFAULT_APP_STANDBY_QUOTAS_ENABLED = true;
private static final long DEFAULT_APP_STANDBY_WINDOW = 60 * 60 * 1000; // 1 hr
/**
* Max number of times an app can receive alarms in {@link #APP_STANDBY_WINDOW}
@@ -442,13 +430,6 @@ class AlarmManagerService extends SystemService {
1, // Rare
0 // Never
};
- private final long[] DEFAULT_APP_STANDBY_DELAYS = {
- 0, // Active
- 6 * 60_000, // Working
- 30 * 60_000, // Frequent
- 2 * 60 * 60_000, // Rare
- 10 * 24 * 60 * 60_000 // Never
- };
// Minimum futurity of a new alarm
public long MIN_FUTURITY = DEFAULT_MIN_FUTURITY;
@@ -473,10 +454,7 @@ class AlarmManagerService extends SystemService {
public long LISTENER_TIMEOUT = DEFAULT_LISTENER_TIMEOUT;
public int MAX_ALARMS_PER_UID = DEFAULT_MAX_ALARMS_PER_UID;
- public boolean APP_STANDBY_QUOTAS_ENABLED = DEFAULT_APP_STANDBY_QUOTAS_ENABLED;
-
public long APP_STANDBY_WINDOW = DEFAULT_APP_STANDBY_WINDOW;
- public long[] APP_STANDBY_MIN_DELAYS = new long[DEFAULT_APP_STANDBY_DELAYS.length];
public int[] APP_STANDBY_QUOTAS = new int[DEFAULT_APP_STANDBY_QUOTAS.length];
private ContentResolver mResolver;
@@ -532,16 +510,6 @@ class AlarmManagerService extends SystemService {
DEFAULT_ALLOW_WHILE_IDLE_WHITELIST_DURATION);
LISTENER_TIMEOUT = mParser.getLong(KEY_LISTENER_TIMEOUT,
DEFAULT_LISTENER_TIMEOUT);
- APP_STANDBY_MIN_DELAYS[ACTIVE_INDEX] = mParser.getDurationMillis(
- KEYS_APP_STANDBY_DELAY[ACTIVE_INDEX],
- DEFAULT_APP_STANDBY_DELAYS[ACTIVE_INDEX]);
- for (int i = WORKING_INDEX; i < KEYS_APP_STANDBY_DELAY.length; i++) {
- APP_STANDBY_MIN_DELAYS[i] = mParser.getDurationMillis(KEYS_APP_STANDBY_DELAY[i],
- Math.max(APP_STANDBY_MIN_DELAYS[i - 1], DEFAULT_APP_STANDBY_DELAYS[i]));
- }
-
- APP_STANDBY_QUOTAS_ENABLED = mParser.getBoolean(KEY_APP_STANDBY_QUOTAS_ENABLED,
- DEFAULT_APP_STANDBY_QUOTAS_ENABLED);
APP_STANDBY_WINDOW = mParser.getLong(KEY_APP_STANDBY_WINDOW,
DEFAULT_APP_STANDBY_WINDOW);
@@ -614,15 +582,6 @@ class AlarmManagerService extends SystemService {
pw.print(KEY_MAX_ALARMS_PER_UID); pw.print("=");
pw.println(MAX_ALARMS_PER_UID);
- for (int i = 0; i < KEYS_APP_STANDBY_DELAY.length; i++) {
- pw.print(KEYS_APP_STANDBY_DELAY[i]); pw.print("=");
- TimeUtils.formatDuration(APP_STANDBY_MIN_DELAYS[i], pw);
- pw.println();
- }
-
- pw.print(KEY_APP_STANDBY_QUOTAS_ENABLED); pw.print("=");
- pw.println(APP_STANDBY_QUOTAS_ENABLED);
-
pw.print(KEY_APP_STANDBY_WINDOW); pw.print("=");
TimeUtils.formatDuration(APP_STANDBY_WINDOW, pw);
pw.println();
@@ -1826,27 +1785,6 @@ class AlarmManagerService extends SystemService {
}
/**
- * Return the minimum time that should elapse before an app in the specified bucket
- * can receive alarms again
- */
- @VisibleForTesting
- long getMinDelayForBucketLocked(int bucket) {
- // UsageStats bucket values are treated as floors of their behavioral range.
- // In other words, a bucket value between WORKING and ACTIVE is treated as
- // WORKING, not as ACTIVE. The ACTIVE and NEVER bucket apply only at specific
- // values.
- final int index;
-
- if (bucket == UsageStatsManager.STANDBY_BUCKET_NEVER) index = NEVER_INDEX;
- else if (bucket > UsageStatsManager.STANDBY_BUCKET_FREQUENT) index = RARE_INDEX;
- else if (bucket > UsageStatsManager.STANDBY_BUCKET_WORKING_SET) index = FREQUENT_INDEX;
- else if (bucket > UsageStatsManager.STANDBY_BUCKET_ACTIVE) index = WORKING_INDEX;
- else index = ACTIVE_INDEX;
-
- return mConstants.APP_STANDBY_MIN_DELAYS[index];
- }
-
- /**
* Adjusts the alarm delivery time based on the current app standby bucket.
* @param alarm The alarm to adjust
* @return true if the alarm delivery time was updated.
@@ -1872,50 +1810,34 @@ class AlarmManagerService extends SystemService {
final int standbyBucket = mUsageStatsManagerInternal.getAppStandbyBucket(
sourcePackage, sourceUserId, mInjector.getElapsedRealtime());
- if (mConstants.APP_STANDBY_QUOTAS_ENABLED) {
- // Quota deferring implementation:
- final int wakeupsInWindow = mAppWakeupHistory.getTotalWakeupsInWindow(sourcePackage,
- sourceUserId);
- final int quotaForBucket = getQuotaForBucketLocked(standbyBucket);
- boolean deferred = false;
- if (wakeupsInWindow >= quotaForBucket) {
- final long minElapsed;
- if (quotaForBucket <= 0) {
- // Just keep deferring for a day till the quota changes
- minElapsed = mInjector.getElapsedRealtime() + MILLIS_IN_DAY;
- } else {
- // Suppose the quota for window was q, and the qth last delivery time for this
- // package was t(q) then the next delivery must be after t(q) + <window_size>
- final long t = mAppWakeupHistory.getLastWakeupForPackage(sourcePackage,
- sourceUserId, quotaForBucket);
- minElapsed = t + 1 + mConstants.APP_STANDBY_WINDOW;
- }
- if (alarm.expectedWhenElapsed < minElapsed) {
- alarm.whenElapsed = alarm.maxWhenElapsed = minElapsed;
- deferred = true;
- }
- }
- if (!deferred) {
- // Restore original requirements in case they were changed earlier.
- alarm.whenElapsed = alarm.expectedWhenElapsed;
- alarm.maxWhenElapsed = alarm.expectedMaxWhenElapsed;
+ // Quota deferring implementation:
+ final int wakeupsInWindow = mAppWakeupHistory.getTotalWakeupsInWindow(sourcePackage,
+ sourceUserId);
+ final int quotaForBucket = getQuotaForBucketLocked(standbyBucket);
+ boolean deferred = false;
+ if (wakeupsInWindow >= quotaForBucket) {
+ final long minElapsed;
+ if (quotaForBucket <= 0) {
+ // Just keep deferring for a day till the quota changes
+ minElapsed = mInjector.getElapsedRealtime() + MILLIS_IN_DAY;
+ } else {
+ // Suppose the quota for window was q, and the qth last delivery time for this
+ // package was t(q) then the next delivery must be after t(q) + <window_size>
+ final long t = mAppWakeupHistory.getLastWakeupForPackage(sourcePackage,
+ sourceUserId, quotaForBucket);
+ minElapsed = t + 1 + mConstants.APP_STANDBY_WINDOW;
}
- } else {
- // Minimum delay deferring implementation:
- final long lastElapsed = mAppWakeupHistory.getLastWakeupForPackage(sourcePackage,
- sourceUserId, 1);
- if (lastElapsed > 0) {
- final long minElapsed = lastElapsed + getMinDelayForBucketLocked(standbyBucket);
- if (alarm.expectedWhenElapsed < minElapsed) {
- alarm.whenElapsed = alarm.maxWhenElapsed = minElapsed;
- } else {
- // app is now eligible to run alarms at the originally requested window.
- // Restore original requirements in case they were changed earlier.
- alarm.whenElapsed = alarm.expectedWhenElapsed;
- alarm.maxWhenElapsed = alarm.expectedMaxWhenElapsed;
- }
+ if (alarm.expectedWhenElapsed < minElapsed) {
+ alarm.whenElapsed = alarm.maxWhenElapsed = minElapsed;
+ deferred = true;
}
}
+ if (!deferred) {
+ // Restore original requirements in case they were changed earlier.
+ alarm.whenElapsed = alarm.expectedWhenElapsed;
+ alarm.maxWhenElapsed = alarm.expectedMaxWhenElapsed;
+ }
+
return (oldWhenElapsed != alarm.whenElapsed || oldMaxWhenElapsed != alarm.maxWhenElapsed);
}
@@ -4446,7 +4368,8 @@ class AlarmManagerService extends SystemService {
}
final class UidObserver extends IUidObserver.Stub {
- @Override public void onUidStateChanged(int uid, int procState, long procStateSeq) {
+ @Override public void onUidStateChanged(int uid, int procState, long procStateSeq,
+ int capability) {
}
@Override public void onUidGone(int uid, boolean disabled) {
diff --git a/services/core/java/com/android/server/AppStateTracker.java b/services/core/java/com/android/server/AppStateTracker.java
index 5eff2c5c1d37..486cd5fee01c 100644
--- a/services/core/java/com/android/server/AppStateTracker.java
+++ b/services/core/java/com/android/server/AppStateTracker.java
@@ -632,7 +632,7 @@ public class AppStateTracker {
private final class UidObserver extends IUidObserver.Stub {
@Override
- public void onUidStateChanged(int uid, int procState, long procStateSeq) {
+ public void onUidStateChanged(int uid, int procState, long procStateSeq, int capability) {
mHandler.onUidStateChanged(uid, procState);
}
diff --git a/services/core/java/com/android/server/DropBoxManagerService.java b/services/core/java/com/android/server/DropBoxManagerService.java
index 7365e78c707f..028d41234dd0 100644
--- a/services/core/java/com/android/server/DropBoxManagerService.java
+++ b/services/core/java/com/android/server/DropBoxManagerService.java
@@ -41,11 +41,13 @@ import android.os.StatFs;
import android.os.SystemClock;
import android.os.UserHandle;
import android.provider.Settings;
+import android.service.dropbox.DropBoxManagerServiceDumpProto;
import android.text.TextUtils;
import android.text.format.TimeMigrationUtils;
import android.util.ArrayMap;
import android.util.ArraySet;
import android.util.Slog;
+import android.util.proto.ProtoOutputStream;
import com.android.internal.R;
import com.android.internal.annotations.GuardedBy;
@@ -66,6 +68,7 @@ import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.util.ArrayList;
+import java.util.Arrays;
import java.util.SortedSet;
import java.util.TreeSet;
import java.util.zip.GZIPOutputStream;
@@ -86,6 +89,9 @@ public final class DropBoxManagerService extends SystemService {
private static final boolean PROFILE_DUMP = false;
+ // Max number of bytes of a dropbox entry to write into protobuf.
+ private static final int PROTO_MAX_DATA_BYTES = 256 * 1024;
+
// TODO: This implementation currently uses one file per entry, which is
// inefficient for smallish entries -- consider using a single queue file
// per tag (or even globally) instead.
@@ -556,18 +562,22 @@ public final class DropBoxManagerService extends SystemService {
StringBuilder out = new StringBuilder();
boolean doPrint = false, doFile = false;
+ boolean dumpProto = false;
ArrayList<String> searchArgs = new ArrayList<String>();
for (int i = 0; args != null && i < args.length; i++) {
if (args[i].equals("-p") || args[i].equals("--print")) {
doPrint = true;
} else if (args[i].equals("-f") || args[i].equals("--file")) {
doFile = true;
+ } else if (args[i].equals("--proto")) {
+ dumpProto = true;
} else if (args[i].equals("-h") || args[i].equals("--help")) {
pw.println("Dropbox (dropbox) dump options:");
pw.println(" [-h|--help] [-p|--print] [-f|--file] [timestamp]");
pw.println(" -h|--help: print this help");
pw.println(" -p|--print: print full contents of each entry");
pw.println(" -f|--file: print path of each entry's file");
+ pw.println(" --proto: dump data to proto");
pw.println(" [timestamp] optionally filters to only those entries.");
return;
} else if (args[i].startsWith("-")) {
@@ -577,6 +587,11 @@ public final class DropBoxManagerService extends SystemService {
}
}
+ if (dumpProto) {
+ dumpProtoLocked(fd, searchArgs);
+ return;
+ }
+
out.append("Drop box contents: ").append(mAllFiles.contents.size()).append(" entries\n");
out.append("Max entries: ").append(mMaxFiles).append("\n");
@@ -590,19 +605,15 @@ public final class DropBoxManagerService extends SystemService {
out.append("\n");
}
- int numFound = 0, numArgs = searchArgs.size();
+ int numFound = 0;
out.append("\n");
for (EntryFile entry : mAllFiles.contents) {
- String date = TimeMigrationUtils.formatMillisWithFixedFormat(entry.timestampMillis);
- boolean match = true;
- for (int i = 0; i < numArgs && match; i++) {
- String arg = searchArgs.get(i);
- match = (date.contains(arg) || arg.equals(entry.tag));
- }
- if (!match) continue;
+ if (!matchEntry(entry, searchArgs)) continue;
numFound++;
if (doPrint) out.append("========================================\n");
+
+ String date = TimeMigrationUtils.formatMillisWithFixedFormat(entry.timestampMillis);
out.append(date).append(" ").append(entry.tag == null ? "(no tag)" : entry.tag);
final File file = entry.getFile(mDropBoxDir);
@@ -688,6 +699,55 @@ public final class DropBoxManagerService extends SystemService {
if (PROFILE_DUMP) Debug.stopMethodTracing();
}
+ private boolean matchEntry(EntryFile entry, ArrayList<String> searchArgs) {
+ String date = TimeMigrationUtils.formatMillisWithFixedFormat(entry.timestampMillis);
+ boolean match = true;
+ int numArgs = searchArgs.size();
+ for (int i = 0; i < numArgs && match; i++) {
+ String arg = searchArgs.get(i);
+ match = (date.contains(arg) || arg.equals(entry.tag));
+ }
+ return match;
+ }
+
+ private void dumpProtoLocked(FileDescriptor fd, ArrayList<String> searchArgs) {
+ final ProtoOutputStream proto = new ProtoOutputStream(fd);
+
+ for (EntryFile entry : mAllFiles.contents) {
+ if (!matchEntry(entry, searchArgs)) continue;
+
+ final File file = entry.getFile(mDropBoxDir);
+ if ((file == null) || ((entry.flags & DropBoxManager.IS_EMPTY) != 0)) {
+ continue;
+ }
+
+ final long bToken = proto.start(DropBoxManagerServiceDumpProto.ENTRIES);
+ proto.write(DropBoxManagerServiceDumpProto.Entry.TIME_MS, entry.timestampMillis);
+ try (
+ DropBoxManager.Entry dbe = new DropBoxManager.Entry(
+ entry.tag, entry.timestampMillis, file, entry.flags);
+ InputStream is = dbe.getInputStream();
+ ) {
+ if (is != null) {
+ byte[] buf = new byte[PROTO_MAX_DATA_BYTES];
+ int readBytes = 0;
+ int n = 0;
+ while (n >= 0 && (readBytes += n) < PROTO_MAX_DATA_BYTES) {
+ n = is.read(buf, readBytes, PROTO_MAX_DATA_BYTES - readBytes);
+ }
+ proto.write(DropBoxManagerServiceDumpProto.Entry.DATA,
+ Arrays.copyOf(buf, readBytes));
+ }
+ } catch (IOException e) {
+ Slog.e(TAG, "Can't read: " + file, e);
+ }
+
+ proto.end(bToken);
+ }
+
+ proto.flush();
+ }
+
///////////////////////////////////////////////////////////////////////////
/** Chronologically sorted list of {@link EntryFile} */
diff --git a/services/core/java/com/android/server/LocationManagerService.java b/services/core/java/com/android/server/LocationManagerService.java
index 7712f1b4a9a0..39f039af330c 100644
--- a/services/core/java/com/android/server/LocationManagerService.java
+++ b/services/core/java/com/android/server/LocationManagerService.java
@@ -128,6 +128,32 @@ import java.util.concurrent.TimeUnit;
* updates and alerts.
*/
public class LocationManagerService extends ILocationManager.Stub {
+
+ /**
+ * Controls lifecycle of LocationManagerService.
+ */
+ public static class Lifecycle extends SystemService {
+
+ private LocationManagerService mService;
+
+ public Lifecycle(Context context) {
+ super(context);
+ mService = new LocationManagerService(context);
+ }
+
+ @Override
+ public void onStart() {
+ publishBinderService(Context.LOCATION_SERVICE, mService);
+ }
+
+ @Override
+ public void onBootPhase(int phase) {
+ if (phase == SystemService.PHASE_THIRD_PARTY_APPS_CAN_START) {
+ mService.systemRunning();
+ }
+ }
+ }
+
private static final String TAG = "LocationManagerService";
public static final boolean D = Log.isLoggable(TAG, Log.DEBUG);
@@ -234,8 +260,7 @@ public class LocationManagerService extends ILocationManager.Stub {
@GuardedBy("mLock")
private final LocationUsageLogger mLocationUsageLogger;
- public LocationManagerService(Context context) {
- super();
+ private LocationManagerService(Context context) {
mContext = context;
mHandler = FgThread.getHandler();
mLocationUsageLogger = new LocationUsageLogger();
@@ -254,7 +279,7 @@ public class LocationManagerService extends ILocationManager.Stub {
// most startup is deferred until systemRunning()
}
- public void systemRunning() {
+ private void systemRunning() {
synchronized (mLock) {
initializeLocked();
}
@@ -1453,6 +1478,16 @@ public class LocationManagerService extends ILocationManager.Stub {
return true;
}
+ public void callRemovedLocked() {
+ if (mListener != null) {
+ try {
+ mListener.onRemoved();
+ } catch (RemoteException e) {
+ // doesn't matter
+ }
+ }
+ }
+
@Override
public void binderDied() {
if (D) Log.d(TAG, "Remote " + mListenerName + " died.");
@@ -3066,6 +3101,8 @@ public class LocationManagerService extends ILocationManager.Stub {
// track expired records
if (r.mRealRequest.getNumUpdates() <= 0 || r.mRealRequest.getExpireAt() < now) {
+ // notify the client it can remove this listener
+ r.mReceiver.callRemovedLocked();
if (deadUpdateRecords == null) {
deadUpdateRecords = new ArrayList<>();
}
diff --git a/services/core/java/com/android/server/PinnerService.java b/services/core/java/com/android/server/PinnerService.java
index 49ef1642c051..d5f795683675 100644
--- a/services/core/java/com/android/server/PinnerService.java
+++ b/services/core/java/com/android/server/PinnerService.java
@@ -333,8 +333,8 @@ public final class PinnerService extends SystemService {
}
@Override
- public void onUidStateChanged(int uid, int procState, long procStateSeq)
- throws RemoteException {
+ public void onUidStateChanged(int uid, int procState, long procStateSeq,
+ int capability) throws RemoteException {
}
@Override
diff --git a/services/core/java/com/android/server/VibratorService.java b/services/core/java/com/android/server/VibratorService.java
index d622fb433ed8..b8acd7ac108a 100644
--- a/services/core/java/com/android/server/VibratorService.java
+++ b/services/core/java/com/android/server/VibratorService.java
@@ -174,7 +174,8 @@ public class VibratorService extends IVibratorService.Stub
static native long vibratorGetCapabilities();
private final IUidObserver mUidObserver = new IUidObserver.Stub() {
- @Override public void onUidStateChanged(int uid, int procState, long procStateSeq) {
+ @Override public void onUidStateChanged(int uid, int procState, long procStateSeq,
+ int capability) {
mProcStatesCache.put(uid, procState);
}
diff --git a/services/core/java/com/android/server/accounts/AccountManagerService.java b/services/core/java/com/android/server/accounts/AccountManagerService.java
index 4f54e64f6911..b5cab1f8d62b 100644
--- a/services/core/java/com/android/server/accounts/AccountManagerService.java
+++ b/services/core/java/com/android/server/accounts/AccountManagerService.java
@@ -3248,7 +3248,7 @@ public class AccountManagerService
UserAccounts accounts = getUserAccounts(userId);
logRecordWithUid(
accounts, AccountsDb.DEBUG_ACTION_CALLED_ACCOUNT_ADD, AccountsDb.TABLE_ACCOUNTS,
- userId);
+ uid);
new Session(accounts, response, accountType, expectActivityLaunch,
true /* stripAuthTokenFromResult */, null /* accountName */,
false /* authDetailsRequired */, true /* updateLastAuthenticationTime */) {
diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java
index 5df45437ae34..d6ecdeac1654 100644
--- a/services/core/java/com/android/server/am/ActivityManagerService.java
+++ b/services/core/java/com/android/server/am/ActivityManagerService.java
@@ -139,6 +139,7 @@ import static com.android.server.wm.ActivityTaskManagerService.relaunchReasonToS
import android.Manifest;
import android.Manifest.permission;
+import android.annotation.BroadcastBehavior;
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.annotation.UserIdInt;
@@ -299,10 +300,8 @@ import android.view.View;
import android.view.WindowManager;
import android.view.autofill.AutofillManagerInternal;
-import com.android.internal.R;
import com.android.internal.annotations.GuardedBy;
import com.android.internal.annotations.VisibleForTesting;
-import com.android.internal.app.DumpHeapActivity;
import com.android.internal.app.IAppOpsCallback;
import com.android.internal.app.IAppOpsService;
import com.android.internal.app.ProcessMap;
@@ -503,6 +502,41 @@ public class ActivityManagerService extends IActivityManager.Stub
static final int PERSISTENT_MASK =
ApplicationInfo.FLAG_SYSTEM|ApplicationInfo.FLAG_PERSISTENT;
+ // Intent sent when remote bugreport collection has been completed
+ private static final String INTENT_REMOTE_BUGREPORT_FINISHED =
+ "com.android.internal.intent.action.REMOTE_BUGREPORT_FINISHED";
+
+ /**
+ * Broadcast sent when heap dump collection has been completed.
+ */
+ @BroadcastBehavior(includeBackground = true, protectedBroadcast = true)
+ private static final String ACTION_HEAP_DUMP_FINISHED =
+ "com.android.internal.intent.action.HEAP_DUMP_FINISHED";
+
+ /**
+ * The process we are reporting
+ */
+ private static final String EXTRA_HEAP_DUMP_PROCESS_NAME =
+ "com.android.internal.extra.heap_dump.PROCESS_NAME";
+
+ /**
+ * The size limit the process reached.
+ */
+ private static final String EXTRA_HEAP_DUMP_SIZE_BYTES =
+ "com.android.internal.extra.heap_dump.SIZE_BYTES";
+
+ /**
+ * Whether the user initiated the dump or not.
+ */
+ private static final String EXTRA_HEAP_DUMP_IS_USER_INITIATED =
+ "com.android.internal.extra.heap_dump.IS_USER_INITIATED";
+
+ /**
+ * Optional name of package to directly launch.
+ */
+ private static final String EXTRA_HEAP_DUMP_REPORT_PACKAGE =
+ "com.android.internal.extra.heap_dump.REPORT_PACKAGE";
+
// If set, we will push process association information in to procstats.
static final boolean TRACK_PROCSTATS_ASSOCIATIONS = true;
@@ -1332,7 +1366,7 @@ public class ActivityManagerService extends IActivityManager.Stub
int mProfileType = 0;
final ProcessMap<Pair<Long, String>> mMemWatchProcesses = new ProcessMap<>();
String mMemWatchDumpProcName;
- String mMemWatchDumpFile;
+ Uri mMemWatchDumpUri;
int mMemWatchDumpPid;
int mMemWatchDumpUid;
private boolean mMemWatchIsUserInitiated;
@@ -1344,10 +1378,12 @@ public class ActivityManagerService extends IActivityManager.Stub
static final class ProcessChangeItem {
static final int CHANGE_ACTIVITIES = 1<<0;
static final int CHANGE_FOREGROUND_SERVICES = 1<<1;
+ static final int CHANGE_CAPABILITY = 1<<2;
int changes;
int uid;
int pid;
int processState;
+ int capability;
boolean foregroundActivities;
int foregroundServiceTypes;
}
@@ -1519,7 +1555,7 @@ public class ActivityManagerService extends IActivityManager.Stub
static final int UPDATE_TIME_PREFERENCE_MSG = 41;
static final int NOTIFY_CLEARTEXT_NETWORK_MSG = 49;
static final int POST_DUMP_HEAP_NOTIFICATION_MSG = 50;
- static final int DELETE_DUMPHEAP_MSG = 51;
+ static final int ABORT_DUMPHEAP_MSG = 51;
static final int DISPATCH_UIDS_CHANGED_UI_MSG = 53;
static final int SHUTDOWN_UI_AUTOMATION_CONNECTION_MSG = 56;
static final int CONTENT_PROVIDER_PUBLISH_TIMEOUT_MSG = 57;
@@ -1788,11 +1824,7 @@ public class ActivityManagerService extends IActivityManager.Stub
final boolean isUserInitiated;
synchronized (ActivityManagerService.this) {
uid = mMemWatchDumpUid;
- if (uid == SYSTEM_UID) {
- procName = mContext.getString(R.string.android_system_label);
- } else {
- procName = mMemWatchDumpProcName;
- }
+ procName = mMemWatchDumpProcName;
Pair<Long, String> val = mMemWatchProcesses.get(procName, uid);
if (val == null) {
val = mMemWatchProcesses.get(procName, 0);
@@ -1805,6 +1837,11 @@ public class ActivityManagerService extends IActivityManager.Stub
reportPackage = null;
}
isUserInitiated = mMemWatchIsUserInitiated;
+
+ mMemWatchDumpUri = null;
+ mMemWatchDumpProcName = null;
+ mMemWatchDumpPid = -1;
+ mMemWatchDumpUid = -1;
}
if (procName == null) {
return;
@@ -1813,65 +1850,29 @@ public class ActivityManagerService extends IActivityManager.Stub
if (DEBUG_PSS) Slog.d(TAG_PSS,
"Showing dump heap notification from " + procName + "/" + uid);
- INotificationManager inm = NotificationManager.getService();
- if (inm == null) {
- return;
- }
-
- final int titleId = isUserInitiated
- ? R.string.dump_heap_ready_notification : R.string.dump_heap_notification;
- String text = mContext.getString(titleId, procName);
-
- Intent deleteIntent = new Intent();
- deleteIntent.setAction(DumpHeapActivity.ACTION_DELETE_DUMPHEAP);
- Intent intent = new Intent();
- intent.setClassName("android", DumpHeapActivity.class.getName());
- intent.putExtra(DumpHeapActivity.KEY_PROCESS, procName);
- intent.putExtra(DumpHeapActivity.KEY_SIZE, memLimit);
- intent.putExtra(DumpHeapActivity.KEY_IS_USER_INITIATED, isUserInitiated);
- intent.putExtra(DumpHeapActivity.KEY_IS_SYSTEM_PROCESS, uid == SYSTEM_UID);
- if (reportPackage != null) {
- intent.putExtra(DumpHeapActivity.KEY_DIRECT_LAUNCH, reportPackage);
- }
- int userId = UserHandle.getUserId(uid);
- Notification notification =
- new Notification.Builder(mContext, SystemNotificationChannels.DEVELOPER)
- .setSmallIcon(com.android.internal.R.drawable.stat_sys_adb)
- .setAutoCancel(true)
- .setTicker(text)
- .setColor(mContext.getColor(
- com.android.internal.R.color.system_notification_accent_color))
- .setContentTitle(text)
- .setContentText(
- mContext.getText(R.string.dump_heap_notification_detail))
- .setContentIntent(PendingIntent.getActivityAsUser(mContext, 0,
- intent, PendingIntent.FLAG_CANCEL_CURRENT, null,
- new UserHandle(userId)))
- .setDeleteIntent(PendingIntent.getBroadcastAsUser(mContext, 0,
- deleteIntent, 0, UserHandle.SYSTEM))
- .build();
-
- try {
- inm.enqueueNotificationWithTag("android", "android", null,
- SystemMessage.NOTE_DUMP_HEAP_NOTIFICATION,
- notification, userId);
- } catch (RuntimeException e) {
- Slog.w(ActivityManagerService.TAG,
- "Error showing notification for dump heap", e);
- } catch (RemoteException e) {
- }
+ Intent dumpFinishedIntent = new Intent(ACTION_HEAP_DUMP_FINISHED);
+ // Send this only to the Shell package.
+ dumpFinishedIntent.setPackage("com.android.shell");
+ dumpFinishedIntent.putExtra(Intent.EXTRA_UID, uid);
+ dumpFinishedIntent.putExtra(EXTRA_HEAP_DUMP_IS_USER_INITIATED, isUserInitiated);
+ dumpFinishedIntent.putExtra(EXTRA_HEAP_DUMP_SIZE_BYTES, memLimit);
+ dumpFinishedIntent.putExtra(EXTRA_HEAP_DUMP_REPORT_PACKAGE, reportPackage);
+ dumpFinishedIntent.putExtra(EXTRA_HEAP_DUMP_PROCESS_NAME, procName);
+
+ mContext.sendBroadcastAsUser(dumpFinishedIntent,
+ UserHandle.getUserHandleForUid(uid));
} break;
- case DELETE_DUMPHEAP_MSG: {
- revokeUriPermission(ActivityThread.currentActivityThread().getApplicationThread(),
- null, DumpHeapActivity.JAVA_URI,
- Intent.FLAG_GRANT_READ_URI_PERMISSION
- | Intent.FLAG_GRANT_WRITE_URI_PERMISSION,
- UserHandle.myUserId());
- synchronized (ActivityManagerService.this) {
- mMemWatchDumpFile = null;
- mMemWatchDumpProcName = null;
- mMemWatchDumpPid = -1;
- mMemWatchDumpUid = -1;
+ case ABORT_DUMPHEAP_MSG: {
+ String procName = (String) msg.obj;
+ if (procName != null) {
+ synchronized (ActivityManagerService.this) {
+ if (procName.equals(mMemWatchDumpProcName)) {
+ mMemWatchDumpProcName = null;
+ mMemWatchDumpUri = null;
+ mMemWatchDumpPid = -1;
+ mMemWatchDumpUid = -1;
+ }
+ }
}
} break;
case SHUTDOWN_UI_AUTOMATION_CONNECTION_MSG: {
@@ -3337,6 +3338,7 @@ public class ActivityManagerService extends IActivityManager.Stub
validateUid.idle = false;
}
validateUid.setCurProcState(validateUid.setProcState = item.processState);
+ validateUid.curCapability = validateUid.setCapability = item.capability;
validateUid.lastDispatchedProcStateSeq = item.procStateSeq;
}
}
@@ -3402,7 +3404,7 @@ public class ActivityManagerService extends IActivityManager.Stub
if ((reg.which & ActivityManager.UID_OBSERVER_PROCSTATE) != 0) {
if (DEBUG_UID_OBSERVERS) Slog.i(TAG_UID_OBSERVERS,
"UID CHANGED uid=" + item.uid
- + ": " + item.processState);
+ + ": " + item.processState + ": " + item.capability);
boolean doReport = true;
if (reg.cutpoint >= ActivityManager.MIN_PROCESS_STATE) {
final int lastState = reg.lastProcStates.get(item.uid,
@@ -3420,7 +3422,7 @@ public class ActivityManagerService extends IActivityManager.Stub
reg.lastProcStates.put(item.uid, item.processState);
}
observer.onUidStateChanged(item.uid, item.processState,
- item.procStateSeq);
+ item.procStateSeq, item.capability);
}
}
}
@@ -5245,17 +5247,6 @@ public class ActivityManagerService extends IActivityManager.Stub
}
}, pkgFilter);
- IntentFilter dumpheapFilter = new IntentFilter();
- dumpheapFilter.addAction(DumpHeapActivity.ACTION_DELETE_DUMPHEAP);
- mContext.registerReceiver(new BroadcastReceiver() {
- @Override
- public void onReceive(Context context, Intent intent) {
- final long delay = intent.getBooleanExtra(
- DumpHeapActivity.EXTRA_DELAY_DELETE, false) ? 5 * 60 * 1000 : 0;
- mHandler.sendEmptyMessageDelayed(DELETE_DUMPHEAP_MSG, delay);
- }
- }, dumpheapFilter);
-
// Inform checkpointing systems of success
try {
// This line is needed to CTS test for the correct exception handling
@@ -10953,7 +10944,7 @@ public class ActivityManagerService extends IActivityManager.Stub
}
}
pw.print(" mMemWatchDumpProcName="); pw.println(mMemWatchDumpProcName);
- pw.print(" mMemWatchDumpFile="); pw.println(mMemWatchDumpFile);
+ pw.print(" mMemWatchDumpUri="); pw.println(mMemWatchDumpUri);
pw.print(" mMemWatchDumpPid="); pw.println(mMemWatchDumpPid);
pw.print(" mMemWatchDumpUid="); pw.println(mMemWatchDumpUid);
pw.print(" mMemWatchIsUserInitiated="); pw.println(mMemWatchIsUserInitiated);
@@ -11250,10 +11241,14 @@ public class ActivityManagerService extends IActivityManager.Stub
}
final long dtoken = proto.start(ActivityManagerServiceDumpProcessesProto.MemWatchProcess.DUMP);
- proto.write(ActivityManagerServiceDumpProcessesProto.MemWatchProcess.Dump.PROC_NAME, mMemWatchDumpProcName);
- proto.write(ActivityManagerServiceDumpProcessesProto.MemWatchProcess.Dump.FILE, mMemWatchDumpFile);
- proto.write(ActivityManagerServiceDumpProcessesProto.MemWatchProcess.Dump.PID, mMemWatchDumpPid);
- proto.write(ActivityManagerServiceDumpProcessesProto.MemWatchProcess.Dump.UID, mMemWatchDumpUid);
+ proto.write(ActivityManagerServiceDumpProcessesProto.MemWatchProcess.Dump.PROC_NAME,
+ mMemWatchDumpProcName);
+ proto.write(ActivityManagerServiceDumpProcessesProto.MemWatchProcess.Dump.URI,
+ mMemWatchDumpUri.toString());
+ proto.write(ActivityManagerServiceDumpProcessesProto.MemWatchProcess.Dump.PID,
+ mMemWatchDumpPid);
+ proto.write(ActivityManagerServiceDumpProcessesProto.MemWatchProcess.Dump.UID,
+ mMemWatchDumpUid);
proto.write(
ActivityManagerServiceDumpProcessesProto.MemWatchProcess.Dump.IS_USER_INITIATED,
mMemWatchIsUserInitiated);
@@ -16366,9 +16361,10 @@ public class ActivityManagerService extends IActivityManager.Stub
}
}
- void noteUidProcessState(final int uid, final int state) {
+ void noteUidProcessState(final int uid, final int state,
+ final @ActivityManager.ProcessCapability int capability) {
mBatteryStatsService.noteUidProcessState(uid, state);
- mAppOpsService.updateUidProcState(uid, state);
+ mAppOpsService.updateUidProcState(uid, state, capability);
if (mTrackingAssociations) {
for (int i1=0, N1=mAssociations.size(); i1<N1; i1++) {
ArrayMap<ComponentName, SparseArray<ArrayMap<String, Association>>> targetComponents
@@ -16395,56 +16391,44 @@ public class ActivityManagerService extends IActivityManager.Stub
}
}
- private static final class RecordPssRunnable implements Runnable {
- private final ActivityManagerService mService;
+ /** @hide */
+ public static Uri makeHeapDumpUri(String procName) {
+ return Uri.parse("content://com.android.shell.heapdump/" + procName + "_javaheap.bin");
+ }
+
+ private final class RecordPssRunnable implements Runnable {
private final ProcessRecord mProc;
- private final File mHeapdumpFile;
+ private final Uri mDumpUri;
+ private final ContentResolver mContentResolver;
- RecordPssRunnable(ActivityManagerService service, ProcessRecord proc, File heapdumpFile) {
- this.mService = service;
- this.mProc = proc;
- this.mHeapdumpFile = heapdumpFile;
+ RecordPssRunnable(ProcessRecord proc, Uri dumpUri, ContentResolver contentResolver) {
+ mProc = proc;
+ mDumpUri = dumpUri;
+ mContentResolver = contentResolver;
}
@Override
public void run() {
- mService.revokeUriPermission(ActivityThread.currentActivityThread()
- .getApplicationThread(),
- null, DumpHeapActivity.JAVA_URI,
- Intent.FLAG_GRANT_READ_URI_PERMISSION
- | Intent.FLAG_GRANT_WRITE_URI_PERMISSION,
- UserHandle.myUserId());
- ParcelFileDescriptor fd = null;
- try {
- mHeapdumpFile.delete();
- fd = ParcelFileDescriptor.open(mHeapdumpFile,
- ParcelFileDescriptor.MODE_CREATE
- | ParcelFileDescriptor.MODE_TRUNCATE
- | ParcelFileDescriptor.MODE_WRITE_ONLY
- | ParcelFileDescriptor.MODE_APPEND);
+ try (ParcelFileDescriptor fd = mContentResolver.openFileDescriptor(mDumpUri, "rw")) {
IApplicationThread thread = mProc.thread;
if (thread != null) {
try {
if (DEBUG_PSS) {
Slog.d(TAG_PSS, "Requesting dump heap from "
- + mProc + " to " + mHeapdumpFile);
+ + mProc + " to " + mDumpUri.getPath());
}
thread.dumpHeap(/* managed= */ true,
/* mallocInfo= */ false, /* runGc= */ false,
- mHeapdumpFile.toString(), fd,
+ mDumpUri.getPath(), fd,
/* finishCallback= */ null);
} catch (RemoteException e) {
}
}
- } catch (FileNotFoundException e) {
- e.printStackTrace();
- } finally {
- if (fd != null) {
- try {
- fd.close();
- } catch (IOException e) {
- }
- }
+ } catch (IOException e) {
+ Slog.e(TAG, "Failed to dump heap", e);
+ // Need to clear the heap dump variables, otherwise no further heap dumps will be
+ // attempted.
+ abortHeapDump(mProc.processName);
}
}
}
@@ -16513,13 +16497,20 @@ public class ActivityManagerService extends IActivityManager.Stub
}
private void startHeapDumpLocked(ProcessRecord proc, boolean isUserInitiated) {
- final File heapdumpFile = DumpHeapProvider.getJavaFile();
mMemWatchDumpProcName = proc.processName;
- mMemWatchDumpFile = heapdumpFile.toString();
+ mMemWatchDumpUri = makeHeapDumpUri(proc.processName);
mMemWatchDumpPid = proc.pid;
mMemWatchDumpUid = proc.uid;
mMemWatchIsUserInitiated = isUserInitiated;
- BackgroundThread.getHandler().post(new RecordPssRunnable(this, proc, heapdumpFile));
+ Context ctx;
+ try {
+ ctx = mContext.createPackageContextAsUser("android", 0,
+ UserHandle.getUserHandleForUid(mMemWatchDumpUid));
+ } catch (NameNotFoundException e) {
+ throw new RuntimeException("android package not found.");
+ }
+ BackgroundThread.getHandler().post(
+ new RecordPssRunnable(proc, mMemWatchDumpUri, ctx.getContentResolver()));
}
/**
@@ -16891,6 +16882,7 @@ public class ActivityManagerService extends IActivityManager.Stub
}
pendingChange.change = change;
pendingChange.processState = uidRec != null ? uidRec.setProcState : PROCESS_STATE_NONEXISTENT;
+ pendingChange.capability = uidRec != null ? uidRec.setCapability : 0;
pendingChange.ephemeral = uidRec != null ? uidRec.ephemeral : isEphemeralLocked(uid);
pendingChange.procStateSeq = uidRec != null ? uidRec.curProcStateSeq : 0;
if (uidRec != null) {
@@ -17715,9 +17707,9 @@ public class ActivityManagerService extends IActivityManager.Stub
+ " does not match last pid " + mMemWatchDumpPid);
return;
}
- if (mMemWatchDumpFile == null || !mMemWatchDumpFile.equals(path)) {
+ if (mMemWatchDumpUri == null || !mMemWatchDumpUri.getPath().equals(path)) {
Slog.w(TAG, "dumpHeapFinished: Calling path " + path
- + " does not match last path " + mMemWatchDumpFile);
+ + " does not match last path " + mMemWatchDumpUri);
return;
}
if (DEBUG_PSS) Slog.d(TAG_PSS, "Dump heap finished for " + path);
@@ -17728,6 +17720,13 @@ public class ActivityManagerService extends IActivityManager.Stub
}
}
+ /** Clear the currently executing heap dump variables so a new heap dump can be started. */
+ private void abortHeapDump(String procName) {
+ Message msg = mHandler.obtainMessage(ABORT_DUMPHEAP_MSG);
+ msg.obj = procName;
+ mHandler.sendMessage(msg);
+ }
+
/** In this method we try to acquire our lock to make sure that we have not deadlocked */
public void monitor() {
synchronized (this) { }
diff --git a/services/core/java/com/android/server/am/ActivityManagerShellCommand.java b/services/core/java/com/android/server/am/ActivityManagerShellCommand.java
index 8be2438b4f2f..59acdcf4a875 100644
--- a/services/core/java/com/android/server/am/ActivityManagerShellCommand.java
+++ b/services/core/java/com/android/server/am/ActivityManagerShellCommand.java
@@ -1470,7 +1470,8 @@ final class ActivityManagerShellCommand extends ShellCommand {
}
@Override
- public void onUidStateChanged(int uid, int procState, long procStateSeq) throws RemoteException {
+ public void onUidStateChanged(int uid, int procState, long procStateSeq, int capability)
+ throws RemoteException {
synchronized (this) {
final StrictMode.ThreadPolicy oldPolicy = StrictMode.allowThreadDiskWrites();
try {
@@ -1478,7 +1479,9 @@ final class ActivityManagerShellCommand extends ShellCommand {
mPw.print(" procstate ");
mPw.print(ProcessList.makeProcStateString(procState));
mPw.print(" seq ");
- mPw.println(procStateSeq);
+ mPw.print(procStateSeq);
+ mPw.print(" capability ");
+ mPw.println(capability);
mPw.flush();
} finally {
StrictMode.setThreadPolicy(oldPolicy);
diff --git a/services/core/java/com/android/server/am/AppErrors.java b/services/core/java/com/android/server/am/AppErrors.java
index 6a29c75b702a..8095020ce4ce 100644
--- a/services/core/java/com/android/server/am/AppErrors.java
+++ b/services/core/java/com/android/server/am/AppErrors.java
@@ -383,7 +383,11 @@ class AppErrors {
// and then the delayed summary kill will be a no-op.
final ProcessRecord p = proc;
mService.mHandler.postDelayed(
- () -> killAppImmediateLocked(p, "forced", "killed for invalid state"),
+ () -> {
+ synchronized (mService) {
+ killAppImmediateLocked(p, "forced", "killed for invalid state");
+ }
+ },
5000L);
}
}
diff --git a/services/core/java/com/android/server/am/DumpHeapProvider.java b/services/core/java/com/android/server/am/DumpHeapProvider.java
deleted file mode 100644
index a8b639ecf8d4..000000000000
--- a/services/core/java/com/android/server/am/DumpHeapProvider.java
+++ /dev/null
@@ -1,89 +0,0 @@
-/*
- * Copyright (C) 2015 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.server.am;
-
-import android.content.ContentProvider;
-import android.content.ContentValues;
-import android.database.Cursor;
-import android.net.Uri;
-import android.os.Environment;
-import android.os.ParcelFileDescriptor;
-
-import java.io.File;
-import java.io.FileNotFoundException;
-
-public class DumpHeapProvider extends ContentProvider {
- static final Object sLock = new Object();
- static File sHeapDumpJavaFile;
-
- static public File getJavaFile() {
- synchronized (sLock) {
- return sHeapDumpJavaFile;
- }
- }
-
- @Override
- public boolean onCreate() {
- synchronized (sLock) {
- File dataDir = Environment.getDataDirectory();
- File systemDir = new File(dataDir, "system");
- File heapdumpDir = new File(systemDir, "heapdump");
- heapdumpDir.mkdir();
- sHeapDumpJavaFile = new File(heapdumpDir, "javaheap.bin");
- }
- return true;
- }
-
- @Override
- public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) {
- return null;
- }
-
- @Override
- public String getType(Uri uri) {
- return "application/octet-stream";
- }
-
- @Override
- public Uri insert(Uri uri, ContentValues values) {
- return null;
- }
-
- @Override
- public int delete(Uri uri, String selection, String[] selectionArgs) {
- return 0;
- }
-
- @Override
- public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) {
- return 0;
- }
-
- @Override
- public ParcelFileDescriptor openFile(Uri uri, String mode) throws FileNotFoundException {
- synchronized (sLock) {
- String path = uri.getEncodedPath();
- final String tag = Uri.decode(path);
- if (tag.equals("/java")) {
- return ParcelFileDescriptor.open(sHeapDumpJavaFile,
- ParcelFileDescriptor.MODE_READ_ONLY);
- } else {
- throw new FileNotFoundException("Invalid path for " + uri);
- }
- }
- }
-}
diff --git a/services/core/java/com/android/server/am/OomAdjuster.java b/services/core/java/com/android/server/am/OomAdjuster.java
index 78a9efc6e2a7..30674db484d5 100644
--- a/services/core/java/com/android/server/am/OomAdjuster.java
+++ b/services/core/java/com/android/server/am/OomAdjuster.java
@@ -16,6 +16,9 @@
package com.android.server.am;
+import static android.app.ActivityManager.PROCESS_CAPABILITY_ALL;
+import static android.app.ActivityManager.PROCESS_CAPABILITY_FOREGROUND_LOCATION;
+import static android.app.ActivityManager.PROCESS_CAPABILITY_NONE;
import static android.app.ActivityManager.PROCESS_STATE_BOUND_FOREGROUND_SERVICE;
import static android.app.ActivityManager.PROCESS_STATE_BOUND_TOP;
import static android.app.ActivityManager.PROCESS_STATE_CACHED_ACTIVITY;
@@ -23,7 +26,6 @@ import static android.app.ActivityManager.PROCESS_STATE_CACHED_ACTIVITY_CLIENT;
import static android.app.ActivityManager.PROCESS_STATE_CACHED_EMPTY;
import static android.app.ActivityManager.PROCESS_STATE_CACHED_RECENT;
import static android.app.ActivityManager.PROCESS_STATE_FOREGROUND_SERVICE;
-import static android.app.ActivityManager.PROCESS_STATE_FOREGROUND_SERVICE_LOCATION;
import static android.app.ActivityManager.PROCESS_STATE_IMPORTANT_BACKGROUND;
import static android.app.ActivityManager.PROCESS_STATE_IMPORTANT_FOREGROUND;
import static android.app.ActivityManager.PROCESS_STATE_LAST_ACTIVITY;
@@ -65,6 +67,7 @@ import android.app.ActivityManager;
import android.app.usage.UsageEvents;
import android.content.Context;
import android.content.pm.ServiceInfo;
+import android.os.Build;
import android.os.Debug;
import android.os.Handler;
import android.os.IBinder;
@@ -407,6 +410,13 @@ public final class OomAdjuster {
mAdjSeq--;
// Update these reachable processes
updateOomAdjLockedInner(oomAdjReason, topApp, processes, uids, false);
+ } else if (app.getCurRawAdj() == ProcessList.UNKNOWN_ADJ) {
+ // In case the app goes from non-cached to cached but it doesn't have other reachable
+ // processes, its adj could be still unknown as of now, assign one.
+ processes.add(app);
+ assignCachedAdjIfNecessary(processes);
+ applyOomAdjLocked(app, false, SystemClock.uptimeMillis(),
+ SystemClock.elapsedRealtime());
}
mService.mOomAdjProfiler.oomAdjEnded();
Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);
@@ -471,6 +481,7 @@ public final class OomAdjuster {
app.containsCycle = false;
app.setCurRawProcState(PROCESS_STATE_CACHED_EMPTY);
app.setCurRawAdj(ProcessList.UNKNOWN_ADJ);
+ app.setCapability = PROCESS_CAPABILITY_NONE;
app.resetCachedInfo();
}
for (int i = numProc - 1; i >= 0; i--) {
@@ -486,7 +497,7 @@ public final class OomAdjuster {
}
}
- assignCachedAdjIfNecessary();
+ assignCachedAdjIfNecessary(mProcessList.mLruProcesses);
if (fullUpdate) { // There won't be cycles if we didn't compute clients above.
// Cycle strategy:
@@ -560,8 +571,7 @@ public final class OomAdjuster {
}
}
- private void assignCachedAdjIfNecessary() {
- ArrayList<ProcessRecord> lruList = mProcessList.mLruProcesses;
+ private void assignCachedAdjIfNecessary(ArrayList<ProcessRecord> lruList) {
final int numLru = lruList.size();
// First update the OOM adjustment for each of the
@@ -788,6 +798,7 @@ public final class OomAdjuster {
if (app.hasForegroundServices()) {
uidRec.foregroundServices = true;
}
+ uidRec.curCapability |= app.curCapability;
}
}
@@ -804,10 +815,13 @@ public final class OomAdjuster {
int uidChange = UidRecord.CHANGE_PROCSTATE;
if (uidRec.getCurProcState() != PROCESS_STATE_NONEXISTENT
&& (uidRec.setProcState != uidRec.getCurProcState()
+ || uidRec.setCapability != uidRec.curCapability
|| uidRec.setWhitelist != uidRec.curWhitelist)) {
if (DEBUG_UID_OBSERVERS) Slog.i(TAG_UID_OBSERVERS, "Changes in " + uidRec
+ ": proc state from " + uidRec.setProcState + " to "
- + uidRec.getCurProcState() + ", whitelist from " + uidRec.setWhitelist
+ + uidRec.getCurProcState() + ", capability from "
+ + uidRec.setCapability + " to " + uidRec.curCapability
+ + ", whitelist from " + uidRec.setWhitelist
+ " to " + uidRec.curWhitelist);
if (ActivityManager.isProcStateBackground(uidRec.getCurProcState())
&& !uidRec.curWhitelist) {
@@ -845,11 +859,13 @@ public final class OomAdjuster {
uidChange |= isCached ? UidRecord.CHANGE_CACHED : UidRecord.CHANGE_UNCACHED;
}
uidRec.setProcState = uidRec.getCurProcState();
+ uidRec.setCapability = uidRec.curCapability;
uidRec.setWhitelist = uidRec.curWhitelist;
uidRec.setIdle = uidRec.idle;
mService.mAtmInternal.onUidProcStateChanged(uidRec.uid, uidRec.setProcState);
mService.enqueueUidChangeLocked(uidRec, -1, uidChange);
- mService.noteUidProcessState(uidRec.uid, uidRec.getCurProcState());
+ mService.noteUidProcessState(uidRec.uid, uidRec.getCurProcState(),
+ uidRec.curCapability);
if (uidRec.foregroundServices) {
mService.mServices.foregroundServiceProcStateChangedLocked(uidRec);
}
@@ -1016,6 +1032,7 @@ public final class OomAdjuster {
app.curAdj = ProcessList.CACHED_APP_MAX_ADJ;
app.setCurRawAdj(ProcessList.CACHED_APP_MAX_ADJ);
app.completedAdjSeq = app.adjSeq;
+ app.curCapability = PROCESS_CAPABILITY_NONE;
return false;
}
@@ -1030,6 +1047,7 @@ public final class OomAdjuster {
int prevAppAdj = app.curAdj;
int prevProcState = app.getCurProcState();
+ int prevCapability = app.curCapability;
if (app.maxAdj <= ProcessList.FOREGROUND_APP_ADJ) {
// The max adjustment doesn't allow this app to be anything
@@ -1087,6 +1105,7 @@ public final class OomAdjuster {
int schedGroup;
int procState;
int cachedAdjSeq;
+ int capability = 0;
boolean foregroundActivities = false;
if (PROCESS_STATE_CUR_TOP == PROCESS_STATE_TOP && app == topApp) {
@@ -1185,19 +1204,17 @@ public final class OomAdjuster {
}
}
+ if (app.hasLocationForegroundServices()) {
+ capability |= PROCESS_CAPABILITY_FOREGROUND_LOCATION;
+ }
+
if (adj > ProcessList.PERCEPTIBLE_APP_ADJ
- || procState > PROCESS_STATE_FOREGROUND_SERVICE_LOCATION) {
+ || procState > PROCESS_STATE_FOREGROUND_SERVICE) {
if (app.hasForegroundServices()) {
// The user is aware of this app, so make it visible.
adj = ProcessList.PERCEPTIBLE_APP_ADJ;
- if (app.hasLocationForegroundServices()) {
- procState = PROCESS_STATE_FOREGROUND_SERVICE_LOCATION;
- app.adjType = "fg-service-location";
-
- } else {
- procState = PROCESS_STATE_FOREGROUND_SERVICE;
- app.adjType = "fg-service";
- }
+ procState = PROCESS_STATE_FOREGROUND_SERVICE;
+ app.adjType = "fg-service";
app.cached = false;
schedGroup = ProcessList.SCHED_GROUP_DEFAULT;
if (DEBUG_OOM_ADJ_REASON || logUid == appUid) {
@@ -1437,6 +1454,10 @@ public final class OomAdjuster {
continue;
}
+ if (cr.hasFlag(Context.BIND_INCLUDE_CAPABILITIES)) {
+ capability |= client.curCapability;
+ }
+
int clientAdj = client.getCurRawAdj();
int clientProcState = client.getCurRawProcState();
@@ -1549,25 +1570,31 @@ public final class OomAdjuster {
// processes). These should not bring the current process
// into the top state, since they are not on top. Instead
// give them the best bound state after that.
- final int bestState = cr.hasFlag(Context.BIND_INCLUDE_CAPABILITIES)
- ? PROCESS_STATE_FOREGROUND_SERVICE_LOCATION
- : PROCESS_STATE_BOUND_FOREGROUND_SERVICE;
- if ((cr.flags & Context.BIND_FOREGROUND_SERVICE) != 0) {
- clientProcState = bestState;
+ if (cr.hasFlag(Context.BIND_FOREGROUND_SERVICE)) {
+ clientProcState = PROCESS_STATE_BOUND_FOREGROUND_SERVICE; ;
} else if (mService.mWakefulness
== PowerManagerInternal.WAKEFULNESS_AWAKE
&& (cr.flags & Context.BIND_FOREGROUND_SERVICE_WHILE_AWAKE)
!= 0) {
- clientProcState = bestState;
+ clientProcState = PROCESS_STATE_BOUND_FOREGROUND_SERVICE;
} else {
clientProcState =
PROCESS_STATE_IMPORTANT_FOREGROUND;
}
} else if (clientProcState == PROCESS_STATE_TOP) {
- if (cr.notHasFlag(Context.BIND_INCLUDE_CAPABILITIES)) {
- // Go at most to BOUND_TOP, unless requested to elevate
- // to client's state.
- clientProcState = PROCESS_STATE_BOUND_TOP;
+ // Go at most to BOUND_TOP, unless requested to elevate
+ // to client's state.
+ clientProcState = PROCESS_STATE_BOUND_TOP;
+ if (client.info.targetSdkVersion >= Build.VERSION_CODES.R) {
+ if (cr.hasFlag(Context.BIND_INCLUDE_CAPABILITIES)) {
+ // TOP process passes all capabilities to the service.
+ capability = PROCESS_CAPABILITY_ALL;
+ } else {
+ // TOP process passes no capability to the service.
+ }
+ } else {
+ // TOP process passes all capabilities to the service.
+ capability = PROCESS_CAPABILITY_ALL;
}
} else if (clientProcState
<= PROCESS_STATE_FOREGROUND_SERVICE) {
@@ -1852,12 +1879,18 @@ public final class OomAdjuster {
}
}
+ // TOP process has all capabilities.
+ if (procState <= PROCESS_STATE_TOP) {
+ capability = PROCESS_CAPABILITY_ALL;
+ }
+
// Do final modification to adj. Everything we do between here and applying
// the final setAdj must be done in this function, because we will also use
// it when computing the final cached adj later. Note that we don't need to
// worry about this for max adj above, since max adj will always be used to
// keep it out of the cached vaues.
app.curAdj = app.modifyRawOomAdj(adj);
+ app.curCapability = capability;
app.setCurrentSchedulingGroup(schedGroup);
app.setCurProcState(procState);
app.setCurRawProcState(procState);
@@ -1865,7 +1898,8 @@ public final class OomAdjuster {
app.completedAdjSeq = mAdjSeq;
// if curAdj or curProcState improved, then this process was promoted
- return app.curAdj < prevAppAdj || app.getCurProcState() < prevProcState;
+ return app.curAdj < prevAppAdj || app.getCurProcState() < prevProcState
+ || app.curCapability != prevCapability ;
}
/**
@@ -2175,6 +2209,11 @@ public final class OomAdjuster {
maybeUpdateUsageStatsLocked(app, nowElapsed);
}
+ if (app.curCapability != app.setCapability) {
+ changes |= ActivityManagerService.ProcessChangeItem.CHANGE_CAPABILITY;
+ app.setCapability = app.curCapability;
+ }
+
if (changes != 0) {
if (DEBUG_PROCESS_OBSERVERS) Slog.i(TAG_PROCESS_OBSERVERS,
"Changes in " + app + ": " + changes);
@@ -2182,12 +2221,13 @@ public final class OomAdjuster {
mService.enqueueProcessChangeItemLocked(app.pid, app.info.uid);
item.changes = changes;
item.foregroundActivities = app.repForegroundActivities;
+ item.capability = app.setCapability;
if (DEBUG_PROCESS_OBSERVERS) Slog.i(TAG_PROCESS_OBSERVERS,
"Item " + Integer.toHexString(System.identityHashCode(item))
+ " " + app.toShortString() + ": changes=" + item.changes
+ " foreground=" + item.foregroundActivities
+ " type=" + app.adjType + " source=" + app.adjSource
- + " target=" + app.adjTarget);
+ + " target=" + app.adjTarget + " capability=" + item.capability);
}
return success;
diff --git a/services/core/java/com/android/server/am/ProcessList.java b/services/core/java/com/android/server/am/ProcessList.java
index 8163a6d3639f..f2f1e0286a58 100644
--- a/services/core/java/com/android/server/am/ProcessList.java
+++ b/services/core/java/com/android/server/am/ProcessList.java
@@ -810,9 +810,6 @@ public final class ProcessList {
case ActivityManager.PROCESS_STATE_TOP:
procState = "TOP ";
break;
- case ActivityManager.PROCESS_STATE_FOREGROUND_SERVICE_LOCATION:
- procState = "FGSL";
- break;
case ActivityManager.PROCESS_STATE_BOUND_TOP:
procState = "BTOP";
break;
@@ -882,8 +879,6 @@ public final class ProcessList {
return AppProtoEnums.PROCESS_STATE_PERSISTENT_UI;
case ActivityManager.PROCESS_STATE_TOP:
return AppProtoEnums.PROCESS_STATE_TOP;
- case ActivityManager.PROCESS_STATE_FOREGROUND_SERVICE_LOCATION:
- return AppProtoEnums.PROCESS_STATE_FOREGROUND_SERVICE;
case ActivityManager.PROCESS_STATE_BOUND_TOP:
return AppProtoEnums.PROCESS_STATE_BOUND_TOP;
case ActivityManager.PROCESS_STATE_FOREGROUND_SERVICE:
@@ -1014,7 +1009,6 @@ public final class ProcessList {
PROC_MEM_PERSISTENT, // ActivityManager.PROCESS_STATE_PERSISTENT
PROC_MEM_PERSISTENT, // ActivityManager.PROCESS_STATE_PERSISTENT_UI
PROC_MEM_TOP, // ActivityManager.PROCESS_STATE_TOP
- PROC_MEM_IMPORTANT, // ActivityManager.PROCESS_STATE_FOREGROUND_SERVICE_LOCATION
PROC_MEM_IMPORTANT, // ActivityManager.PROCESS_STATE_FOREGROUND_SERVICE
PROC_MEM_TOP, // ActivityManager.PROCESS_STATE_BOUND_TOP
PROC_MEM_IMPORTANT, // ActivityManager.PROCESS_STATE_BOUND_FOREGROUND_SERVICE
@@ -2303,7 +2297,8 @@ public final class ProcessList {
uidRec.updateHasInternetPermission();
mActiveUids.put(proc.uid, uidRec);
EventLogTags.writeAmUidRunning(uidRec.uid);
- mService.noteUidProcessState(uidRec.uid, uidRec.getCurProcState());
+ mService.noteUidProcessState(uidRec.uid, uidRec.getCurProcState(),
+ uidRec.curCapability);
}
proc.uidRecord = uidRec;
@@ -2405,7 +2400,8 @@ public final class ProcessList {
mService.enqueueUidChangeLocked(old.uidRecord, -1, UidRecord.CHANGE_GONE);
EventLogTags.writeAmUidStopped(uid);
mActiveUids.remove(uid);
- mService.noteUidProcessState(uid, ActivityManager.PROCESS_STATE_NONEXISTENT);
+ mService.noteUidProcessState(uid, ActivityManager.PROCESS_STATE_NONEXISTENT,
+ ActivityManager.PROCESS_CAPABILITY_NONE);
}
old.uidRecord = null;
}
diff --git a/services/core/java/com/android/server/am/ProcessRecord.java b/services/core/java/com/android/server/am/ProcessRecord.java
index bf43f3bffb17..1e0693f365e7 100644
--- a/services/core/java/com/android/server/am/ProcessRecord.java
+++ b/services/core/java/com/android/server/am/ProcessRecord.java
@@ -151,6 +151,9 @@ class ProcessRecord implements WindowProcessListener {
int curAdj; // Current OOM adjustment for this process
int setAdj; // Last set OOM adjustment for this process
int verifiedAdj; // The last adjustment that was verified as actually being set
+ int curCapability; // Current capability flags of this process. For example,
+ // PROCESS_CAPABILITY_FOREGROUND_LOCATION is one capability.
+ int setCapability; // Last set capability flags.
long lastCompactTime; // The last time that this process was compacted
int reqCompactAction; // The most recent compaction action requested for this app.
int lastCompactAction; // The most recent compaction action performed for this app.
@@ -425,6 +428,8 @@ class ProcessRecord implements WindowProcessListener {
pw.print(" mRepProcState="); pw.print(mRepProcState);
pw.print(" pssProcState="); pw.print(pssProcState);
pw.print(" setProcState="); pw.print(setProcState);
+ pw.print(" curCapability="); pw.print(curCapability);
+ pw.print(" setCapability="); pw.print(setCapability);
pw.print(" lastStateTime=");
TimeUtils.formatDuration(lastStateTime, nowUptime, pw);
pw.println();
@@ -1097,6 +1102,10 @@ class ProcessRecord implements WindowProcessListener {
&& (mFgServiceTypes & ServiceInfo.FOREGROUND_SERVICE_TYPE_LOCATION) != 0;
}
+ boolean hasLocationCapability() {
+ return (setCapability & ActivityManager.PROCESS_CAPABILITY_FOREGROUND_LOCATION) != 0;
+ }
+
int getForegroundServiceTypes() {
return mHasForegroundServices ? mFgServiceTypes : 0;
}
diff --git a/services/core/java/com/android/server/am/UidRecord.java b/services/core/java/com/android/server/am/UidRecord.java
index 22a7de74cc38..e6cf2872a7e4 100644
--- a/services/core/java/com/android/server/am/UidRecord.java
+++ b/services/core/java/com/android/server/am/UidRecord.java
@@ -34,6 +34,8 @@ public final class UidRecord {
final int uid;
private int mCurProcState;
int setProcState = ActivityManager.PROCESS_STATE_NONEXISTENT;
+ int curCapability;
+ int setCapability;
long lastBackgroundTime;
boolean ephemeral;
boolean foregroundServices;
@@ -108,6 +110,7 @@ public final class UidRecord {
int uid;
int change;
int processState;
+ int capability;
boolean ephemeral;
long procStateSeq;
}
@@ -132,6 +135,8 @@ public final class UidRecord {
public void reset() {
setCurProcState(ActivityManager.PROCESS_STATE_CACHED_EMPTY);
foregroundServices = false;
+ curCapability = 0;
+
}
public void updateHasInternetPermission() {
diff --git a/services/core/java/com/android/server/appop/AppOpsService.java b/services/core/java/com/android/server/appop/AppOpsService.java
index 857506889033..2e36a4305fad 100644
--- a/services/core/java/com/android/server/appop/AppOpsService.java
+++ b/services/core/java/com/android/server/appop/AppOpsService.java
@@ -16,6 +16,7 @@
package com.android.server.appop;
+import static android.app.ActivityManager.PROCESS_CAPABILITY_FOREGROUND_LOCATION;
import static android.app.AppOpsManager.MAX_PRIORITY_UID_STATE;
import static android.app.AppOpsManager.MIN_PRIORITY_UID_STATE;
import static android.app.AppOpsManager.OP_CAMERA;
@@ -27,7 +28,6 @@ import static android.app.AppOpsManager.UID_STATE_BACKGROUND;
import static android.app.AppOpsManager.UID_STATE_CACHED;
import static android.app.AppOpsManager.UID_STATE_FOREGROUND;
import static android.app.AppOpsManager.UID_STATE_FOREGROUND_SERVICE;
-import static android.app.AppOpsManager.UID_STATE_FOREGROUND_SERVICE_LOCATION;
import static android.app.AppOpsManager.UID_STATE_MAX_LAST_NON_RESTRICTED;
import static android.app.AppOpsManager.UID_STATE_PERSISTENT;
import static android.app.AppOpsManager.UID_STATE_TOP;
@@ -119,12 +119,6 @@ import com.android.internal.util.function.pooled.PooledLambda;
import com.android.server.LocalServices;
import com.android.server.LockGuard;
-import libcore.util.EmptyArray;
-
-import org.xmlpull.v1.XmlPullParser;
-import org.xmlpull.v1.XmlPullParserException;
-import org.xmlpull.v1.XmlSerializer;
-
import java.io.File;
import java.io.FileDescriptor;
import java.io.FileInputStream;
@@ -144,6 +138,12 @@ import java.util.List;
import java.util.Map;
import java.util.Objects;
+import libcore.util.EmptyArray;
+
+import org.xmlpull.v1.XmlPullParser;
+import org.xmlpull.v1.XmlPullParserException;
+import org.xmlpull.v1.XmlSerializer;
+
public class AppOpsService extends IAppOpsService.Stub {
static final String TAG = "AppOps";
static final boolean DEBUG = false;
@@ -164,12 +164,10 @@ public class AppOpsService extends IAppOpsService.Stub {
UID_STATE_PERSISTENT, // ActivityManager.PROCESS_STATE_PERSISTENT
UID_STATE_PERSISTENT, // ActivityManager.PROCESS_STATE_PERSISTENT_UI
UID_STATE_TOP, // ActivityManager.PROCESS_STATE_TOP
- UID_STATE_FOREGROUND_SERVICE_LOCATION,
- // ActivityManager.PROCESS_STATE_FOREGROUND_SERVICE_LOCATION
UID_STATE_FOREGROUND, // ActivityManager.PROCESS_STATE_BOUND_TOP
UID_STATE_FOREGROUND_SERVICE, // ActivityManager.PROCESS_STATE_FOREGROUND_SERVICE
UID_STATE_FOREGROUND, // ActivityManager.PROCESS_STATE_BOUND_FOREGROUND_SERVICE
- UID_STATE_FOREGROUND, // ActivityManager.PROCESS_STATE_IMPORTANT_FOREGROUND
+ UID_STATE_BACKGROUND, // ActivityManager.PROCESS_STATE_IMPORTANT_FOREGROUND
UID_STATE_BACKGROUND, // ActivityManager.PROCESS_STATE_IMPORTANT_BACKGROUND
UID_STATE_BACKGROUND, // ActivityManager.PROCESS_STATE_TRANSIENT_BACKGROUND
UID_STATE_BACKGROUND, // ActivityManager.PROCESS_STATE_BACKUP
@@ -364,7 +362,8 @@ public class AppOpsService extends IAppOpsService.Stub {
public int state = UID_STATE_CACHED;
public int pendingState = UID_STATE_CACHED;
public long pendingStateCommitTime;
-
+ public int capability;
+ public int pendingCapability;
// For all features combined
public int startNesting;
@@ -393,8 +392,25 @@ public class AppOpsService extends IAppOpsService.Stub {
int evalMode(int op, int mode) {
if (mode == AppOpsManager.MODE_FOREGROUND) {
- return state <= AppOpsManager.resolveFirstUnrestrictedUidState(op)
- ? AppOpsManager.MODE_ALLOWED : AppOpsManager.MODE_IGNORED;
+ if (state <= UID_STATE_TOP) {
+ // process is in foreground.
+ return AppOpsManager.MODE_ALLOWED;
+ } else if (state <= AppOpsManager.resolveFirstUnrestrictedUidState(op)) {
+ // process is in foreground, check its capability.
+ switch (op) {
+ case AppOpsManager.OP_FINE_LOCATION:
+ case AppOpsManager.OP_COARSE_LOCATION:
+ case AppOpsManager.OP_MONITOR_LOCATION:
+ case AppOpsManager.OP_MONITOR_HIGH_POWER_LOCATION:
+ return ((capability & PROCESS_CAPABILITY_FOREGROUND_LOCATION) != 0)
+ ? AppOpsManager.MODE_ALLOWED : AppOpsManager.MODE_IGNORED;
+ default:
+ return AppOpsManager.MODE_ALLOWED;
+ }
+ } else {
+ // process is not in foreground.
+ return AppOpsManager.MODE_IGNORED;
+ }
}
return mode;
}
@@ -1062,13 +1078,16 @@ public class AppOpsService extends IAppOpsService.Stub {
}
}
- public void updateUidProcState(int uid, int procState) {
+ public void updateUidProcState(int uid, int procState,
+ @ActivityManager.ProcessCapability int capability) {
synchronized (this) {
final UidState uidState = getUidStateLocked(uid, true);
- int newState = PROCESS_STATE_TO_UID_STATE[procState];
- if (uidState != null && uidState.pendingState != newState) {
+ final int newState = PROCESS_STATE_TO_UID_STATE[procState];
+ if (uidState != null && (uidState.pendingState != newState
+ || uidState.pendingCapability != capability)) {
final int oldPendingState = uidState.pendingState;
uidState.pendingState = newState;
+ uidState.pendingCapability = capability;
if (newState < uidState.state
|| (newState <= UID_STATE_MAX_LAST_NON_RESTRICTED
&& uidState.state > UID_STATE_MAX_LAST_NON_RESTRICTED)) {
@@ -1076,6 +1095,9 @@ public class AppOpsService extends IAppOpsService.Stub {
// foreground and the old state is in the background, then always do it
// immediately.
commitUidPendingStateLocked(uidState);
+ } else if (newState == uidState.state && capability != uidState.capability) {
+ // No change on process state, but process capability has changed.
+ commitUidPendingStateLocked(uidState);
} else if (uidState.pendingStateCommitTime == 0) {
// We are moving to a less important state for the first time,
// delay the application for a bit.
@@ -1182,8 +1204,8 @@ public class AppOpsService extends IAppOpsService.Stub {
}
} else {
for (int j=0; j<ops.length; j++) {
- int code = uidState.opModes.keyAt(j);
- if (code >= 0) {
+ int code = ops[j];
+ if (uidState.opModes.indexOfKey(code) >= 0) {
if (resOps == null) {
resOps = new ArrayList<>();
}
@@ -2857,6 +2879,7 @@ public class AppOpsService extends IAppOpsService.Stub {
}
}
uidState.state = uidState.pendingState;
+ uidState.capability = uidState.pendingCapability;
uidState.pendingStateCommitTime = 0;
}
@@ -4494,6 +4517,12 @@ public class AppOpsService extends IAppOpsService.Stub {
pw.print(" pendingState=");
pw.println(AppOpsManager.getUidStateName(uidState.pendingState));
}
+ pw.print(" capability=");
+ pw.println(uidState.capability);
+ if (uidState.capability != uidState.pendingCapability) {
+ pw.print(" pendingCapability=");
+ pw.println(uidState.pendingCapability);
+ }
if (uidState.pendingStateCommitTime != 0) {
pw.print(" pendingStateCommitTime=");
TimeUtils.formatDuration(uidState.pendingStateCommitTime, nowElapsed, pw);
diff --git a/services/core/java/com/android/server/appop/TEST_MAPPING b/services/core/java/com/android/server/appop/TEST_MAPPING
index e9d2b312e01c..9c03a3606e6c 100644
--- a/services/core/java/com/android/server/appop/TEST_MAPPING
+++ b/services/core/java/com/android/server/appop/TEST_MAPPING
@@ -35,6 +35,9 @@
"include-filter": "android.permission.cts.SharedUidPermissionsTest"
}
]
+ },
+ {
+ "name": "CtsAppTestCases:ActivityManagerApi29Test"
}
]
}
diff --git a/services/core/java/com/android/server/audio/AudioService.java b/services/core/java/com/android/server/audio/AudioService.java
index 0d493b825133..e285bfdcdf4c 100644
--- a/services/core/java/com/android/server/audio/AudioService.java
+++ b/services/core/java/com/android/server/audio/AudioService.java
@@ -580,7 +580,8 @@ public class AudioService extends IAudioService.Stub
}
final private IUidObserver mUidObserver = new IUidObserver.Stub() {
- @Override public void onUidStateChanged(int uid, int procState, long procStateSeq) {
+ @Override public void onUidStateChanged(int uid, int procState, long procStateSeq,
+ int capability) {
}
@Override public void onUidGone(int uid, boolean disabled) {
@@ -2784,6 +2785,7 @@ public class AudioService extends IAudioService.Stub
}
public void setMasterMute(boolean mute, int flags, String callingPackage, int userId) {
+ enforceModifyAudioRoutingPermission();
setMasterMuteInternal(mute, flags, callingPackage, Binder.getCallingUid(),
userId);
}
diff --git a/services/core/java/com/android/server/compat/CompatChange.java b/services/core/java/com/android/server/compat/CompatChange.java
index bc5973d1b270..87624359ef85 100644
--- a/services/core/java/com/android/server/compat/CompatChange.java
+++ b/services/core/java/com/android/server/compat/CompatChange.java
@@ -20,6 +20,7 @@ import android.annotation.Nullable;
import android.compat.annotation.EnabledAfter;
import android.content.pm.ApplicationInfo;
+import com.android.internal.compat.CompatibilityChangeInfo;
import com.android.server.compat.config.Change;
import java.util.HashMap;
@@ -35,12 +36,8 @@ import java.util.Map;
*
* <p>Note, this class is not thread safe so callers must ensure thread safety.
*/
-public final class CompatChange {
+public final class CompatChange extends CompatibilityChangeInfo {
- private final long mChangeId;
- @Nullable private final String mName;
- private final int mEnableAfterTargetSdk;
- private final boolean mDisabled;
private Map<String, Boolean> mPackageOverrides;
public CompatChange(long changeId) {
@@ -56,29 +53,15 @@ public final class CompatChange {
*/
public CompatChange(long changeId, @Nullable String name, int enableAfterTargetSdk,
boolean disabled) {
- mChangeId = changeId;
- mName = name;
- mEnableAfterTargetSdk = enableAfterTargetSdk;
- mDisabled = disabled;
+ super(changeId, name, enableAfterTargetSdk, disabled);
}
/**
* @param change an object generated by services/core/xsd/platform-compat-config.xsd
*/
public CompatChange(Change change) {
- mChangeId = change.getId();
- mName = change.getName();
- mEnableAfterTargetSdk = change.getEnableAfterTargetSdk();
- mDisabled = change.getDisabled();
- }
-
- long getId() {
- return mChangeId;
- }
-
- @Nullable
- String getName() {
- return mName;
+ super(change.getId(), change.getName(), change.getEnableAfterTargetSdk(),
+ change.getDisabled());
}
/**
@@ -121,11 +104,11 @@ public final class CompatChange {
if (mPackageOverrides != null && mPackageOverrides.containsKey(app.packageName)) {
return mPackageOverrides.get(app.packageName);
}
- if (mDisabled) {
+ if (getDisabled()) {
return false;
}
- if (mEnableAfterTargetSdk != -1) {
- return app.targetSdkVersion > mEnableAfterTargetSdk;
+ if (getEnableAfterTargetSdk() != -1) {
+ return app.targetSdkVersion > getEnableAfterTargetSdk();
}
return true;
}
@@ -133,14 +116,14 @@ public final class CompatChange {
@Override
public String toString() {
StringBuilder sb = new StringBuilder("ChangeId(")
- .append(mChangeId);
- if (mName != null) {
- sb.append("; name=").append(mName);
+ .append(getId());
+ if (getName() != null) {
+ sb.append("; name=").append(getName());
}
- if (mEnableAfterTargetSdk != -1) {
- sb.append("; enableAfterTargetSdk=").append(mEnableAfterTargetSdk);
+ if (getEnableAfterTargetSdk() != -1) {
+ sb.append("; enableAfterTargetSdk=").append(getEnableAfterTargetSdk());
}
- if (mDisabled) {
+ if (getDisabled()) {
sb.append("; disabled");
}
if (mPackageOverrides != null && mPackageOverrides.size() > 0) {
diff --git a/services/core/java/com/android/server/compat/CompatConfig.java b/services/core/java/com/android/server/compat/CompatConfig.java
index 0fabd9aef373..d6ec22b078ea 100644
--- a/services/core/java/com/android/server/compat/CompatConfig.java
+++ b/services/core/java/com/android/server/compat/CompatConfig.java
@@ -16,6 +16,7 @@
package com.android.server.compat;
+import android.compat.Compatibility.ChangeConfig;
import android.content.pm.ApplicationInfo;
import android.os.Environment;
import android.text.TextUtils;
@@ -26,6 +27,7 @@ import android.util.Slog;
import com.android.internal.annotations.GuardedBy;
import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.compat.CompatibilityChangeConfig;
+import com.android.internal.compat.CompatibilityChangeInfo;
import com.android.server.compat.config.Change;
import com.android.server.compat.config.XmlParser;
@@ -37,6 +39,8 @@ import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.PrintWriter;
+import java.util.HashSet;
+import java.util.Set;
import javax.xml.datatype.DatatypeConfigurationException;
/**
@@ -243,6 +247,49 @@ public final class CompatConfig {
}
}
+ /**
+ * Get the config for a given app.
+ *
+ * @param applicationInfo the {@link ApplicationInfo} for which the info should be dumped.
+ * @return A {@link CompatibilityChangeConfig} which contains the compat config info for the
+ * given app.
+ */
+
+ public CompatibilityChangeConfig getAppConfig(ApplicationInfo applicationInfo) {
+ Set<Long> enabled = new HashSet<>();
+ Set<Long> disabled = new HashSet<>();
+ synchronized (mChanges) {
+ for (int i = 0; i < mChanges.size(); ++i) {
+ CompatChange c = mChanges.valueAt(i);
+ if (c.isEnabled(applicationInfo)) {
+ enabled.add(c.getId());
+ } else {
+ disabled.add(c.getId());
+ }
+ }
+ }
+ return new CompatibilityChangeConfig(new ChangeConfig(enabled, disabled));
+ }
+
+ /**
+ * Dumps all the compatibility change information.
+ *
+ * @return An array of {@link CompatibilityChangeInfo} with the current changes.
+ */
+ public CompatibilityChangeInfo[] dumpChanges() {
+ synchronized (mChanges) {
+ CompatibilityChangeInfo[] changeInfos = new CompatibilityChangeInfo[mChanges.size()];
+ for (int i = 0; i < mChanges.size(); ++i) {
+ CompatChange change = mChanges.valueAt(i);
+ changeInfos[i] = new CompatibilityChangeInfo(change.getId(),
+ change.getName(),
+ change.getEnableAfterTargetSdk(),
+ change.getDisabled());
+ }
+ return changeInfos;
+ }
+ }
+
CompatConfig initConfigFromLib(File libraryDir) {
if (!libraryDir.exists() || !libraryDir.isDirectory()) {
Slog.e(TAG, "No directory " + libraryDir + ", skipping");
diff --git a/services/core/java/com/android/server/compat/PlatformCompat.java b/services/core/java/com/android/server/compat/PlatformCompat.java
index 9ac9955493cc..75e2d220898d 100644
--- a/services/core/java/com/android/server/compat/PlatformCompat.java
+++ b/services/core/java/com/android/server/compat/PlatformCompat.java
@@ -25,6 +25,7 @@ import android.util.StatsLog;
import com.android.internal.compat.ChangeReporter;
import com.android.internal.compat.CompatibilityChangeConfig;
+import com.android.internal.compat.CompatibilityChangeInfo;
import com.android.internal.compat.IPlatformCompat;
import com.android.internal.util.DumpUtils;
@@ -114,6 +115,16 @@ public class PlatformCompat extends IPlatformCompat.Stub {
}
@Override
+ public CompatibilityChangeConfig getAppConfig(ApplicationInfo appInfo) {
+ return CompatConfig.get().getAppConfig(appInfo);
+ }
+
+ @Override
+ public CompatibilityChangeInfo[] listAllChanges() {
+ return CompatConfig.get().dumpChanges();
+ }
+
+ @Override
protected void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
if (!DumpUtils.checkDumpAndUsageStatsPermission(mContext, "platform_compat", pw)) return;
CompatConfig.get().dumpConfig(pw);
diff --git a/services/core/java/com/android/server/input/InputManagerService.java b/services/core/java/com/android/server/input/InputManagerService.java
index 362955d589af..2c23c51216a8 100644
--- a/services/core/java/com/android/server/input/InputManagerService.java
+++ b/services/core/java/com/android/server/input/InputManagerService.java
@@ -1810,8 +1810,9 @@ public class InputManagerService extends IInputManager.Stub
}
// Native callback.
- private long notifyANR(IBinder token, String reason) {
- return mWindowManagerCallbacks.notifyANR(
+ private long notifyANR(InputApplicationHandle inputApplicationHandle, IBinder token,
+ String reason) {
+ return mWindowManagerCallbacks.notifyANR(inputApplicationHandle,
token, reason);
}
@@ -2055,7 +2056,12 @@ public class InputManagerService extends IInputManager.Stub
public void notifyInputChannelBroken(IBinder token);
- public long notifyANR(IBinder token, String reason);
+ /**
+ * Notifies the window manager about an application that is not responding.
+ * Returns a new timeout to continue waiting in nanoseconds, or 0 to abort dispatch.
+ */
+ long notifyANR(InputApplicationHandle inputApplicationHandle, IBinder token,
+ String reason);
public int interceptKeyBeforeQueueing(KeyEvent event, int policyFlags);
diff --git a/services/core/java/com/android/server/integrity/parser/RuleBinaryParser.java b/services/core/java/com/android/server/integrity/parser/RuleBinaryParser.java
new file mode 100644
index 000000000000..c1567bc51474
--- /dev/null
+++ b/services/core/java/com/android/server/integrity/parser/RuleBinaryParser.java
@@ -0,0 +1,37 @@
+/*
+ * 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.server.integrity.parser;
+
+import com.android.server.integrity.model.Rule;
+
+import java.io.InputStream;
+
+/** A helper class to parse rules into the {@link Rule} model from Binary representation. */
+public class RuleBinaryParser implements RuleParser {
+
+ @Override
+ public Rule parse(String ruleText) {
+ // TODO: Implement binary text parser.
+ return null;
+ }
+
+ @Override
+ public Rule parse(InputStream inputStream) {
+ // TODO: Implement stream parser.
+ return null;
+ }
+}
diff --git a/services/core/java/com/android/server/integrity/parser/RuleParser.java b/services/core/java/com/android/server/integrity/parser/RuleParser.java
new file mode 100644
index 000000000000..96ed5993cb06
--- /dev/null
+++ b/services/core/java/com/android/server/integrity/parser/RuleParser.java
@@ -0,0 +1,31 @@
+/*
+ * 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.server.integrity.parser;
+
+import com.android.server.integrity.model.Rule;
+
+import java.io.InputStream;
+
+/** A helper class to parse rules into the {@link Rule} model. */
+public interface RuleParser {
+
+ /** Parse rules from a string. */
+ Rule parse(String ruleText);
+
+ /** Parse rules from an input stream. */
+ Rule parse(InputStream inputStream);
+}
diff --git a/services/core/java/com/android/server/integrity/parser/RuleXmlParser.java b/services/core/java/com/android/server/integrity/parser/RuleXmlParser.java
new file mode 100644
index 000000000000..8b1bec90f994
--- /dev/null
+++ b/services/core/java/com/android/server/integrity/parser/RuleXmlParser.java
@@ -0,0 +1,37 @@
+/*
+ * 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.server.integrity.parser;
+
+import com.android.server.integrity.model.Rule;
+
+import java.io.InputStream;
+
+/** A helper class to parse rules into the {@link Rule} model from Xml representation. */
+public final class RuleXmlParser implements RuleParser {
+
+ @Override
+ public Rule parse(String ruleText) {
+ // TODO: Implement text parser.
+ return null;
+ }
+
+ @Override
+ public Rule parse(InputStream inputStream) {
+ // TODO: Implement stream parser.
+ return null;
+ }
+}
diff --git a/services/core/java/com/android/server/integrity/serializer/RuleBinarySerializer.java b/services/core/java/com/android/server/integrity/serializer/RuleBinarySerializer.java
new file mode 100644
index 000000000000..ecb00a4b7025
--- /dev/null
+++ b/services/core/java/com/android/server/integrity/serializer/RuleBinarySerializer.java
@@ -0,0 +1,36 @@
+/*
+ * 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.server.integrity.serializer;
+
+import com.android.server.integrity.model.Rule;
+
+import java.io.OutputStream;
+
+/** A helper class to serialize rules from the {@link Rule} model to Xml representation. */
+public class RuleBinarySerializer implements RuleSerializer {
+
+ @Override
+ public void serialize(Rule rule, OutputStream outputStream) {
+ // TODO: Implement stream serializer.
+ }
+
+ @Override
+ public String serialize(Rule rule) {
+ // TODO: Implement text serializer.
+ return null;
+ }
+}
diff --git a/services/core/java/com/android/server/integrity/serializer/RuleSerializer.java b/services/core/java/com/android/server/integrity/serializer/RuleSerializer.java
new file mode 100644
index 000000000000..07a912f8aeab
--- /dev/null
+++ b/services/core/java/com/android/server/integrity/serializer/RuleSerializer.java
@@ -0,0 +1,31 @@
+/*
+ * 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.server.integrity.serializer;
+
+import com.android.server.integrity.model.Rule;
+
+import java.io.OutputStream;
+
+/** A helper class to serialize rules from the {@link Rule} model. */
+public interface RuleSerializer {
+
+ /** Serialize a rule to an output stream */
+ void serialize(Rule rule, OutputStream outputStream);
+
+ /** Serialize a rule to a string. */
+ String serialize(Rule rule);
+}
diff --git a/services/core/java/com/android/server/integrity/serializer/RuleXmlSerializer.java b/services/core/java/com/android/server/integrity/serializer/RuleXmlSerializer.java
new file mode 100644
index 000000000000..62973e2b026f
--- /dev/null
+++ b/services/core/java/com/android/server/integrity/serializer/RuleXmlSerializer.java
@@ -0,0 +1,36 @@
+/*
+ * 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.server.integrity.serializer;
+
+import com.android.server.integrity.model.Rule;
+
+import java.io.OutputStream;
+
+/** A helper class to serialize rules from the {@link Rule} model to Xml representation. */
+public class RuleXmlSerializer implements RuleSerializer {
+
+ @Override
+ public void serialize(Rule rule, OutputStream outputStream) {
+ // TODO: Implement stream serializer.
+ }
+
+ @Override
+ public String serialize(Rule rule) {
+ // TODO: Implement text serializer.
+ return null;
+ }
+}
diff --git a/services/core/java/com/android/server/location/GnssLocationProvider.java b/services/core/java/com/android/server/location/GnssLocationProvider.java
index 11b9ac44ff7f..fb57d69f0db9 100644
--- a/services/core/java/com/android/server/location/GnssLocationProvider.java
+++ b/services/core/java/com/android/server/location/GnssLocationProvider.java
@@ -589,9 +589,17 @@ public class GnssLocationProvider extends AbstractLocationProvider implements
if (sStaticTestOverride) {
return true;
}
+ ensureInitialized();
return native_is_supported();
}
+ private static synchronized void ensureInitialized() {
+ if (!sIsInitialized) {
+ class_init_native();
+ }
+ sIsInitialized = true;
+ }
+
private void reloadGpsProperties() {
mGnssConfiguration.reloadGpsProperties();
setSuplHostPort();
@@ -610,12 +618,7 @@ public class GnssLocationProvider extends AbstractLocationProvider implements
Looper looper) {
super(context, locationProviderManager);
- synchronized (mLock) {
- if (!sIsInitialized) {
- class_init_native();
- }
- sIsInitialized = true;
- }
+ ensureInitialized();
mLooper = looper;
@@ -833,7 +836,7 @@ public class GnssLocationProvider extends AbstractLocationProvider implements
int elapsedRealtimeFlags = ELAPSED_REALTIME_HAS_TIMESTAMP_NS
| (location.hasElapsedRealtimeUncertaintyNanos()
- ? ELAPSED_REALTIME_HAS_TIME_UNCERTAINTY_NS : 0);
+ ? ELAPSED_REALTIME_HAS_TIME_UNCERTAINTY_NS : 0);
long elapsedRealtimeNanos = location.getElapsedRealtimeNanos();
double elapsedRealtimeUncertaintyNanos = location.getElapsedRealtimeUncertaintyNanos();
@@ -1024,7 +1027,7 @@ public class GnssLocationProvider extends AbstractLocationProvider implements
// .. but enable anyway, if there's an active settings-ignored request (e.g. ELS)
enabled |= (mProviderRequest != null && mProviderRequest.reportLocation
- && mProviderRequest.locationSettingsIgnored);
+ && mProviderRequest.locationSettingsIgnored);
// ... and, finally, disable anyway, if device is being shut down
enabled &= !mShutdown;
diff --git a/services/core/java/com/android/server/media/MediaRoute2ProviderProxy.java b/services/core/java/com/android/server/media/MediaRoute2ProviderProxy.java
index 4816ceb5d76c..626bf1cc361b 100644
--- a/services/core/java/com/android/server/media/MediaRoute2ProviderProxy.java
+++ b/services/core/java/com/android/server/media/MediaRoute2ProviderProxy.java
@@ -119,6 +119,11 @@ final class MediaRoute2ProviderProxy implements ServiceConnection {
}
}
+ @NonNull
+ public String getUniqueId() {
+ return mUniqueId;
+ }
+
@Nullable
public MediaRoute2ProviderInfo getProviderInfo() {
return mProviderInfo;
@@ -294,7 +299,7 @@ final class MediaRoute2ProviderProxy implements ServiceConnection {
}
public interface Callback {
- void onProviderStateChanged(MediaRoute2ProviderProxy provider);
+ void onProviderStateChanged(@NonNull MediaRoute2ProviderProxy provider);
}
private final class Connection implements DeathRecipient {
diff --git a/services/core/java/com/android/server/media/MediaRouter2ServiceImpl.java b/services/core/java/com/android/server/media/MediaRouter2ServiceImpl.java
index 361dc3673665..44642d4f85cd 100644
--- a/services/core/java/com/android/server/media/MediaRouter2ServiceImpl.java
+++ b/services/core/java/com/android/server/media/MediaRouter2ServiceImpl.java
@@ -47,9 +47,12 @@ import com.android.internal.util.function.pooled.PooledLambda;
import java.io.PrintWriter;
import java.lang.ref.WeakReference;
import java.util.ArrayList;
+import java.util.Collection;
import java.util.Collections;
+import java.util.HashSet;
import java.util.List;
import java.util.Objects;
+import java.util.Set;
/**
* TODO: Merge this to MediaRouterService once it's finished.
@@ -357,8 +360,7 @@ class MediaRouter2ServiceImpl {
mAllClientRecords.put(binder, clientRecord);
userRecord.mHandler.sendMessage(
- obtainMessage(UserHandler::notifyProviderInfosUpdatedToClient,
- userRecord.mHandler, client));
+ obtainMessage(UserHandler::notifyRoutesToClient, userRecord.mHandler, client));
}
}
@@ -586,6 +588,7 @@ class MediaRouter2ServiceImpl {
final class UserRecord {
public final int mUserId;
+ //TODO: make records private for thread-safety
final ArrayList<ClientRecord> mClientRecords = new ArrayList<>();
final ArrayList<ManagerRecord> mManagerRecords = new ArrayList<>();
final UserHandler mHandler;
@@ -705,7 +708,7 @@ class MediaRouter2ServiceImpl {
//TODO: Make this thread-safe.
private final ArrayList<MediaRoute2ProviderProxy> mMediaProviders =
new ArrayList<>();
- private List<MediaRoute2ProviderInfo> mProviderInfos;
+ private final List<MediaRoute2ProviderInfo> mProviderInfos = new ArrayList<>();
private boolean mRunning;
private boolean mProviderInfosUpdateScheduled;
@@ -745,14 +748,89 @@ class MediaRouter2ServiceImpl {
}
@Override
- public void onProviderStateChanged(MediaRoute2ProviderProxy provider) {
- updateProvider(provider);
+ public void onProviderStateChanged(@NonNull MediaRoute2ProviderProxy provider) {
+ sendMessage(PooledLambda.obtainMessage(UserHandler::updateProvider, this, provider));
}
private void updateProvider(MediaRoute2ProviderProxy provider) {
+ int providerIndex = getProviderInfoIndex(provider.getUniqueId());
+ MediaRoute2ProviderInfo providerInfo = provider.getProviderInfo();
+ MediaRoute2ProviderInfo prevInfo =
+ (providerIndex < 0) ? null : mProviderInfos.get(providerIndex);
+
+ if (Objects.equals(prevInfo, providerInfo)) return;
+
+ if (prevInfo == null) {
+ mProviderInfos.add(providerInfo);
+ Collection<MediaRoute2Info> addedRoutes = providerInfo.getRoutes();
+ if (addedRoutes.size() > 0) {
+ sendMessage(PooledLambda.obtainMessage(UserHandler::notifyRoutesAddedToClients,
+ this, getClients(), new ArrayList<>(addedRoutes)));
+ }
+ } else if (providerInfo == null) {
+ mProviderInfos.remove(prevInfo);
+ Collection<MediaRoute2Info> removedRoutes = prevInfo.getRoutes();
+ if (removedRoutes.size() > 0) {
+ sendMessage(PooledLambda.obtainMessage(
+ UserHandler::notifyRoutesRemovedToClients,
+ this, getClients(), new ArrayList<>(removedRoutes)));
+ }
+ } else {
+ mProviderInfos.set(providerIndex, providerInfo);
+ List<MediaRoute2Info> addedRoutes = new ArrayList<>();
+ List<MediaRoute2Info> removedRoutes = new ArrayList<>();
+ List<MediaRoute2Info> changedRoutes = new ArrayList<>();
+
+ final Collection<MediaRoute2Info> currentRoutes = providerInfo.getRoutes();
+ final Set<String> updatedRouteIds = new HashSet<>();
+
+ for (MediaRoute2Info route : currentRoutes) {
+ if (!route.isValid()) {
+ Slog.w(TAG, "Ignoring invalid route : " + route);
+ continue;
+ }
+ MediaRoute2Info prevRoute = prevInfo.getRoute(route.getId());
+
+ if (prevRoute != null) {
+ if (!Objects.equals(prevRoute, route)) {
+ changedRoutes.add(route);
+ }
+ updatedRouteIds.add(route.getId());
+ } else {
+ addedRoutes.add(route);
+ }
+ }
+
+ for (MediaRoute2Info prevRoute : prevInfo.getRoutes()) {
+ if (!updatedRouteIds.contains(prevRoute.getId())) {
+ removedRoutes.add(prevRoute);
+ }
+ }
+
+ List<IMediaRouter2Client> clients = getClients();
+ if (addedRoutes.size() > 0) {
+ notifyRoutesAddedToClients(clients, addedRoutes);
+ }
+ if (removedRoutes.size() > 0) {
+ notifyRoutesRemovedToClients(clients, removedRoutes);
+ }
+ if (changedRoutes.size() > 0) {
+ notifyRoutesChangedToClients(clients, changedRoutes);
+ }
+ }
scheduleUpdateProviderInfos();
}
+ private int getProviderInfoIndex(String providerId) {
+ for (int i = 0; i < mProviderInfos.size(); i++) {
+ MediaRoute2ProviderInfo providerInfo = mProviderInfos.get(i);
+ if (TextUtils.equals(providerInfo.getUniqueId(), providerId)) {
+ return i;
+ }
+ }
+ return -1;
+ }
+
private void selectRoute(ClientRecord clientRecord, MediaRoute2Info route) {
if (route != null) {
MediaRoute2ProviderProxy provider = findProvider(route.getProviderId());
@@ -803,6 +881,7 @@ class MediaRouter2ServiceImpl {
}
}
+ //TODO: should be replaced into notifyRoutes...ToManagers
private void updateProviderInfos() {
mProviderInfosUpdateScheduled = false;
@@ -810,55 +889,83 @@ class MediaRouter2ServiceImpl {
if (service == null) {
return;
}
- final List<MediaRoute2ProviderInfo> providers = new ArrayList<>();
- for (MediaRoute2ProviderProxy mediaProvider : mMediaProviders) {
- final MediaRoute2ProviderInfo providerInfo =
- mediaProvider.getProviderInfo();
- if (providerInfo == null || !providerInfo.isValid()) {
- Slog.w(TAG, "Ignoring invalid provider info : " + providerInfo);
- } else {
- providers.add(providerInfo);
- }
- }
- mProviderInfos = providers;
final List<IMediaRouter2Manager> managers = new ArrayList<>();
- final List<IMediaRouter2Client> clients = new ArrayList<>();
synchronized (service.mLock) {
for (ManagerRecord managerRecord : mUserRecord.mManagerRecords) {
managers.add(managerRecord.mManager);
}
+ }
+ for (IMediaRouter2Manager manager : managers) {
+ notifyProviderInfosUpdatedToManager(manager);
+ }
+ }
+
+ private List<IMediaRouter2Client> getClients() {
+ final List<IMediaRouter2Client> clients = new ArrayList<>();
+ MediaRouter2ServiceImpl service = mServiceRef.get();
+ if (service == null) {
+ return clients;
+ }
+ synchronized (service.mLock) {
for (ClientRecord clientRecord : mUserRecord.mClientRecords) {
if (clientRecord instanceof Client2Record) {
clients.add(((Client2Record) clientRecord).mClient);
}
}
}
- for (IMediaRouter2Manager manager : managers) {
- notifyProviderInfosUpdatedToManager(manager);
- }
- for (IMediaRouter2Client client : clients) {
- notifyProviderInfosUpdatedToClient(client);
- }
+ return clients;
}
- private void notifyProviderInfosUpdatedToClient(IMediaRouter2Client client) {
- if (mProviderInfos == null) {
- scheduleUpdateProviderInfos();
+ private void notifyRoutesToClient(IMediaRouter2Client client) {
+ List<MediaRoute2Info> routes = new ArrayList<>();
+ for (MediaRoute2ProviderInfo providerInfo : mProviderInfos) {
+ routes.addAll(providerInfo.getRoutes());
+ }
+ if (routes.size() == 0) {
return;
}
try {
- client.notifyProviderInfosUpdated(mProviderInfos);
+ client.notifyRoutesAdded(routes);
} catch (RemoteException ex) {
- Slog.w(TAG, "Failed to notify provider infos updated. Client probably died.");
+ Slog.w(TAG, "Failed to notify all routes. Client probably died.", ex);
}
}
- private void notifyProviderInfosUpdatedToManager(IMediaRouter2Manager manager) {
- if (mProviderInfos == null) {
- scheduleUpdateProviderInfos();
- return;
+ private void notifyRoutesAddedToClients(List<IMediaRouter2Client> clients,
+ List<MediaRoute2Info> routes) {
+ for (IMediaRouter2Client client : clients) {
+ try {
+ client.notifyRoutesAdded(routes);
+ } catch (RemoteException ex) {
+ Slog.w(TAG, "Failed to notify routes added. Client probably died.", ex);
+ }
+ }
+ }
+
+ private void notifyRoutesRemovedToClients(List<IMediaRouter2Client> clients,
+ List<MediaRoute2Info> routes) {
+ for (IMediaRouter2Client client : clients) {
+ try {
+ client.notifyRoutesRemoved(routes);
+ } catch (RemoteException ex) {
+ Slog.w(TAG, "Failed to notify routes removed. Client probably died.", ex);
+ }
}
+ }
+
+ private void notifyRoutesChangedToClients(List<IMediaRouter2Client> clients,
+ List<MediaRoute2Info> routes) {
+ for (IMediaRouter2Client client : clients) {
+ try {
+ client.notifyRoutesChanged(routes);
+ } catch (RemoteException ex) {
+ Slog.w(TAG, "Failed to notify routes changed. Client probably died.", ex);
+ }
+ }
+ }
+
+ private void notifyProviderInfosUpdatedToManager(IMediaRouter2Manager manager) {
try {
manager.notifyProviderInfosUpdated(mProviderInfos);
} catch (RemoteException ex) {
@@ -891,9 +998,7 @@ class MediaRouter2ServiceImpl {
private MediaRoute2ProviderProxy findProvider(String providerId) {
for (MediaRoute2ProviderProxy provider : mMediaProviders) {
- final MediaRoute2ProviderInfo providerInfo = provider.getProviderInfo();
- if (providerInfo != null
- && TextUtils.equals(providerInfo.getUniqueId(), providerId)) {
+ if (TextUtils.equals(provider.getUniqueId(), providerId)) {
return provider;
}
}
diff --git a/services/core/java/com/android/server/net/NetworkPolicyManagerService.java b/services/core/java/com/android/server/net/NetworkPolicyManagerService.java
index 388214bffcb2..32d4b726f011 100644
--- a/services/core/java/com/android/server/net/NetworkPolicyManagerService.java
+++ b/services/core/java/com/android/server/net/NetworkPolicyManagerService.java
@@ -912,7 +912,8 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub {
}
final private IUidObserver mUidObserver = new IUidObserver.Stub() {
- @Override public void onUidStateChanged(int uid, int procState, long procStateSeq) {
+ @Override public void onUidStateChanged(int uid, int procState, long procStateSeq,
+ int capability) {
mUidEventHandler.obtainMessage(UID_MSG_STATE_CHANGED,
uid, procState, procStateSeq).sendToTarget();
}
diff --git a/services/core/java/com/android/server/notification/InlineReplyUriRecord.java b/services/core/java/com/android/server/notification/InlineReplyUriRecord.java
new file mode 100644
index 000000000000..76cfb032aaf4
--- /dev/null
+++ b/services/core/java/com/android/server/notification/InlineReplyUriRecord.java
@@ -0,0 +1,97 @@
+/*
+ * 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.server.notification;
+
+import android.net.Uri;
+import android.os.IBinder;
+import android.os.UserHandle;
+import android.util.ArraySet;
+
+/**
+ * A record of inline reply (ex. RemoteInput) URI grants associated with a Notification.
+ */
+public final class InlineReplyUriRecord {
+ private final IBinder mPermissionOwner;
+ private final ArraySet<Uri> mUris;
+ private final UserHandle mUser;
+ private final String mPackageName;
+ private final String mKey;
+
+ /**
+ * Construct a new InlineReplyUriRecord.
+ * @param owner The PermissionOwner associated with this record.
+ * @param user The user associated with this record.
+ * @param packageName The name of the package which posted the notification.
+ * @param key The key of the original NotificationRecord this notification as created with.
+ */
+ public InlineReplyUriRecord(IBinder owner, UserHandle user, String packageName, String key) {
+ mPermissionOwner = owner;
+ mUris = new ArraySet<>();
+ mUser = user;
+ mPackageName = packageName;
+ mKey = key;
+ }
+
+ /**
+ * Get the permission owner associated with this record.
+ */
+ public IBinder getPermissionOwner() {
+ return mPermissionOwner;
+ }
+
+ /**
+ * Get the content URIs associated with this record.
+ */
+ public ArraySet<Uri> getUris() {
+ return mUris;
+ }
+
+ /**
+ * Associate a new content URI with this record.
+ */
+ public void addUri(Uri uri) {
+ mUris.add(uri);
+ }
+
+ /**
+ * Get the user id associated with this record.
+ * If the UserHandle associated with this record belongs to USER_ALL, return the ID for
+ * USER_SYSTEM instead, to avoid errors around modifying URI permissions for an invalid user ID.
+ */
+ public int getUserId() {
+ int userId = mUser.getIdentifier();
+ if (userId == UserHandle.USER_ALL) {
+ return UserHandle.USER_SYSTEM;
+ } else {
+ return userId;
+ }
+ }
+
+ /**
+ * Get the name of the package associated with this record.
+ */
+ public String getPackageName() {
+ return mPackageName;
+ }
+
+ /**
+ * Get the key associated with this record.
+ */
+ public String getKey() {
+ return mKey;
+ }
+}
diff --git a/services/core/java/com/android/server/notification/NotificationDelegate.java b/services/core/java/com/android/server/notification/NotificationDelegate.java
index 6f0ad33244e4..88fc072e2481 100644
--- a/services/core/java/com/android/server/notification/NotificationDelegate.java
+++ b/services/core/java/com/android/server/notification/NotificationDelegate.java
@@ -18,6 +18,7 @@ package com.android.server.notification;
import android.app.Notification;
import android.net.Uri;
+import android.os.UserHandle;
import android.service.notification.NotificationStats;
import com.android.internal.statusbar.NotificationVisibility;
@@ -53,7 +54,13 @@ public interface NotificationDelegate {
* Grant permission to read the specified URI to the package associated with the
* NotificationRecord associated with the given key.
*/
- void grantInlineReplyUriPermission(String key, Uri uri, int callingUid);
+ void grantInlineReplyUriPermission(String key, Uri uri, UserHandle user, String packageName,
+ int callingUid);
+
+ /**
+ * Clear inline URI grants associated with the given notification.
+ */
+ void clearInlineReplyUriPermissions(String key, int callingUid);
/**
* Notifies that smart replies and actions have been added to the UI.
diff --git a/services/core/java/com/android/server/notification/NotificationManagerService.java b/services/core/java/com/android/server/notification/NotificationManagerService.java
index 0fc1718ad673..5e764012f46d 100755
--- a/services/core/java/com/android/server/notification/NotificationManagerService.java
+++ b/services/core/java/com/android/server/notification/NotificationManagerService.java
@@ -415,6 +415,8 @@ public class NotificationManagerService extends SystemService {
@GuardedBy("mNotificationLock")
final ArrayMap<String, NotificationRecord> mNotificationsByKey = new ArrayMap<>();
@GuardedBy("mNotificationLock")
+ final ArrayMap<String, InlineReplyUriRecord> mInlineReplyRecordsByKey = new ArrayMap<>();
+ @GuardedBy("mNotificationLock")
final ArrayList<NotificationRecord> mEnqueuedNotifications = new ArrayList<>();
@GuardedBy("mNotificationLock")
final ArrayMap<Integer, ArrayMap<String, String>> mAutobundledSummaries = new ArrayMap<>();
@@ -1167,42 +1169,53 @@ public class NotificationManagerService extends SystemService {
* user associated with the NotificationRecord, and this grant will fail when trying
* to grant URI permissions across users.
*/
- public void grantInlineReplyUriPermission(String key, Uri uri, int callingUid) {
+ public void grantInlineReplyUriPermission(String key, Uri uri, UserHandle user,
+ String packageName, int callingUid) {
synchronized (mNotificationLock) {
- NotificationRecord r = mNotificationsByKey.get(key);
- if (r != null) {
- IBinder owner = r.permissionOwner;
- if (owner == null) {
- r.permissionOwner = mUgmInternal.newUriPermissionOwner("NOTIF:" + key);
- owner = r.permissionOwner;
- }
- int uid = callingUid;
- int userId = r.sbn.getUserId();
- if (userId == UserHandle.USER_ALL) {
- userId = USER_SYSTEM;
- }
- if (UserHandle.getUserId(uid) != userId) {
- try {
- final String[] pkgs = mPackageManager.getPackagesForUid(callingUid);
- if (pkgs == null) {
- Log.e(TAG, "Cannot grant uri permission to unknown UID: "
- + callingUid);
- }
- final String pkg = pkgs[0]; // Get the SystemUI package
- // Find the UID for SystemUI for the correct user
- uid = mPackageManager.getPackageUid(pkg, 0, userId);
- } catch (RemoteException re) {
- Log.e(TAG, "Cannot talk to package manager", re);
+ InlineReplyUriRecord r = mInlineReplyRecordsByKey.get(key);
+ if (r == null) {
+ InlineReplyUriRecord newRecord = new InlineReplyUriRecord(
+ mUgmInternal.newUriPermissionOwner("INLINE_REPLY:" + key),
+ user,
+ packageName,
+ key);
+ r = newRecord;
+ mInlineReplyRecordsByKey.put(key, r);
+ }
+ IBinder owner = r.getPermissionOwner();
+ int uid = callingUid;
+ int userId = r.getUserId();
+ if (UserHandle.getUserId(uid) != userId) {
+ try {
+ final String[] pkgs = mPackageManager.getPackagesForUid(callingUid);
+ if (pkgs == null) {
+ Log.e(TAG, "Cannot grant uri permission to unknown UID: "
+ + callingUid);
}
+ final String pkg = pkgs[0]; // Get the SystemUI package
+ // Find the UID for SystemUI for the correct user
+ uid = mPackageManager.getPackageUid(pkg, 0, userId);
+ } catch (RemoteException re) {
+ Log.e(TAG, "Cannot talk to package manager", re);
}
- grantUriPermission(owner, uri, uid, r.sbn.getPackageName(), userId);
- } else {
- Log.w(TAG, "No record found for notification key:" + key);
+ }
+ r.addUri(uri);
+ grantUriPermission(owner, uri, uid, r.getPackageName(), userId);
+ }
+ }
- // TODO: figure out cancel story. I think it's: sysui needs to tell us
- // whenever noitifications held by a lifetimextender go away
- // IBinder owner = mUgmInternal.newUriPermissionOwner("InlineReply:" + key);
- // pass in userId and package as well as key (key for logging purposes)
+ @Override
+ /**
+ * Clears inline URI permission grants by destroying the permission owner for the specified
+ * notification.
+ */
+ public void clearInlineReplyUriPermissions(String key, int callingUid) {
+ synchronized (mNotificationLock) {
+ InlineReplyUriRecord uriRecord = mInlineReplyRecordsByKey.get(key);
+ if (uriRecord != null) {
+ destroyPermissionOwner(uriRecord.getPermissionOwner(), uriRecord.getUserId(),
+ "INLINE_REPLY: " + uriRecord.getKey());
+ mInlineReplyRecordsByKey.remove(key);
}
}
}
@@ -7036,15 +7049,8 @@ public class NotificationManagerService extends SystemService {
// If we have no Uris to grant, but an existing owner, go destroy it
if (newUris == null && permissionOwner != null) {
- final long ident = Binder.clearCallingIdentity();
- try {
- if (DBG) Slog.d(TAG, key + ": destroying owner");
- mUgmInternal.revokeUriPermissionFromOwner(permissionOwner, null, ~0,
- UserHandle.getUserId(oldRecord.getUid()));
- permissionOwner = null;
- } finally {
- Binder.restoreCallingIdentity(ident);
- }
+ destroyPermissionOwner(permissionOwner, UserHandle.getUserId(oldRecord.getUid()), key);
+ permissionOwner = null;
}
// Grant access to new Uris
@@ -7065,7 +7071,9 @@ public class NotificationManagerService extends SystemService {
final Uri uri = oldUris.valueAt(i);
if (newUris == null || !newUris.contains(uri)) {
if (DBG) Slog.d(TAG, key + ": revoking " + uri);
- revokeUriPermission(permissionOwner, uri, oldRecord.getUid());
+ int userId = ContentProvider.getUserIdFromUri(
+ uri, UserHandle.getUserId(oldRecord.getUid()));
+ revokeUriPermission(permissionOwner, uri, userId);
}
}
}
@@ -7092,7 +7100,7 @@ public class NotificationManagerService extends SystemService {
}
}
- private void revokeUriPermission(IBinder owner, Uri uri, int sourceUid) {
+ private void revokeUriPermission(IBinder owner, Uri uri, int userId) {
if (uri == null || !ContentResolver.SCHEME_CONTENT.equals(uri.getScheme())) return;
final long ident = Binder.clearCallingIdentity();
@@ -7101,7 +7109,17 @@ public class NotificationManagerService extends SystemService {
owner,
ContentProvider.getUriWithoutUserId(uri),
Intent.FLAG_GRANT_READ_URI_PERMISSION,
- ContentProvider.getUserIdFromUri(uri, UserHandle.getUserId(sourceUid)));
+ userId);
+ } finally {
+ Binder.restoreCallingIdentity(ident);
+ }
+ }
+
+ private void destroyPermissionOwner(IBinder owner, int userId, String logKey) {
+ final long ident = Binder.clearCallingIdentity();
+ try {
+ if (DBG) Slog.d(TAG, logKey + ": destroying owner");
+ mUgmInternal.revokeUriPermissionFromOwner(owner, null, ~0, userId);
} finally {
Binder.restoreCallingIdentity(ident);
}
diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java
index b36958a69162..340720e2f1fb 100644
--- a/services/core/java/com/android/server/pm/PackageManagerService.java
+++ b/services/core/java/com/android/server/pm/PackageManagerService.java
@@ -751,17 +751,17 @@ public class PackageManagerService extends IPackageManager.Stub
static final List<SystemPartition> SYSTEM_PARTITIONS = Collections.unmodifiableList(
Arrays.asList(
new SystemPartition(Environment.getRootDirectory(), 0 /* scanFlag */,
- true /* hasPriv */, false /* hasOverlays */),
+ false /* hasOverlays */),
new SystemPartition(Environment.getVendorDirectory(), SCAN_AS_VENDOR,
- true /* hasPriv */, true /* hasOverlays */),
+ true /* hasOverlays */),
new SystemPartition(Environment.getOdmDirectory(), SCAN_AS_ODM,
- true /* hasPriv */, true /* hasOverlays */),
+ true /* hasOverlays */),
new SystemPartition(Environment.getOemDirectory(), SCAN_AS_OEM,
- false /* hasPriv */, true /* hasOverlays */),
+ true /* hasOverlays */),
new SystemPartition(Environment.getProductDirectory(), SCAN_AS_PRODUCT,
- true /* hasPriv */, true /* hasOverlays */),
+ true /* hasOverlays */),
new SystemPartition(Environment.getSystemExtDirectory(), SCAN_AS_SYSTEM_EXT,
- true /* hasPriv */, true /* hasOverlays */)));
+ true /* hasOverlays */)));
private final List<SystemPartition> mDirsToScanAsSystem;
@@ -2427,12 +2427,28 @@ public class PackageManagerService extends IPackageManager.Stub
@Nullable
public final File overlayFolder;
- private SystemPartition(File folder, int scanFlag, boolean hasPrivApps,
- boolean hasOverlays) {
+
+ private static boolean shouldScanPrivApps(@ScanFlags int scanFlags) {
+ if ((scanFlags & SCAN_AS_OEM) != 0) {
+ return false;
+ }
+ if (scanFlags == 0) { // /system partition
+ return true;
+ }
+ if ((scanFlags
+ & (SCAN_AS_VENDOR | SCAN_AS_ODM | SCAN_AS_PRODUCT | SCAN_AS_SYSTEM_EXT)) != 0) {
+ return true;
+ }
+ return false;
+ }
+
+ private SystemPartition(File folder, int scanFlag, boolean hasOverlays) {
this.folder = folder;
this.scanFlag = scanFlag;
this.appFolder = toCanonical(new File(folder, "app"));
- this.privAppFolder = hasPrivApps ? toCanonical(new File(folder, "priv-app")) : null;
+ this.privAppFolder = shouldScanPrivApps(scanFlag)
+ ? toCanonical(new File(folder, "priv-app"))
+ : null;
this.overlayFolder = hasOverlays ? toCanonical(new File(folder, "overlay")) : null;
}
@@ -8663,6 +8679,16 @@ public class PackageManagerService extends IPackageManager.Stub
pkgSetting = originalPkgSetting == null ? installedPkgSetting : originalPkgSetting;
pkgAlreadyExists = pkgSetting != null;
final String disabledPkgName = pkgAlreadyExists ? pkgSetting.name : pkg.packageName;
+ if (scanSystemPartition && !pkgAlreadyExists
+ && mSettings.getDisabledSystemPkgLPr(disabledPkgName) != null) {
+ // The updated-package data for /system apk remains inconsistently
+ // after the package data for /data apk is lost accidentally.
+ // To recover it, enable /system apk and install it as non-updated system app.
+ Slog.w(TAG, "Inconsistent package setting of updated system app for "
+ + disabledPkgName + ". To recover it, enable the system app"
+ + "and install it as non-updated system app.");
+ mSettings.removeDisabledSystemPackageLPw(disabledPkgName);
+ }
disabledPkgSetting = mSettings.getDisabledSystemPkgLPr(disabledPkgName);
isSystemPkgUpdated = disabledPkgSetting != null;
@@ -17790,17 +17816,6 @@ public class PackageManagerService extends IPackageManager.Stub
}
}
- static boolean locationIsPrivileged(String path) {
- // TODO(dariofreni): include APEX partitions when they will support priv apps.
- for (int i = 0, size = SYSTEM_PARTITIONS.size(); i < size; i++) {
- SystemPartition partition = SYSTEM_PARTITIONS.get(i);
- if (partition.containsPrivPath(path)) {
- return true;
- }
- }
- return false;
- }
-
private static @Nullable SystemPartition resolveApexToSystemPartition(
ApexManager.ActiveApexInfo apexInfo) {
for (int i = 0, size = SYSTEM_PARTITIONS.size(); i < size; i++) {
@@ -17808,7 +17823,7 @@ public class PackageManagerService extends IPackageManager.Stub
if (apexInfo.preinstalledApexPath.getAbsolutePath().startsWith(
sp.folder.getAbsolutePath())) {
return new SystemPartition(apexInfo.apexDirectory, sp.scanFlag,
- false /* hasPriv */, false /* hasOverlays */);
+ false /* hasOverlays */);
}
}
return null;
diff --git a/services/core/java/com/android/server/pm/Settings.java b/services/core/java/com/android/server/pm/Settings.java
index a11ae8ce6f54..66c77f583c57 100644
--- a/services/core/java/com/android/server/pm/Settings.java
+++ b/services/core/java/com/android/server/pm/Settings.java
@@ -3513,7 +3513,7 @@ public final class Settings {
int pkgFlags = 0;
int pkgPrivateFlags = 0;
pkgFlags |= ApplicationInfo.FLAG_SYSTEM;
- if (PackageManagerService.locationIsPrivileged(codePathStr)) {
+ if (codePathStr.contains("/priv-app/")) {
pkgPrivateFlags |= ApplicationInfo.PRIVATE_FLAG_PRIVILEGED;
}
PackageSetting ps = new PackageSetting(name, realName, new File(codePathStr),
diff --git a/services/core/java/com/android/server/pm/ShortcutService.java b/services/core/java/com/android/server/pm/ShortcutService.java
index 8253b392768f..f0a1c70057c4 100644
--- a/services/core/java/com/android/server/pm/ShortcutService.java
+++ b/services/core/java/com/android/server/pm/ShortcutService.java
@@ -495,7 +495,7 @@ public class ShortcutService extends IShortcutService.Stub {
final private IUidObserver mUidObserver = new IUidObserver.Stub() {
@Override
- public void onUidStateChanged(int uid, int procState, long procStateSeq) {
+ public void onUidStateChanged(int uid, int procState, long procStateSeq, int capability) {
injectPostToHandler(() -> handleOnUidStateChanged(uid, procState));
}
diff --git a/services/core/java/com/android/server/pm/UserManagerService.java b/services/core/java/com/android/server/pm/UserManagerService.java
index a2aeaf189be5..5c9b9c93e4fe 100644
--- a/services/core/java/com/android/server/pm/UserManagerService.java
+++ b/services/core/java/com/android/server/pm/UserManagerService.java
@@ -1593,6 +1593,7 @@ public class UserManagerService extends IUserManager.Stub {
/** @return a specific user restriction that's in effect currently. */
@Override
public boolean hasUserRestriction(String restrictionKey, @UserIdInt int userId) {
+ checkManageOrInteractPermIfCallerInOtherProfileGroup(userId, "hasUserRestriction");
return mLocalService.hasUserRestriction(restrictionKey, userId);
}
@@ -1717,6 +1718,7 @@ public class UserManagerService extends IUserManager.Stub {
*/
@Override
public Bundle getUserRestrictions(@UserIdInt int userId) {
+ checkManageOrInteractPermIfCallerInOtherProfileGroup(userId, "getUserRestrictions");
return UserRestrictionsUtils.clone(getEffectiveUserRestrictions(userId));
}
@@ -4000,9 +4002,14 @@ public class UserManagerService extends IUserManager.Stub {
long now = System.currentTimeMillis();
final long nowRealtime = SystemClock.elapsedRealtime();
- final int currentUser = LocalServices.getService(ActivityManagerInternal.class)
- .getCurrentUserId();
- pw.print("Current user: "); pw.println(currentUser);
+ final ActivityManagerInternal amInternal = LocalServices
+ .getService(ActivityManagerInternal.class);
+ pw.print("Current user: ");
+ if (amInternal != null) {
+ pw.println(amInternal.getCurrentUserId());
+ } else {
+ pw.println("N/A");
+ }
StringBuilder sb = new StringBuilder();
synchronized (mPackagesLock) {
diff --git a/services/core/java/com/android/server/pm/UserSystemPackageInstaller.java b/services/core/java/com/android/server/pm/UserSystemPackageInstaller.java
index 323c957acdd0..91df33a8a16f 100644
--- a/services/core/java/com/android/server/pm/UserSystemPackageInstaller.java
+++ b/services/core/java/com/android/server/pm/UserSystemPackageInstaller.java
@@ -49,13 +49,14 @@ import java.util.Set;
* <p>If {@link #isEnforceMode()} is false, then all system packages are always installed for all
* users. The following applies when it is true.
*
- * Any package can be in one of three states in the SystemConfig whitelist
+ * <p>Any package can be in one of three states in the {@code SystemConfig} whitelist
* <ol>
* <li>Explicitly blacklisted for a particular user type</li>
* <li>Explicitly whitelisted for a particular user type</li>
* <li>Not mentioned at all, for any user type (neither whitelisted nor blacklisted)</li>
* </ol>
- * Blacklisting always takes precedence - if a package is blacklisted for a particular user,
+ *
+ * <p>Blacklisting always takes precedence - if a package is blacklisted for a particular user,
* it won't be installed on that type of user (even if it is also whitelisted for that user).
* Next comes whitelisting - if it is whitelisted for a particular user, it will be installed on
* that type of user (as long as it isn't blacklisted).
@@ -69,6 +70,12 @@ import java.util.Set;
* <li>Either way, for {@link UserHandle#USER_SYSTEM}, the package will be implicitly
* whitelisted so that it can be used for local development purposes.</li>
* </ul>
+ *
+ * <p><b>NOTE:</b> the {@code SystemConfig} state is only updated on first boot or after a system
+ * update. So, to verify changes during development, you can emulate the latter by calling:
+ * <pre><code>
+ * adb shell setprop persist.pm.mock-upgrade true
+ * </code></pre>
*/
class UserSystemPackageInstaller {
private static final String TAG = "UserManagerService";
diff --git a/services/core/java/com/android/server/pm/dex/DexManager.java b/services/core/java/com/android/server/pm/dex/DexManager.java
index f56231fc02af..41dcaa59047b 100644
--- a/services/core/java/com/android/server/pm/dex/DexManager.java
+++ b/services/core/java/com/android/server/pm/dex/DexManager.java
@@ -16,8 +16,6 @@
package com.android.server.pm.dex;
-import static android.provider.DeviceConfig.NAMESPACE_DEX_BOOT;
-
import static com.android.server.pm.InstructionSets.getAppDexInstructionSets;
import static com.android.server.pm.dex.PackageDexUsage.DexUseInfo;
import static com.android.server.pm.dex.PackageDexUsage.PackageUseInfo;
@@ -31,7 +29,6 @@ import android.os.RemoteException;
import android.os.SystemProperties;
import android.os.UserHandle;
import android.os.storage.StorageManager;
-import android.provider.DeviceConfig;
import android.util.Log;
import android.util.Slog;
import android.util.jar.StrictJarFile;
@@ -72,10 +69,6 @@ public class DexManager {
private static final String PROPERTY_NAME_PM_DEXOPT_PRIV_APPS_OOB_LIST =
"pm.dexopt.priv-apps-oob-list";
- // flags for Device Config API
- private static final String PRIV_APPS_OOB_ENABLED = "priv_apps_oob_enabled";
- private static final String PRIV_APPS_OOB_WHITELIST = "priv_apps_oob_whitelist";
-
private static final boolean DEBUG = Log.isLoggable(TAG, Log.DEBUG);
private final Context mContext;
@@ -717,24 +710,16 @@ public class DexManager {
return isPackageSelectedToRunOobInternal(
SystemProperties.getBoolean(PROPERTY_NAME_PM_DEXOPT_PRIV_APPS_OOB, false),
SystemProperties.get(PROPERTY_NAME_PM_DEXOPT_PRIV_APPS_OOB_LIST, "ALL"),
- DeviceConfig.getProperty(NAMESPACE_DEX_BOOT, PRIV_APPS_OOB_ENABLED),
- DeviceConfig.getProperty(NAMESPACE_DEX_BOOT, PRIV_APPS_OOB_WHITELIST),
packageNamesInSameProcess);
}
@VisibleForTesting
- /* package */ static boolean isPackageSelectedToRunOobInternal(
- boolean isDefaultEnabled, String defaultWhitelist, String overrideEnabled,
- String overrideWhitelist, Collection<String> packageNamesInSameProcess) {
- // Allow experiment (if exists) to override device configuration.
- boolean enabled = overrideEnabled != null ? overrideEnabled.equals("true")
- : isDefaultEnabled;
- if (!enabled) {
+ /* package */ static boolean isPackageSelectedToRunOobInternal(boolean isEnabled,
+ String whitelist, Collection<String> packageNamesInSameProcess) {
+ if (!isEnabled) {
return false;
}
- // Similarly, experiment flag can override the whitelist.
- String whitelist = overrideWhitelist != null ? overrideWhitelist : defaultWhitelist;
if ("ALL".equals(whitelist)) {
return true;
}
diff --git a/services/core/java/com/android/server/rollback/RollbackManagerServiceImpl.java b/services/core/java/com/android/server/rollback/RollbackManagerServiceImpl.java
index ef4c12e8145a..198bb146c9b2 100644
--- a/services/core/java/com/android/server/rollback/RollbackManagerServiceImpl.java
+++ b/services/core/java/com/android/server/rollback/RollbackManagerServiceImpl.java
@@ -53,6 +53,7 @@ import android.util.Slog;
import android.util.SparseBooleanArray;
import com.android.internal.annotations.GuardedBy;
+import com.android.internal.util.DumpUtils;
import com.android.internal.util.IndentingPrintWriter;
import com.android.server.LocalServices;
import com.android.server.Watchdog;
@@ -469,44 +470,39 @@ class RollbackManagerServiceImpl extends IRollbackManager.Stub {
List<Rollback> restoreInProgress = new ArrayList<>();
Set<String> apexPackageNames = new HashSet<>();
synchronized (mLock) {
- for (Rollback rollback : mRollbacks) {
- if (rollback.isStaged()) {
+ Iterator<Rollback> iter = mRollbacks.iterator();
+ while (iter.hasNext()) {
+ Rollback rollback = iter.next();
+ if (!rollback.isStaged()) {
+ // We only care about staged rollbacks here
+ continue;
+ }
+
+ PackageInstaller.SessionInfo session = mContext.getPackageManager()
+ .getPackageInstaller().getSessionInfo(rollback.getStagedSessionId());
+ if (session == null || session.isStagedSessionFailed()) {
+ iter.remove();
+ rollback.delete(mAppDataRollbackHelper);
+ continue;
+ }
+
+ if (session.isStagedSessionApplied()) {
if (rollback.isEnabling()) {
enabling.add(rollback);
} else if (rollback.isRestoreUserDataInProgress()) {
restoreInProgress.add(rollback);
}
-
- apexPackageNames.addAll(rollback.getApexPackageNames());
}
+ apexPackageNames.addAll(rollback.getApexPackageNames());
}
}
for (Rollback rollback : enabling) {
- PackageInstaller installer = mContext.getPackageManager().getPackageInstaller();
- PackageInstaller.SessionInfo session =
- installer.getSessionInfo(rollback.getStagedSessionId());
- if (session == null || session.isStagedSessionFailed()) {
- // TODO: Do we need to remove this from
- // mRollbacks, or is it okay to leave as
- // unavailable until the next reboot when it will go
- // away on its own?
- rollback.delete(mAppDataRollbackHelper);
- } else if (session.isStagedSessionApplied()) {
- makeRollbackAvailable(rollback);
- }
+ makeRollbackAvailable(rollback);
}
for (Rollback rollback : restoreInProgress) {
- PackageInstaller installer = mContext.getPackageManager().getPackageInstaller();
- PackageInstaller.SessionInfo session =
- installer.getSessionInfo(rollback.getStagedSessionId());
- // TODO: What if session is null?
- if (session != null) {
- if (session.isStagedSessionApplied() || session.isStagedSessionFailed()) {
- rollback.setRestoreUserDataInProgress(false);
- }
- }
+ rollback.setRestoreUserDataInProgress(false);
}
for (String apexPackageName : apexPackageNames) {
@@ -1133,6 +1129,8 @@ class RollbackManagerServiceImpl extends IRollbackManager.Stub {
@Override
protected void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
+ if (!DumpUtils.checkDumpPermission(mContext, TAG, pw)) return;
+
IndentingPrintWriter ipw = new IndentingPrintWriter(pw, " ");
synchronized (mLock) {
for (Rollback rollback : mRollbacks) {
diff --git a/services/core/java/com/android/server/statusbar/StatusBarManagerService.java b/services/core/java/com/android/server/statusbar/StatusBarManagerService.java
index 489c34359645..effeb80298b8 100644
--- a/services/core/java/com/android/server/statusbar/StatusBarManagerService.java
+++ b/services/core/java/com/android/server/statusbar/StatusBarManagerService.java
@@ -1364,12 +1364,26 @@ public class StatusBarManagerService extends IStatusBarService.Stub implements D
}
@Override
- public void grantInlineReplyUriPermission(String key, Uri uri) {
+ public void grantInlineReplyUriPermission(String key, Uri uri, UserHandle user,
+ String packageName) {
enforceStatusBarService();
int callingUid = Binder.getCallingUid();
long identity = Binder.clearCallingIdentity();
try {
- mNotificationDelegate.grantInlineReplyUriPermission(key, uri, callingUid);
+ mNotificationDelegate.grantInlineReplyUriPermission(key, uri, user, packageName,
+ callingUid);
+ } finally {
+ Binder.restoreCallingIdentity(identity);
+ }
+ }
+
+ @Override
+ public void clearInlineReplyUriPermissions(String key) {
+ enforceStatusBarService();
+ int callingUid = Binder.getCallingUid();
+ long identity = Binder.clearCallingIdentity();
+ try {
+ mNotificationDelegate.clearInlineReplyUriPermissions(key, callingUid);
} finally {
Binder.restoreCallingIdentity(identity);
}
diff --git a/services/core/java/com/android/server/updates/EmergencyNumberDbInstallReceiver.java b/services/core/java/com/android/server/updates/EmergencyNumberDbInstallReceiver.java
index 852f70779f77..cb0b45ceaf05 100644
--- a/services/core/java/com/android/server/updates/EmergencyNumberDbInstallReceiver.java
+++ b/services/core/java/com/android/server/updates/EmergencyNumberDbInstallReceiver.java
@@ -18,6 +18,7 @@ package com.android.server.updates;
import android.content.Context;
import android.content.Intent;
+import android.telephony.TelephonyManager;
import android.util.Slog;
/**
@@ -34,6 +35,11 @@ public class EmergencyNumberDbInstallReceiver extends ConfigUpdateInstallReceive
@Override
protected void postInstall(Context context, Intent intent) {
Slog.i(TAG, "Emergency number database is updated in file partition");
- // TODO Send a notification to EmergencyNumberTracker for updating of emergency number db.
+
+ // Notify EmergencyNumberTracker for emergency number installation complete.
+ Intent notifyInstallComplete = new Intent(
+ TelephonyManager.ACTION_OTA_EMERGENCY_NUMBER_DB_INSTALLED);
+ context.sendBroadcast(
+ notifyInstallComplete, android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE);
}
}
diff --git a/services/core/java/com/android/server/wm/AccessibilityController.java b/services/core/java/com/android/server/wm/AccessibilityController.java
index 5e4f75cca10d..c57ac11723b4 100644
--- a/services/core/java/com/android/server/wm/AccessibilityController.java
+++ b/services/core/java/com/android/server/wm/AccessibilityController.java
@@ -132,17 +132,20 @@ final class AccessibilityController {
return false;
}
- if (mWindowsForAccessibilityObserver.get(displayId) != null) {
- final Display display = dc.getDisplay();
- if (display.getType() == Display.TYPE_VIRTUAL && dc.getParentWindow() != null) {
- // The window observer of this embedded display had been set from
- // window manager after setting its parent window.
- return false;
- } else {
- throw new IllegalStateException(
- "Windows for accessibility callback of display "
- + displayId + " already set!");
+ final Display display = dc.getDisplay();
+ if (display.getType() == Display.TYPE_VIRTUAL && dc.getParentWindow() != null) {
+ // If this display is an embedded one, its window observer should have been set from
+ // window manager after setting its parent window. But if its window observer is
+ // empty, that means this mapping didn't be set, and needs to do this again.
+ // This happened when accessibility window observer is disabled and enabled again.
+ if (mWindowsForAccessibilityObserver.get(displayId) == null) {
+ handleWindowObserverOfEmbeddedDisplayLocked(displayId, dc.getParentWindow());
}
+ return false;
+ } else if (mWindowsForAccessibilityObserver.get(displayId) != null) {
+ throw new IllegalStateException(
+ "Windows for accessibility callback of display "
+ + displayId + " already set!");
}
mWindowsForAccessibilityObserver.put(displayId,
new WindowsForAccessibilityObserver(mService, displayId, callback));
diff --git a/services/core/java/com/android/server/wm/ActivityMetricsLogger.java b/services/core/java/com/android/server/wm/ActivityMetricsLogger.java
index 9d41d97bc1ed..ff2c67135e5c 100644
--- a/services/core/java/com/android/server/wm/ActivityMetricsLogger.java
+++ b/services/core/java/com/android/server/wm/ActivityMetricsLogger.java
@@ -403,8 +403,7 @@ class ActivityMetricsLogger {
if (launchedActivity != null && launchedActivity.mDrawn) {
// Launched activity is already visible. We cannot measure windows drawn delay.
- reset(true /* abort */, info, "launched activity already visible",
- 0L /* timestampNs */);
+ abort(info, "launched activity already visible");
return;
}
@@ -422,8 +421,7 @@ class ActivityMetricsLogger {
if ((!isLoggableResultCode(resultCode) || launchedActivity == null || !processSwitch
|| windowingMode == WINDOWING_MODE_UNDEFINED) && !otherWindowModesLaunching) {
// Failed to launch or it was not a process switch, so we don't care about the timing.
- reset(true /* abort */, info, "failed to launch or not a process switch",
- 0L /* timestampNs */);
+ abort(info, "failed to launch or not a process switch");
return;
} else if (otherWindowModesLaunching) {
// Don't log this windowing mode but continue with the other windowing modes.
@@ -469,8 +467,7 @@ class ActivityMetricsLogger {
final WindowingModeTransitionInfoSnapshot infoSnapshot =
new WindowingModeTransitionInfoSnapshot(info);
if (allWindowsDrawn() && mLoggedTransitionStarting) {
- reset(false /* abort */, info, "notifyWindowsDrawn - all windows drawn",
- timestampNs /* timestampNs */);
+ reset(false /* abort */, info, "notifyWindowsDrawn - all windows drawn", timestampNs);
}
return infoSnapshot;
}
@@ -478,13 +475,13 @@ class ActivityMetricsLogger {
/**
* Notifies the tracker that the starting window was drawn.
*/
- void notifyStartingWindowDrawn(@WindowingMode int windowingMode, long timestamp) {
+ void notifyStartingWindowDrawn(@WindowingMode int windowingMode, long timestampNs) {
final WindowingModeTransitionInfo info = mWindowingModeTransitionInfo.get(windowingMode);
if (info == null || info.loggedStartingWindowDrawn) {
return;
}
info.loggedStartingWindowDrawn = true;
- info.startingWindowDelayMs = calculateDelay(timestamp);
+ info.startingWindowDelayMs = calculateDelay(timestampNs);
}
/**
@@ -544,10 +541,11 @@ class ActivityMetricsLogger {
mHandler.obtainMessage(MSG_CHECK_VISIBILITY, args).sendToTarget();
}
- private boolean hasVisibleNonFinishingActivity(TaskRecord t) {
+ /** @return {@code true} if the given task has an activity will be drawn. */
+ private static boolean hasActivityToBeDrawn(TaskRecord t) {
for (int i = t.getChildCount() - 1; i >= 0; --i) {
final ActivityRecord r = t.getChildAt(i);
- if (r.visible && !r.finishing) {
+ if (r.visible && !r.mDrawn && !r.finishing) {
return true;
}
}
@@ -574,19 +572,20 @@ class ActivityMetricsLogger {
return;
}
- // Check if there is any activity in the task that is visible and not finishing. If the
- // launched activity finished before it is drawn and if there is another activity in
- // the task then that activity will be draw on screen.
- if (hasVisibleNonFinishingActivity(t)) {
+ // If the task of the launched activity contains any activity to be drawn, then the
+ // window drawn event should report later to complete the transition. Otherwise all
+ // activities in this task may be finished, invisible or drawn, so the transition event
+ // should be cancelled.
+ if (hasActivityToBeDrawn(t)) {
return;
}
if (DEBUG_METRICS) Slog.i(TAG, "notifyVisibilityChanged to invisible activity=" + r);
logAppTransitionCancel(info);
- mWindowingModeTransitionInfo.remove(r.getWindowingMode());
- if (mWindowingModeTransitionInfo.size() == 0) {
- reset(true /* abort */, info, "notifyVisibilityChanged to invisible",
- 0L /* timestampNs */);
+ // Abort if this is the only one active transition.
+ if (mWindowingModeTransitionInfo.size() == 1
+ && mWindowingModeTransitionInfo.get(r.getWindowingMode()) != null) {
+ abort(info, "notifyVisibilityChanged to invisible");
}
}
}
@@ -622,19 +621,25 @@ class ActivityMetricsLogger {
&& mWindowingModeTransitionInfo.size() > 0;
}
+ /** Aborts tracking of current launch metrics. */
+ private void abort(WindowingModeTransitionInfo info, String cause) {
+ reset(true /* abort */, info, cause, 0L /* timestampNs */);
+ }
+
private void reset(boolean abort, WindowingModeTransitionInfo info, String cause,
- long timestampNs) {
+ long timestampNs) {
+ final boolean isAnyTransitionActive = isAnyTransitionActive();
if (DEBUG_METRICS) {
- Slog.i(TAG,
- "reset abort=" + abort + ",cause=" + cause + ",timestamp=" + timestampNs);
+ Slog.i(TAG, "reset abort=" + abort + " cause=" + cause + " timestamp=" + timestampNs
+ + " active=" + isAnyTransitionActive);
}
- if (!abort && isAnyTransitionActive()) {
+ if (!abort && isAnyTransitionActive) {
logAppTransitionMultiEvents();
}
stopLaunchTrace(info);
// Ignore reset-after reset.
- if (isAnyTransitionActive()) {
+ if (isAnyTransitionActive) {
// LaunchObserver callbacks.
if (abort) {
launchObserverNotifyActivityLaunchCancelled(info);
@@ -818,7 +823,14 @@ class ActivityMetricsLogger {
return StatsLog.APP_START_OCCURRED__TYPE__HOT;
}
return StatsLog.APP_START_OCCURRED__TYPE__UNKNOWN;
- }
+ }
+
+ /** @return the last known window drawn delay of the given windowing mode. */
+ int getLastDrawnDelayMs(@WindowingMode int windowingMode) {
+ final WindowingModeTransitionInfo info = mLastWindowingModeTransitionInfo.get(
+ windowingMode);
+ return info != null ? info.windowsDrawnDelayMs : INVALID_DELAY;
+ }
WindowingModeTransitionInfoSnapshot logAppTransitionReportedDrawn(ActivityRecord r,
boolean restoredFromBundle) {
diff --git a/services/core/java/com/android/server/wm/ActivityRecord.java b/services/core/java/com/android/server/wm/ActivityRecord.java
index ec0900f7270e..d4dd033f38e6 100644
--- a/services/core/java/com/android/server/wm/ActivityRecord.java
+++ b/services/core/java/com/android/server/wm/ActivityRecord.java
@@ -179,7 +179,7 @@ import static com.android.server.wm.AppWindowTokenProto.FILLS_PARENT;
import static com.android.server.wm.AppWindowTokenProto.FROZEN_BOUNDS;
import static com.android.server.wm.AppWindowTokenProto.HIDDEN_REQUESTED;
import static com.android.server.wm.AppWindowTokenProto.HIDDEN_SET_FROM_TRANSFERRED_STARTING_WINDOW;
-import static com.android.server.wm.AppWindowTokenProto.IS_REALLY_ANIMATING;
+import static com.android.server.wm.AppWindowTokenProto.IS_ANIMATING;
import static com.android.server.wm.AppWindowTokenProto.IS_WAITING_FOR_TRANSITION_START;
import static com.android.server.wm.AppWindowTokenProto.LAST_ALL_DRAWN;
import static com.android.server.wm.AppWindowTokenProto.LAST_SURFACE_SHOWING;
@@ -205,16 +205,17 @@ import static com.android.server.wm.ProtoLogGroup.WM_DEBUG_ORIENTATION;
import static com.android.server.wm.ProtoLogGroup.WM_DEBUG_STARTING_WINDOW;
import static com.android.server.wm.TaskPersister.DEBUG;
import static com.android.server.wm.TaskPersister.IMAGE_EXTENSION;
+import static com.android.server.wm.WindowContainer.AnimationFlags.CHILDREN;
+import static com.android.server.wm.WindowContainer.AnimationFlags.PARENTS;
+import static com.android.server.wm.WindowContainer.AnimationFlags.TRANSITION;
import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_ANIM;
import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_LAYOUT_REPEATS;
import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_STARTING_WINDOW_VERBOSE;
import static com.android.server.wm.WindowManagerDebugConfig.TAG_WM;
import static com.android.server.wm.WindowManagerService.UPDATE_FOCUS_NORMAL;
import static com.android.server.wm.WindowManagerService.UPDATE_FOCUS_WILL_PLACE_SURFACES;
-import static com.android.server.wm.WindowManagerService.logWithStack;
import static com.android.server.wm.WindowState.LEGACY_POLICY_VISIBILITY;
import static com.android.server.wm.WindowStateAnimator.HAS_DRAWN;
-import static com.android.server.wm.WindowStateAnimator.STACK_CLIP_AFTER_ANIM;
import static com.android.server.wm.WindowStateAnimator.STACK_CLIP_BEFORE_ANIM;
import static org.xmlpull.v1.XmlPullParser.END_DOCUMENT;
@@ -291,16 +292,17 @@ import android.view.IApplicationToken;
import android.view.InputApplicationHandle;
import android.view.RemoteAnimationAdapter;
import android.view.RemoteAnimationDefinition;
+import android.view.RemoteAnimationTarget;
import android.view.SurfaceControl;
import android.view.SurfaceControl.Transaction;
import android.view.WindowManager;
import android.view.WindowManager.LayoutParams;
import android.view.animation.Animation;
+import com.android.internal.R;
import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.app.ResolverActivity;
import com.android.internal.content.ReferrerIntent;
-import com.android.internal.R;
import com.android.internal.util.ToBooleanFunction;
import com.android.internal.util.XmlUtils;
import com.android.server.AttributeCache;
@@ -315,6 +317,7 @@ import com.android.server.uri.UriPermissionOwner;
import com.android.server.wm.ActivityMetricsLogger.WindowingModeTransitionInfoSnapshot;
import com.android.server.wm.ActivityStack.ActivityState;
import com.android.server.wm.WindowManagerService.H;
+import com.android.server.wm.utils.InsetUtils;
import com.google.android.collect.Sets;
@@ -332,7 +335,6 @@ import java.util.Arrays;
import java.util.HashSet;
import java.util.List;
import java.util.Objects;
-import java.util.function.Consumer;
/**
* An entry in the history stack, representing an activity.
@@ -374,6 +376,7 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A
* Value to increment the z-layer when boosting a layer during animations. BOOST in l33tsp34k.
*/
@VisibleForTesting static final int Z_BOOST_BASE = 800570000;
+ static final int INVALID_PID = -1;
final ActivityTaskManagerService mAtmService;
final ActivityInfo info; // activity info provided by developer in AndroidManifest
@@ -551,24 +554,6 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A
private boolean mCurrentLaunchCanTurnScreenOn = true;
/**
- * This gets used during some open/close transitions as well as during a change transition
- * where it represents the starting-state snapshot.
- */
- private AppWindowThumbnail mThumbnail;
- private final Rect mTransitStartRect = new Rect();
-
- /**
- * If we are running an animation, this determines the transition type. Must be one of
- * AppTransition.TRANSIT_* constants.
- */
- private int mTransit;
-
- /**
- * If we are running an animation, this determines the flags during this animation. Must be a
- * bitwise combination of AppTransition.TRANSIT_FLAG_* constants.
- */
- private int mTransitFlags;
- /**
* This leash is used to "freeze" the app surface in place after the state change, but before
* the animation is ready to start.
*/
@@ -602,7 +587,6 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A
private long mLastTransactionSequence = Long.MIN_VALUE;
private int mNumInterestingWindows;
private int mNumDrawnWindows;
- boolean inPendingTransaction;
boolean allDrawn;
private boolean mLastAllDrawn;
@@ -664,7 +648,6 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A
// TODO: Have a WindowContainer state for tracking exiting/deferred removal.
boolean mIsExiting;
- boolean mLaunchTaskBehind;
boolean mEnteringAnimation;
boolean mAppStopped;
@@ -676,15 +659,6 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A
ArrayDeque<Rect> mFrozenBounds = new ArrayDeque<>();
ArrayDeque<Configuration> mFrozenMergedConfig = new ArrayDeque<>();
- /** Whether this token should be boosted at the top of all app window tokens. */
- @VisibleForTesting boolean mNeedsZBoost;
-
- /** Layer used to constrain the animation to a token's stack bounds. */
- SurfaceControl mAnimationBoundsLayer;
-
- /** Whether this token needs to create mAnimationBoundsLayer for cropping animations. */
- boolean mNeedsAnimationBoundsLayer;
-
private AppSaturationInfo mLastAppSaturationInfo;
private final ColorDisplayService.ColorTransformController mColorTransformController =
@@ -710,10 +684,6 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A
private final Configuration mTmpConfig = new Configuration();
private final Rect mTmpBounds = new Rect();
- private final Point mTmpPoint = new Point();
- private final Rect mTmpRect = new Rect();
- private final Rect mTmpPrevBounds = new Rect();
-
// Token for targeting this activity for assist purposes.
final Binder assistToken = new Binder();
@@ -905,15 +875,10 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A
pw.print(prefix); pw.print("mNumInterestingWindows=");
pw.print(mNumInterestingWindows);
pw.print(" mNumDrawnWindows="); pw.print(mNumDrawnWindows);
- pw.print(" inPendingTransaction="); pw.print(inPendingTransaction);
pw.print(" allDrawn="); pw.print(allDrawn);
pw.print(" lastAllDrawn="); pw.print(mLastAllDrawn);
pw.println(")");
}
- if (inPendingTransaction) {
- pw.print(prefix); pw.print("inPendingTransaction=");
- pw.println(inPendingTransaction);
- }
if (mStartingData != null || removed || firstWindowDrawn || mIsExiting) {
pw.print(prefix); pw.print("startingData="); pw.print(mStartingData);
pw.print(" removed="); pw.print(removed);
@@ -2305,7 +2270,7 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A
* 2. App is delayed closing since it might enter PIP.
*/
boolean isClosingOrEnteringPip() {
- return (isAnimating() && hiddenRequested) || mWillCloseOrEnterPip;
+ return (isAnimating(TRANSITION | PARENTS) && hiddenRequested) || mWillCloseOrEnterPip;
}
/**
* @return Whether AppOps allows this package to enter picture-in-picture.
@@ -3114,7 +3079,7 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A
ProtoLog.v(WM_DEBUG_APP_TRANSITIONS,
"Removing app %s delayed=%b animation=%s animating=%b", this, delayed,
- getAnimation(), isSelfAnimating());
+ getAnimation(), isAnimating(TRANSITION));
ProtoLog.v(WM_DEBUG_ADD_REMOVE, "removeAppToken: %s"
+ " delayed=%b Callers=%s", this, delayed, Debug.getCallers(4));
@@ -3126,7 +3091,7 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A
// If this window was animating, then we need to ensure that the app transition notifies
// that animations have completed in DisplayContent.handleAnimatingStoppedAndTransition(),
// so add to that list now
- if (isSelfAnimating()) {
+ if (isAnimating(TRANSITION)) {
getDisplayContent().mNoAnimationNotifyOnTransitionFinished.add(token);
}
@@ -3474,7 +3439,7 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A
* color mode set to avoid jank in the middle of the transition.
*/
boolean canShowWindows() {
- return allDrawn && !(isReallyAnimating() && hasNonDefaultColorWindow());
+ return allDrawn && !(isAnimating() && hasNonDefaultColorWindow());
}
/**
@@ -3536,17 +3501,17 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A
return forAllWindowsUnchecked(callback, traverseTopToBottom);
}
- @Override
- void forAllActivities(Consumer<ActivityRecord> callback) {
- callback.accept(this);
- }
-
boolean forAllWindowsUnchecked(ToBooleanFunction<WindowState> callback,
boolean traverseTopToBottom) {
return super.forAllWindows(callback, traverseTopToBottom);
}
@Override
+ boolean forAllActivities(ToBooleanFunction<ActivityRecord> callback) {
+ return callback.apply(this);
+ }
+
+ @Override
protected void setLayer(Transaction t, int layer) {
if (!mSurfaceAnimator.hasLeash()) {
t.setLayer(mSurfaceControl, layer);
@@ -4065,7 +4030,6 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A
// If we are preparing an app transition, then delay changing
// the visibility of this token until we execute that transition.
if (okToAnimate() && appTransition.isTransitionSet()) {
- inPendingTransaction = true;
if (visible) {
displayContent.mOpeningApps.add(this);
mEnteringAnimation = true;
@@ -4099,7 +4063,6 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A
boolean visible, int transit, boolean performLayout, boolean isVoiceInteraction) {
boolean delayed = false;
- inPendingTransaction = false;
// Reset the state of mHiddenSetFromTransferredStartingWindow since visibility is actually
// been set by the app now.
mHiddenSetFromTransferredStartingWindow = false;
@@ -4127,8 +4090,8 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A
if (transit != WindowManager.TRANSIT_UNSET) {
if (mUseTransferredAnimation) {
- runningAppAnimation = isReallyAnimating();
- } else if (applyAnimationLocked(lp, transit, visible, isVoiceInteraction)) {
+ runningAppAnimation = isAnimating();
+ } else if (applyAnimation(lp, transit, visible, isVoiceInteraction)) {
runningAppAnimation = true;
}
delayed = runningAppAnimation;
@@ -4179,21 +4142,14 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A
}
mUseTransferredAnimation = false;
- if (isReallyAnimating()) {
- delayed = true;
- } else {
+ delayed = isAnimating(CHILDREN);
+ if (!delayed) {
// We aren't animating anything, but exiting windows rely on the animation finished
// callback being called in case the ActivityRecord was pretending to be animating,
// which we might have done because we were in closing/opening apps list.
onAnimationFinished();
}
- for (int i = mChildren.size() - 1; i >= 0 && !delayed; i--) {
- if ((mChildren.get(i)).isSelfOrChildAnimating()) {
- delayed = true;
- }
- }
-
if (visibilityChanged) {
if (visible && !delayed) {
// The token was made immediately visible, there will be no entrance animation.
@@ -4208,7 +4164,7 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A
// updated.
// If we're becoming invisible, update the client visibility if we are not running an
// animation. Otherwise, we'll update client visibility in onAnimationFinished.
- if (visible || !isReallyAnimating()) {
+ if (visible || !isAnimating()) {
setClientHidden(!visible);
}
@@ -5122,7 +5078,7 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A
final @LaunchState int launchState = info != null ? info.getLaunchState() : -1;
mStackSupervisor.reportActivityLaunchedLocked(false /* timeout */, this,
windowsDrawnDelayMs, launchState);
- mStackSupervisor.stopWaitingForActivityVisible(this);
+ mStackSupervisor.stopWaitingForActivityVisible(this, windowsDrawnDelayMs);
finishLaunchTickingLocked();
if (task != null) {
task.hasBeenVisible = true;
@@ -5288,13 +5244,13 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A
if (!allDrawn && w.mightAffectAllDrawn()) {
if (DEBUG_VISIBILITY || WM_DEBUG_ORIENTATION.isLogToLogcat()) {
Slog.v(TAG, "Eval win " + w + ": isDrawn=" + w.isDrawnLw()
- + ", isAnimationSet=" + isSelfAnimating());
+ + ", isAnimationSet=" + isAnimating(TRANSITION));
if (!w.isDrawnLw()) {
Slog.v(TAG, "Not displayed: s=" + winAnimator.mSurfaceController
+ " pv=" + w.isVisibleByPolicy()
+ " mDrawState=" + winAnimator.drawStateToString()
+ " ph=" + w.isParentWindowHidden() + " th=" + hiddenRequested
- + " a=" + isSelfAnimating());
+ + " a=" + isAnimating(TRANSITION));
}
}
@@ -5318,7 +5274,7 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A
}
}
} else if (w.isDrawnLw()) {
- onStartingWindowDrawn(SystemClock.uptimeMillis());
+ onStartingWindowDrawn(SystemClock.elapsedRealtimeNanos());
startingDisplayed = true;
}
}
@@ -5327,10 +5283,10 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A
}
/** Called when the starting window for this container is drawn. */
- private void onStartingWindowDrawn(long timestamp) {
+ private void onStartingWindowDrawn(long timestampNs) {
synchronized (mAtmService.mGlobalLock) {
mAtmService.mStackSupervisor.getActivityMetricsLogger().notifyStartingWindowDrawn(
- getWindowingMode(), timestamp);
+ getWindowingMode(), timestampNs);
}
}
@@ -5350,7 +5306,7 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A
anrActivity = getWaitingHistoryRecordLocked();
anrApp = app;
windowFromSameProcessAsActivity =
- !hasProcess() || app.getPid() == windowPid || windowPid == -1;
+ !hasProcess() || app.getPid() == windowPid || windowPid == INVALID_PID;
}
if (windowFromSameProcessAsActivity) {
@@ -5722,204 +5678,55 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A
}
}
-
@VisibleForTesting
boolean shouldAnimate(int transit) {
+ final Task task = getTask();
+ if (task != null && !task.shouldAnimate()) {
+ return false;
+ }
final boolean isSplitScreenPrimary =
getWindowingMode() == WINDOWING_MODE_SPLIT_SCREEN_PRIMARY;
final boolean allowSplitScreenPrimaryAnimation = transit != TRANSIT_WALLPAPER_OPEN;
- // Don't animate while the task runs recents animation but only if we are in the mode
- // where we cancel with deferred screenshot, which means that the controller has
- // transformed the task.
- final RecentsAnimationController controller = mWmService.getRecentsAnimationController();
- if (controller != null && controller.isAnimatingTask(getTask())
- && controller.shouldDeferCancelUntilNextTransition()) {
- return false;
- }
-
// We animate always if it's not split screen primary, and only some special cases in split
// screen primary because it causes issues with stack clipping when we run an un-minimize
// animation at the same time.
return !isSplitScreenPrimary || allowSplitScreenPrimaryAnimation;
}
- /**
- * Creates a layer to apply crop to an animation.
- */
- private SurfaceControl createAnimationBoundsLayer(Transaction t) {
- ProtoLog.i(WM_DEBUG_APP_TRANSITIONS_ANIM, "Creating animation bounds layer");
- final SurfaceControl.Builder builder = makeAnimationLeash()
- .setParent(getAnimationLeashParent())
- .setName(getSurfaceControl() + " - animation-bounds");
- final SurfaceControl boundsLayer = builder.build();
- t.show(boundsLayer);
- return boundsLayer;
+ @Override
+ boolean isChangingAppTransition() {
+ final Task task = getTask();
+ if (task != null) {
+ return task.isChangingAppTransition();
+ }
+ return super.isChangingAppTransition();
}
- boolean applyAnimationLocked(WindowManager.LayoutParams lp, int transit, boolean enter,
+ @Override
+ boolean applyAnimation(WindowManager.LayoutParams lp, int transit, boolean enter,
boolean isVoiceInteraction) {
-
if (mWmService.mDisableTransitionAnimation || !shouldAnimate(transit)) {
ProtoLog.v(WM_DEBUG_APP_TRANSITIONS_ANIM,
"applyAnimation: transition animation is disabled or skipped. "
- + "atoken=%s", this);
+ + "container=%s", this);
cancelAnimation();
return false;
}
-
- // Only apply an animation if the display isn't frozen. If it is frozen, there is no reason
- // to animate and it can cause strange artifacts when we unfreeze the display if some
- // different animation is running.
- Trace.traceBegin(TRACE_TAG_WINDOW_MANAGER, "AWT#applyAnimationLocked");
- if (okToAnimate()) {
- final AnimationAdapter adapter;
- AnimationAdapter thumbnailAdapter = null;
-
- final int appStackClipMode =
- getDisplayContent().mAppTransition.getAppStackClipMode();
-
- // Separate position and size for use in animators.
- mTmpRect.set(getAnimationBounds(appStackClipMode));
- mTmpPoint.set(mTmpRect.left, mTmpRect.top);
- mTmpRect.offsetTo(0, 0);
-
- final boolean isChanging = AppTransition.isChangeTransit(transit) && enter
- && getDisplayContent().mChangingApps.contains(this);
-
- // Delaying animation start isn't compatible with remote animations at all.
- if (getDisplayContent().mAppTransition.getRemoteAnimationController() != null
- && !mSurfaceAnimator.isAnimationStartDelayed()) {
- RemoteAnimationController.RemoteAnimationRecord adapters =
- getDisplayContent().mAppTransition.getRemoteAnimationController()
- .createRemoteAnimationRecord(this, mTmpPoint, mTmpRect,
- (isChanging ? mTransitStartRect : null));
- adapter = adapters.mAdapter;
- thumbnailAdapter = adapters.mThumbnailAdapter;
- } else if (isChanging) {
- final float durationScale = mWmService.getTransitionAnimationScaleLocked();
- mTmpRect.offsetTo(mTmpPoint.x, mTmpPoint.y);
- adapter = new LocalAnimationAdapter(
- new WindowChangeAnimationSpec(mTransitStartRect, mTmpRect,
- getDisplayContent().getDisplayInfo(), durationScale,
- true /* isAppAnimation */, false /* isThumbnail */),
- mWmService.mSurfaceAnimationRunner);
- if (mThumbnail != null) {
- thumbnailAdapter = new LocalAnimationAdapter(
- new WindowChangeAnimationSpec(mTransitStartRect, mTmpRect,
- getDisplayContent().getDisplayInfo(), durationScale,
- true /* isAppAnimation */, true /* isThumbnail */),
- mWmService.mSurfaceAnimationRunner);
- }
- mTransit = transit;
- mTransitFlags = getDisplayContent().mAppTransition.getTransitFlags();
- } else {
- mNeedsAnimationBoundsLayer = (appStackClipMode == STACK_CLIP_AFTER_ANIM);
-
- final Animation a = loadAnimation(lp, transit, enter, isVoiceInteraction);
- if (a != null) {
- // Only apply corner radius to animation if we're not in multi window mode.
- // We don't want rounded corners when in pip or split screen.
- final float windowCornerRadius = !inMultiWindowMode()
- ? getDisplayContent().getWindowCornerRadius()
- : 0;
- adapter = new LocalAnimationAdapter(
- new WindowAnimationSpec(a, mTmpPoint, mTmpRect,
- getDisplayContent().mAppTransition.canSkipFirstFrame(),
- appStackClipMode,
- true /* isAppAnimation */,
- windowCornerRadius),
- mWmService.mSurfaceAnimationRunner);
- if (a.getZAdjustment() == Animation.ZORDER_TOP) {
- mNeedsZBoost = true;
- }
- mTransit = transit;
- mTransitFlags = getDisplayContent().mAppTransition.getTransitFlags();
- } else {
- adapter = null;
- }
- }
- if (adapter != null) {
- startAnimation(getPendingTransaction(), adapter, !isVisible());
- if (adapter.getShowWallpaper()) {
- mDisplayContent.pendingLayoutChanges |= FINISH_LAYOUT_REDO_WALLPAPER;
- }
- if (thumbnailAdapter != null) {
- mThumbnail.startAnimation(
- getPendingTransaction(), thumbnailAdapter, !isVisible());
- }
- }
- } else {
- cancelAnimation();
- }
- Trace.traceEnd(TRACE_TAG_WINDOW_MANAGER);
-
- return isReallyAnimating();
+ return super.applyAnimation(lp, transit, enter, isVoiceInteraction);
}
- private Animation loadAnimation(WindowManager.LayoutParams lp, int transit, boolean enter,
- boolean isVoiceInteraction) {
- final DisplayContent displayContent = getTask().getDisplayContent();
- final DisplayInfo displayInfo = displayContent.getDisplayInfo();
- final int width = displayInfo.appWidth;
- final int height = displayInfo.appHeight;
- ProtoLog.v(WM_DEBUG_APP_TRANSITIONS_ANIM,
- "applyAnimation: atoken=%s", this);
-
- // Determine the visible rect to calculate the thumbnail clip
- final WindowState win = findMainWindow();
- final Rect frame = new Rect(0, 0, width, height);
- final Rect displayFrame = new Rect(0, 0,
- displayInfo.logicalWidth, displayInfo.logicalHeight);
- final Rect insets = new Rect();
- final Rect stableInsets = new Rect();
- Rect surfaceInsets = null;
- final boolean freeform = win != null && win.inFreeformWindowingMode();
- if (win != null) {
- // Containing frame will usually cover the whole screen, including dialog windows.
- // For freeform workspace windows it will not cover the whole screen and it also
- // won't exactly match the final freeform window frame (e.g. when overlapping with
- // the status bar). In that case we need to use the final frame.
- if (freeform) {
- frame.set(win.getFrameLw());
- } else if (win.isLetterboxedAppWindow()) {
- frame.set(getTask().getBounds());
- } else if (win.isDockedResizing()) {
- // If we are animating while docked resizing, then use the stack bounds as the
- // animation target (which will be different than the task bounds)
- frame.set(getTask().getParent().getBounds());
- } else {
- frame.set(win.getContainingFrame());
- }
- surfaceInsets = win.getAttrs().surfaceInsets;
- // XXX(b/72757033): These are insets relative to the window frame, but we're really
- // interested in the insets relative to the frame we chose in the if-blocks above.
- win.getContentInsets(insets);
- win.getStableInsets(stableInsets);
- }
-
- if (mLaunchTaskBehind) {
- // Differentiate the two animations. This one which is briefly on the screen
- // gets the !enter animation, and the other activity which remains on the
- // screen gets the enter animation. Both appear in the mOpeningApps set.
- enter = false;
- }
- ProtoLog.d(WM_DEBUG_APP_TRANSITIONS,
- "Loading animation for app transition. transit=%s enter=%b frame=%s insets=%s "
- + "surfaceInsets=%s",
- AppTransition.appTransitionToString(transit), enter, frame, insets, surfaceInsets);
- final Configuration displayConfig = displayContent.getConfiguration();
- final Animation a = getDisplayContent().mAppTransition.loadAnimation(lp, transit, enter,
- displayConfig.uiMode, displayConfig.orientation, frame, displayFrame, insets,
- surfaceInsets, stableInsets, isVoiceInteraction, freeform, getTask().mTaskId);
- if (a != null) {
- if (DEBUG_ANIM) logWithStack(TAG, "Loaded animation " + a + " for " + this);
- final int containingWidth = frame.width();
- final int containingHeight = frame.height();
- a.initialize(containingWidth, containingHeight, width, height);
- a.scaleCurrentDuration(mWmService.getTransitionAnimationScaleLocked());
- }
- return a;
+ /**
+ * Creates a layer to apply crop to an animation.
+ */
+ private SurfaceControl createAnimationBoundsLayer(Transaction t) {
+ ProtoLog.i(WM_DEBUG_APP_TRANSITIONS_ANIM, "Creating animation bounds layer");
+ final SurfaceControl.Builder builder = makeAnimationLeash()
+ .setParent(getAnimationLeashParent())
+ .setName(getSurfaceControl() + " - animation-bounds");
+ final SurfaceControl boundsLayer = builder.build();
+ t.show(boundsLayer);
+ return boundsLayer;
}
@Override
@@ -5941,6 +5748,7 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A
return (prevWinMode == WINDOWING_MODE_FREEFORM) != (newWinMode == WINDOWING_MODE_FREEFORM);
}
+ @Override
boolean isWaitingForTransitionStart() {
final DisplayContent dc = getDisplayContent();
// TODO: Test for null can be removed once unification is done.
@@ -6069,10 +5877,7 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A
@Override
void prepareSurfaces() {
- // isSelfAnimating also returns true when we are about to start a transition, so we need
- // to check super here.
- final boolean reallyAnimating = super.isSelfAnimating();
- final boolean show = !isHidden() || reallyAnimating;
+ final boolean show = !isHidden() || isAnimating();
if (mSurfaceControl != null) {
if (show && !mLastSurfaceShowing) {
@@ -6100,14 +5905,13 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A
}
void attachThumbnailAnimation() {
- if (!isReallyAnimating()) {
+ if (!isAnimating()) {
return;
}
- final int taskId = getTask().mTaskId;
final GraphicBuffer thumbnailHeader =
- getDisplayContent().mAppTransition.getAppTransitionThumbnailHeader(taskId);
+ getDisplayContent().mAppTransition.getAppTransitionThumbnailHeader(getTask());
if (thumbnailHeader == null) {
- ProtoLog.d(WM_DEBUG_APP_TRANSITIONS, "No thumbnail header bitmap for: %d", taskId);
+ ProtoLog.d(WM_DEBUG_APP_TRANSITIONS, "No thumbnail header bitmap for: %s", getTask());
return;
}
clearThumbnail();
@@ -6121,7 +5925,7 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A
* {@link android.app.ActivityOptions#ANIM_OPEN_CROSS_PROFILE_APPS} animation.
*/
void attachCrossProfileAppsThumbnailAnimation() {
- if (!isReallyAnimating()) {
+ if (!isAnimating()) {
return;
}
clearThumbnail();
@@ -6161,22 +5965,11 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A
final Rect insets = win != null ? win.getContentInsets() : null;
final Configuration displayConfig = mDisplayContent.getConfiguration();
return getDisplayContent().mAppTransition.createThumbnailAspectScaleAnimationLocked(
- appRect, insets, thumbnailHeader, getTask().mTaskId, displayConfig.uiMode,
+ appRect, insets, thumbnailHeader, getTask(), displayConfig.uiMode,
displayConfig.orientation);
}
@Override
- boolean isAppAnimating() {
- return isSelfAnimating();
- }
-
- @Override
- boolean isSelfAnimating() {
- // If we are about to start a transition, we also need to be considered animating.
- return isWaitingForTransitionStart() || isReallyAnimating();
- }
-
- @Override
public void onAnimationLeashLost(Transaction t) {
super.onAnimationLeashLost(t);
if (mAnimationBoundsLayer != null) {
@@ -6281,15 +6074,6 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A
}
}
- /**
- * @return True if and only if we are actually running an animation. Note that
- * {@link #isSelfAnimating} also returns true if we are waiting for an animation to
- * start.
- */
- private boolean isReallyAnimating() {
- return super.isSelfAnimating();
- }
-
@Override
void cancelAnimation() {
cancelAnimationOnly();
@@ -6691,6 +6475,7 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A
}
@VisibleForTesting
+ @Override
Rect getAnimationBounds(int appStackClipMode) {
if (appStackClipMode == STACK_CLIP_BEFORE_ANIM && getStack() != null) {
// Using the stack bounds here effectively applies the clipping before animation.
@@ -7643,7 +7428,7 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A
super.writeToProto(proto, WINDOW_TOKEN, logLevel);
proto.write(LAST_SURFACE_SHOWING, mLastSurfaceShowing);
proto.write(IS_WAITING_FOR_TRANSITION_START, isWaitingForTransitionStart());
- proto.write(IS_REALLY_ANIMATING, isReallyAnimating());
+ proto.write(IS_ANIMATING, isAnimating());
if (mThumbnail != null){
mThumbnail.writeToProto(proto, THUMBNAIL);
}
@@ -7765,4 +7550,35 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A
System.arraycopy(translation, 0, mTranslation, 0, mTranslation.length);
}
}
+
+ @Override
+ RemoteAnimationTarget createRemoteAnimationTarget(
+ RemoteAnimationController.RemoteAnimationRecord record) {
+ final Task task = getTask();
+ final WindowState mainWindow = findMainWindow();
+ if (task == null || mainWindow == null) {
+ return null;
+ }
+ final Rect insets = new Rect();
+ mainWindow.getContentInsets(insets);
+ InsetUtils.addInsets(insets, getLetterboxInsets());
+ return new RemoteAnimationTarget(task.mTaskId, record.getMode(),
+ record.mAdapter.mCapturedLeash, !task.fillsParent(),
+ mainWindow.mWinAnimator.mLastClipRect, insets,
+ getPrefixOrderIndex(), record.mAdapter.mPosition,
+ record.mAdapter.mStackBounds, task.getWindowConfiguration(),
+ false /*isNotInRecents*/,
+ record.mThumbnailAdapter != null ? record.mThumbnailAdapter.mCapturedLeash : null,
+ record.mStartBounds);
+ }
+
+ @Override
+ void getAnimationFrames(Rect outFrame, Rect outInsets, Rect outStableInsets,
+ Rect outSurfaceInsets) {
+ final WindowState win = findMainWindow();
+ if (win == null) {
+ return;
+ }
+ win.getAnimationFrames(outFrame, outInsets, outStableInsets, outSurfaceInsets);
+ }
}
diff --git a/services/core/java/com/android/server/wm/ActivityStackSupervisor.java b/services/core/java/com/android/server/wm/ActivityStackSupervisor.java
index 64351fb07aed..dc3d2631a5d7 100644
--- a/services/core/java/com/android/server/wm/ActivityStackSupervisor.java
+++ b/services/core/java/com/android/server/wm/ActivityStackSupervisor.java
@@ -82,6 +82,7 @@ import static com.android.server.wm.TaskRecord.LOCK_TASK_AUTH_WHITELISTED;
import static com.android.server.wm.TaskRecord.REPARENT_KEEP_STACK_AT_FRONT;
import static com.android.server.wm.TaskRecord.REPARENT_LEAVE_STACK_IN_PLACE;
import static com.android.server.wm.TaskRecord.REPARENT_MOVE_STACK_TO_FRONT;
+import static com.android.server.wm.WindowContainer.AnimationFlags.TRANSITION;
import android.Manifest;
import android.app.Activity;
@@ -561,8 +562,8 @@ public class ActivityStackSupervisor implements RecentTasks.Callbacks {
return candidateTaskId;
}
- void waitActivityVisible(ComponentName name, WaitResult result, long startTimeMs) {
- final WaitInfo waitInfo = new WaitInfo(name, result, startTimeMs);
+ void waitActivityVisible(ComponentName name, WaitResult result) {
+ final WaitInfo waitInfo = new WaitInfo(name, result);
mWaitingForActivityVisible.add(waitInfo);
}
@@ -572,10 +573,15 @@ public class ActivityStackSupervisor implements RecentTasks.Callbacks {
// down to the max limit while they are still waiting to finish.
mFinishingActivities.remove(r);
- stopWaitingForActivityVisible(r);
+ stopWaitingForActivityVisible(r, WaitResult.INVALID_DELAY);
}
void stopWaitingForActivityVisible(ActivityRecord r) {
+ stopWaitingForActivityVisible(r,
+ getActivityMetricsLogger().getLastDrawnDelayMs(r.getWindowingMode()));
+ }
+
+ void stopWaitingForActivityVisible(ActivityRecord r, long totalTime) {
boolean changed = false;
for (int i = mWaitingForActivityVisible.size() - 1; i >= 0; --i) {
final WaitInfo w = mWaitingForActivityVisible.get(i);
@@ -584,7 +590,7 @@ public class ActivityStackSupervisor implements RecentTasks.Callbacks {
changed = true;
result.timeout = false;
result.who = w.getComponent();
- result.totalTime = SystemClock.uptimeMillis() - w.getStartTime();
+ result.totalTime = totalTime;
mWaitingForActivityVisible.remove(w);
}
}
@@ -2127,7 +2133,7 @@ public class ActivityStackSupervisor implements RecentTasks.Callbacks {
for (int activityNdx = mStoppingActivities.size() - 1; activityNdx >= 0; --activityNdx) {
ActivityRecord s = mStoppingActivities.get(activityNdx);
- final boolean animating = s.isSelfAnimating();
+ final boolean animating = s.isAnimating(TRANSITION);
if (DEBUG_STATES) Slog.v(TAG, "Stopping " + s + ": nowVisible=" + nowVisible
+ " animating=" + animating + " finishing=" + s.finishing);
@@ -2823,13 +2829,10 @@ public class ActivityStackSupervisor implements RecentTasks.Callbacks {
static class WaitInfo {
private final ComponentName mTargetComponent;
private final WaitResult mResult;
- /** Time stamp when we started to wait for {@link WaitResult}. */
- private final long mStartTimeMs;
- WaitInfo(ComponentName targetComponent, WaitResult result, long startTimeMs) {
+ WaitInfo(ComponentName targetComponent, WaitResult result) {
this.mTargetComponent = targetComponent;
this.mResult = result;
- this.mStartTimeMs = startTimeMs;
}
public boolean matches(ComponentName targetComponent) {
@@ -2840,10 +2843,6 @@ public class ActivityStackSupervisor implements RecentTasks.Callbacks {
return mResult;
}
- public long getStartTime() {
- return mStartTimeMs;
- }
-
public ComponentName getComponent() {
return mTargetComponent;
}
diff --git a/services/core/java/com/android/server/wm/ActivityStarter.java b/services/core/java/com/android/server/wm/ActivityStarter.java
index f87175de1d06..d1bb2559e5be 100644
--- a/services/core/java/com/android/server/wm/ActivityStarter.java
+++ b/services/core/java/com/android/server/wm/ActivityStarter.java
@@ -107,7 +107,6 @@ import android.os.Bundle;
import android.os.IBinder;
import android.os.Process;
import android.os.RemoteException;
-import android.os.SystemClock;
import android.os.Trace;
import android.os.UserHandle;
import android.os.UserManager;
@@ -764,9 +763,7 @@ class ActivityStarter {
mRequest.waitResult.who = r.mActivityComponent;
mRequest.waitResult.totalTime = 0;
} else {
- final long startTimeMs = SystemClock.uptimeMillis();
- mSupervisor.waitActivityVisible(r.mActivityComponent, mRequest.waitResult,
- startTimeMs);
+ mSupervisor.waitActivityVisible(r.mActivityComponent, mRequest.waitResult);
// Note: the timeout variable is not currently not ever set.
do {
try {
diff --git a/services/core/java/com/android/server/wm/ActivityTaskManagerService.java b/services/core/java/com/android/server/wm/ActivityTaskManagerService.java
index 3da84811ee1b..222f26edaf5d 100644
--- a/services/core/java/com/android/server/wm/ActivityTaskManagerService.java
+++ b/services/core/java/com/android/server/wm/ActivityTaskManagerService.java
@@ -227,6 +227,7 @@ import android.util.proto.ProtoOutputStream;
import android.view.IRecentsAnimationRunner;
import android.view.RemoteAnimationAdapter;
import android.view.RemoteAnimationDefinition;
+import android.view.WindowContainerTransaction;
import android.view.WindowManager;
import com.android.internal.R;
@@ -289,6 +290,7 @@ import java.util.Arrays;
import java.util.Date;
import java.util.HashMap;
import java.util.HashSet;
+import java.util.Iterator;
import java.util.List;
import java.util.Locale;
import java.util.Map;
@@ -3249,6 +3251,47 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub {
}
}
+ private void sanitizeAndApplyConfigChange(ConfigurationContainer container,
+ WindowContainerTransaction.Change change) {
+ if (!(container instanceof TaskRecord)) {
+ throw new RuntimeException("Invalid token in task transaction");
+ }
+ // The "client"-facing API should prevent bad changes; however, just in case, sanitize
+ // masks here.
+ int configMask = change.getConfigSetMask();
+ int windowMask = change.getWindowSetMask();
+ configMask &= ActivityInfo.CONFIG_WINDOW_CONFIGURATION
+ | ActivityInfo.CONFIG_SMALLEST_SCREEN_SIZE;
+ windowMask &= WindowConfiguration.WINDOW_CONFIG_BOUNDS;
+ Configuration c = new Configuration(container.getRequestedOverrideConfiguration());
+ c.setTo(change.getConfiguration(), configMask, windowMask);
+ container.onRequestedOverrideConfigurationChanged(c);
+ }
+
+ @Override
+ public void applyContainerTransaction(WindowContainerTransaction t) {
+ mAmInternal.enforceCallingPermission(MANAGE_ACTIVITY_STACKS, "applyContainerTransaction()");
+ long ident = Binder.clearCallingIdentity();
+ try {
+ if (t == null) {
+ return;
+ }
+ synchronized (mGlobalLock) {
+ Iterator<Map.Entry<IBinder, WindowContainerTransaction.Change>> entries =
+ t.getChanges().entrySet().iterator();
+ while (entries.hasNext()) {
+ final Map.Entry<IBinder, WindowContainerTransaction.Change> entry =
+ entries.next();
+ final ConfigurationContainer cc = ConfigurationContainer.RemoteToken.fromBinder(
+ entry.getKey()).getContainer();
+ sanitizeAndApplyConfigChange(cc, entry.getValue());
+ }
+ }
+ } finally {
+ Binder.restoreCallingIdentity(ident);
+ }
+ }
+
@Override
public boolean releaseActivityInstance(IBinder token) {
synchronized (mGlobalLock) {
diff --git a/services/core/java/com/android/server/wm/AppTransition.java b/services/core/java/com/android/server/wm/AppTransition.java
index c1143c856bb4..cb9a200e6010 100644
--- a/services/core/java/com/android/server/wm/AppTransition.java
+++ b/services/core/java/com/android/server/wm/AppTransition.java
@@ -219,7 +219,7 @@ public class AppTransition implements Dump {
private int mNextAppTransitionExit;
private int mNextAppTransitionInPlace;
- // Keyed by task id.
+ // Keyed by WindowContainer hashCode.
private final SparseArray<AppTransitionAnimationSpec> mNextAppTransitionAnimationsSpecs
= new SparseArray<>();
private IAppTransitionAnimationSpecsFuture mNextAppTransitionAnimationsSpecsFuture;
@@ -372,8 +372,9 @@ public class AppTransition implements Dump {
setAppTransitionState(APP_STATE_TIMEOUT);
}
- GraphicBuffer getAppTransitionThumbnailHeader(int taskId) {
- AppTransitionAnimationSpec spec = mNextAppTransitionAnimationsSpecs.get(taskId);
+ GraphicBuffer getAppTransitionThumbnailHeader(WindowContainer container) {
+ AppTransitionAnimationSpec spec = mNextAppTransitionAnimationsSpecs.get(
+ container.hashCode());
if (spec == null) {
spec = mDefaultNextAppTransitionAnimationSpec;
}
@@ -789,14 +790,15 @@ public class AppTransition implements Dump {
}
}
- void getNextAppTransitionStartRect(int taskId, Rect rect) {
- AppTransitionAnimationSpec spec = mNextAppTransitionAnimationsSpecs.get(taskId);
+ void getNextAppTransitionStartRect(WindowContainer container, Rect rect) {
+ AppTransitionAnimationSpec spec = mNextAppTransitionAnimationsSpecs.get(
+ container.hashCode());
if (spec == null) {
spec = mDefaultNextAppTransitionAnimationSpec;
}
if (spec == null || spec.rect == null) {
- Slog.e(TAG, "Starting rect for task: " + taskId + " requested, but not available",
- new Throwable());
+ Slog.e(TAG, "Starting rect for container: " + container
+ + " requested, but not available", new Throwable());
rect.setEmpty();
} else {
rect.set(spec.rect);
@@ -1065,7 +1067,7 @@ public class AppTransition implements Dump {
* when a thumbnail is specified with the pending animation override.
*/
Animation createThumbnailAspectScaleAnimationLocked(Rect appRect, @Nullable Rect contentInsets,
- GraphicBuffer thumbnailHeader, final int taskId, int uiMode, int orientation) {
+ GraphicBuffer thumbnailHeader, WindowContainer container, int uiMode, int orientation) {
Animation a;
final int thumbWidthI = thumbnailHeader.getWidth();
final float thumbWidth = thumbWidthI > 0 ? thumbWidthI : 1;
@@ -1073,7 +1075,7 @@ public class AppTransition implements Dump {
final int appWidth = appRect.width();
float scaleW = appWidth / thumbWidth;
- getNextAppTransitionStartRect(taskId, mTmpRect);
+ getNextAppTransitionStartRect(container, mTmpRect);
final float fromX;
float fromY;
final float toX;
@@ -1226,7 +1228,7 @@ public class AppTransition implements Dump {
Animation createAspectScaledThumbnailEnterExitAnimationLocked(int thumbTransitState,
int uiMode, int orientation, int transit, Rect containingFrame, Rect contentInsets,
@Nullable Rect surfaceInsets, @Nullable Rect stableInsets, boolean freeform,
- int taskId) {
+ WindowContainer container) {
Animation a;
final int appWidth = containingFrame.width();
final int appHeight = containingFrame.height();
@@ -1244,10 +1246,10 @@ public class AppTransition implements Dump {
final boolean scaleUp = thumbTransitState == THUMBNAIL_TRANSITION_ENTER_SCALE_UP;
if (freeform && scaleUp) {
a = createAspectScaledThumbnailEnterFreeformAnimationLocked(
- containingFrame, surfaceInsets, taskId);
+ containingFrame, surfaceInsets, container);
} else if (freeform) {
a = createAspectScaledThumbnailExitFreeformAnimationLocked(
- containingFrame, surfaceInsets, taskId);
+ containingFrame, surfaceInsets, container);
} else {
AnimationSet set = new AnimationSet(true);
@@ -1359,15 +1361,15 @@ public class AppTransition implements Dump {
}
private Animation createAspectScaledThumbnailEnterFreeformAnimationLocked(Rect frame,
- @Nullable Rect surfaceInsets, int taskId) {
- getNextAppTransitionStartRect(taskId, mTmpRect);
+ @Nullable Rect surfaceInsets, WindowContainer container) {
+ getNextAppTransitionStartRect(container, mTmpRect);
return createAspectScaledThumbnailFreeformAnimationLocked(mTmpRect, frame, surfaceInsets,
true);
}
private Animation createAspectScaledThumbnailExitFreeformAnimationLocked(Rect frame,
- @Nullable Rect surfaceInsets, int taskId) {
- getNextAppTransitionStartRect(taskId, mTmpRect);
+ @Nullable Rect surfaceInsets, WindowContainer container) {
+ getNextAppTransitionStartRect(container, mTmpRect);
return createAspectScaledThumbnailFreeformAnimationLocked(frame, mTmpRect, surfaceInsets,
false);
}
@@ -1469,10 +1471,10 @@ public class AppTransition implements Dump {
* leaving, and the activity that is entering.
*/
Animation createThumbnailEnterExitAnimationLocked(int thumbTransitState, Rect containingFrame,
- int transit, int taskId) {
+ int transit, WindowContainer container) {
final int appWidth = containingFrame.width();
final int appHeight = containingFrame.height();
- final GraphicBuffer thumbnailHeader = getAppTransitionThumbnailHeader(taskId);
+ final GraphicBuffer thumbnailHeader = getAppTransitionThumbnailHeader(container);
Animation a;
getDefaultNextAppTransitionStartRect(mTmpRect);
final int thumbWidthI = thumbnailHeader != null ? thumbnailHeader.getWidth() : appWidth;
@@ -1615,7 +1617,7 @@ public class AppTransition implements Dump {
Animation loadAnimation(LayoutParams lp, int transit, boolean enter, int uiMode,
int orientation, Rect frame, Rect displayFrame, Rect insets,
@Nullable Rect surfaceInsets, @Nullable Rect stableInsets, boolean isVoiceInteraction,
- boolean freeform, int taskId) {
+ boolean freeform, WindowContainer container) {
Animation a;
if (isKeyguardGoingAwayTransit(transit) && enter) {
a = loadKeyguardExitAnimation(transit);
@@ -1679,7 +1681,7 @@ public class AppTransition implements Dump {
mNextAppTransitionScaleUp =
(mNextAppTransitionType == NEXT_TRANSIT_TYPE_THUMBNAIL_SCALE_UP);
a = createThumbnailEnterExitAnimationLocked(getThumbnailTransitionState(enter),
- frame, transit, taskId);
+ frame, transit, container);
ProtoLog.v(WM_DEBUG_APP_TRANSITIONS_ANIM,
"applyAnimation: anim=%s nextAppTransition=%s transit=%s isEntrance=%b "
+ "Callers=%s",
@@ -1692,7 +1694,7 @@ public class AppTransition implements Dump {
(mNextAppTransitionType == NEXT_TRANSIT_TYPE_THUMBNAIL_ASPECT_SCALE_UP);
a = createAspectScaledThumbnailEnterExitAnimationLocked(
getThumbnailTransitionState(enter), uiMode, orientation, transit, frame,
- insets, surfaceInsets, stableInsets, freeform, taskId);
+ insets, surfaceInsets, stableInsets, freeform, container);
ProtoLog.v(WM_DEBUG_APP_TRANSITIONS_ANIM,
"applyAnimation: anim=%s nextAppTransition=%s transit=%s isEntrance=%b "
+ "Callers=%s",
@@ -1895,7 +1897,11 @@ public class AppTransition implements Dump {
for (int i = 0; i < specs.length; i++) {
AppTransitionAnimationSpec spec = specs[i];
if (spec != null) {
- mNextAppTransitionAnimationsSpecs.put(spec.taskId, spec);
+ final WindowContainer container = findTask(spec.taskId);
+ if (container == null) {
+ continue;
+ }
+ mNextAppTransitionAnimationsSpecs.put(container.hashCode(), spec);
if (i == 0) {
// In full screen mode, the transition code depends on the default spec
// to be set.
@@ -1912,6 +1918,19 @@ public class AppTransition implements Dump {
}
}
+ private Task findTask(int taskId) {
+ if (taskId < 0) {
+ return null;
+ }
+ ArrayList<Task> tasks = new ArrayList<>();
+ mDisplayContent.forAllTasks(task -> {
+ if (task.mTaskId == taskId) {
+ tasks.add(task);
+ }
+ });
+ return tasks.size() == 1 ? tasks.get(0) : null;
+ }
+
void overridePendingAppTransitionMultiThumbFuture(
IAppTransitionAnimationSpecsFuture specsFuture, IRemoteCallback callback,
boolean scaleUp) {
diff --git a/services/core/java/com/android/server/wm/AppTransitionController.java b/services/core/java/com/android/server/wm/AppTransitionController.java
index 3bda0c25a6b0..bef6af350269 100644
--- a/services/core/java/com/android/server/wm/AppTransitionController.java
+++ b/services/core/java/com/android/server/wm/AppTransitionController.java
@@ -410,7 +410,7 @@ public class AppTransitionController {
ActivityRecord activity = apps.valueAt(i);
ProtoLog.v(WM_DEBUG_APP_TRANSITIONS, "Now changing app %s", activity);
activity.cancelAnimationOnly();
- activity.applyAnimationLocked(null, transit, true, false);
+ activity.applyAnimation(null, transit, true, false);
activity.updateReportedVisibilityLocked();
mService.openSurfaceTransaction();
try {
diff --git a/services/core/java/com/android/server/wm/ConfigurationContainer.java b/services/core/java/com/android/server/wm/ConfigurationContainer.java
index 70d5ab93421e..8b4f7cc571f8 100644
--- a/services/core/java/com/android/server/wm/ConfigurationContainer.java
+++ b/services/core/java/com/android/server/wm/ConfigurationContainer.java
@@ -39,11 +39,15 @@ import android.app.WindowConfiguration;
import android.content.res.Configuration;
import android.graphics.Point;
import android.graphics.Rect;
+import android.os.IBinder;
import android.util.proto.ProtoOutputStream;
+import android.view.IWindowContainer;
+import android.view.SurfaceControl;
import com.android.internal.annotations.VisibleForTesting;
import java.io.PrintWriter;
+import java.lang.ref.WeakReference;
import java.util.ArrayList;
/**
@@ -102,6 +106,11 @@ public abstract class ConfigurationContainer<E extends ConfigurationContainer> {
// Return value from {@link setBounds} indicating the size of the override bounds changed.
static final int BOUNDS_CHANGE_SIZE = 1 << 1;
+ /**
+ * Used as a unique, cross-process identifier for this Container. It also serves a minimal
+ * interface to other processes.
+ */
+ RemoteToken mRemoteToken = null;
/**
* Returns full configuration applied to this configuration container.
@@ -634,4 +643,37 @@ public abstract class ConfigurationContainer<E extends ConfigurationContainer> {
abstract protected E getChildAt(int index);
abstract protected ConfigurationContainer getParent();
+
+ // TODO: Consider moving to WindowContainer once hierarchies and Task/Stack are merged.
+ static class RemoteToken extends IWindowContainer.Stub {
+ final WeakReference<ConfigurationContainer> mWeakRef;
+
+ RemoteToken(ConfigurationContainer container) {
+ mWeakRef = new WeakReference<>(container);
+ }
+
+ ConfigurationContainer getContainer() {
+ return mWeakRef.get();
+ }
+
+ static RemoteToken fromBinder(IBinder binder) {
+ return (RemoteToken) binder;
+ }
+
+ @Override
+ public SurfaceControl getLeash() {
+ throw new RuntimeException("Not implemented");
+ }
+
+ @Override
+ public String toString() {
+ StringBuilder sb = new StringBuilder(128);
+ sb.append("RemoteToken{");
+ sb.append(Integer.toHexString(System.identityHashCode(this)));
+ sb.append(' ');
+ sb.append(mWeakRef.get());
+ sb.append('}');
+ return sb.toString();
+ }
+ }
}
diff --git a/services/core/java/com/android/server/wm/DisplayContent.java b/services/core/java/com/android/server/wm/DisplayContent.java
index 2d1d29710c95..89568ebf4277 100644
--- a/services/core/java/com/android/server/wm/DisplayContent.java
+++ b/services/core/java/com/android/server/wm/DisplayContent.java
@@ -106,6 +106,8 @@ import static com.android.server.wm.ProtoLogGroup.WM_DEBUG_FOCUS_LIGHT;
import static com.android.server.wm.ProtoLogGroup.WM_DEBUG_ORIENTATION;
import static com.android.server.wm.ProtoLogGroup.WM_DEBUG_SCREEN_ON;
import static com.android.server.wm.ProtoLogGroup.WM_SHOW_TRANSACTIONS;
+import static com.android.server.wm.WindowContainer.AnimationFlags.PARENTS;
+import static com.android.server.wm.WindowContainer.AnimationFlags.TRANSITION;
import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_DISPLAY;
import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_INPUT_METHOD;
import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_LAYOUT;
@@ -2363,7 +2365,7 @@ class DisplayContent extends WindowContainer<DisplayContent.DisplayChildWindowCo
@Override
void removeIfPossible() {
- if (isAnimating()) {
+ if (isAnimating(TRANSITION | PARENTS)) {
mDeferredRemoval = true;
return;
}
@@ -3165,13 +3167,15 @@ class DisplayContent extends WindowContainer<DisplayContent.DisplayChildWindowCo
// to look at all windows below the current target that are in this app, finding the
// highest visible one in layering.
WindowState highestTarget = null;
- if (activity.isSelfAnimating()) {
+ if (activity.isAnimating(TRANSITION)) {
highestTarget = activity.getHighestAnimLayerWindow(curTarget);
}
if (highestTarget != null) {
- if (DEBUG_INPUT_METHOD) Slog.v(TAG_WM, mAppTransition + " " + highestTarget
- + " animating=" + highestTarget.isAnimating());
+ if (DEBUG_INPUT_METHOD) {
+ Slog.v(TAG_WM, mAppTransition + " " + highestTarget + " animating="
+ + highestTarget.isAnimating(TRANSITION | PARENTS));
+ }
if (mAppTransition.isTransitionSet()) {
// If we are currently setting up for an animation, hold everything until we
@@ -4322,7 +4326,7 @@ class DisplayContent extends WindowContainer<DisplayContent.DisplayChildWindowCo
// The split screen divider anchor is located above the split screen window.
layerForSplitScreenDividerAnchor = layer++;
}
- if (s.isTaskAnimating() || s.isAppAnimating()) {
+ if (s.isTaskAnimating() || s.isAppTransitioning()) {
// The animation layer is located above the highest animating stack and no
// higher.
layerForAnimationLayer = layer++;
@@ -4651,7 +4655,8 @@ class DisplayContent extends WindowContainer<DisplayContent.DisplayChildWindowCo
// so it get's layered above the starting window.
if (imeTarget != null
&& !(imeTarget.mActivityRecord != null && imeTarget.mActivityRecord.hasStartingWindow())
- && (!(imeTarget.inSplitScreenWindowingMode() || imeTarget.mToken.isAppAnimating())
+ && (!(imeTarget.inSplitScreenWindowingMode()
+ || imeTarget.mToken.isAppTransitioning())
&& (imeTarget.getSurfaceControl() != null))) {
mImeWindowsContainers.assignRelativeLayer(t, imeTarget.getSurfaceControl(),
// TODO: We need to use an extra level on the app surface to ensure
diff --git a/services/core/java/com/android/server/wm/InputManagerCallback.java b/services/core/java/com/android/server/wm/InputManagerCallback.java
index 7f9e76b0c7e0..1ebbb0294204 100644
--- a/services/core/java/com/android/server/wm/InputManagerCallback.java
+++ b/services/core/java/com/android/server/wm/InputManagerCallback.java
@@ -4,6 +4,7 @@ import static android.app.WindowConfiguration.WINDOWING_MODE_FREEFORM;
import static android.view.Display.DEFAULT_DISPLAY;
import static android.view.WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY;
+import static com.android.server.wm.ActivityRecord.INVALID_PID;
import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_INPUT;
import static com.android.server.wm.WindowManagerDebugConfig.TAG_WITH_CLASS_NAME;
import static com.android.server.wm.WindowManagerDebugConfig.TAG_WM;
@@ -14,6 +15,7 @@ import android.os.IBinder;
import android.os.RemoteException;
import android.util.Slog;
import android.view.IWindow;
+import android.view.InputApplicationHandle;
import android.view.KeyEvent;
import android.view.WindowManager;
@@ -80,7 +82,8 @@ final class InputManagerCallback implements InputManagerService.WindowManagerCal
* Called by the InputManager.
*/
@Override
- public long notifyANR(IBinder token, String reason) {
+ public long notifyANR(InputApplicationHandle inputApplicationHandle,
+ IBinder token, String reason) {
ActivityRecord activity = null;
WindowState windowState = null;
boolean aboveSystem = false;
@@ -93,6 +96,10 @@ final class InputManagerCallback implements InputManagerService.WindowManagerCal
}
}
+ if (activity == null && inputApplicationHandle != null) {
+ activity = ActivityRecord.forTokenLocked(inputApplicationHandle.token);
+ }
+
if (windowState != null) {
Slog.i(TAG_WM, "Input event dispatching timed out "
+ "sending to " + windowState.mAttrs.getTitle()
@@ -122,7 +129,7 @@ final class InputManagerCallback implements InputManagerService.WindowManagerCal
// Notify the activity manager about the timeout and let it decide whether
// to abort dispatching or keep waiting.
final boolean abort = activity.keyDispatchingTimedOut(reason,
- windowState.mSession.mPid);
+ (windowState != null) ? windowState.mSession.mPid : INVALID_PID);
if (!abort) {
// The activity manager declined to abort dispatching.
// Wait a bit longer and timeout again later.
diff --git a/services/core/java/com/android/server/wm/RefreshRatePolicy.java b/services/core/java/com/android/server/wm/RefreshRatePolicy.java
index 0c0cf9262e44..e0a7b18f40c0 100644
--- a/services/core/java/com/android/server/wm/RefreshRatePolicy.java
+++ b/services/core/java/com/android/server/wm/RefreshRatePolicy.java
@@ -16,6 +16,9 @@
package com.android.server.wm;
+import static com.android.server.wm.WindowContainer.AnimationFlags.PARENTS;
+import static com.android.server.wm.WindowContainer.AnimationFlags.TRANSITION;
+
import android.util.ArraySet;
import android.view.Display.Mode;
import android.view.DisplayInfo;
@@ -67,7 +70,7 @@ class RefreshRatePolicy {
// If app is animating, it's not able to control refresh rate because we want the animation
// to run in default refresh rate.
- if (w.isAnimating()) {
+ if (w.isAnimating(TRANSITION | PARENTS)) {
return 0;
}
diff --git a/services/core/java/com/android/server/wm/RemoteAnimationController.java b/services/core/java/com/android/server/wm/RemoteAnimationController.java
index c23ffd964e06..efd124164779 100644
--- a/services/core/java/com/android/server/wm/RemoteAnimationController.java
+++ b/services/core/java/com/android/server/wm/RemoteAnimationController.java
@@ -41,7 +41,6 @@ import com.android.internal.util.FastPrintWriter;
import com.android.server.protolog.ProtoLogImpl;
import com.android.server.protolog.common.ProtoLog;
import com.android.server.wm.SurfaceAnimator.OnAnimationFinishedCallback;
-import com.android.server.wm.utils.InsetUtils;
import java.io.PrintWriter;
import java.io.StringWriter;
@@ -76,20 +75,20 @@ class RemoteAnimationController implements DeathRecipient {
}
/**
- * Creates an animation record for each individual {@link ActivityRecord}.
+ * Creates an animation record for each individual {@link WindowContainer}.
*
- * @param activity The app to animate.
+ * @param windowContainer The windows to animate.
* @param position The position app bounds, in screen coordinates.
* @param stackBounds The stack bounds of the app relative to position.
* @param startBounds The stack bounds before the transition, in screen coordinates
* @return The record representing animation(s) to run on the app.
*/
- RemoteAnimationRecord createRemoteAnimationRecord(ActivityRecord activity, Point position,
- Rect stackBounds, Rect startBounds) {
- ProtoLog.d(WM_DEBUG_REMOTE_ANIMATIONS, "createAnimationAdapter(): token=%s",
- activity);
+ RemoteAnimationRecord createRemoteAnimationRecord(WindowContainer windowContainer,
+ Point position, Rect stackBounds, Rect startBounds) {
+ ProtoLog.d(WM_DEBUG_REMOTE_ANIMATIONS, "createAnimationAdapter(): container=%s",
+ windowContainer);
final RemoteAnimationRecord adapters =
- new RemoteAnimationRecord(activity, position, stackBounds, startBounds);
+ new RemoteAnimationRecord(windowContainer, position, stackBounds, startBounds);
mPendingAnimations.add(adapters);
return adapters;
}
@@ -169,11 +168,12 @@ class RemoteAnimationController implements DeathRecipient {
final RemoteAnimationRecord wrappers = mPendingAnimations.get(i);
final RemoteAnimationTarget target = wrappers.createRemoteAnimationTarget();
if (target != null) {
- ProtoLog.d(WM_DEBUG_REMOTE_ANIMATIONS, "\tAdd token=%s", wrappers.mActivityRecord);
+ ProtoLog.d(WM_DEBUG_REMOTE_ANIMATIONS, "\tAdd container=%s",
+ wrappers.mWindowContainer);
targets.add(target);
} else {
- ProtoLog.d(WM_DEBUG_REMOTE_ANIMATIONS, "\tRemove token=%s",
- wrappers.mActivityRecord);
+ ProtoLog.d(WM_DEBUG_REMOTE_ANIMATIONS, "\tRemove container=%s",
+ wrappers.mWindowContainer);
// We can't really start an animation but we still need to make sure to finish the
// pending animation that was started by SurfaceAnimator
@@ -228,7 +228,8 @@ class RemoteAnimationController implements DeathRecipient {
.onAnimationFinished(adapters.mThumbnailAdapter);
}
mPendingAnimations.remove(i);
- ProtoLog.d(WM_DEBUG_REMOTE_ANIMATIONS, "\tapp=%s", adapters.mActivityRecord);
+ ProtoLog.d(WM_DEBUG_REMOTE_ANIMATIONS, "\tcontainer=%s",
+ adapters.mWindowContainer);
}
for (int i = mPendingWallpaperAnimations.size() - 1; i >= 0; i--) {
@@ -332,7 +333,7 @@ class RemoteAnimationController implements DeathRecipient {
};
/**
- * Contains information about a remote-animation for one AppWindowToken. This keeps track of,
+ * Contains information about a remote-animation for one WindowContainer. This keeps track of,
* potentially, multiple animating surfaces (AdapterWrappers) associated with one
* Window/Transition. For example, a change transition has an adapter controller for the
* main window and an adapter controlling the start-state snapshot.
@@ -345,12 +346,12 @@ class RemoteAnimationController implements DeathRecipient {
RemoteAnimationAdapterWrapper mAdapter;
RemoteAnimationAdapterWrapper mThumbnailAdapter = null;
RemoteAnimationTarget mTarget;
- final ActivityRecord mActivityRecord;
+ final WindowContainer mWindowContainer;
final Rect mStartBounds;
- RemoteAnimationRecord(ActivityRecord activityRecord, Point endPos, Rect endBounds,
+ RemoteAnimationRecord(WindowContainer windowContainer, Point endPos, Rect endBounds,
Rect startBounds) {
- mActivityRecord = activityRecord;
+ mWindowContainer = windowContainer;
mAdapter = new RemoteAnimationAdapterWrapper(this, endPos, endBounds);
if (startBounds != null) {
mStartBounds = new Rect(startBounds);
@@ -366,31 +367,20 @@ class RemoteAnimationController implements DeathRecipient {
}
RemoteAnimationTarget createRemoteAnimationTarget() {
- final Task task = mActivityRecord.getTask();
- final WindowState mainWindow = mActivityRecord.findMainWindow();
- if (task == null || mainWindow == null || mAdapter == null
+ if (mAdapter == null
|| mAdapter.mCapturedFinishCallback == null
|| mAdapter.mCapturedLeash == null) {
return null;
}
- final Rect insets = new Rect();
- mainWindow.getContentInsets(insets);
- InsetUtils.addInsets(insets, mActivityRecord.getLetterboxInsets());
- mTarget = new RemoteAnimationTarget(task.mTaskId, getMode(),
- mAdapter.mCapturedLeash, !mActivityRecord.fillsParent(),
- mainWindow.mWinAnimator.mLastClipRect, insets,
- mActivityRecord.getPrefixOrderIndex(), mAdapter.mPosition,
- mAdapter.mStackBounds, task.getWindowConfiguration(), false /*isNotInRecents*/,
- mThumbnailAdapter != null ? mThumbnailAdapter.mCapturedLeash : null,
- mStartBounds);
+ mTarget = mWindowContainer.createRemoteAnimationTarget(this);
return mTarget;
}
- private int getMode() {
- final DisplayContent dc = mActivityRecord.getDisplayContent();
- if (dc.mOpeningApps.contains(mActivityRecord)) {
+ int getMode() {
+ final DisplayContent dc = mWindowContainer.getDisplayContent();
+ if (dc.mOpeningApps.contains(mWindowContainer)) {
return RemoteAnimationTarget.MODE_OPENING;
- } else if (dc.mChangingApps.contains(mActivityRecord)) {
+ } else if (dc.mChangingApps.contains(mWindowContainer)) {
return RemoteAnimationTarget.MODE_CHANGING;
} else {
return RemoteAnimationTarget.MODE_CLOSING;
@@ -398,12 +388,12 @@ class RemoteAnimationController implements DeathRecipient {
}
}
- private class RemoteAnimationAdapterWrapper implements AnimationAdapter {
+ class RemoteAnimationAdapterWrapper implements AnimationAdapter {
private final RemoteAnimationRecord mRecord;
SurfaceControl mCapturedLeash;
private OnAnimationFinishedCallback mCapturedFinishCallback;
- private final Point mPosition = new Point();
- private final Rect mStackBounds = new Rect();
+ final Point mPosition = new Point();
+ final Rect mStackBounds = new Rect();
RemoteAnimationAdapterWrapper(RemoteAnimationRecord record, Point position,
Rect stackBounds) {
@@ -423,7 +413,7 @@ class RemoteAnimationController implements DeathRecipient {
ProtoLog.d(WM_DEBUG_REMOTE_ANIMATIONS, "startAnimation");
// Restore z-layering, position and stack crop until client has a chance to modify it.
- t.setLayer(animationLeash, mRecord.mActivityRecord.getPrefixOrderIndex());
+ t.setLayer(animationLeash, mRecord.mWindowContainer.getPrefixOrderIndex());
if (mRecord.mStartBounds != null) {
t.setPosition(animationLeash, mRecord.mStartBounds.left, mRecord.mStartBounds.top);
t.setWindowCrop(animationLeash, mRecord.mStartBounds.width(),
@@ -464,7 +454,7 @@ class RemoteAnimationController implements DeathRecipient {
@Override
public void dump(PrintWriter pw, String prefix) {
- pw.print(prefix); pw.print("token="); pw.println(mRecord.mActivityRecord);
+ pw.print(prefix); pw.print("container="); pw.println(mRecord.mWindowContainer);
if (mRecord.mTarget != null) {
pw.print(prefix); pw.println("Target:");
mRecord.mTarget.dump(pw, prefix + " ");
diff --git a/services/core/java/com/android/server/wm/RootActivityContainer.java b/services/core/java/com/android/server/wm/RootActivityContainer.java
index 9db6dc263944..51a3e7205489 100644
--- a/services/core/java/com/android/server/wm/RootActivityContainer.java
+++ b/services/core/java/com/android/server/wm/RootActivityContainer.java
@@ -1154,7 +1154,7 @@ class RootActivityContainer extends ConfigurationContainer
// activity is started and resumed, and no recursion occurs.
final ActivityStack focusedStack = display.getFocusedStack();
if (focusedStack != null) {
- focusedStack.resumeTopActivityUncheckedLocked(target, targetOptions);
+ result |= focusedStack.resumeTopActivityUncheckedLocked(target, targetOptions);
}
}
}
diff --git a/services/core/java/com/android/server/wm/RootWindowContainer.java b/services/core/java/com/android/server/wm/RootWindowContainer.java
index 17f5abdda2c7..f5d3affa89ef 100644
--- a/services/core/java/com/android/server/wm/RootWindowContainer.java
+++ b/services/core/java/com/android/server/wm/RootWindowContainer.java
@@ -787,7 +787,7 @@ class RootWindowContainer extends WindowContainer<DisplayContent>
}
}
- if (curDisplay.mAppTransition.isRunning() && !curDisplay.isAppAnimating()) {
+ if (curDisplay.mAppTransition.isRunning() && !curDisplay.isAppTransitioning()) {
// We have finished the animation of an app transition. To do this, we have
// delayed a lot of operations like showing and hiding apps, moving apps in
// Z-order, etc.
diff --git a/services/core/java/com/android/server/wm/Task.java b/services/core/java/com/android/server/wm/Task.java
index bf7dd57e82ed..634990b5fdf2 100644
--- a/services/core/java/com/android/server/wm/Task.java
+++ b/services/core/java/com/android/server/wm/Task.java
@@ -28,13 +28,14 @@ import static com.android.server.EventLogTags.WM_TASK_REMOVED;
import static com.android.server.wm.DragResizeMode.DRAG_RESIZE_MODE_DOCKED_DIVIDER;
import static com.android.server.wm.TaskProto.APP_WINDOW_TOKENS;
import static com.android.server.wm.TaskProto.BOUNDS;
-import static com.android.server.wm.TaskProto.DEFER_REMOVAL;
import static com.android.server.wm.TaskProto.DISPLAYED_BOUNDS;
import static com.android.server.wm.TaskProto.FILLS_PARENT;
import static com.android.server.wm.TaskProto.ID;
import static com.android.server.wm.TaskProto.SURFACE_HEIGHT;
import static com.android.server.wm.TaskProto.SURFACE_WIDTH;
import static com.android.server.wm.TaskProto.WINDOW_CONTAINER;
+import static com.android.server.wm.WindowContainer.AnimationFlags.CHILDREN;
+import static com.android.server.wm.WindowContainer.AnimationFlags.TRANSITION;
import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_STACK;
import static com.android.server.wm.WindowManagerDebugConfig.TAG_WITH_CLASS_NAME;
import static com.android.server.wm.WindowManagerDebugConfig.TAG_WM;
@@ -50,6 +51,7 @@ import android.util.EventLog;
import android.util.Slog;
import android.util.proto.ProtoOutputStream;
import android.view.Display;
+import android.view.RemoteAnimationTarget;
import android.view.Surface;
import android.view.SurfaceControl;
@@ -204,7 +206,7 @@ class Task extends WindowContainer<ActivityRecord> implements ConfigurationConta
// No reason to defer removal of a Task that doesn't have any child.
return false;
}
- return hasWindowsAlive() && mStack.isSelfOrChildAnimating();
+ return hasWindowsAlive() && mStack.isAnimating(TRANSITION | CHILDREN);
}
@Override
@@ -469,6 +471,17 @@ class Task extends WindowContainer<ActivityRecord> implements ConfigurationConta
}
}
+ @Override
+ void getAnimationFrames(Rect outFrame, Rect outInsets, Rect outStableInsets,
+ Rect outSurfaceInsets) {
+ final WindowState windowState = getTopVisibleAppMainWindow();
+ if (windowState != null) {
+ windowState.getAnimationFrames(outFrame, outInsets, outStableInsets, outSurfaceInsets);
+ } else {
+ super.getAnimationFrames(outFrame, outInsets, outStableInsets, outSurfaceInsets);
+ }
+ }
+
/**
* Calculate the maximum visible area of this task. If the task has only one app,
* the result will be visible frame of that app. If the task has more than one apps,
@@ -645,6 +658,18 @@ class Task extends WindowContainer<ActivityRecord> implements ConfigurationConta
return getAppAnimationLayer(ANIMATION_LAYER_HOME);
}
+ boolean shouldAnimate() {
+ // Don't animate while the task runs recents animation but only if we are in the mode
+ // where we cancel with deferred screenshot, which means that the controller has
+ // transformed the task.
+ final RecentsAnimationController controller = mWmService.getRecentsAnimationController();
+ if (controller != null && controller.isAnimatingTask(this)
+ && controller.shouldDeferCancelUntilNextTransition()) {
+ return false;
+ }
+ return true;
+ }
+
@Override
SurfaceControl.Builder makeSurface() {
return super.makeSurface().setMetadata(METADATA_TASK_ID, mTaskId);
@@ -660,6 +685,22 @@ class Task extends WindowContainer<ActivityRecord> implements ConfigurationConta
return false;
}
+ /**
+ * @return {@code true} if changing app transition is running.
+ */
+ @Override
+ boolean isChangingAppTransition() {
+ final ActivityRecord activity = getTopVisibleActivity();
+ return activity != null && getDisplayContent().mChangingApps.contains(activity);
+ }
+
+ @Override
+ RemoteAnimationTarget createRemoteAnimationTarget(
+ RemoteAnimationController.RemoteAnimationRecord record) {
+ final ActivityRecord activity = getTopVisibleActivity();
+ return activity != null ? activity.createRemoteAnimationTarget(record) : null;
+ }
+
WindowState getTopVisibleAppMainWindow() {
final ActivityRecord activity = getTopVisibleActivity();
return activity != null ? activity.findMainWindow() : null;
diff --git a/services/core/java/com/android/server/wm/TaskRecord.java b/services/core/java/com/android/server/wm/TaskRecord.java
index 166bd058b080..6920d9d3a770 100644
--- a/services/core/java/com/android/server/wm/TaskRecord.java
+++ b/services/core/java/com/android/server/wm/TaskRecord.java
@@ -77,7 +77,6 @@ import static com.android.server.wm.ActivityStackSupervisor.REMOVE_FROM_RECENTS;
import static com.android.server.wm.ActivityTaskManagerDebugConfig.DEBUG_ADD_REMOVE;
import static com.android.server.wm.ActivityTaskManagerDebugConfig.DEBUG_LOCKTASK;
import static com.android.server.wm.ActivityTaskManagerDebugConfig.DEBUG_RECENTS;
-import static com.android.server.wm.ActivityTaskManagerDebugConfig.DEBUG_STATES;
import static com.android.server.wm.ActivityTaskManagerDebugConfig.DEBUG_TASKS;
import static com.android.server.wm.ActivityTaskManagerDebugConfig.POSTFIX_ADD_REMOVE;
import static com.android.server.wm.ActivityTaskManagerDebugConfig.POSTFIX_LOCKTASK;
@@ -378,6 +377,7 @@ class TaskRecord extends ConfigurationContainer {
IVoiceInteractionSession _voiceSession, IVoiceInteractor _voiceInteractor) {
mAtmService = atmService;
mTaskId = _taskId;
+ mRemoteToken = new RemoteToken(this);
affinityIntent = _affinityIntent;
affinity = _affinity;
rootAffinity = _rootAffinity;
diff --git a/services/core/java/com/android/server/wm/TaskStack.java b/services/core/java/com/android/server/wm/TaskStack.java
index 355224536066..56211e25f421 100644
--- a/services/core/java/com/android/server/wm/TaskStack.java
+++ b/services/core/java/com/android/server/wm/TaskStack.java
@@ -52,6 +52,8 @@ import static com.android.server.wm.StackProto.ID;
import static com.android.server.wm.StackProto.MINIMIZE_AMOUNT;
import static com.android.server.wm.StackProto.TASKS;
import static com.android.server.wm.StackProto.WINDOW_CONTAINER;
+import static com.android.server.wm.WindowContainer.AnimationFlags.CHILDREN;
+import static com.android.server.wm.WindowContainer.AnimationFlags.TRANSITION;
import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_STACK;
import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_TASK_MOVEMENT;
import static com.android.server.wm.WindowManagerDebugConfig.TAG_WM;
@@ -69,6 +71,7 @@ import android.util.Slog;
import android.util.proto.ProtoOutputStream;
import android.view.DisplayCutout;
import android.view.DisplayInfo;
+import android.view.RemoteAnimationTarget;
import android.view.SurfaceControl;
import com.android.internal.annotations.VisibleForTesting;
@@ -934,7 +937,7 @@ public class TaskStack extends WindowContainer<Task> implements
@Override
void removeIfPossible() {
- if (isSelfOrChildAnimating()) {
+ if (isAnimating(TRANSITION | CHILDREN)) {
mDeferRemoval = true;
return;
}
@@ -1792,7 +1795,7 @@ public class TaskStack extends WindowContainer<Task> implements
/** Returns true if a removal action is still being deferred. */
boolean checkCompleteDeferredRemoval() {
- if (isSelfOrChildAnimating()) {
+ if (isAnimating(TRANSITION | CHILDREN)) {
return true;
}
if (mDeferRemoval) {
@@ -1866,4 +1869,22 @@ public class TaskStack extends WindowContainer<Task> implements
AnimatingActivityRegistry getAnimatingActivityRegistry() {
return mAnimatingActivityRegistry;
}
+
+ @Override
+ void getAnimationFrames(Rect outFrame, Rect outInsets, Rect outStableInsets,
+ Rect outSurfaceInsets) {
+ final Task task = getTopChild();
+ if (task != null) {
+ task.getAnimationFrames(outFrame, outInsets, outStableInsets, outSurfaceInsets);
+ } else {
+ super.getAnimationFrames(outFrame, outInsets, outStableInsets, outSurfaceInsets);
+ }
+ }
+
+ @Override
+ RemoteAnimationTarget createRemoteAnimationTarget(
+ RemoteAnimationController.RemoteAnimationRecord record) {
+ final Task task = getTopChild();
+ return task != null ? task.createRemoteAnimationTarget(record) : null;
+ }
}
diff --git a/services/core/java/com/android/server/wm/WallpaperController.java b/services/core/java/com/android/server/wm/WallpaperController.java
index 1e13aef2f8eb..3632284fdeb6 100644
--- a/services/core/java/com/android/server/wm/WallpaperController.java
+++ b/services/core/java/com/android/server/wm/WallpaperController.java
@@ -24,6 +24,8 @@ import static android.view.WindowManager.LayoutParams.TYPE_WALLPAPER;
import static android.view.WindowManager.TRANSIT_FLAG_KEYGUARD_GOING_AWAY_WITH_WALLPAPER;
import static com.android.server.policy.WindowManagerPolicy.FINISH_LAYOUT_REDO_WALLPAPER;
+import static com.android.server.wm.WindowContainer.AnimationFlags.PARENTS;
+import static com.android.server.wm.WindowContainer.AnimationFlags.TRANSITION;
import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_SCREENSHOT;
import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_WALLPAPER;
import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_WALLPAPER_LIGHT;
@@ -118,7 +120,8 @@ class WallpaperController {
}
mFindResults.resetTopWallpaper = true;
- if (w.mActivityRecord != null && w.mActivityRecord.isHidden() && !w.mActivityRecord.isSelfAnimating()) {
+ if (w.mActivityRecord != null && w.mActivityRecord.isHidden()
+ && !w.mActivityRecord.isAnimating(TRANSITION)) {
// If this window's app token is hidden and not animating, it is of no interest to us.
if (DEBUG_WALLPAPER) Slog.v(TAG, "Skipping hidden and not animating token: " + w);
@@ -136,7 +139,7 @@ class WallpaperController {
}
final boolean keyguardGoingAwayWithWallpaper = (w.mActivityRecord != null
- && w.mActivityRecord.isSelfAnimating()
+ && w.mActivityRecord.isAnimating(TRANSITION)
&& AppTransition.isKeyguardGoingAwayTransit(w.mActivityRecord.getTransit())
&& (w.mActivityRecord.getTransitFlags()
& TRANSIT_FLAG_KEYGUARD_GOING_AWAY_WITH_WALLPAPER) != 0);
@@ -159,7 +162,8 @@ class WallpaperController {
final RecentsAnimationController recentsAnimationController =
mService.getRecentsAnimationController();
- final boolean animationWallpaper = w.mActivityRecord != null && w.mActivityRecord.getAnimation() != null
+ final boolean animationWallpaper = w.mActivityRecord != null
+ && w.mActivityRecord.getAnimation() != null
&& w.mActivityRecord.getAnimation().getShowWallpaper();
final boolean hasWallpaper = (w.mAttrs.flags & FLAG_SHOW_WALLPAPER) != 0
|| animationWallpaper;
@@ -173,7 +177,7 @@ class WallpaperController {
&& (mWallpaperTarget == w || w.isDrawFinishedLw())) {
if (DEBUG_WALLPAPER) Slog.v(TAG, "Found wallpaper target: " + w);
mFindResults.setWallpaperTarget(w);
- if (w == mWallpaperTarget && w.isAnimating()) {
+ if (w == mWallpaperTarget && w.isAnimating(TRANSITION | PARENTS)) {
// The current wallpaper target is animating, so we'll look behind it for
// another possible target and figure out what is going on later.
if (DEBUG_WALLPAPER) Slog.v(TAG,
@@ -224,19 +228,19 @@ class WallpaperController {
if (DEBUG_WALLPAPER) Slog.v(TAG, "Wallpaper vis: target " + wallpaperTarget + ", obscured="
+ (wallpaperTarget != null ? Boolean.toString(wallpaperTarget.mObscured) : "??")
+ " animating=" + ((wallpaperTarget != null && wallpaperTarget.mActivityRecord != null)
- ? wallpaperTarget.mActivityRecord.isSelfAnimating() : null)
+ ? wallpaperTarget.mActivityRecord.isAnimating(TRANSITION) : null)
+ " prev=" + mPrevWallpaperTarget
+ " recentsAnimationWallpaperVisible=" + isAnimatingWithRecentsComponent);
return (wallpaperTarget != null
&& (!wallpaperTarget.mObscured
|| isAnimatingWithRecentsComponent
|| (wallpaperTarget.mActivityRecord != null
- && wallpaperTarget.mActivityRecord.isSelfAnimating())))
+ && wallpaperTarget.mActivityRecord.isAnimating(TRANSITION))))
|| mPrevWallpaperTarget != null;
}
boolean isWallpaperTargetAnimating() {
- return mWallpaperTarget != null && mWallpaperTarget.isAnimating()
+ return mWallpaperTarget != null && mWallpaperTarget.isAnimating(TRANSITION | PARENTS)
&& (mWallpaperTarget.mActivityRecord == null
|| !mWallpaperTarget.mActivityRecord.isWaitingForTransitionStart());
}
diff --git a/services/core/java/com/android/server/wm/WindowAnimator.java b/services/core/java/com/android/server/wm/WindowAnimator.java
index 3a1d6e047fa8..f7525a913e33 100644
--- a/services/core/java/com/android/server/wm/WindowAnimator.java
+++ b/services/core/java/com/android/server/wm/WindowAnimator.java
@@ -17,6 +17,8 @@
package com.android.server.wm;
import static com.android.server.wm.ProtoLogGroup.WM_SHOW_TRANSACTIONS;
+import static com.android.server.wm.WindowContainer.AnimationFlags.CHILDREN;
+import static com.android.server.wm.WindowContainer.AnimationFlags.TRANSITION;
import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_WINDOW_TRACE;
import static com.android.server.wm.WindowManagerDebugConfig.TAG_WITH_CLASS_NAME;
import static com.android.server.wm.WindowManagerDebugConfig.TAG_WM;
@@ -192,7 +194,7 @@ public class WindowAnimator {
mService.mWindowPlacerLocked.requestTraversal();
}
- final boolean rootAnimating = mService.mRoot.isSelfOrChildAnimating();
+ final boolean rootAnimating = mService.mRoot.isAnimating(TRANSITION | CHILDREN);
if (rootAnimating && !mLastRootAnimating) {
// Usually app transitions but quite a load onto the system already (with all the
diff --git a/services/core/java/com/android/server/wm/WindowContainer.java b/services/core/java/com/android/server/wm/WindowContainer.java
index a620a7cfe42b..7ce2b5eb727b 100644
--- a/services/core/java/com/android/server/wm/WindowContainer.java
+++ b/services/core/java/com/android/server/wm/WindowContainer.java
@@ -24,8 +24,15 @@ import static android.content.pm.ActivityInfo.isFixedOrientationPortrait;
import static android.content.res.Configuration.ORIENTATION_LANDSCAPE;
import static android.content.res.Configuration.ORIENTATION_PORTRAIT;
import static android.content.res.Configuration.ORIENTATION_UNDEFINED;
+import static android.os.Trace.TRACE_TAG_WINDOW_MANAGER;
import static android.view.SurfaceControl.Transaction;
+import static com.android.server.policy.WindowManagerPolicy.FINISH_LAYOUT_REDO_WALLPAPER;
+import static com.android.server.wm.ProtoLogGroup.WM_DEBUG_APP_TRANSITIONS;
+import static com.android.server.wm.ProtoLogGroup.WM_DEBUG_APP_TRANSITIONS_ANIM;
+import static com.android.server.wm.WindowContainer.AnimationFlags.CHILDREN;
+import static com.android.server.wm.WindowContainer.AnimationFlags.PARENTS;
+import static com.android.server.wm.WindowContainer.AnimationFlags.TRANSITION;
import static com.android.server.wm.WindowContainerProto.CONFIGURATION_CONTAINER;
import static com.android.server.wm.WindowContainerProto.ORIENTATION;
import static com.android.server.wm.WindowContainerProto.SURFACE_ANIMATOR;
@@ -33,7 +40,9 @@ import static com.android.server.wm.WindowContainerProto.VISIBLE;
import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_ANIM;
import static com.android.server.wm.WindowManagerDebugConfig.TAG_WITH_CLASS_NAME;
import static com.android.server.wm.WindowManagerDebugConfig.TAG_WM;
+import static com.android.server.wm.WindowManagerService.logWithStack;
import static com.android.server.wm.WindowStateAnimator.DRAW_PENDING;
+import static com.android.server.wm.WindowStateAnimator.STACK_CLIP_AFTER_ANIM;
import android.annotation.CallSuper;
import android.annotation.IntDef;
@@ -45,17 +54,24 @@ import android.graphics.Point;
import android.graphics.Rect;
import android.os.Debug;
import android.os.IBinder;
+import android.os.Trace;
+import android.util.Pair;
import android.util.Pools;
import android.util.Slog;
import android.util.proto.ProtoOutputStream;
+import android.view.DisplayInfo;
import android.view.MagnificationSpec;
+import android.view.RemoteAnimationTarget;
import android.view.SurfaceControl;
import android.view.SurfaceControl.Builder;
import android.view.SurfaceSession;
+import android.view.WindowManager;
+import android.view.animation.Animation;
import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.util.ToBooleanFunction;
import com.android.server.policy.WindowManagerPolicy;
+import com.android.server.protolog.common.ProtoLog;
import com.android.server.wm.SurfaceAnimator.Animatable;
import java.io.PrintWriter;
@@ -155,6 +171,29 @@ class WindowContainer<E extends WindowContainer> extends ConfigurationContainer<
private final Configuration mTmpConfig = new Configuration();
+ /** Interface for {@link #isAnimating} to check which cases for the container is animating. */
+ public interface AnimationFlags {
+ /**
+ * A bit flag indicates that {@link #isAnimating} should also return {@code true}
+ * even though the container is not yet animating, but the window container or its
+ * relatives as specified by PARENTS or CHILDREN are part of an {@link AppTransition}
+ * that is pending so an animation starts soon.
+ */
+ int TRANSITION = 1;
+
+ /**
+ * A bit flag indicates that {@link #isAnimating} should also check if one of the
+ * ancestors of the container are animating in addition to the container itself.
+ */
+ int PARENTS = 2;
+
+ /**
+ * A bit flag indicates that {@link #isAnimating} should also check if one of the
+ * descendants of the container are animating in addition to the container itself.
+ */
+ int CHILDREN = 4;
+ }
+
/**
* Callback which is triggered while changing the parent, after setting up the surface but
* before asking the parent to assign child layers.
@@ -163,6 +202,47 @@ class WindowContainer<E extends WindowContainer> extends ConfigurationContainer<
void onPreAssignChildLayers();
}
+ /**
+ * True if this an AppWindowToken and the activity which created this was launched with
+ * ActivityOptions.setLaunchTaskBehind.
+ *
+ * TODO(b/142617871): We run a special animation when the activity was launched with that
+ * flag, but it's not necessary anymore. Keep the window invisible until the task is explicitly
+ * selected to suppress an animation, and remove this flag.
+ */
+ boolean mLaunchTaskBehind;
+
+ /**
+ * If we are running an animation, this determines the transition type. Must be one of
+ * {@link AppTransition#TransitionFlags}.
+ */
+ int mTransit;
+
+ /**
+ * If we are running an animation, this determines the flags during this animation. Must be a
+ * bitwise combination of AppTransition.TRANSIT_FLAG_* constants.
+ */
+ int mTransitFlags;
+
+ /** Whether this container should be boosted at the top of all its siblings. */
+ @VisibleForTesting boolean mNeedsZBoost;
+
+ /** Layer used to constrain the animation to a container's stack bounds. */
+ SurfaceControl mAnimationBoundsLayer;
+
+ /** Whether this container needs to create mAnimationBoundsLayer for cropping animations. */
+ boolean mNeedsAnimationBoundsLayer;
+
+ /**
+ * This gets used during some open/close transitions as well as during a change transition
+ * where it represents the starting-state snapshot.
+ */
+ AppWindowThumbnail mThumbnail;
+ final Rect mTransitStartRect = new Rect();
+ final Point mTmpPoint = new Point();
+ protected final Rect mTmpRect = new Rect();
+ final Rect mTmpPrevBounds = new Rect();
+
WindowContainer(WindowManagerService wms) {
mWmService = wms;
mPendingTransaction = wms.mTransactionFactory.get();
@@ -642,51 +722,78 @@ class WindowContainer<E extends WindowContainer> extends ConfigurationContainer<
}
/**
- * @return Whether our own container is running an animation or any child, no matter how deep in
- * the hierarchy, is animating.
+ * @return {@code true} when this container or its related containers are running an
+ * animation, {@code false} otherwise.
+ *
+ * By default this predicate only checks if this container itself is actually running an
+ * animation, but you can extend the check target over its relatives, or relax the condition
+ * so that this can return {@code true} if an animation starts soon by giving a combination
+ * of {@link #AnimationFlags}.
+ *
+ * Note that you can give a combination of bitmask flags to specify targets and condition for
+ * checking animating status.
+ * e.g. {@code isAnimating(TRANSITION | PARENT)} returns {@code true} if either this
+ * container itself or one of its parents is running an animation or waiting for an app
+ * transition.
+ *
+ * Note that TRANSITION propagates to parents and children as well.
+ *
+ * {@see AnimationFlags#TRANSITION}
+ * {@see AnimationFlags#PARENTS}
+ * {@see AnimationFlags#CHILDREN}
*/
- boolean isSelfOrChildAnimating() {
- if (isSelfAnimating()) {
+ final boolean isAnimating(int flags) {
+ if (mSurfaceAnimator.isAnimating()) {
return true;
}
- for (int j = mChildren.size() - 1; j >= 0; j--) {
- final WindowContainer wc = mChildren.get(j);
- if (wc.isSelfOrChildAnimating()) {
+ if ((flags & TRANSITION) != 0 && isWaitingForTransitionStart()) {
+ return true;
+ }
+ if ((flags & PARENTS) != 0) {
+ final WindowContainer parent = getParent();
+ if (parent != null && parent.isAnimating(flags & ~CHILDREN)) {
return true;
}
}
+ if ((flags & CHILDREN) != 0) {
+ for (int i = 0; i < mChildren.size(); ++i) {
+ final WindowContainer wc = mChildren.get(i);
+ if (wc.isAnimating(flags & ~PARENTS)) {
+ return true;
+ }
+ }
+ }
return false;
}
/**
- * @return Whether our own container is running an animation or our parent is animating. This
- * doesn't consider whether children are animating.
+ * @return {@code true} when the container is waiting the app transition start, {@code false}
+ * otherwise.
*/
- boolean isAnimating() {
-
- // We are animating if we ourselves are animating or if our parent is animating.
- return isSelfAnimating() || mParent != null && mParent.isAnimating();
+ boolean isWaitingForTransitionStart() {
+ return false;
}
/**
- * @return {@code true} if in this subtree of the hierarchy we have an {@link AppWindowToken}
- * that is {@link #isSelfAnimating}; {@code false} otherwise.
+ * @return {@code true} if in this subtree of the hierarchy we have an
+ * {@ode ActivityRecord#isAnimating(TRANSITION)}, {@code false} otherwise.
*/
- boolean isAppAnimating() {
- for (int j = mChildren.size() - 1; j >= 0; j--) {
- final WindowContainer wc = mChildren.get(j);
- if (wc.isAppAnimating()) {
- return true;
- }
- }
- return false;
+ boolean isAppTransitioning() {
+ return forAllActivities(app -> app.isAnimating(TRANSITION));
}
/**
* @return Whether our own container running an animation at the moment.
*/
- boolean isSelfAnimating() {
- return mSurfaceAnimator.isAnimating();
+ final boolean isAnimating() {
+ return isAnimating(0 /* self only */);
+ }
+
+ /**
+ * @return {@code true} if the container is in changing app transition.
+ */
+ boolean isChangingAppTransition() {
+ return false;
}
void sendAppVisibilityToClients() {
@@ -988,10 +1095,13 @@ class WindowContainer<E extends WindowContainer> extends ConfigurationContainer<
wrapper.release();
}
- void forAllActivities(Consumer<ActivityRecord> callback) {
+ boolean forAllActivities(ToBooleanFunction<ActivityRecord> callback) {
for (int i = mChildren.size() - 1; i >= 0; --i) {
- mChildren.get(i).forAllActivities(callback);
+ if (mChildren.get(i).forAllActivities(callback)) {
+ return true;
+ }
}
+ return false;
}
void forAllWallpaperWindows(Consumer<WallpaperWindowToken> callback) {
@@ -1374,6 +1484,203 @@ class WindowContainer<E extends WindowContainer> extends ConfigurationContainer<
return null;
}
+ // TODO: Remove this and use #getBounds() instead once we set an app transition animation
+ // on TaskStack.
+ Rect getAnimationBounds(int appStackClipMode) {
+ return getBounds();
+ }
+
+ /**
+ * Applies the app transition animation according the given the layout properties in the
+ * window hierarchy.
+ *
+ * @param lp The layout parameters of the window.
+ * @param transit The app transition type indicates what kind of transition to be applied.
+ * @param enter Whether the app transition is entering transition or not.
+ * @param isVoiceInteraction Whether the container is participating in voice interaction or not.
+ *
+ * @return {@code true} when the container applied the app transition, {@code false} if the
+ * app transition is disabled or skipped.
+ *
+ * @see #getAnimationAdapter
+ */
+ boolean applyAnimation(WindowManager.LayoutParams lp, int transit, boolean enter,
+ boolean isVoiceInteraction) {
+ if (mWmService.mDisableTransitionAnimation) {
+ ProtoLog.v(WM_DEBUG_APP_TRANSITIONS_ANIM,
+ "applyAnimation: transition animation is disabled or skipped. "
+ + "container=%s", this);
+ cancelAnimation();
+ return false;
+ }
+
+ // Only apply an animation if the display isn't frozen. If it is frozen, there is no reason
+ // to animate and it can cause strange artifacts when we unfreeze the display if some
+ // different animation is running.
+ try {
+ Trace.traceBegin(TRACE_TAG_WINDOW_MANAGER, "WC#applyAnimation");
+ if (okToAnimate()) {
+ Pair<AnimationAdapter, AnimationAdapter> adapters = getAnimationAdapter(lp, transit,
+ enter, isVoiceInteraction);
+ AnimationAdapter adapter = adapters.first;
+ AnimationAdapter thumbnailAdapter = adapters.second;
+ if (adapter != null) {
+ startAnimation(getPendingTransaction(), adapter, !isVisible());
+ if (adapter.getShowWallpaper()) {
+ mDisplayContent.pendingLayoutChanges |= FINISH_LAYOUT_REDO_WALLPAPER;
+ }
+ if (thumbnailAdapter != null) {
+ mThumbnail.startAnimation(
+ getPendingTransaction(), thumbnailAdapter, !isVisible());
+ }
+ }
+ } else {
+ cancelAnimation();
+ }
+ } finally {
+ Trace.traceEnd(TRACE_TAG_WINDOW_MANAGER);
+ }
+
+ return isAnimating();
+ }
+
+ /**
+ * Gets the {@link AnimationAdapter} according the given window layout properties in the window
+ * hierarchy.
+ *
+ * @return The return value will always contain two elements, one for normal animations and the
+ * other for thumbnail animation, both can be {@code null}.
+ *
+ * @See com.android.server.wm.RemoteAnimationController.RemoteAnimationRecord
+ * @See LocalAnimationAdapter
+ */
+ Pair<AnimationAdapter, AnimationAdapter> getAnimationAdapter(WindowManager.LayoutParams lp,
+ int transit, boolean enter, boolean isVoiceInteraction) {
+ final Pair<AnimationAdapter, AnimationAdapter> resultAdapters;
+ final int appStackClipMode = getDisplayContent().mAppTransition.getAppStackClipMode();
+
+ // Separate position and size for use in animators.
+ mTmpRect.set(getAnimationBounds(appStackClipMode));
+ mTmpPoint.set(mTmpRect.left, mTmpRect.top);
+ mTmpRect.offsetTo(0, 0);
+
+ final RemoteAnimationController controller =
+ getDisplayContent().mAppTransition.getRemoteAnimationController();
+ final boolean isChanging = AppTransition.isChangeTransit(transit) && enter
+ && isChangingAppTransition();
+
+ // Delaying animation start isn't compatible with remote animations at all.
+ if (controller != null && !mSurfaceAnimator.isAnimationStartDelayed()) {
+ final RemoteAnimationController.RemoteAnimationRecord adapters =
+ controller.createRemoteAnimationRecord(this, mTmpPoint, mTmpRect,
+ (isChanging ? mTransitStartRect : null));
+ resultAdapters = new Pair<>(adapters.mAdapter, adapters.mThumbnailAdapter);
+ } else if (isChanging) {
+ final float durationScale = mWmService.getTransitionAnimationScaleLocked();
+ final DisplayInfo displayInfo = getDisplayContent().getDisplayInfo();
+ mTmpRect.offsetTo(mTmpPoint.x, mTmpPoint.y);
+
+ AnimationAdapter adapter = new LocalAnimationAdapter(
+ new WindowChangeAnimationSpec(mTransitStartRect, mTmpRect, displayInfo,
+ durationScale, true /* isAppAnimation */, false /* isThumbnail */),
+ getSurfaceAnimationRunner());
+
+ AnimationAdapter thumbnailAdapter = null;
+ if (mThumbnail != null) {
+ thumbnailAdapter = new LocalAnimationAdapter(
+ new WindowChangeAnimationSpec(mTransitStartRect, mTmpRect, displayInfo,
+ durationScale, true /* isAppAnimation */, true /* isThumbnail */),
+ getSurfaceAnimationRunner());
+ }
+ resultAdapters = new Pair<>(adapter, thumbnailAdapter);
+ mTransit = transit;
+ mTransitFlags = getDisplayContent().mAppTransition.getTransitFlags();
+ } else {
+ mNeedsAnimationBoundsLayer = (appStackClipMode == STACK_CLIP_AFTER_ANIM);
+ final Animation a = loadAnimation(lp, transit, enter, isVoiceInteraction);
+
+ if (a != null) {
+ // Only apply corner radius to animation if we're not in multi window mode.
+ // We don't want rounded corners when in pip or split screen.
+ final float windowCornerRadius = !inMultiWindowMode()
+ ? getDisplayContent().getWindowCornerRadius()
+ : 0;
+ AnimationAdapter adapter = new LocalAnimationAdapter(
+ new WindowAnimationSpec(a, mTmpPoint, mTmpRect,
+ getDisplayContent().mAppTransition.canSkipFirstFrame(),
+ appStackClipMode, true /* isAppAnimation */, windowCornerRadius),
+ getSurfaceAnimationRunner());
+
+ resultAdapters = new Pair<>(adapter, null);
+ mNeedsZBoost = a.getZAdjustment() == Animation.ZORDER_TOP;
+ mTransit = transit;
+ mTransitFlags = getDisplayContent().mAppTransition.getTransitFlags();
+ } else {
+ resultAdapters = new Pair<>(null, null);
+ }
+ }
+ return resultAdapters;
+ }
+
+ final SurfaceAnimationRunner getSurfaceAnimationRunner() {
+ return mWmService.mSurfaceAnimationRunner;
+ }
+
+ private Animation loadAnimation(WindowManager.LayoutParams lp, int transit, boolean enter,
+ boolean isVoiceInteraction) {
+ final DisplayContent displayContent = getDisplayContent();
+ final DisplayInfo displayInfo = displayContent.getDisplayInfo();
+ final int width = displayInfo.appWidth;
+ final int height = displayInfo.appHeight;
+ ProtoLog.v(WM_DEBUG_APP_TRANSITIONS_ANIM, "applyAnimation: container=%s", this);
+
+ // Determine the visible rect to calculate the thumbnail clip with
+ // getAnimationFrames.
+ final Rect frame = new Rect(0, 0, width, height);
+ final Rect displayFrame = new Rect(0, 0,
+ displayInfo.logicalWidth, displayInfo.logicalHeight);
+ final Rect insets = new Rect();
+ final Rect stableInsets = new Rect();
+ final Rect surfaceInsets = new Rect();
+ getAnimationFrames(frame, insets, stableInsets, surfaceInsets);
+
+ if (mLaunchTaskBehind) {
+ // Differentiate the two animations. This one which is briefly on the screen
+ // gets the !enter animation, and the other one which remains on the
+ // screen gets the enter animation. Both appear in the mOpeningApps set.
+ enter = false;
+ }
+ ProtoLog.d(WM_DEBUG_APP_TRANSITIONS,
+ "Loading animation for app transition. transit=%s enter=%b frame=%s insets=%s "
+ + "surfaceInsets=%s",
+ AppTransition.appTransitionToString(transit), enter, frame, insets, surfaceInsets);
+ final Configuration displayConfig = displayContent.getConfiguration();
+ final Animation a = getDisplayContent().mAppTransition.loadAnimation(lp, transit, enter,
+ displayConfig.uiMode, displayConfig.orientation, frame, displayFrame, insets,
+ surfaceInsets, stableInsets, isVoiceInteraction, inFreeformWindowingMode(), this);
+ if (a != null) {
+ if (DEBUG_ANIM) logWithStack(TAG, "Loaded animation " + a + " for " + this);
+ final int containingWidth = frame.width();
+ final int containingHeight = frame.height();
+ a.initialize(containingWidth, containingHeight, width, height);
+ a.scaleCurrentDuration(mWmService.getTransitionAnimationScaleLocked());
+ }
+ return a;
+ }
+
+ RemoteAnimationTarget createRemoteAnimationTarget(
+ RemoteAnimationController.RemoteAnimationRecord record) {
+ return null;
+ }
+
+ boolean okToDisplay() {
+ return mDisplayContent != null && mDisplayContent.okToDisplay();
+ }
+
+ boolean okToAnimate() {
+ return mDisplayContent != null && mDisplayContent.okToAnimate();
+ }
+
@Override
public void commitPendingTransaction() {
scheduleAnimation();
@@ -1473,6 +1780,26 @@ class WindowContainer<E extends WindowContainer> extends ConfigurationContainer<
return getBounds();
}
+ /**
+ * The {@code outFrame} retrieved by this method specifies where the animation will finish
+ * the entrance animation, as the next frame will display the window at these coordinates. In
+ * case of exit animation, this is where the animation will start, as the frame before the
+ * animation is displaying the window at these bounds.
+ *
+ * @param outFrame The bounds where entrance animation finishes or exit animation starts.
+ * @param outInsets Insets that are covered by system windows.
+ * @param outStableInsets Insets that determine the area covered by the stable system windows.
+ * @param outSurfaceInsets Positive insets between the drawing surface and window content.
+ */
+ void getAnimationFrames(Rect outFrame, Rect outInsets, Rect outStableInsets,
+ Rect outSurfaceInsets) {
+ final DisplayInfo displayInfo = getDisplayContent().getDisplayInfo();
+ outFrame.set(0, 0, displayInfo.appWidth, displayInfo.appHeight);
+ outInsets.setEmpty();
+ outStableInsets.setEmpty();
+ outSurfaceInsets.setEmpty();
+ }
+
void getRelativeDisplayedPosition(Point outPos) {
final Rect dispBounds = getDisplayedBounds();
outPos.set(dispBounds.left, dispBounds.top);
diff --git a/services/core/java/com/android/server/wm/WindowManagerService.java b/services/core/java/com/android/server/wm/WindowManagerService.java
index 085b0f66702a..ab937e0a4e23 100644
--- a/services/core/java/com/android/server/wm/WindowManagerService.java
+++ b/services/core/java/com/android/server/wm/WindowManagerService.java
@@ -94,6 +94,9 @@ import static com.android.server.wm.ProtoLogGroup.WM_DEBUG_STARTING_WINDOW;
import static com.android.server.wm.ProtoLogGroup.WM_DEBUG_WINDOW_MOVEMENT;
import static com.android.server.wm.ProtoLogGroup.WM_ERROR;
import static com.android.server.wm.ProtoLogGroup.WM_SHOW_TRANSACTIONS;
+import static com.android.server.wm.WindowContainer.AnimationFlags.CHILDREN;
+import static com.android.server.wm.WindowContainer.AnimationFlags.PARENTS;
+import static com.android.server.wm.WindowContainer.AnimationFlags.TRANSITION;
import static com.android.server.wm.WindowManagerDebugConfig.DEBUG;
import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_DISPLAY;
import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_INPUT_METHOD;
@@ -2418,7 +2421,7 @@ public class WindowManagerService extends IWindowManager.Stub
if (win.isWinVisibleLw() && winAnimator.applyAnimationLocked(transit, false)) {
focusMayChange = true;
win.mAnimatingExit = true;
- } else if (win.isAnimating()) {
+ } else if (win.isAnimating(TRANSITION | PARENTS)) {
// Currently in a hide animation... turn this into
// an exit.
win.mAnimatingExit = true;
@@ -7618,7 +7621,7 @@ public class WindowManagerService extends IWindowManager.Stub
private void waitForAnimationsToComplete() {
synchronized (mGlobalLock) {
long timeoutRemaining = ANIMATION_COMPLETED_TIMEOUT_MS;
- while (mRoot.isSelfOrChildAnimating() && timeoutRemaining > 0) {
+ while (mRoot.isAnimating(TRANSITION | CHILDREN) && timeoutRemaining > 0) {
long startTime = System.currentTimeMillis();
try {
mGlobalLock.wait(timeoutRemaining);
@@ -7627,7 +7630,7 @@ public class WindowManagerService extends IWindowManager.Stub
timeoutRemaining -= (System.currentTimeMillis() - startTime);
}
- if (mRoot.isSelfOrChildAnimating()) {
+ if (mRoot.isAnimating(TRANSITION | CHILDREN)) {
Log.w(TAG, "Timed out waiting for animations to complete.");
}
}
diff --git a/services/core/java/com/android/server/wm/WindowState.java b/services/core/java/com/android/server/wm/WindowState.java
index f0ea13d2c68a..17e67ebf617f 100644
--- a/services/core/java/com/android/server/wm/WindowState.java
+++ b/services/core/java/com/android/server/wm/WindowState.java
@@ -98,6 +98,8 @@ import static com.android.server.wm.ProtoLogGroup.WM_DEBUG_FOCUS_LIGHT;
import static com.android.server.wm.ProtoLogGroup.WM_DEBUG_ORIENTATION;
import static com.android.server.wm.ProtoLogGroup.WM_DEBUG_RESIZE;
import static com.android.server.wm.ProtoLogGroup.WM_DEBUG_STARTING_WINDOW;
+import static com.android.server.wm.WindowContainer.AnimationFlags.PARENTS;
+import static com.android.server.wm.WindowContainer.AnimationFlags.TRANSITION;
import static com.android.server.wm.WindowManagerDebugConfig.DEBUG;
import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_ANIM;
import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_CONFIGURATION;
@@ -1492,7 +1494,8 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP
@Override
boolean hasContentToDisplay() {
if (!mAppFreezing && isDrawnLw() && (mViewVisibility == View.VISIBLE
- || (isAnimating() && !getDisplayContent().mAppTransition.isTransitionSet()))) {
+ || (isAnimating(TRANSITION | PARENTS)
+ && !getDisplayContent().mAppTransition.isTransitionSet()))) {
return true;
}
@@ -1550,8 +1553,8 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP
*/
// TODO: Can we consolidate this with #isVisible() or have a more appropriate name for this?
boolean isWinVisibleLw() {
- return (mActivityRecord == null || !mActivityRecord.hiddenRequested || mActivityRecord.isSelfAnimating())
- && isVisible();
+ return (mActivityRecord == null || !mActivityRecord.hiddenRequested
+ || mActivityRecord.isAnimating(TRANSITION)) && isVisible();
}
/**
@@ -1597,9 +1600,9 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP
final ActivityRecord atoken = mActivityRecord;
if (atoken != null) {
return ((!isParentWindowHidden() && !atoken.hiddenRequested)
- || isAnimating());
+ || isAnimating(TRANSITION | PARENTS));
}
- return !isParentWindowHidden() || isAnimating();
+ return !isParentWindowHidden() || isAnimating(TRANSITION | PARENTS);
}
/**
@@ -1634,7 +1637,7 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP
final boolean parentAndClientVisible = !isParentWindowHidden()
&& mViewVisibility == View.VISIBLE && !mToken.isHidden();
return mHasSurface && isVisibleByPolicy() && !mDestroying
- && (parentAndClientVisible || isAnimating());
+ && (parentAndClientVisible || isAnimating(TRANSITION | PARENTS));
}
// TODO: Another visibility method that was added late in the release to minimize risk.
@@ -1664,7 +1667,7 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP
final ActivityRecord atoken = mActivityRecord;
return isDrawnLw() && isVisibleByPolicy()
&& ((!isParentWindowHidden() && (atoken == null || !atoken.hiddenRequested))
- || isAnimating());
+ || isAnimating(TRANSITION | PARENTS));
}
/**
@@ -1672,7 +1675,7 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP
*/
@Override
public boolean isAnimatingLw() {
- return isAnimating();
+ return isAnimating(TRANSITION | PARENTS);
}
@Override
@@ -1718,7 +1721,7 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP
// to determine if it's occluding apps.
return ((!mIsWallpaper && mAttrs.format == PixelFormat.OPAQUE)
|| (mIsWallpaper && mWallpaperVisible))
- && isDrawnLw() && !isAnimating();
+ && isDrawnLw() && !isAnimating(TRANSITION | PARENTS);
}
@Override
@@ -1740,7 +1743,7 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP
// Starting window that's exiting will be removed when the animation finishes.
// Mark all relevant flags for that onExitAnimationDone will proceed all the way
// to actually remove it.
- if (!visible && isVisibleNow() && mActivityRecord.isSelfAnimating()) {
+ if (!visible && isVisibleNow() && mActivityRecord.isAnimating(TRANSITION)) {
mAnimatingExit = true;
mRemoveOnExit = true;
mWindowRemovalAllowed = true;
@@ -2013,12 +2016,12 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP
ProtoLog.v(WM_DEBUG_APP_TRANSITIONS,
"Remove %s: mSurfaceController=%s mAnimatingExit=%b mRemoveOnExit=%b "
+ "mHasSurface=%b surfaceShowing=%b animating=%b app-animation=%b "
- + "mWillReplaceWindow=%b inPendingTransaction=%b mDisplayFrozen=%b "
- + "callers=%s",
+ + "mWillReplaceWindow=%b mDisplayFrozen=%b callers=%s",
this, mWinAnimator.mSurfaceController, mAnimatingExit, mRemoveOnExit,
- mHasSurface, mWinAnimator.getShown(), isAnimating(),
- mActivityRecord != null && mActivityRecord.isSelfAnimating(), mWillReplaceWindow,
- mActivityRecord != null && mActivityRecord.inPendingTransaction,
+ mHasSurface, mWinAnimator.getShown(),
+ isAnimating(TRANSITION | PARENTS),
+ mActivityRecord != null && mActivityRecord.isAnimating(TRANSITION),
+ mWillReplaceWindow,
mWmService.mDisplayFrozen, Debug.getCallers(6));
// Visibility of the removed window. Will be used later to update orientation later on.
@@ -2076,7 +2079,7 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP
mWmService.mAccessibilityController.onWindowTransitionLocked(this, transit);
}
}
- final boolean isAnimating = isAnimating()
+ final boolean isAnimating = isAnimating(TRANSITION | PARENTS)
&& (mActivityRecord == null || !mActivityRecord.isWaitingForTransitionStart());
final boolean lastWindowIsStartingWindow = startingWindow && mActivityRecord != null
&& mActivityRecord.isLastWindow(this);
@@ -2683,10 +2686,11 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP
if (DEBUG_VISIBILITY) Slog.v(TAG, "Policy visibility true: " + this);
if (doAnimation) {
if (DEBUG_VISIBILITY) Slog.v(TAG, "doAnimation: mPolicyVisibility="
- + isLegacyPolicyVisibility() + " animating=" + isAnimating());
+ + isLegacyPolicyVisibility()
+ + " animating=" + isAnimating(TRANSITION | PARENTS));
if (!mToken.okToAnimate()) {
doAnimation = false;
- } else if (isLegacyPolicyVisibility() && !isAnimating()) {
+ } else if (isLegacyPolicyVisibility() && !isAnimating(TRANSITION | PARENTS)) {
// Check for the case where we are currently visible and
// not animating; we do not want to do animation at such a
// point to become visible when we already are.
@@ -2726,7 +2730,7 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP
}
if (doAnimation) {
mWinAnimator.applyAnimationLocked(TRANSIT_EXIT, false);
- if (!isAnimating()) {
+ if (!isAnimating(TRANSITION | PARENTS)) {
doAnimation = false;
}
}
@@ -4163,9 +4167,9 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP
+ " tok.hiddenRequested="
+ (mActivityRecord != null && mActivityRecord.hiddenRequested)
+ " tok.hidden=" + (mActivityRecord != null && mActivityRecord.isHidden())
- + " animating=" + isAnimating()
+ + " animating=" + isAnimating(TRANSITION | PARENTS)
+ " tok animating="
- + (mActivityRecord != null && mActivityRecord.isSelfAnimating())
+ + (mActivityRecord != null && mActivityRecord.isAnimating(TRANSITION))
+ " Callers=" + Debug.getCallers(4));
}
}
@@ -4392,7 +4396,7 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP
void onExitAnimationDone() {
if (DEBUG_ANIM) Slog.v(TAG, "onExitAnimationDone in " + this
+ ": exiting=" + mAnimatingExit + " remove=" + mRemoveOnExit
- + " selfAnimating=" + isSelfAnimating());
+ + " selfAnimating=" + isAnimating());
if (!mChildren.isEmpty()) {
// Copying to a different list as multiple children can be removed.
@@ -4415,7 +4419,7 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP
}
}
- if (isSelfAnimating()) {
+ if (isAnimating()) {
return;
}
if (mWmService.mAccessibilityController != null) {
@@ -4563,25 +4567,25 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP
}
if (DEBUG_VISIBILITY) {
Slog.v(TAG, "Win " + this + ": isDrawn=" + isDrawnLw()
- + ", animating=" + isAnimating());
+ + ", animating=" + isAnimating(TRANSITION | PARENTS));
if (!isDrawnLw()) {
Slog.v(TAG, "Not displayed: s=" + mWinAnimator.mSurfaceController
+ " pv=" + isVisibleByPolicy()
+ " mDrawState=" + mWinAnimator.mDrawState
+ " ph=" + isParentWindowHidden()
+ " th=" + (mActivityRecord != null ? mActivityRecord.hiddenRequested : false)
- + " a=" + isAnimating());
+ + " a=" + isAnimating(TRANSITION | PARENTS));
}
}
results.numInteresting++;
if (isDrawnLw()) {
results.numDrawn++;
- if (!isAnimating()) {
+ if (!isAnimating(TRANSITION | PARENTS)) {
results.numVisible++;
}
results.nowGone = false;
- } else if (isAnimating()) {
+ } else if (isAnimating(TRANSITION | PARENTS)) {
results.nowGone = false;
}
}
@@ -4718,7 +4722,7 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP
+ mRemoveOnExit + ", mDestroying=" + mDestroying);
// Cancel the existing exit animation for the next enter animation.
- if (isSelfAnimating()) {
+ if (isAnimating()) {
cancelAnimation();
destroySurfaceUnchecked();
}
@@ -5398,4 +5402,29 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP
}
return mKeyInterceptionInfo;
}
+
+ @Override
+ void getAnimationFrames(Rect outFrame, Rect outInsets, Rect outStableInsets,
+ Rect outSurfaceInsets) {
+ // Containing frame will usually cover the whole screen, including dialog windows.
+ // For freeform workspace windows it will not cover the whole screen and it also
+ // won't exactly match the final freeform window frame (e.g. when overlapping with
+ // the status bar). In that case we need to use the final frame.
+ if (inFreeformWindowingMode()) {
+ outFrame.set(getFrameLw());
+ } else if (isLetterboxedAppWindow()) {
+ outFrame.set(getTask().getBounds());
+ } else if (isDockedResizing()) {
+ // If we are animating while docked resizing, then use the stack bounds as the
+ // animation target (which will be different than the task bounds)
+ outFrame.set(getTask().getParent().getBounds());
+ } else {
+ outFrame.set(getContainingFrame());
+ }
+ outSurfaceInsets.set(getAttrs().surfaceInsets);
+ // TODO(b/72757033): These are insets relative to the window frame, but we're really
+ // interested in the insets relative to the frame we chose in the if-blocks above.
+ getContentInsets(outInsets);
+ getStableInsets(outStableInsets);
+ }
}
diff --git a/services/core/java/com/android/server/wm/WindowStateAnimator.java b/services/core/java/com/android/server/wm/WindowStateAnimator.java
index 3f25f89c1a3f..fef3a9d362eb 100644
--- a/services/core/java/com/android/server/wm/WindowStateAnimator.java
+++ b/services/core/java/com/android/server/wm/WindowStateAnimator.java
@@ -32,6 +32,8 @@ import static com.android.server.wm.ProtoLogGroup.WM_DEBUG_ORIENTATION;
import static com.android.server.wm.ProtoLogGroup.WM_DEBUG_STARTING_WINDOW;
import static com.android.server.wm.ProtoLogGroup.WM_SHOW_SURFACE_ALLOC;
import static com.android.server.wm.ProtoLogGroup.WM_SHOW_TRANSACTIONS;
+import static com.android.server.wm.WindowContainer.AnimationFlags.PARENTS;
+import static com.android.server.wm.WindowContainer.AnimationFlags.TRANSITION;
import static com.android.server.wm.WindowManagerDebugConfig.DEBUG;
import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_ANIM;
import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_LAYOUT_REPEATS;
@@ -435,7 +437,7 @@ class WindowStateAnimator {
return;
}
- if (!mWin.mActivityRecord.isSelfAnimating()) {
+ if (!mWin.mActivityRecord.isAnimating(TRANSITION)) {
mWin.mActivityRecord.clearAllDrawn();
} else {
// Currently animating, persist current state of allDrawn until animation
@@ -1169,7 +1171,7 @@ class WindowStateAnimator {
w.mToken.hasVisible = true;
}
} else {
- if (DEBUG_ANIM && mWin.isAnimating()) {
+ if (DEBUG_ANIM && mWin.isAnimating(TRANSITION | PARENTS)) {
Slog.v(TAG, "prepareSurface: No changes in animation for " + this);
}
displayed = true;
@@ -1332,7 +1334,7 @@ class WindowStateAnimator {
* @return true if an animation has been loaded.
*/
boolean applyAnimationLocked(int transit, boolean isEntrance) {
- if (mWin.isSelfAnimating() && mAnimationIsEntrance == isEntrance) {
+ if (mWin.isAnimating() && mAnimationIsEntrance == isEntrance) {
// If we are trying to apply an animation, but already running
// an animation of the same type, then just leave that one alone.
return true;
@@ -1400,7 +1402,7 @@ class WindowStateAnimator {
mWin.getDisplayContent().adjustForImeIfNeeded();
}
- return mWin.isAnimating();
+ return mWin.isAnimating(TRANSITION | PARENTS);
}
void writeToProto(ProtoOutputStream proto, long fieldId) {
diff --git a/services/core/java/com/android/server/wm/WindowToken.java b/services/core/java/com/android/server/wm/WindowToken.java
index ad71237bdf4e..88a1458a783f 100644
--- a/services/core/java/com/android/server/wm/WindowToken.java
+++ b/services/core/java/com/android/server/wm/WindowToken.java
@@ -22,6 +22,9 @@ import static android.view.WindowManager.LayoutParams.TYPE_NAVIGATION_BAR;
import static com.android.server.wm.ProtoLogGroup.WM_DEBUG_ADD_REMOVE;
import static com.android.server.wm.ProtoLogGroup.WM_DEBUG_FOCUS;
import static com.android.server.wm.ProtoLogGroup.WM_DEBUG_WINDOW_MOVEMENT;
+import static com.android.server.wm.WindowContainer.AnimationFlags.CHILDREN;
+import static com.android.server.wm.WindowContainer.AnimationFlags.PARENTS;
+import static com.android.server.wm.WindowContainer.AnimationFlags.TRANSITION;
import static com.android.server.wm.WindowManagerDebugConfig.TAG_WITH_CLASS_NAME;
import static com.android.server.wm.WindowManagerDebugConfig.TAG_WM;
import static com.android.server.wm.WindowManagerService.UPDATE_FOCUS_NORMAL;
@@ -159,13 +162,10 @@ class WindowToken extends WindowContainer<WindowState> {
final int count = mChildren.size();
boolean changed = false;
- boolean delayed = false;
+ final boolean delayed = isAnimating(TRANSITION | PARENTS | CHILDREN);
for (int i = 0; i < count; i++) {
final WindowState win = mChildren.get(i);
- if (win.isAnimating()) {
- delayed = true;
- }
changed |= win.onSetAppExiting();
}
@@ -321,14 +321,6 @@ class WindowToken extends WindowContainer<WindowState> {
return toString();
}
- boolean okToDisplay() {
- return mDisplayContent != null && mDisplayContent.okToDisplay();
- }
-
- boolean okToAnimate() {
- return mDisplayContent != null && mDisplayContent.okToAnimate();
- }
-
/**
* Return whether windows from this token can layer above the
* system bars, or in other words extend outside of the "Decor Frame"
diff --git a/services/core/jni/Android.bp b/services/core/jni/Android.bp
index bcd1713222cb..da355ea0ca3b 100644
--- a/services/core/jni/Android.bp
+++ b/services/core/jni/Android.bp
@@ -147,6 +147,7 @@ cc_defaults {
"android.frameworks.sensorservice@1.0",
"android.system.suspend@1.0",
"suspend_control_aidl_interface-cpp",
+ "vintf-vibrator-cpp",
],
static_libs: [
diff --git a/services/core/jni/com_android_server_VibratorService.cpp b/services/core/jni/com_android_server_VibratorService.cpp
index 64c7935efff9..8ddb86b08ea3 100644
--- a/services/core/jni/com_android_server_VibratorService.cpp
+++ b/services/core/jni/com_android_server_VibratorService.cpp
@@ -17,6 +17,9 @@
#define LOG_TAG "VibratorService"
#include <android/hardware/vibrator/1.4/IVibrator.h>
+#include <android/hardware/vibrator/BnVibratorCallback.h>
+#include <android/hardware/vibrator/IVibrator.h>
+#include <binder/IServiceManager.h>
#include "jni.h"
#include <nativehelper/JNIHelp.h>
@@ -41,11 +44,147 @@ namespace V1_1 = android::hardware::vibrator::V1_1;
namespace V1_2 = android::hardware::vibrator::V1_2;
namespace V1_3 = android::hardware::vibrator::V1_3;
namespace V1_4 = android::hardware::vibrator::V1_4;
+namespace aidl = android::hardware::vibrator;
namespace android {
static jmethodID sMethodIdOnComplete;
+// TODO(b/141828236): remove HIDL 1.4 and re-write all of this code to remove
+// shim
+class VibratorShim : public V1_4::IVibrator {
+ public:
+ VibratorShim(const sp<aidl::IVibrator>& vib) : mVib(vib) {}
+
+ Return<V1_0::Status> on(uint32_t timeoutMs) override {
+ return on_1_4(timeoutMs, nullptr);
+ }
+
+ Return<V1_0::Status> off() override {
+ return toHidlStatus(mVib->off());
+ }
+
+ Return<bool> supportsAmplitudeControl() override {
+ int32_t cap = 0;
+ if (!mVib->getCapabilities(&cap).isOk()) return false;
+ return (cap & aidl::IVibrator::CAP_AMPLITUDE_CONTROL) > 0;
+ }
+
+ Return<V1_0::Status> setAmplitude(uint8_t amplitude) override {
+ return toHidlStatus(mVib->setAmplitude(amplitude));
+ }
+
+ Return<void> perform(V1_0::Effect effect, V1_0::EffectStrength strength,
+ perform_cb _hidl_cb) override {
+ return perform_1_4(static_cast<V1_3::Effect>(effect), strength, nullptr, _hidl_cb);
+ }
+
+ Return<void> perform_1_1(V1_1::Effect_1_1 effect, V1_0::EffectStrength strength,
+ perform_1_1_cb _hidl_cb) override {
+ return perform_1_4(static_cast<V1_3::Effect>(effect), strength, nullptr, _hidl_cb);
+ }
+
+ Return<void> perform_1_2(V1_2::Effect effect, V1_0::EffectStrength strength,
+ perform_1_2_cb _hidl_cb) override {
+ return perform_1_4(static_cast<V1_3::Effect>(effect), strength, nullptr, _hidl_cb);
+ }
+
+ Return<bool> supportsExternalControl() override {
+ int32_t cap = 0;
+ if (!mVib->getCapabilities(&cap).isOk()) return false;
+ return (cap & aidl::IVibrator::CAP_EXTERNAL_CONTROL) > 0;
+ }
+
+ Return<V1_0::Status> setExternalControl(bool enabled) override {
+ return toHidlStatus(mVib->setExternalControl(enabled));
+ }
+
+ Return<void> perform_1_3(V1_3::Effect effect, V1_0::EffectStrength strength,
+ perform_1_3_cb _hidl_cb) override {
+ return perform_1_4(static_cast<V1_3::Effect>(effect), strength, nullptr, _hidl_cb);
+ }
+
+ Return<uint32_t> getCapabilities() override {
+ static_assert(static_cast<int32_t>(V1_4::Capabilities::ON_COMPLETION_CALLBACK) ==
+ static_cast<int32_t>(aidl::IVibrator::CAP_ON_CALLBACK));
+ static_assert(static_cast<int32_t>(V1_4::Capabilities::PERFORM_COMPLETION_CALLBACK) ==
+ static_cast<int32_t>(aidl::IVibrator::CAP_PERFORM_CALLBACK));
+
+ int32_t cap;
+ if (!mVib->getCapabilities(&cap).isOk()) return 0;
+ return (cap & (aidl::IVibrator::CAP_ON_CALLBACK |
+ aidl::IVibrator::CAP_PERFORM_CALLBACK)) > 0;
+ }
+
+ Return<V1_0::Status> on_1_4(uint32_t timeoutMs,
+ const sp<V1_4::IVibratorCallback>& callback) override {
+ sp<aidl::IVibratorCallback> cb = callback ? new CallbackShim(callback) : nullptr;
+ return toHidlStatus(mVib->on(timeoutMs, cb));
+ }
+
+ Return<void> perform_1_4(V1_3::Effect effect, V1_0::EffectStrength strength,
+ const sp<V1_4::IVibratorCallback>& callback,
+ perform_1_4_cb _hidl_cb) override {
+ static_assert(static_cast<uint8_t>(V1_0::EffectStrength::LIGHT) ==
+ static_cast<uint8_t>(aidl::EffectStrength::LIGHT));
+ static_assert(static_cast<uint8_t>(V1_0::EffectStrength::MEDIUM) ==
+ static_cast<uint8_t>(aidl::EffectStrength::MEDIUM));
+ static_assert(static_cast<uint8_t>(V1_0::EffectStrength::STRONG) ==
+ static_cast<uint8_t>(aidl::EffectStrength::STRONG));
+ static_assert(static_cast<uint8_t>(V1_3::Effect::CLICK) ==
+ static_cast<uint8_t>(aidl::Effect::CLICK));
+ static_assert(static_cast<uint8_t>(V1_3::Effect::DOUBLE_CLICK) ==
+ static_cast<uint8_t>(aidl::Effect::DOUBLE_CLICK));
+ static_assert(static_cast<uint8_t>(V1_3::Effect::TICK) ==
+ static_cast<uint8_t>(aidl::Effect::TICK));
+ static_assert(static_cast<uint8_t>(V1_3::Effect::THUD) ==
+ static_cast<uint8_t>(aidl::Effect::THUD));
+ static_assert(static_cast<uint8_t>(V1_3::Effect::POP) ==
+ static_cast<uint8_t>(aidl::Effect::POP));
+ static_assert(static_cast<uint8_t>(V1_3::Effect::HEAVY_CLICK) ==
+ static_cast<uint8_t>(aidl::Effect::HEAVY_CLICK));
+ static_assert(static_cast<uint8_t>(V1_3::Effect::RINGTONE_1) ==
+ static_cast<uint8_t>(aidl::Effect::RINGTONE_1));
+ static_assert(static_cast<uint8_t>(V1_3::Effect::RINGTONE_2) ==
+ static_cast<uint8_t>(aidl::Effect::RINGTONE_2));
+ static_assert(static_cast<uint8_t>(V1_3::Effect::RINGTONE_15) ==
+ static_cast<uint8_t>(aidl::Effect::RINGTONE_15));
+ static_assert(static_cast<uint8_t>(V1_3::Effect::TEXTURE_TICK) ==
+ static_cast<uint8_t>(aidl::Effect::TEXTURE_TICK));
+
+ sp<aidl::IVibratorCallback> cb = callback ? new CallbackShim(callback) : nullptr;
+ int timeoutMs = 0;
+ V1_0::Status status = toHidlStatus(
+ mVib->perform(static_cast<aidl::Effect>(effect),
+ static_cast<aidl::EffectStrength>(strength), cb, &timeoutMs));
+ _hidl_cb(status, timeoutMs);
+ return android::hardware::Status::ok();
+ }
+ private:
+ sp<aidl::IVibrator> mVib;
+
+ V1_0::Status toHidlStatus(const android::binder::Status& status) {
+ switch(status.exceptionCode()) {
+ using android::hardware::Status;
+ case Status::EX_NONE: return V1_0::Status::OK;
+ case Status::EX_ILLEGAL_ARGUMENT: return V1_0::Status::BAD_VALUE;
+ case Status::EX_UNSUPPORTED_OPERATION: return V1_0::Status::UNSUPPORTED_OPERATION;
+ }
+ return V1_0::Status::UNKNOWN_ERROR;
+ }
+
+ class CallbackShim : public aidl::BnVibratorCallback {
+ public:
+ CallbackShim(const sp<V1_4::IVibratorCallback>& cb) : mCb(cb) {}
+ binder::Status onComplete() {
+ mCb->onComplete();
+ return binder::Status::ok(); // oneway, local call
+ }
+ private:
+ sp<V1_4::IVibratorCallback> mCb;
+ };
+};
+
class VibratorCallback : public V1_4::IVibratorCallback {
public:
VibratorCallback(JNIEnv *env, jobject vibration) :
@@ -79,6 +218,11 @@ template <typename I>
class HalWrapper {
public:
static std::unique_ptr<HalWrapper> Create() {
+ sp<aidl::IVibrator> aidlVib = waitForVintfService<aidl::IVibrator>();
+ if (aidlVib) {
+ return std::unique_ptr<HalWrapper>(new HalWrapper(new VibratorShim(aidlVib)));
+ }
+
// Assume that if getService returns a nullptr, HAL is not available on the
// device.
auto hal = I::getService();
diff --git a/services/core/jni/com_android_server_input_InputManagerService.cpp b/services/core/jni/com_android_server_input_InputManagerService.cpp
index dd2629d31768..35e2436817df 100644
--- a/services/core/jni/com_android_server_input_InputManagerService.cpp
+++ b/services/core/jni/com_android_server_input_InputManagerService.cpp
@@ -709,6 +709,18 @@ void NativeInputManager::notifyConfigurationChanged(nsecs_t when) {
checkAndClearExceptionFromCallback(env, "notifyConfigurationChanged");
}
+static jobject getInputApplicationHandleObjLocalRef(JNIEnv* env,
+ const sp<InputApplicationHandle>& inputApplicationHandle) {
+ if (inputApplicationHandle == nullptr) {
+ return nullptr;
+ }
+ NativeInputApplicationHandle* handle =
+ static_cast<NativeInputApplicationHandle*>(inputApplicationHandle.get());
+
+ return handle->getInputApplicationHandleObjLocalRef(env);
+}
+
+
nsecs_t NativeInputManager::notifyANR(const sp<InputApplicationHandle>& inputApplicationHandle,
const sp<IBinder>& token, const std::string& reason) {
#if DEBUG_INPUT_DISPATCHER_POLICY
@@ -719,12 +731,15 @@ nsecs_t NativeInputManager::notifyANR(const sp<InputApplicationHandle>& inputApp
JNIEnv* env = jniEnv();
ScopedLocalFrame localFrame(env);
+ jobject inputApplicationHandleObj =
+ getInputApplicationHandleObjLocalRef(env, inputApplicationHandle);
+
jobject tokenObj = javaObjectForIBinder(env, token);
jstring reasonObj = env->NewStringUTF(reason.c_str());
jlong newTimeout = env->CallLongMethod(mServiceObj,
- gServiceClassInfo.notifyANR, tokenObj,
- reasonObj);
+ gServiceClassInfo.notifyANR, inputApplicationHandleObj, tokenObj,
+ reasonObj);
if (checkAndClearExceptionFromCallback(env, "notifyANR")) {
newTimeout = 0; // abort dispatch
} else {
@@ -1865,7 +1880,7 @@ int register_android_server_InputManager(JNIEnv* env) {
GET_METHOD_ID(gServiceClassInfo.notifyANR, clazz,
"notifyANR",
- "(Landroid/os/IBinder;Ljava/lang/String;)J");
+ "(Landroid/view/InputApplicationHandle;Landroid/os/IBinder;Ljava/lang/String;)J");
GET_METHOD_ID(gServiceClassInfo.filterInputEvent, clazz,
"filterInputEvent", "(Landroid/view/InputEvent;I)Z");
diff --git a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java
index 5e49c7a9e5d1..a39cc2088be0 100644
--- a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java
+++ b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java
@@ -8105,15 +8105,7 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager {
mSecurityLogMonitor.stop();
setNetworkLoggingActiveInternal(false);
deleteTransferOwnershipBundleLocked(userId);
-
- try {
- if (mInjector.getIBackupManager() != null) {
- // Reactivate backup service.
- mInjector.getIBackupManager().setBackupServiceActive(UserHandle.USER_SYSTEM, true);
- }
- } catch (RemoteException e) {
- throw new IllegalStateException("Failed reactivating backup service.", e);
- }
+ toggleBackupServiceActive(UserHandle.USER_SYSTEM, true);
}
@Override
@@ -8173,7 +8165,6 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager {
}
}
-
private void toggleBackupServiceActive(int userId, boolean makeActive) {
long ident = mInjector.binderClearCallingIdentity();
try {
@@ -8182,7 +8173,8 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager {
.setBackupServiceActive(userId, makeActive);
}
} catch (RemoteException e) {
- throw new IllegalStateException("Failed deactivating backup service.", e);
+ throw new IllegalStateException(String.format("Failed %s backup service.",
+ makeActive ? "activating" : "deactivating"), e);
} finally {
mInjector.binderRestoreCallingIdentity(ident);
}
@@ -8233,6 +8225,7 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager {
mOwners.removeProfileOwner(userId);
mOwners.writeProfileOwner(userId);
deleteTransferOwnershipBundleLocked(userId);
+ toggleBackupServiceActive(userId, true);
}
@Override
diff --git a/services/java/com/android/server/SystemServer.java b/services/java/com/android/server/SystemServer.java
index 58830487a0fe..2009dbdca448 100644
--- a/services/java/com/android/server/SystemServer.java
+++ b/services/java/com/android/server/SystemServer.java
@@ -27,6 +27,7 @@ import static com.android.server.utils.TimingsTraceAndSlog.SYSTEM_SERVER_TIMING_
import android.annotation.NonNull;
import android.annotation.StringRes;
import android.app.ActivityThread;
+import android.app.AppCompatCallbacks;
import android.app.INotificationManager;
import android.app.usage.UsageStatsManagerInternal;
import android.content.ComponentName;
@@ -646,6 +647,7 @@ public final class SystemServer {
ServiceManager.addService(Context.PLATFORM_COMPAT_SERVICE, platformCompat);
ServiceManager.addService(Context.PLATFORM_COMPAT_NATIVE_SERVICE,
new PlatformCompatNative(platformCompat));
+ AppCompatCallbacks.install(new long[0]);
t.traceEnd();
// Wait for installd to finish starting up so that it has a chance to
@@ -1133,7 +1135,6 @@ public final class SystemServer {
StatusBarManagerService statusBar = null;
INotificationManager notification = null;
- LocationManagerService location = null;
CountryDetectorService countryDetector = null;
ILockSettings lockSettings = null;
MediaRouterService mediaRouter = null;
@@ -1430,12 +1431,7 @@ public final class SystemServer {
t.traceEnd();
t.traceBegin("StartLocationManagerService");
- try {
- location = new LocationManagerService(context);
- ServiceManager.addService(Context.LOCATION_SERVICE, location);
- } catch (Throwable e) {
- reportWtf("starting Location Manager", e);
- }
+ mSystemServiceManager.startService(LocationManagerService.Lifecycle.class);
t.traceEnd();
t.traceBegin("StartCountryDetectorService");
@@ -2019,7 +2015,6 @@ public final class SystemServer {
final NetworkStatsService networkStatsF = networkStats;
final NetworkPolicyManagerService networkPolicyF = networkPolicy;
final ConnectivityService connectivityF = connectivity;
- final LocationManagerService locationF = location;
final CountryDetectorService countryDetectorF = countryDetector;
final NetworkTimeUpdateService networkTimeUpdaterF = networkTimeUpdater;
final InputManagerService inputManagerF = inputManager;
@@ -2175,16 +2170,6 @@ public final class SystemServer {
}
t.traceEnd();
-
- t.traceBegin("MakeLocationServiceReady");
- try {
- if (locationF != null) {
- locationF.systemRunning();
- }
- } catch (Throwable e) {
- reportWtf("Notifying Location Service running", e);
- }
- t.traceEnd();
t.traceBegin("MakeCountryDetectionServiceReady");
try {
if (countryDetectorF != null) {
diff --git a/services/tests/mockingservicestests/src/com/android/server/AlarmManagerServiceTest.java b/services/tests/mockingservicestests/src/com/android/server/AlarmManagerServiceTest.java
index 9e7b80567263..485f436f7f65 100644
--- a/services/tests/mockingservicestests/src/com/android/server/AlarmManagerServiceTest.java
+++ b/services/tests/mockingservicestests/src/com/android/server/AlarmManagerServiceTest.java
@@ -38,7 +38,6 @@ import static com.android.server.AlarmManagerService.AlarmHandler.CHARGING_STATU
import static com.android.server.AlarmManagerService.Constants.KEY_ALLOW_WHILE_IDLE_LONG_TIME;
import static com.android.server.AlarmManagerService.Constants.KEY_ALLOW_WHILE_IDLE_SHORT_TIME;
import static com.android.server.AlarmManagerService.Constants.KEY_ALLOW_WHILE_IDLE_WHITELIST_DURATION;
-import static com.android.server.AlarmManagerService.Constants.KEY_APP_STANDBY_QUOTAS_ENABLED;
import static com.android.server.AlarmManagerService.Constants.KEY_LISTENER_TIMEOUT;
import static com.android.server.AlarmManagerService.Constants.KEY_MAX_INTERVAL;
import static com.android.server.AlarmManagerService.Constants.KEY_MIN_FUTURITY;
@@ -305,6 +304,8 @@ public class AlarmManagerServiceTest {
argThat((filter) -> filter.hasAction(BatteryManager.ACTION_CHARGING)
&& filter.hasAction(BatteryManager.ACTION_DISCHARGING)));
mChargingReceiver = chargingReceiverCaptor.getValue();
+
+ setTestableQuotas();
}
private void setTestAlarm(int type, long triggerTime, PendingIntent operation) {
@@ -342,9 +343,10 @@ public class AlarmManagerServiceTest {
}
/**
+ * Lowers quotas to make testing feasible.
* Careful while calling as this will replace any existing settings for the calling test.
*/
- private void setQuotasEnabled(boolean enabled) {
+ private void setTestableQuotas() {
final StringBuilder constantsBuilder = new StringBuilder();
constantsBuilder.append(KEY_MIN_FUTURITY);
constantsBuilder.append("=0,");
@@ -353,14 +355,9 @@ public class AlarmManagerServiceTest {
constantsBuilder.append("=8,");
constantsBuilder.append(mService.mConstants.KEYS_APP_STANDBY_QUOTAS[WORKING_INDEX]);
constantsBuilder.append("=5,");
- if (!enabled) {
- constantsBuilder.append(KEY_APP_STANDBY_QUOTAS_ENABLED);
- constantsBuilder.append("=false,");
- }
doReturn(constantsBuilder.toString()).when(() -> Settings.Global.getString(mMockResolver,
Settings.Global.ALARM_MANAGER_CONSTANTS));
mService.mConstants.onChange(false, null);
- assertEquals(mService.mConstants.APP_STANDBY_QUOTAS_ENABLED, enabled);
}
@Test
@@ -481,67 +478,6 @@ public class AlarmManagerServiceTest {
assertEquals(mNowElapsedTest + 9, mTestTimer.getElapsed());
}
- @Test
- public void testStandbyBucketDelay_workingSet() throws Exception {
- setQuotasEnabled(false);
- setTestAlarm(ELAPSED_REALTIME_WAKEUP, mNowElapsedTest + 5, getNewMockPendingIntent());
- setTestAlarm(ELAPSED_REALTIME_WAKEUP, mNowElapsedTest + 6, getNewMockPendingIntent());
- assertEquals(mNowElapsedTest + 5, mTestTimer.getElapsed());
-
- when(mUsageStatsManagerInternal.getAppStandbyBucket(eq(TEST_CALLING_PACKAGE), anyInt(),
- anyLong())).thenReturn(STANDBY_BUCKET_WORKING_SET);
-
- mNowElapsedTest = mTestTimer.getElapsed();
- mTestTimer.expire();
-
- verify(mUsageStatsManagerInternal, atLeastOnce())
- .getAppStandbyBucket(eq(TEST_CALLING_PACKAGE),
- eq(UserHandle.getUserId(TEST_CALLING_UID)), anyLong());
- final long expectedNextTrigger = mNowElapsedTest
- + mService.getMinDelayForBucketLocked(STANDBY_BUCKET_WORKING_SET);
- assertEquals("Incorrect next alarm trigger", expectedNextTrigger, mTestTimer.getElapsed());
- }
-
- @Test
- public void testStandbyBucketDelay_frequent() throws Exception {
- setQuotasEnabled(false);
- setTestAlarm(ELAPSED_REALTIME_WAKEUP, mNowElapsedTest + 5, getNewMockPendingIntent());
- setTestAlarm(ELAPSED_REALTIME_WAKEUP, mNowElapsedTest + 6, getNewMockPendingIntent());
- assertEquals(mNowElapsedTest + 5, mTestTimer.getElapsed());
-
- when(mUsageStatsManagerInternal.getAppStandbyBucket(eq(TEST_CALLING_PACKAGE), anyInt(),
- anyLong())).thenReturn(STANDBY_BUCKET_FREQUENT);
- mNowElapsedTest = mTestTimer.getElapsed();
- mTestTimer.expire();
-
- verify(mUsageStatsManagerInternal, atLeastOnce())
- .getAppStandbyBucket(eq(TEST_CALLING_PACKAGE),
- eq(UserHandle.getUserId(TEST_CALLING_UID)), anyLong());
- final long expectedNextTrigger = mNowElapsedTest
- + mService.getMinDelayForBucketLocked(STANDBY_BUCKET_FREQUENT);
- assertEquals("Incorrect next alarm trigger.", expectedNextTrigger, mTestTimer.getElapsed());
- }
-
- @Test
- public void testStandbyBucketDelay_rare() throws Exception {
- setQuotasEnabled(false);
- setTestAlarm(ELAPSED_REALTIME_WAKEUP, mNowElapsedTest + 5, getNewMockPendingIntent());
- setTestAlarm(ELAPSED_REALTIME_WAKEUP, mNowElapsedTest + 6, getNewMockPendingIntent());
- assertEquals(mNowElapsedTest + 5, mTestTimer.getElapsed());
-
- when(mUsageStatsManagerInternal.getAppStandbyBucket(eq(TEST_CALLING_PACKAGE), anyInt(),
- anyLong())).thenReturn(STANDBY_BUCKET_RARE);
- mNowElapsedTest = mTestTimer.getElapsed();
- mTestTimer.expire();
-
- verify(mUsageStatsManagerInternal, atLeastOnce())
- .getAppStandbyBucket(eq(TEST_CALLING_PACKAGE),
- eq(UserHandle.getUserId(TEST_CALLING_UID)), anyLong());
- final long expectedNextTrigger = mNowElapsedTest
- + mService.getMinDelayForBucketLocked(STANDBY_BUCKET_RARE);
- assertEquals("Incorrect next alarm trigger.", expectedNextTrigger, mTestTimer.getElapsed());
- }
-
private void testQuotasDeferralOnSet(int standbyBucket) throws Exception {
final int quota = mService.getQuotaForBucketLocked(standbyBucket);
when(mUsageStatsManagerInternal.getAppStandbyBucket(eq(TEST_CALLING_PACKAGE), anyInt(),
@@ -601,73 +537,61 @@ public class AlarmManagerServiceTest {
@Test
public void testActiveQuota_deferredOnSet() throws Exception {
- setQuotasEnabled(true);
testQuotasDeferralOnSet(STANDBY_BUCKET_ACTIVE);
}
@Test
public void testActiveQuota_deferredOnExpiration() throws Exception {
- setQuotasEnabled(true);
testQuotasDeferralOnExpiration(STANDBY_BUCKET_ACTIVE);
}
@Test
public void testActiveQuota_notDeferred() throws Exception {
- setQuotasEnabled(true);
testQuotasNoDeferral(STANDBY_BUCKET_ACTIVE);
}
@Test
public void testWorkingQuota_deferredOnSet() throws Exception {
- setQuotasEnabled(true);
testQuotasDeferralOnSet(STANDBY_BUCKET_WORKING_SET);
}
@Test
public void testWorkingQuota_deferredOnExpiration() throws Exception {
- setQuotasEnabled(true);
testQuotasDeferralOnExpiration(STANDBY_BUCKET_WORKING_SET);
}
@Test
public void testWorkingQuota_notDeferred() throws Exception {
- setQuotasEnabled(true);
testQuotasNoDeferral(STANDBY_BUCKET_WORKING_SET);
}
@Test
public void testFrequentQuota_deferredOnSet() throws Exception {
- setQuotasEnabled(true);
testQuotasDeferralOnSet(STANDBY_BUCKET_FREQUENT);
}
@Test
public void testFrequentQuota_deferredOnExpiration() throws Exception {
- setQuotasEnabled(true);
testQuotasDeferralOnExpiration(STANDBY_BUCKET_FREQUENT);
}
@Test
public void testFrequentQuota_notDeferred() throws Exception {
- setQuotasEnabled(true);
testQuotasNoDeferral(STANDBY_BUCKET_FREQUENT);
}
@Test
public void testRareQuota_deferredOnSet() throws Exception {
- setQuotasEnabled(true);
testQuotasDeferralOnSet(STANDBY_BUCKET_RARE);
}
@Test
public void testRareQuota_deferredOnExpiration() throws Exception {
- setQuotasEnabled(true);
testQuotasDeferralOnExpiration(STANDBY_BUCKET_RARE);
}
@Test
public void testRareQuota_notDeferred() throws Exception {
- setQuotasEnabled(true);
testQuotasNoDeferral(STANDBY_BUCKET_RARE);
}
@@ -686,7 +610,6 @@ public class AlarmManagerServiceTest {
@Test
public void testQuotaDowngrade() throws Exception {
- setQuotasEnabled(true);
final int workingQuota = mService.getQuotaForBucketLocked(STANDBY_BUCKET_WORKING_SET);
when(mUsageStatsManagerInternal.getAppStandbyBucket(eq(TEST_CALLING_PACKAGE), anyInt(),
anyLong())).thenReturn(STANDBY_BUCKET_WORKING_SET);
@@ -714,7 +637,6 @@ public class AlarmManagerServiceTest {
@Test
public void testQuotaUpgrade() throws Exception {
- setQuotasEnabled(true);
final int frequentQuota = mService.getQuotaForBucketLocked(STANDBY_BUCKET_FREQUENT);
when(mUsageStatsManagerInternal.getAppStandbyBucket(eq(TEST_CALLING_PACKAGE), anyInt(),
anyLong())).thenReturn(STANDBY_BUCKET_FREQUENT);
@@ -752,7 +674,6 @@ public class AlarmManagerServiceTest {
@Test
public void testCharging() throws Exception {
- setQuotasEnabled(true);
final int workingQuota = mService.getQuotaForBucketLocked(STANDBY_BUCKET_WORKING_SET);
when(mUsageStatsManagerInternal.getAppStandbyBucket(eq(TEST_CALLING_PACKAGE), anyInt(),
anyLong())).thenReturn(STANDBY_BUCKET_WORKING_SET);
diff --git a/services/tests/mockingservicestests/src/com/android/server/AppStateTrackerTest.java b/services/tests/mockingservicestests/src/com/android/server/AppStateTrackerTest.java
index 1f4656ae54a4..1e270077780d 100644
--- a/services/tests/mockingservicestests/src/com/android/server/AppStateTrackerTest.java
+++ b/services/tests/mockingservicestests/src/com/android/server/AppStateTrackerTest.java
@@ -513,7 +513,8 @@ public class AppStateTrackerTest {
mIUidObserver.onUidStateChanged(UID_2,
- ActivityManager.PROCESS_STATE_BOUND_FOREGROUND_SERVICE, 0);
+ ActivityManager.PROCESS_STATE_BOUND_FOREGROUND_SERVICE, 0,
+ ActivityManager.PROCESS_CAPABILITY_NONE);
waitUntilMainHandlerDrain();
assertTrue(instance.isUidActive(UID_1));
@@ -530,7 +531,8 @@ public class AppStateTrackerTest {
mIUidObserver.onUidStateChanged(UID_1,
- ActivityManager.PROCESS_STATE_FOREGROUND_SERVICE, 0);
+ ActivityManager.PROCESS_STATE_FOREGROUND_SERVICE, 0,
+ ActivityManager.PROCESS_CAPABILITY_NONE);
waitUntilMainHandlerDrain();
assertTrue(instance.isUidActive(UID_1));
@@ -564,7 +566,8 @@ public class AppStateTrackerTest {
assertTrue(instance.isUidInForeground(Process.SYSTEM_UID));
mIUidObserver.onUidStateChanged(UID_1,
- ActivityManager.PROCESS_STATE_IMPORTANT_FOREGROUND, 0);
+ ActivityManager.PROCESS_STATE_IMPORTANT_FOREGROUND, 0,
+ ActivityManager.PROCESS_CAPABILITY_NONE);
waitUntilMainHandlerDrain();
assertFalse(instance.isUidActive(UID_1));
@@ -576,7 +579,8 @@ public class AppStateTrackerTest {
assertTrue(instance.isUidInForeground(Process.SYSTEM_UID));
mIUidObserver.onUidStateChanged(UID_1,
- ActivityManager.PROCESS_STATE_TRANSIENT_BACKGROUND, 0);
+ ActivityManager.PROCESS_STATE_TRANSIENT_BACKGROUND, 0,
+ ActivityManager.PROCESS_CAPABILITY_NONE);
waitUntilMainHandlerDrain();
assertFalse(instance.isUidActive(UID_1));
diff --git a/services/tests/mockingservicestests/src/com/android/server/am/MockingOomAdjusterTests.java b/services/tests/mockingservicestests/src/com/android/server/am/MockingOomAdjusterTests.java
index 6dd1bd87019f..e7f6a7484881 100644
--- a/services/tests/mockingservicestests/src/com/android/server/am/MockingOomAdjusterTests.java
+++ b/services/tests/mockingservicestests/src/com/android/server/am/MockingOomAdjusterTests.java
@@ -23,7 +23,6 @@ import static android.app.ActivityManager.PROCESS_STATE_CACHED_ACTIVITY_CLIENT;
import static android.app.ActivityManager.PROCESS_STATE_CACHED_EMPTY;
import static android.app.ActivityManager.PROCESS_STATE_CACHED_RECENT;
import static android.app.ActivityManager.PROCESS_STATE_FOREGROUND_SERVICE;
-import static android.app.ActivityManager.PROCESS_STATE_FOREGROUND_SERVICE_LOCATION;
import static android.app.ActivityManager.PROCESS_STATE_HEAVY_WEIGHT;
import static android.app.ActivityManager.PROCESS_STATE_HOME;
import static android.app.ActivityManager.PROCESS_STATE_IMPORTANT_BACKGROUND;
@@ -62,6 +61,7 @@ import static com.android.server.am.ProcessList.UNKNOWN_ADJ;
import static com.android.server.am.ProcessList.VISIBLE_APP_ADJ;
import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
import static org.mockito.AdditionalAnswers.answer;
import static org.mockito.Mockito.any;
import static org.mockito.Mockito.anyInt;
@@ -368,7 +368,7 @@ public class MockingOomAdjusterTests {
sService.mWakefulness = PowerManagerInternal.WAKEFULNESS_AWAKE;
sService.mOomAdjuster.updateOomAdjLocked(app, false, OomAdjuster.OOM_ADJ_REASON_NONE);
- assertProcStates(app, PROCESS_STATE_FOREGROUND_SERVICE_LOCATION, PERCEPTIBLE_APP_ADJ,
+ assertProcStates(app, PROCESS_STATE_FOREGROUND_SERVICE, PERCEPTIBLE_APP_ADJ,
SCHED_GROUP_DEFAULT);
}
@@ -543,6 +543,21 @@ public class MockingOomAdjusterTests {
@SuppressWarnings("GuardedBy")
@Test
+ public void testUpdateOomAdj_DoOne_NonCachedToCached() {
+ ProcessRecord app = spy(makeDefaultProcessRecord(MOCKAPP_PID, MOCKAPP_UID,
+ MOCKAPP_PROCESSNAME, MOCKAPP_PACKAGENAME, false));
+ app.cached = false;
+ app.setCurRawAdj(SERVICE_ADJ);
+ doReturn(null).when(sService).getTopAppLocked();
+ sService.mWakefulness = PowerManagerInternal.WAKEFULNESS_AWAKE;
+ sService.mOomAdjuster.updateOomAdjLocked(app, OomAdjuster.OOM_ADJ_REASON_NONE);
+
+ assertTrue(ProcessList.CACHED_APP_MIN_ADJ <= app.setAdj);
+ assertTrue(ProcessList.CACHED_APP_MAX_ADJ >= app.setAdj);
+ }
+
+ @SuppressWarnings("GuardedBy")
+ @Test
public void testUpdateOomAdj_DoOne_Service_Started() {
ProcessRecord app = spy(makeDefaultProcessRecord(MOCKAPP_PID, MOCKAPP_UID,
MOCKAPP_PROCESSNAME, MOCKAPP_PACKAGENAME, false));
diff --git a/services/tests/mockingservicestests/src/com/android/server/appop/AppOpsServiceTest.java b/services/tests/mockingservicestests/src/com/android/server/appop/AppOpsServiceTest.java
index b6a7b09b3b7f..fa209a7a5f8e 100644
--- a/services/tests/mockingservicestests/src/com/android/server/appop/AppOpsServiceTest.java
+++ b/services/tests/mockingservicestests/src/com/android/server/appop/AppOpsServiceTest.java
@@ -16,7 +16,6 @@
package com.android.server.appop;
import static android.app.ActivityManager.PROCESS_STATE_FOREGROUND_SERVICE;
-import static android.app.ActivityManager.PROCESS_STATE_FOREGROUND_SERVICE_LOCATION;
import static android.app.AppOpsManager.MODE_ALLOWED;
import static android.app.AppOpsManager.MODE_ERRORED;
import static android.app.AppOpsManager.MODE_FOREGROUND;
@@ -338,18 +337,22 @@ public class AppOpsServiceTest {
public void testUidProcStateChange_cachedToTopToCached() throws Exception {
setupProcStateTests();
- mAppOpsService.updateUidProcState(mMyUid, ActivityManager.PROCESS_STATE_CACHED_EMPTY);
+ mAppOpsService.updateUidProcState(mMyUid, ActivityManager.PROCESS_STATE_CACHED_EMPTY,
+ ActivityManager.PROCESS_CAPABILITY_NONE);
assertThat(mAppOpsService.noteOperation(OP_COARSE_LOCATION, mMyUid, sMyPackageName, null))
.isNotEqualTo(MODE_ALLOWED);
- mAppOpsService.updateUidProcState(mMyUid, ActivityManager.PROCESS_STATE_TOP);
+ mAppOpsService.updateUidProcState(mMyUid, ActivityManager.PROCESS_STATE_TOP,
+ ActivityManager.PROCESS_CAPABILITY_FOREGROUND_LOCATION);
assertThat(mAppOpsService.noteOperation(OP_COARSE_LOCATION, mMyUid, sMyPackageName, null))
.isEqualTo(MODE_ALLOWED);
- mAppOpsService.updateUidProcState(mMyUid, ActivityManager.PROCESS_STATE_CACHED_EMPTY);
+ mAppOpsService.updateUidProcState(mMyUid, ActivityManager.PROCESS_STATE_CACHED_EMPTY,
+ ActivityManager.PROCESS_CAPABILITY_NONE);
// Second time to make sure that settle time is overcome
Thread.sleep(50);
- mAppOpsService.updateUidProcState(mMyUid, ActivityManager.PROCESS_STATE_CACHED_EMPTY);
+ mAppOpsService.updateUidProcState(mMyUid, ActivityManager.PROCESS_STATE_CACHED_EMPTY,
+ ActivityManager.PROCESS_CAPABILITY_NONE);
assertThat(mAppOpsService.noteOperation(OP_COARSE_LOCATION, mMyUid, sMyPackageName, null))
.isNotEqualTo(MODE_ALLOWED);
}
@@ -357,12 +360,13 @@ public class AppOpsServiceTest {
@Test
public void testUidProcStateChange_cachedToFgs() {
setupProcStateTests();
-
- mAppOpsService.updateUidProcState(mMyUid, ActivityManager.PROCESS_STATE_CACHED_EMPTY);
+ mAppOpsService.updateUidProcState(mMyUid, ActivityManager.PROCESS_STATE_CACHED_EMPTY,
+ ActivityManager.PROCESS_CAPABILITY_NONE);
assertThat(mAppOpsService.noteOperation(OP_COARSE_LOCATION, mMyUid, sMyPackageName, null))
.isNotEqualTo(MODE_ALLOWED);
- mAppOpsService.updateUidProcState(mMyUid, PROCESS_STATE_FOREGROUND_SERVICE);
+ mAppOpsService.updateUidProcState(mMyUid, PROCESS_STATE_FOREGROUND_SERVICE,
+ ActivityManager.PROCESS_CAPABILITY_NONE);
assertThat(mAppOpsService.noteOperation(OP_COARSE_LOCATION, mMyUid, sMyPackageName, null))
.isNotEqualTo(MODE_ALLOWED);
}
@@ -371,12 +375,13 @@ public class AppOpsServiceTest {
public void testUidProcStateChange_cachedToFgsLocation() {
setupProcStateTests();
- mAppOpsService.updateUidProcState(mMyUid, ActivityManager.PROCESS_STATE_CACHED_EMPTY);
+ mAppOpsService.updateUidProcState(mMyUid, ActivityManager.PROCESS_STATE_CACHED_EMPTY,
+ ActivityManager.PROCESS_CAPABILITY_NONE);
assertThat(mAppOpsService.noteOperation(OP_COARSE_LOCATION, mMyUid, sMyPackageName, null))
.isNotEqualTo(MODE_ALLOWED);
- mAppOpsService.updateUidProcState(mMyUid,
- PROCESS_STATE_FOREGROUND_SERVICE_LOCATION);
+ mAppOpsService.updateUidProcState(mMyUid, PROCESS_STATE_FOREGROUND_SERVICE,
+ ActivityManager.PROCESS_CAPABILITY_FOREGROUND_LOCATION);
assertThat(mAppOpsService.noteOperation(OP_COARSE_LOCATION, mMyUid, sMyPackageName, null))
.isEqualTo(MODE_ALLOWED);
}
@@ -385,18 +390,22 @@ public class AppOpsServiceTest {
public void testUidProcStateChange_topToFgs() throws Exception {
setupProcStateTests();
- mAppOpsService.updateUidProcState(mMyUid, ActivityManager.PROCESS_STATE_CACHED_EMPTY);
+ mAppOpsService.updateUidProcState(mMyUid, ActivityManager.PROCESS_STATE_CACHED_EMPTY,
+ ActivityManager.PROCESS_CAPABILITY_NONE);
assertThat(mAppOpsService.noteOperation(OP_COARSE_LOCATION, mMyUid, sMyPackageName, null))
.isNotEqualTo(MODE_ALLOWED);
- mAppOpsService.updateUidProcState(mMyUid, ActivityManager.PROCESS_STATE_TOP);
+ mAppOpsService.updateUidProcState(mMyUid, ActivityManager.PROCESS_STATE_TOP,
+ ActivityManager.PROCESS_CAPABILITY_FOREGROUND_LOCATION);
assertThat(mAppOpsService.noteOperation(OP_COARSE_LOCATION, mMyUid, sMyPackageName, null))
.isEqualTo(MODE_ALLOWED);
- mAppOpsService.updateUidProcState(mMyUid, PROCESS_STATE_FOREGROUND_SERVICE);
+ mAppOpsService.updateUidProcState(mMyUid, PROCESS_STATE_FOREGROUND_SERVICE,
+ ActivityManager.PROCESS_CAPABILITY_NONE);
// Second time to make sure that settle time is overcome
Thread.sleep(50);
- mAppOpsService.updateUidProcState(mMyUid, PROCESS_STATE_FOREGROUND_SERVICE);
+ mAppOpsService.updateUidProcState(mMyUid, PROCESS_STATE_FOREGROUND_SERVICE,
+ ActivityManager.PROCESS_CAPABILITY_NONE);
assertThat(mAppOpsService.noteOperation(OP_COARSE_LOCATION, mMyUid, sMyPackageName, null))
.isNotEqualTo(MODE_ALLOWED);
}
@@ -405,25 +414,31 @@ public class AppOpsServiceTest {
public void testUidProcStateChange_topToFgsLocationToFgs() throws Exception {
setupProcStateTests();
- mAppOpsService.updateUidProcState(mMyUid, ActivityManager.PROCESS_STATE_CACHED_EMPTY);
+ mAppOpsService.updateUidProcState(mMyUid, ActivityManager.PROCESS_STATE_CACHED_EMPTY,
+ ActivityManager.PROCESS_CAPABILITY_NONE);
assertThat(mAppOpsService.noteOperation(OP_COARSE_LOCATION, mMyUid, sMyPackageName, null))
.isNotEqualTo(MODE_ALLOWED);
- mAppOpsService.updateUidProcState(mMyUid, ActivityManager.PROCESS_STATE_TOP);
+ mAppOpsService.updateUidProcState(mMyUid, ActivityManager.PROCESS_STATE_TOP,
+ ActivityManager.PROCESS_CAPABILITY_FOREGROUND_LOCATION);
assertThat(mAppOpsService.noteOperation(OP_COARSE_LOCATION, mMyUid, sMyPackageName, null))
.isEqualTo(MODE_ALLOWED);
- mAppOpsService.updateUidProcState(mMyUid, PROCESS_STATE_FOREGROUND_SERVICE_LOCATION);
+ mAppOpsService.updateUidProcState(mMyUid, PROCESS_STATE_FOREGROUND_SERVICE,
+ ActivityManager.PROCESS_CAPABILITY_FOREGROUND_LOCATION);
// Second time to make sure that settle time is overcome
Thread.sleep(50);
- mAppOpsService.updateUidProcState(mMyUid, PROCESS_STATE_FOREGROUND_SERVICE_LOCATION);
+ mAppOpsService.updateUidProcState(mMyUid, PROCESS_STATE_FOREGROUND_SERVICE,
+ ActivityManager.PROCESS_CAPABILITY_FOREGROUND_LOCATION);
assertThat(mAppOpsService.noteOperation(OP_COARSE_LOCATION, mMyUid, sMyPackageName, null))
.isEqualTo(MODE_ALLOWED);
- mAppOpsService.updateUidProcState(mMyUid, PROCESS_STATE_FOREGROUND_SERVICE);
+ mAppOpsService.updateUidProcState(mMyUid, PROCESS_STATE_FOREGROUND_SERVICE,
+ ActivityManager.PROCESS_CAPABILITY_NONE);
// Second time to make sure that settle time is overcome
Thread.sleep(50);
- mAppOpsService.updateUidProcState(mMyUid, PROCESS_STATE_FOREGROUND_SERVICE);
+ mAppOpsService.updateUidProcState(mMyUid, PROCESS_STATE_FOREGROUND_SERVICE,
+ ActivityManager.PROCESS_CAPABILITY_NONE);
assertThat(mAppOpsService.noteOperation(OP_COARSE_LOCATION, mMyUid, sMyPackageName, null))
.isNotEqualTo(MODE_ALLOWED);
}
diff --git a/services/tests/mockingservicestests/src/com/android/server/job/controllers/QuotaControllerTest.java b/services/tests/mockingservicestests/src/com/android/server/job/controllers/QuotaControllerTest.java
index 8863d5abeca3..5bd08c03d233 100644
--- a/services/tests/mockingservicestests/src/com/android/server/job/controllers/QuotaControllerTest.java
+++ b/services/tests/mockingservicestests/src/com/android/server/job/controllers/QuotaControllerTest.java
@@ -233,7 +233,8 @@ public class QuotaControllerTest {
doReturn(procState).when(mActivityMangerInternal).getUidProcessState(uid);
SparseBooleanArray foregroundUids = mQuotaController.getForegroundUids();
spyOn(foregroundUids);
- mUidObserver.onUidStateChanged(uid, procState, 0);
+ mUidObserver.onUidStateChanged(uid, procState, 0,
+ ActivityManager.PROCESS_CAPABILITY_NONE);
if (procState <= ActivityManager.PROCESS_STATE_FOREGROUND_SERVICE) {
verify(foregroundUids, timeout(2 * SECOND_IN_MILLIS).times(1))
.put(eq(uid), eq(true));
diff --git a/services/tests/servicestests/src/com/android/server/am/ActivityManagerServiceTest.java b/services/tests/servicestests/src/com/android/server/am/ActivityManagerServiceTest.java
index 1edc9534b011..49412bc0c559 100644
--- a/services/tests/servicestests/src/com/android/server/am/ActivityManagerServiceTest.java
+++ b/services/tests/servicestests/src/com/android/server/am/ActivityManagerServiceTest.java
@@ -571,7 +571,8 @@ public class ActivityManagerServiceTest {
verifyObserverReceivedChanges(observerToTest, changesToVerify, changeItems,
(observer, changeItem) -> {
verify(observer).onUidStateChanged(changeItem.uid,
- changeItem.processState, changeItem.procStateSeq);
+ changeItem.processState, changeItem.procStateSeq,
+ ActivityManager.PROCESS_CAPABILITY_NONE);
});
}
// Verify there are no other callbacks for this observer.
@@ -619,7 +620,8 @@ public class ActivityManagerServiceTest {
// First process state message is always delivered regardless of whether the process state
// change is above or below the cutpoint (PROCESS_STATE_SERVICE).
verify(observer).onUidStateChanged(TEST_UID,
- changeItem.processState, changeItem.procStateSeq);
+ changeItem.processState, changeItem.procStateSeq,
+ ActivityManager.PROCESS_CAPABILITY_NONE);
verifyNoMoreInteractions(observer);
changeItem.processState = ActivityManager.PROCESS_STATE_RECEIVER;
@@ -636,7 +638,8 @@ public class ActivityManagerServiceTest {
// the current process state change is above cutpoint, so callback will be invoked with the
// current process state change.
verify(observer).onUidStateChanged(TEST_UID,
- changeItem.processState, changeItem.procStateSeq);
+ changeItem.processState, changeItem.procStateSeq,
+ ActivityManager.PROCESS_CAPABILITY_NONE);
verifyNoMoreInteractions(observer);
changeItem.processState = ActivityManager.PROCESS_STATE_TOP;
@@ -653,7 +656,8 @@ public class ActivityManagerServiceTest {
// the current process state change is below cutpoint, so callback will be invoked with the
// current process state change.
verify(observer).onUidStateChanged(TEST_UID,
- changeItem.processState, changeItem.procStateSeq);
+ changeItem.processState, changeItem.procStateSeq,
+ ActivityManager.PROCESS_CAPABILITY_NONE);
verifyNoMoreInteractions(observer);
}
diff --git a/services/tests/servicestests/src/com/android/server/am/OomAdjusterTests.java b/services/tests/servicestests/src/com/android/server/am/OomAdjusterTests.java
index d3bcff528155..d12d8040183a 100644
--- a/services/tests/servicestests/src/com/android/server/am/OomAdjusterTests.java
+++ b/services/tests/servicestests/src/com/android/server/am/OomAdjusterTests.java
@@ -181,7 +181,7 @@ public class OomAdjusterTests {
@Test
public void testMaybeUpdateUsageStats_ProcStateFGSLocation() {
final long elapsedTime = ZERO;
- mProcessRecord.setCurProcState(ActivityManager.PROCESS_STATE_FOREGROUND_SERVICE_LOCATION);
+ mProcessRecord.setCurProcState(ActivityManager.PROCESS_STATE_FOREGROUND_SERVICE);
sService.mOomAdjuster.maybeUpdateUsageStats(mProcessRecord, elapsedTime);
assertProcessRecordState(elapsedTime, false, ZERO);
diff --git a/services/tests/servicestests/src/com/android/server/devicepolicy/DevicePolicyManagerTest.java b/services/tests/servicestests/src/com/android/server/devicepolicy/DevicePolicyManagerTest.java
index aeccfc5310e9..f571411391b5 100644
--- a/services/tests/servicestests/src/com/android/server/devicepolicy/DevicePolicyManagerTest.java
+++ b/services/tests/servicestests/src/com/android/server/devicepolicy/DevicePolicyManagerTest.java
@@ -943,10 +943,6 @@ public class DevicePolicyManagerTest extends DpmTestBase {
verify(getServices().iactivityManager, times(1)).updateDeviceOwner(
eq(admin1.getPackageName()));
- // TODO We should check if the caller has called clearCallerIdentity().
- verify(getServices().ibackupManager, times(1)).setBackupServiceActive(
- eq(UserHandle.USER_SYSTEM), eq(false));
-
verify(mContext.spiedContext, times(1)).sendBroadcastAsUser(
MockUtils.checkIntentAction(DevicePolicyManager.ACTION_DEVICE_OWNER_CHANGED),
MockUtils.checkUserHandle(UserHandle.USER_SYSTEM));
@@ -1175,6 +1171,37 @@ public class DevicePolicyManagerTest extends DpmTestBase {
// TODO Check other calls.
}
+ public void testDeviceOwnerBackupActivateDeactivate() throws Exception {
+ mContext.callerPermissions.add(permission.MANAGE_DEVICE_ADMINS);
+ mContext.callerPermissions.add(permission.MANAGE_PROFILE_AND_DEVICE_OWNERS);
+
+ // Set admin1 as a DA to the secondary user.
+ mContext.binder.callingUid = DpmMockContext.CALLER_SYSTEM_USER_UID;
+ setUpPackageManagerForAdmin(admin1, DpmMockContext.CALLER_SYSTEM_USER_UID);
+ dpm.setActiveAdmin(admin1, /* replace =*/ false);
+ assertTrue(dpm.setDeviceOwner(admin1, "owner-name"));
+
+ verify(getServices().ibackupManager, times(1)).setBackupServiceActive(
+ eq(UserHandle.USER_SYSTEM), eq(false));
+
+ dpm.clearDeviceOwnerApp(admin1.getPackageName());
+
+ verify(getServices().ibackupManager, times(1)).setBackupServiceActive(
+ eq(UserHandle.USER_SYSTEM), eq(true));
+ }
+
+ public void testProfileOwnerBackupActivateDeactivate() throws Exception {
+ setAsProfileOwner(admin1);
+
+ verify(getServices().ibackupManager, times(1)).setBackupServiceActive(
+ eq(DpmMockContext.CALLER_USER_HANDLE), eq(false));
+
+ dpm.clearProfileOwner(admin1);
+
+ verify(getServices().ibackupManager, times(1)).setBackupServiceActive(
+ eq(DpmMockContext.CALLER_USER_HANDLE), eq(true));
+ }
+
public void testClearDeviceOwner_fromDifferentUser() throws Exception {
mContext.callerPermissions.add(permission.MANAGE_DEVICE_ADMINS);
mContext.callerPermissions.add(permission.MANAGE_USERS);
diff --git a/services/tests/servicestests/src/com/android/server/net/NetworkPolicyManagerServiceTest.java b/services/tests/servicestests/src/com/android/server/net/NetworkPolicyManagerServiceTest.java
index 64bd2c7a4095..51bae166b2dc 100644
--- a/services/tests/servicestests/src/com/android/server/net/NetworkPolicyManagerServiceTest.java
+++ b/services/tests/servicestests/src/com/android/server/net/NetworkPolicyManagerServiceTest.java
@@ -1362,7 +1362,8 @@ public class NetworkPolicyManagerServiceTest {
private void callOnUidStateChanged(int uid, int procState, long procStateSeq)
throws Exception {
- mUidObserver.onUidStateChanged(uid, procState, procStateSeq);
+ mUidObserver.onUidStateChanged(uid, procState, procStateSeq,
+ ActivityManager.PROCESS_CAPABILITY_NONE);
final CountDownLatch latch = new CountDownLatch(1);
mService.mUidEventHandler.post(() -> {
latch.countDown();
diff --git a/services/tests/servicestests/src/com/android/server/pm/BaseShortcutManagerTest.java b/services/tests/servicestests/src/com/android/server/pm/BaseShortcutManagerTest.java
index b806180a8584..f9fc3a145953 100644
--- a/services/tests/servicestests/src/com/android/server/pm/BaseShortcutManagerTest.java
+++ b/services/tests/servicestests/src/com/android/server/pm/BaseShortcutManagerTest.java
@@ -2222,7 +2222,8 @@ public abstract class BaseShortcutManagerTest extends InstrumentationTestCase {
protected void makeUidForeground(int uid) {
try {
mService.mUidObserver.onUidStateChanged(
- uid, ActivityManager.PROCESS_STATE_FOREGROUND_SERVICE, 0);
+ uid, ActivityManager.PROCESS_STATE_FOREGROUND_SERVICE, 0,
+ ActivityManager.PROCESS_CAPABILITY_NONE);
} catch (RemoteException e) {
e.rethrowAsRuntimeException();
}
@@ -2235,7 +2236,8 @@ public abstract class BaseShortcutManagerTest extends InstrumentationTestCase {
protected void makeUidBackground(int uid) {
try {
mService.mUidObserver.onUidStateChanged(
- uid, ActivityManager.PROCESS_STATE_TOP_SLEEPING, 0);
+ uid, ActivityManager.PROCESS_STATE_TOP_SLEEPING, 0,
+ ActivityManager.PROCESS_CAPABILITY_NONE);
} catch (RemoteException e) {
e.rethrowAsRuntimeException();
}
diff --git a/services/tests/servicestests/src/com/android/server/pm/ShortcutManagerTest2.java b/services/tests/servicestests/src/com/android/server/pm/ShortcutManagerTest2.java
index fd3678dae0c4..7b101c728d0f 100644
--- a/services/tests/servicestests/src/com/android/server/pm/ShortcutManagerTest2.java
+++ b/services/tests/servicestests/src/com/android/server/pm/ShortcutManagerTest2.java
@@ -1647,7 +1647,8 @@ public class ShortcutManagerTest2 extends BaseShortcutManagerTest {
// State changed, but not foreground, so no resetting.
mService.mUidObserver.onUidStateChanged(
- CALLING_UID_1, ActivityManager.PROCESS_STATE_TOP_SLEEPING, 0);
+ CALLING_UID_1, ActivityManager.PROCESS_STATE_TOP_SLEEPING, 0,
+ ActivityManager.PROCESS_CAPABILITY_NONE);
runWithCaller(CALLING_PACKAGE_1, USER_0, () -> {
MoreAsserts.assertNotEqual(3, mManager.getRemainingCallCount());
});
@@ -1671,7 +1672,8 @@ public class ShortcutManagerTest2 extends BaseShortcutManagerTest {
// State changed, package1 foreground, reset.
mService.mUidObserver.onUidStateChanged(
- CALLING_UID_1, ActivityManager.PROCESS_STATE_FOREGROUND_SERVICE, 0);
+ CALLING_UID_1, ActivityManager.PROCESS_STATE_FOREGROUND_SERVICE, 0,
+ ActivityManager.PROCESS_CAPABILITY_NONE);
runWithCaller(CALLING_PACKAGE_1, USER_0, () -> {
assertEquals(3, mManager.getRemainingCallCount());
});
@@ -1691,16 +1693,19 @@ public class ShortcutManagerTest2 extends BaseShortcutManagerTest {
MoreAsserts.assertNotEqual(3, mManager.getRemainingCallCount());
});
mService.mUidObserver.onUidStateChanged(
- CALLING_UID_1, ActivityManager.PROCESS_STATE_TOP_SLEEPING, 0);
+ CALLING_UID_1, ActivityManager.PROCESS_STATE_TOP_SLEEPING, 0,
+ ActivityManager.PROCESS_CAPABILITY_NONE);
mInjectedCurrentTimeMillis++;
// Different app comes to foreground briefly, and goes back to background.
// Now, make sure package 2's counter is reset, even in this case.
mService.mUidObserver.onUidStateChanged(
- CALLING_UID_2, ActivityManager.PROCESS_STATE_FOREGROUND_SERVICE, 0);
+ CALLING_UID_2, ActivityManager.PROCESS_STATE_FOREGROUND_SERVICE, 0,
+ ActivityManager.PROCESS_CAPABILITY_NONE);
mService.mUidObserver.onUidStateChanged(
- CALLING_UID_2, ActivityManager.PROCESS_STATE_TOP_SLEEPING, 0);
+ CALLING_UID_2, ActivityManager.PROCESS_STATE_TOP_SLEEPING, 0,
+ ActivityManager.PROCESS_CAPABILITY_NONE);
runWithCaller(CALLING_PACKAGE_1, USER_0, () -> {
assertEquals(3, mManager.getRemainingCallCount());
@@ -1731,9 +1736,11 @@ public class ShortcutManagerTest2 extends BaseShortcutManagerTest {
});
mService.mUidObserver.onUidStateChanged(
- CALLING_UID_2, ActivityManager.PROCESS_STATE_FOREGROUND_SERVICE, 0);
+ CALLING_UID_2, ActivityManager.PROCESS_STATE_FOREGROUND_SERVICE, 0,
+ ActivityManager.PROCESS_CAPABILITY_NONE);
mService.mUidObserver.onUidStateChanged(
- CALLING_UID_2, ActivityManager.PROCESS_STATE_TOP_SLEEPING, 0);
+ CALLING_UID_2, ActivityManager.PROCESS_STATE_TOP_SLEEPING, 0,
+ ActivityManager.PROCESS_CAPABILITY_NONE);
runWithCaller(CALLING_PACKAGE_1, USER_0, () -> {
assertEquals(3, mManager.getRemainingCallCount());
@@ -1760,7 +1767,8 @@ public class ShortcutManagerTest2 extends BaseShortcutManagerTest {
// Now, also try calling some APIs and make sure foreground apps don't get throttled.
mService.mUidObserver.onUidStateChanged(
UserHandle.getUid(USER_10, CALLING_UID_1),
- ActivityManager.PROCESS_STATE_FOREGROUND_SERVICE, 0);
+ ActivityManager.PROCESS_STATE_FOREGROUND_SERVICE, 0,
+ ActivityManager.PROCESS_CAPABILITY_NONE);
runWithCaller(CALLING_PACKAGE_1, USER_0, () -> {
assertEquals(3, mManager.getRemainingCallCount());
assertFalse(mManager.isRateLimitingActive());
diff --git a/services/tests/servicestests/src/com/android/server/pm/dex/DexManagerTests.java b/services/tests/servicestests/src/com/android/server/pm/dex/DexManagerTests.java
index 0196279cbf56..f08044c0b5b5 100644
--- a/services/tests/servicestests/src/com/android/server/pm/dex/DexManagerTests.java
+++ b/services/tests/servicestests/src/com/android/server/pm/dex/DexManagerTests.java
@@ -691,35 +691,16 @@ public class DexManagerTests {
}
}
- private boolean shouldPackageRunOob(
- boolean isDefaultEnabled, String defaultWhitelist, String overrideEnabled,
- String overrideWhitelist, Collection<String> packageNamesInSameProcess) {
+ private boolean shouldPackageRunOob(boolean isDefaultEnabled, String whitelist,
+ Collection<String> packageNamesInSameProcess) {
return DexManager.isPackageSelectedToRunOobInternal(
- isDefaultEnabled, defaultWhitelist, overrideEnabled, overrideWhitelist,
- packageNamesInSameProcess);
+ isDefaultEnabled, whitelist, packageNamesInSameProcess);
}
@Test
- public void testOobPackageSelectionSwitch() {
+ public void testOobPackageSelectionDefault() {
// Feature is off by default, not overriden
- assertFalse(shouldPackageRunOob(false, "ALL", null, null, null));
-
- // Feature is off by default, overriden
- assertTrue(shouldPackageRunOob(false, "ALL", "true", "ALL", null));
- assertFalse(shouldPackageRunOob(false, "ALL", "false", null, null));
- assertFalse(shouldPackageRunOob(false, "ALL", "false", "ALL", null));
- assertFalse(shouldPackageRunOob(false, "ALL", "false", null, null));
-
- // Feature is on by default, not overriden
- assertTrue(shouldPackageRunOob(true, "ALL", null, null, null));
- assertTrue(shouldPackageRunOob(true, "ALL", null, null, null));
- assertTrue(shouldPackageRunOob(true, "ALL", null, "ALL", null));
-
- // Feature is on by default, overriden
- assertTrue(shouldPackageRunOob(true, "ALL", "true", null, null));
- assertTrue(shouldPackageRunOob(true, "ALL", "true", "ALL", null));
- assertFalse(shouldPackageRunOob(true, "ALL", "false", null, null));
- assertFalse(shouldPackageRunOob(true, "ALL", "false", "ALL", null));
+ assertFalse(shouldPackageRunOob(false, "ALL", null));
}
@Test
@@ -734,24 +715,19 @@ public class DexManagerTests {
final Collection<String> runningPackages = Arrays.asList("com.priv.app1", "com.priv.app2");
// Feature is off, whitelist does not matter
- assertFalse(shouldPackageRunOob(false, kWhitelistApp0, null, null, runningPackages));
- assertFalse(shouldPackageRunOob(false, kWhitelistApp1, null, null, runningPackages));
- assertFalse(shouldPackageRunOob(false, "", null, kWhitelistApp1, runningPackages));
- assertFalse(shouldPackageRunOob(false, "", null, "ALL", runningPackages));
- assertFalse(shouldPackageRunOob(false, "ALL", null, "ALL", runningPackages));
- assertFalse(shouldPackageRunOob(false, "ALL", null, "", runningPackages));
-
- // Feature is on, app not in default or overridden whitelist
- assertFalse(shouldPackageRunOob(true, kWhitelistApp0, null, null, runningPackages));
- assertFalse(shouldPackageRunOob(true, "", null, kWhitelistApp0, runningPackages));
- assertFalse(shouldPackageRunOob(true, "ALL", null, kWhitelistApp0, runningPackages));
-
- // Feature is on, app in default or overridden whitelist
- assertTrue(shouldPackageRunOob(true, kWhitelistApp1, null, null, runningPackages));
- assertTrue(shouldPackageRunOob(true, kWhitelistApp2, null, null, runningPackages));
- assertTrue(shouldPackageRunOob(true, kWhitelistApp1AndApp2, null, null, runningPackages));
- assertTrue(shouldPackageRunOob(true, kWhitelistApp1, null, "ALL", runningPackages));
- assertTrue(shouldPackageRunOob(true, "", null, kWhitelistApp1, runningPackages));
- assertTrue(shouldPackageRunOob(true, "ALL", null, kWhitelistApp1, runningPackages));
+ assertFalse(shouldPackageRunOob(false, kWhitelistApp0, runningPackages));
+ assertFalse(shouldPackageRunOob(false, kWhitelistApp1, runningPackages));
+ assertFalse(shouldPackageRunOob(false, "", runningPackages));
+ assertFalse(shouldPackageRunOob(false, "ALL", runningPackages));
+
+ // Feature is on, app not in whitelist
+ assertFalse(shouldPackageRunOob(true, kWhitelistApp0, runningPackages));
+ assertFalse(shouldPackageRunOob(true, "", runningPackages));
+
+ // Feature is on, app in whitelist
+ assertTrue(shouldPackageRunOob(true, kWhitelistApp1, runningPackages));
+ assertTrue(shouldPackageRunOob(true, kWhitelistApp2, runningPackages));
+ assertTrue(shouldPackageRunOob(true, kWhitelistApp1AndApp2, runningPackages));
+ assertTrue(shouldPackageRunOob(true, "ALL", runningPackages));
}
}
diff --git a/services/tests/uiservicestests/src/com/android/server/notification/NotificationManagerServiceTest.java b/services/tests/uiservicestests/src/com/android/server/notification/NotificationManagerServiceTest.java
index cd0f4f185927..1ee71fbd3831 100755
--- a/services/tests/uiservicestests/src/com/android/server/notification/NotificationManagerServiceTest.java
+++ b/services/tests/uiservicestests/src/com/android/server/notification/NotificationManagerServiceTest.java
@@ -5478,7 +5478,7 @@ public class NotificationManagerServiceTest extends UiServiceTestCase {
Uri uri = ContentUris.withAppendedId(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, 1);
mService.mNotificationDelegate.grantInlineReplyUriPermission(
- nr.getKey(), uri, nr.sbn.getUid());
+ nr.getKey(), uri, nr.sbn.getUser(), nr.sbn.getPackageName(), nr.sbn.getUid());
// Grant permission called for the UID of SystemUI under the target user ID
verify(mUgm, times(1)).grantUriPermissionFromOwner(any(),
@@ -5487,6 +5487,27 @@ public class NotificationManagerServiceTest extends UiServiceTestCase {
}
@Test
+ public void testGrantInlineReplyUriPermission_noRecordExists() throws Exception {
+ NotificationRecord nr = generateNotificationRecord(mTestNotificationChannel, 0);
+ waitForIdle();
+
+ // No notifications exist for the given record
+ StatusBarNotification[] notifsBefore = mBinderService.getActiveNotifications(PKG);
+ assertEquals(0, notifsBefore.length);
+
+ Uri uri = ContentUris.withAppendedId(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, 1);
+ int uid = 0; // sysui on primary user
+
+ mService.mNotificationDelegate.grantInlineReplyUriPermission(
+ nr.getKey(), uri, nr.sbn.getUser(), nr.sbn.getPackageName(), nr.sbn.getUid());
+
+ // Grant permission still called if no NotificationRecord exists for the given key
+ verify(mUgm, times(1)).grantUriPermissionFromOwner(any(),
+ eq(nr.sbn.getUid()), eq(nr.sbn.getPackageName()), eq(uri), anyInt(), anyInt(),
+ eq(nr.sbn.getUserId()));
+ }
+
+ @Test
public void testGrantInlineReplyUriPermission_userAll() throws Exception {
// generate a NotificationRecord for USER_ALL to make sure it's converted into USER_SYSTEM
NotificationRecord nr =
@@ -5504,7 +5525,7 @@ public class NotificationManagerServiceTest extends UiServiceTestCase {
Uri uri = ContentUris.withAppendedId(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, 1);
mService.mNotificationDelegate.grantInlineReplyUriPermission(
- nr.getKey(), uri, nr.sbn.getUid());
+ nr.getKey(), uri, nr.sbn.getUser(), nr.sbn.getPackageName(), nr.sbn.getUid());
// Target user for the grant is USER_ALL instead of USER_SYSTEM
verify(mUgm, times(1)).grantUriPermissionFromOwner(any(),
@@ -5531,7 +5552,7 @@ public class NotificationManagerServiceTest extends UiServiceTestCase {
Uri uri = ContentUris.withAppendedId(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, 1);
int uid = 0; // sysui on primary user
- int otherUserUid = (otherUserId * 100000) + 1; // SystemUI as a different user
+ int otherUserUid = (otherUserId * 100000) + 1; // sysui as a different user
String sysuiPackage = "sysui";
final String[] sysuiPackages = new String[] { sysuiPackage };
when(mPackageManager.getPackagesForUid(uid)).thenReturn(sysuiPackages);
@@ -5541,7 +5562,8 @@ public class NotificationManagerServiceTest extends UiServiceTestCase {
when(mPackageManager.getPackageUid(sysuiPackage, 0, otherUserId))
.thenReturn(otherUserUid);
- mService.mNotificationDelegate.grantInlineReplyUriPermission(nr.getKey(), uri, uid);
+ mService.mNotificationDelegate.grantInlineReplyUriPermission(
+ nr.getKey(), uri, nr.sbn.getUser(), nr.sbn.getPackageName(), uid);
// Target user for the grant is USER_ALL instead of USER_SYSTEM
verify(mUgm, times(1)).grantUriPermissionFromOwner(any(),
@@ -5550,22 +5572,64 @@ public class NotificationManagerServiceTest extends UiServiceTestCase {
}
@Test
- public void testGrantInlineReplyUriPermission_noRecordExists() throws Exception {
- NotificationRecord nr = generateNotificationRecord(mTestNotificationChannel);
- waitForIdle();
+ public void testClearInlineReplyUriPermission_uriRecordExists() throws Exception {
+ NotificationRecord nr = generateNotificationRecord(mTestNotificationChannel, 0);
+ reset(mPackageManager);
- // No notifications exist for the given record
- StatusBarNotification[] notifsBefore = mBinderService.getActiveNotifications(PKG);
- assertEquals(0, notifsBefore.length);
+ Uri uri1 = ContentUris.withAppendedId(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, 1);
+ Uri uri2 = ContentUris.withAppendedId(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, 2);
- Uri uri = ContentUris.withAppendedId(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, 1);
- int uid = 0; // sysui on primary user
+ // create an inline record with two uris in it
+ mService.mNotificationDelegate.grantInlineReplyUriPermission(
+ nr.getKey(), uri1, nr.sbn.getUser(), nr.sbn.getPackageName(), nr.sbn.getUid());
+ mService.mNotificationDelegate.grantInlineReplyUriPermission(
+ nr.getKey(), uri2, nr.sbn.getUser(), nr.sbn.getPackageName(), nr.sbn.getUid());
+
+ InlineReplyUriRecord record = mService.mInlineReplyRecordsByKey.get(nr.getKey());
+ assertNotNull(record); // record exists
+ assertEquals(record.getUris().size(), 2); // record has two uris in it
+
+ mService.mNotificationDelegate.clearInlineReplyUriPermissions(nr.getKey(), nr.sbn.getUid());
+
+ // permissionOwner destroyed
+ verify(mUgmInternal, times(1)).revokeUriPermissionFromOwner(
+ eq(record.getPermissionOwner()), eq(null), eq(~0), eq(nr.getUserId()));
+ }
+
+
+ @Test
+ public void testClearInlineReplyUriPermission_noUriRecordExists() throws Exception {
+ NotificationRecord nr = generateNotificationRecord(mTestNotificationChannel, 0);
+ reset(mPackageManager);
+
+ mService.mNotificationDelegate.clearInlineReplyUriPermissions(nr.getKey(), nr.sbn.getUid());
+
+ // no permissionOwner destroyed
+ verify(mUgmInternal, times(0)).revokeUriPermissionFromOwner(
+ any(), eq(null), eq(~0), eq(nr.getUserId()));
+ }
+
+ @Test
+ public void testClearInlineReplyUriPermission_userAll() throws Exception {
+ NotificationRecord nr = generateNotificationRecord(mTestNotificationChannel,
+ UserHandle.USER_ALL);
+ reset(mPackageManager);
+
+ Uri uri1 = ContentUris.withAppendedId(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, 1);
+ Uri uri2 = ContentUris.withAppendedId(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, 2);
+
+ // create an inline record a uri in it
+ mService.mNotificationDelegate.grantInlineReplyUriPermission(
+ nr.getKey(), uri1, nr.sbn.getUser(), nr.sbn.getPackageName(), nr.sbn.getUid());
+
+ InlineReplyUriRecord record = mService.mInlineReplyRecordsByKey.get(nr.getKey());
+ assertNotNull(record); // record exists
- mService.mNotificationDelegate.grantInlineReplyUriPermission(nr.getKey(), uri, uid);
+ mService.mNotificationDelegate.clearInlineReplyUriPermissions(nr.getKey(), nr.sbn.getUid());
- // Grant permission not called if no record exists for the given key
- verify(mUgm, times(0)).grantUriPermissionFromOwner(any(), anyInt(), any(),
- eq(uri), anyInt(), anyInt(), anyInt());
+ // permissionOwner destroyed for USER_SYSTEM, not USER_ALL
+ verify(mUgmInternal, times(1)).revokeUriPermissionFromOwner(
+ eq(record.getPermissionOwner()), eq(null), eq(~0), eq(USER_SYSTEM));
}
@Test
diff --git a/services/tests/wmtests/src/com/android/server/wm/ActivityMetricsLaunchObserverTests.java b/services/tests/wmtests/src/com/android/server/wm/ActivityMetricsLaunchObserverTests.java
index 03367db0c3e6..7c867b695203 100644
--- a/services/tests/wmtests/src/com/android/server/wm/ActivityMetricsLaunchObserverTests.java
+++ b/services/tests/wmtests/src/com/android/server/wm/ActivityMetricsLaunchObserverTests.java
@@ -149,9 +149,7 @@ public class ActivityMetricsLaunchObserverTests extends ActivityTestsBase {
public void testOnActivityLaunchFinished() {
onActivityLaunched();
- mActivityMetricsLogger.notifyTransitionStarting(new SparseIntArray(),
- SystemClock.elapsedRealtimeNanos());
-
+ notifyTransitionStarting();
notifyWindowsDrawn(mTopActivity);
verifyAsync(mLaunchObserver).onActivityLaunchFinished(eqProto(mTopActivity), anyLong());
@@ -159,10 +157,10 @@ public class ActivityMetricsLaunchObserverTests extends ActivityTestsBase {
}
@Test
- public void testOnActivityLaunchCancelled() {
+ public void testOnActivityLaunchCancelled_hasDrawn() {
onActivityLaunched();
- mTopActivity.mDrawn = true;
+ mTopActivity.visible = mTopActivity.mDrawn = true;
// Cannot time already-visible activities.
mActivityMetricsLogger.notifyActivityLaunched(START_TASK_TO_FRONT, mTopActivity);
@@ -172,6 +170,28 @@ public class ActivityMetricsLaunchObserverTests extends ActivityTestsBase {
}
@Test
+ public void testOnActivityLaunchCancelled_finishedBeforeDrawn() {
+ mTopActivity.visible = mTopActivity.mDrawn = true;
+
+ // Suppress resume when creating the record because we want to notify logger manually.
+ mSupervisor.beginDeferResume();
+ // Create an activity with different process that meets process switch.
+ final ActivityRecord noDrawnActivity = new ActivityBuilder(mService)
+ .setTask(mTopActivity.getTaskRecord())
+ .setProcessName("other")
+ .build();
+ mSupervisor.readyToResume();
+
+ mActivityMetricsLogger.notifyActivityLaunching(noDrawnActivity.intent);
+ mActivityMetricsLogger.notifyActivityLaunched(START_SUCCESS, noDrawnActivity);
+
+ noDrawnActivity.destroyIfPossible("test");
+ mActivityMetricsLogger.notifyVisibilityChanged(noDrawnActivity);
+
+ verifyAsync(mLaunchObserver).onActivityLaunchCancelled(eqProto(noDrawnActivity));
+ }
+
+ @Test
public void testOnReportFullyDrawn() {
onActivityLaunched();
@@ -184,16 +204,21 @@ public class ActivityMetricsLaunchObserverTests extends ActivityTestsBase {
private void onActivityLaunchedTrampoline() {
onIntentStarted();
- mActivityMetricsLogger.notifyActivityLaunched(START_SUCCESS, mTopActivity);
+ mActivityMetricsLogger.notifyActivityLaunched(START_SUCCESS, mTrampolineActivity);
- verifyAsync(mLaunchObserver).onActivityLaunched(eqProto(mTopActivity), anyInt());
+ verifyAsync(mLaunchObserver).onActivityLaunched(eqProto(mTrampolineActivity), anyInt());
- // A second, distinct, activity launch is coalesced into the the current app launch sequence
- mActivityMetricsLogger.notifyActivityLaunched(START_SUCCESS, mTrampolineActivity);
+ // A second, distinct, activity launch is coalesced into the current app launch sequence.
+ mActivityMetricsLogger.notifyActivityLaunched(START_SUCCESS, mTopActivity);
verifyNoMoreInteractions(mLaunchObserver);
}
+ private void notifyTransitionStarting() {
+ mActivityMetricsLogger.notifyTransitionStarting(new SparseIntArray(),
+ SystemClock.elapsedRealtimeNanos());
+ }
+
private void notifyWindowsDrawn(ActivityRecord r) {
mActivityMetricsLogger.notifyWindowsDrawn(r.getWindowingMode(),
SystemClock.elapsedRealtimeNanos());
@@ -203,15 +228,12 @@ public class ActivityMetricsLaunchObserverTests extends ActivityTestsBase {
public void testOnActivityLaunchFinishedTrampoline() {
onActivityLaunchedTrampoline();
- mActivityMetricsLogger.notifyTransitionStarting(new SparseIntArray(),
- SystemClock.elapsedRealtimeNanos());
-
+ notifyTransitionStarting();
notifyWindowsDrawn(mTrampolineActivity);
notifyWindowsDrawn(mTopActivity);
- verifyAsync(mLaunchObserver).onActivityLaunchFinished(eqProto(mTrampolineActivity),
- anyLong());
+ verifyAsync(mLaunchObserver).onActivityLaunchFinished(eqProto(mTopActivity), anyLong());
verifyNoMoreInteractions(mLaunchObserver);
}
@@ -219,12 +241,12 @@ public class ActivityMetricsLaunchObserverTests extends ActivityTestsBase {
public void testOnActivityLaunchCancelledTrampoline() {
onActivityLaunchedTrampoline();
- mTrampolineActivity.mDrawn = true;
+ mTopActivity.mDrawn = true;
// Cannot time already-visible activities.
- mActivityMetricsLogger.notifyActivityLaunched(START_TASK_TO_FRONT, mTrampolineActivity);
+ mActivityMetricsLogger.notifyActivityLaunched(START_TASK_TO_FRONT, mTopActivity);
- verifyAsync(mLaunchObserver).onActivityLaunchCancelled(eqProto(mTrampolineActivity));
+ verifyAsync(mLaunchObserver).onActivityLaunchCancelled(eqProto(mTopActivity));
verifyNoMoreInteractions(mLaunchObserver);
}
diff --git a/services/tests/wmtests/src/com/android/server/wm/ActivityRecordTests.java b/services/tests/wmtests/src/com/android/server/wm/ActivityRecordTests.java
index 99ecdcb002a1..38d6c9c1e4db 100644
--- a/services/tests/wmtests/src/com/android/server/wm/ActivityRecordTests.java
+++ b/services/tests/wmtests/src/com/android/server/wm/ActivityRecordTests.java
@@ -836,6 +836,14 @@ public class ActivityRecordTests extends ActivityTestsBase {
// Set process to 'null' to allow immediate removal, but don't call mActivity.setProcess() -
// this will cause NPE when updating task's process.
mActivity.app = null;
+
+ // Put a visible activity on top, so the finishing activity doesn't have to wait until the
+ // next activity reports idle to destroy it.
+ final ActivityRecord topActivity = new ActivityBuilder(mService).setTask(mTask).build();
+ topActivity.visible = true;
+ topActivity.nowVisible = true;
+ topActivity.setState(RESUMED, "test");
+
assertEquals("Activity outside of task/stack cannot be finished", FINISH_RESULT_REMOVED,
mActivity.finishIfPossible("test", false /* oomAdj */));
assertTrue(mActivity.finishing);
@@ -1131,8 +1139,11 @@ public class ActivityRecordTests extends ActivityTestsBase {
// Add another stack to become focused and make the activity there visible. This way it
// simulates finishing in non-focused stack in split-screen.
final ActivityStack stack = new StackBuilder(mRootActivityContainer).build();
- stack.getChildAt(0).getChildAt(0).nowVisible = true;
- stack.getChildAt(0).getChildAt(0).visible = true;
+ final ActivityRecord focusedActivity = stack.getChildAt(0).getChildAt(0);
+ focusedActivity.nowVisible = true;
+ focusedActivity.visible = true;
+ focusedActivity.setState(RESUMED, "test");
+ stack.mResumedActivity = focusedActivity;
topActivity.completeFinishing("test");
@@ -1180,6 +1191,30 @@ public class ActivityRecordTests extends ActivityTestsBase {
}
/**
+ * Verify that complete finish request for visible activity must resume next home stack before
+ * destroying it immediately if it is the last running activity on a display with a home stack.
+ * We must wait for home activity to come up to avoid a black flash in this case.
+ */
+ @Test
+ public void testCompleteFinishing_lastActivityAboveEmptyHomeStack() {
+ // Empty the home stack.
+ final ActivityStack homeStack = mActivity.getDisplay().getHomeStack();
+ for (TaskRecord t : homeStack.getAllTasks()) {
+ homeStack.removeTask(t, "test", REMOVE_TASK_MODE_DESTROYING);
+ }
+ mActivity.finishing = true;
+ spyOn(mStack);
+
+ // Try to finish the last activity above the home stack.
+ mActivity.completeFinishing("test");
+
+ // Verify that the activity is not destroyed immediately, but waits for next one to come up.
+ verify(mActivity, never()).destroyImmediately(eq(true) /* removeFromApp */, anyString());
+ assertEquals(FINISHING, mActivity.getState());
+ assertTrue(mActivity.mStackSupervisor.mFinishingActivities.contains(mActivity));
+ }
+
+ /**
* Test that the activity will be moved to destroying state and the message to destroy will be
* sent to the client.
*/
diff --git a/services/tests/wmtests/src/com/android/server/wm/ActivityTaskManagerServiceTests.java b/services/tests/wmtests/src/com/android/server/wm/ActivityTaskManagerServiceTests.java
index 7b7e6e70cd80..399f28302f32 100644
--- a/services/tests/wmtests/src/com/android/server/wm/ActivityTaskManagerServiceTests.java
+++ b/services/tests/wmtests/src/com/android/server/wm/ActivityTaskManagerServiceTests.java
@@ -16,11 +16,16 @@
package com.android.server.wm;
+import static android.app.WindowConfiguration.WINDOWING_MODE_FREEFORM;
+
import static com.android.dx.mockito.inline.extended.ExtendedMockito.doReturn;
+import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
import android.app.Activity;
+import android.graphics.Rect;
+import android.view.WindowContainerTransaction;
import androidx.test.filters.MediumTest;
@@ -58,5 +63,18 @@ public class ActivityTaskManagerServiceTests extends ActivityTestsBase {
mService.finishActivity(activity.appToken, 0 /* resultCode */,
null /* resultData */, Activity.DONT_FINISH_TASK_WITH_ACTIVITY));
}
+
+ @Test
+ public void testTaskTransaction() {
+ removeGlobalMinSizeRestriction();
+ final ActivityStack stack = new StackBuilder(mRootActivityContainer)
+ .setWindowingMode(WINDOWING_MODE_FREEFORM).build();
+ final TaskRecord task = stack.topTask();
+ WindowContainerTransaction t = new WindowContainerTransaction();
+ Rect newBounds = new Rect(10, 10, 100, 100);
+ t.setBounds(task.mRemoteToken, new Rect(10, 10, 100, 100));
+ mService.applyContainerTransaction(t);
+ assertEquals(newBounds, task.getBounds());
+ }
}
diff --git a/services/tests/wmtests/src/com/android/server/wm/ActivityTestsBase.java b/services/tests/wmtests/src/com/android/server/wm/ActivityTestsBase.java
index 80f0851c27a8..78db6c92772f 100644
--- a/services/tests/wmtests/src/com/android/server/wm/ActivityTestsBase.java
+++ b/services/tests/wmtests/src/com/android/server/wm/ActivityTestsBase.java
@@ -118,7 +118,8 @@ class ActivityTestsBase extends SystemServiceTestsBase {
private ComponentName mComponent;
private String mTargetActivity;
private TaskRecord mTaskRecord;
- private int mUid;
+ private String mProcessName = "name";
+ private int mUid = 12345;
private boolean mCreateTask;
private ActivityStack mStack;
private int mActivityFlags;
@@ -175,6 +176,11 @@ class ActivityTestsBase extends SystemServiceTestsBase {
return this;
}
+ ActivityBuilder setProcessName(String name) {
+ mProcessName = name;
+ return this;
+ }
+
ActivityBuilder setUid(int uid) {
mUid = uid;
return this;
@@ -235,6 +241,7 @@ class ActivityTestsBase extends SystemServiceTestsBase {
aInfo.applicationInfo.targetSdkVersion = Build.VERSION_CODES.CUR_DEVELOPMENT;
aInfo.applicationInfo.packageName = mComponent.getPackageName();
aInfo.applicationInfo.uid = mUid;
+ aInfo.processName = mProcessName;
aInfo.packageName = mComponent.getPackageName();
if (mTargetActivity != null) {
aInfo.targetActivity = mTargetActivity;
@@ -268,7 +275,7 @@ class ActivityTestsBase extends SystemServiceTestsBase {
}
final WindowProcessController wpc = new WindowProcessController(mService,
- mService.mContext.getApplicationInfo(), "name", 12345,
+ mService.mContext.getApplicationInfo(), mProcessName, mUid,
UserHandle.getUserId(12345), mock(Object.class),
mock(WindowProcessListener.class));
wpc.setThread(mock(IApplicationThread.class));
diff --git a/services/tests/wmtests/src/com/android/server/wm/AnimatingActivityRegistryTest.java b/services/tests/wmtests/src/com/android/server/wm/AnimatingActivityRegistryTest.java
index 77f9f0428e70..b6eaab7efec4 100644
--- a/services/tests/wmtests/src/com/android/server/wm/AnimatingActivityRegistryTest.java
+++ b/services/tests/wmtests/src/com/android/server/wm/AnimatingActivityRegistryTest.java
@@ -21,6 +21,7 @@ import static android.app.WindowConfiguration.WINDOWING_MODE_FULLSCREEN;
import static com.android.dx.mockito.inline.extended.ExtendedMockito.verify;
import static com.android.dx.mockito.inline.extended.ExtendedMockito.verifyZeroInteractions;
+import static com.android.server.wm.WindowContainer.AnimationFlags.TRANSITION;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
@@ -69,8 +70,8 @@ public class AnimatingActivityRegistryTest extends WindowTestsBase {
activity1.startAnimation(activity1.getPendingTransaction(), mAdapter, false /* hidden */);
activity2.startAnimation(activity1.getPendingTransaction(), mAdapter, false /* hidden */);
- assertTrue(activity1.isSelfAnimating());
- assertTrue(activity2.isSelfAnimating());
+ assertTrue(activity1.isAnimating(TRANSITION));
+ assertTrue(activity2.isAnimating(TRANSITION));
// Make sure that first animation finish is deferred, second one is not deferred, and first
// one gets cancelled.
@@ -92,8 +93,8 @@ public class AnimatingActivityRegistryTest extends WindowTestsBase {
window1.startAnimation(window1.getPendingTransaction(), mAdapter, false /* hidden */);
window2.startAnimation(window1.getPendingTransaction(), mAdapter, false /* hidden */);
- assertTrue(window1.isSelfAnimating());
- assertTrue(window2.isSelfAnimating());
+ assertTrue(window1.isAnimating(TRANSITION));
+ assertTrue(window2.isAnimating(TRANSITION));
// Make sure that first animation finish is deferred, and removing the second window stops
// finishes all pending deferred finishings.
diff --git a/services/tests/wmtests/src/com/android/server/wm/AppTransitionTests.java b/services/tests/wmtests/src/com/android/server/wm/AppTransitionTests.java
index 06afce2368b7..5f42d2398421 100644
--- a/services/tests/wmtests/src/com/android/server/wm/AppTransitionTests.java
+++ b/services/tests/wmtests/src/com/android/server/wm/AppTransitionTests.java
@@ -147,8 +147,8 @@ public class AppTransitionTests extends WindowTestsBase {
// Make sure each display is in animating stage.
assertTrue(dc1.mOpeningApps.size() > 0);
assertTrue(dc2.mClosingApps.size() > 0);
- assertTrue(dc1.isAppAnimating());
- assertTrue(dc2.isAppAnimating());
+ assertTrue(dc1.isAppTransitioning());
+ assertTrue(dc2.isAppTransitioning());
}
@Test
@@ -219,10 +219,10 @@ public class AppTransitionTests extends WindowTestsBase {
assertTrue(dc.mClosingApps.size() > 0);
// Make sure window is in animating stage before freeze, and cancel after freeze.
- assertTrue(dc.isAppAnimating());
+ assertTrue(dc.isAppTransitioning());
assertFalse(runner.mCancelled);
dc.mAppTransition.freeze();
- assertFalse(dc.isAppAnimating());
+ assertFalse(dc.isAppTransitioning());
assertTrue(runner.mCancelled);
}
diff --git a/services/tests/wmtests/src/com/android/server/wm/TaskStackTests.java b/services/tests/wmtests/src/com/android/server/wm/TaskStackTests.java
index 2fc03c7f13d3..164d28d57cb0 100644
--- a/services/tests/wmtests/src/com/android/server/wm/TaskStackTests.java
+++ b/services/tests/wmtests/src/com/android/server/wm/TaskStackTests.java
@@ -23,12 +23,13 @@ import static com.android.dx.mockito.inline.extended.ExtendedMockito.doReturn;
import static com.android.dx.mockito.inline.extended.ExtendedMockito.spyOn;
import static com.android.dx.mockito.inline.extended.ExtendedMockito.times;
import static com.android.dx.mockito.inline.extended.ExtendedMockito.verify;
+import static com.android.server.wm.WindowContainer.AnimationFlags.CHILDREN;
+import static com.android.server.wm.WindowContainer.AnimationFlags.TRANSITION;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotEquals;
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 android.graphics.Rect;
@@ -141,7 +142,7 @@ public class TaskStackTests extends WindowTestsBase {
final Task task = createTaskInStack(stack, 0 /* userId */);
// Stack removal is deferred if one of its child is animating.
- doReturn(true).when(task).isSelfAnimating();
+ doReturn(true).when(task).isAnimating(TRANSITION | CHILDREN);
stack.removeIfPossible();
// For the case of deferred removal the task controller will still be connected to the its
diff --git a/services/tests/wmtests/src/com/android/server/wm/WindowConfigurationTests.java b/services/tests/wmtests/src/com/android/server/wm/WindowConfigurationTests.java
index d6608f1cabdc..64ac547bd9ee 100644
--- a/services/tests/wmtests/src/com/android/server/wm/WindowConfigurationTests.java
+++ b/services/tests/wmtests/src/com/android/server/wm/WindowConfigurationTests.java
@@ -20,13 +20,17 @@ import static android.app.WindowConfiguration.ACTIVITY_TYPE_ASSISTANT;
import static android.app.WindowConfiguration.ACTIVITY_TYPE_HOME;
import static android.app.WindowConfiguration.ACTIVITY_TYPE_RECENTS;
import static android.app.WindowConfiguration.ACTIVITY_TYPE_STANDARD;
+import static android.app.WindowConfiguration.ROTATION_UNDEFINED;
import static android.app.WindowConfiguration.WINDOWING_MODE_FREEFORM;
import static android.app.WindowConfiguration.WINDOWING_MODE_FULLSCREEN;
+import static android.app.WindowConfiguration.WINDOWING_MODE_UNDEFINED;
import static android.app.WindowConfiguration.WINDOW_CONFIG_ALWAYS_ON_TOP;
import static android.app.WindowConfiguration.WINDOW_CONFIG_APP_BOUNDS;
+import static android.app.WindowConfiguration.WINDOW_CONFIG_BOUNDS;
import static android.app.WindowConfiguration.WINDOW_CONFIG_ROTATION;
import static android.app.WindowConfiguration.WINDOW_CONFIG_WINDOWING_MODE;
import static android.content.pm.ActivityInfo.CONFIG_WINDOW_CONFIGURATION;
+import static android.view.Surface.ROTATION_270;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
@@ -218,4 +222,31 @@ public class WindowConfigurationTests extends WindowTestsBase {
config.setActivityType(ACTIVITY_TYPE_STANDARD);
assertTrue(config.hasWindowDecorCaption());
}
+
+ @Test
+ public void testMaskedSetTo() {
+ final WindowConfiguration config = new WindowConfiguration();
+ final WindowConfiguration other = new WindowConfiguration();
+ other.setBounds(new Rect(10, 10, 100, 100));
+ other.setRotation(ROTATION_270);
+ config.setWindowingMode(WINDOWING_MODE_FULLSCREEN);
+ config.setBounds(null);
+
+ // no change
+ config.setTo(other, 0);
+ assertTrue(config.getBounds().isEmpty());
+ assertEquals(ROTATION_UNDEFINED, config.getRotation());
+ assertEquals(WINDOWING_MODE_FULLSCREEN, config.getWindowingMode());
+
+ final int justBoundsAndRotation = WINDOW_CONFIG_BOUNDS | WINDOW_CONFIG_ROTATION;
+ config.setTo(other, justBoundsAndRotation);
+ assertEquals(other.getBounds(), config.getBounds());
+ assertEquals(other.getRotation(), config.getRotation());
+ assertEquals(WINDOWING_MODE_FULLSCREEN, config.getWindowingMode());
+
+ // unsets as well
+ final int justWindowingMode = WINDOW_CONFIG_WINDOWING_MODE;
+ config.setTo(other, justWindowingMode);
+ assertEquals(WINDOWING_MODE_UNDEFINED, config.getWindowingMode());
+ }
}
diff --git a/services/tests/wmtests/src/com/android/server/wm/WindowContainerTests.java b/services/tests/wmtests/src/com/android/server/wm/WindowContainerTests.java
index 85aff7f9a9cd..853644873f01 100644
--- a/services/tests/wmtests/src/com/android/server/wm/WindowContainerTests.java
+++ b/services/tests/wmtests/src/com/android/server/wm/WindowContainerTests.java
@@ -24,13 +24,18 @@ import static android.content.pm.ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED;
import static com.android.dx.mockito.inline.extended.ExtendedMockito.any;
import static com.android.dx.mockito.inline.extended.ExtendedMockito.anyFloat;
+import static com.android.dx.mockito.inline.extended.ExtendedMockito.doReturn;
import static com.android.dx.mockito.inline.extended.ExtendedMockito.eq;
import static com.android.dx.mockito.inline.extended.ExtendedMockito.mock;
import static com.android.dx.mockito.inline.extended.ExtendedMockito.never;
import static com.android.dx.mockito.inline.extended.ExtendedMockito.reset;
import static com.android.dx.mockito.inline.extended.ExtendedMockito.spy;
+import static com.android.dx.mockito.inline.extended.ExtendedMockito.spyOn;
import static com.android.dx.mockito.inline.extended.ExtendedMockito.times;
import static com.android.dx.mockito.inline.extended.ExtendedMockito.verify;
+import static com.android.server.wm.WindowContainer.AnimationFlags.CHILDREN;
+import static com.android.server.wm.WindowContainer.AnimationFlags.PARENTS;
+import static com.android.server.wm.WindowContainer.AnimationFlags.TRANSITION;
import static com.android.server.wm.WindowContainer.POSITION_BOTTOM;
import static com.android.server.wm.WindowContainer.POSITION_TOP;
@@ -335,7 +340,53 @@ public class WindowContainerTests extends WindowTestsBase {
}
@Test
- public void testIsAnimating() {
+ public void testIsAnimating_TransitionFlag() {
+ final TestWindowContainerBuilder builder = new TestWindowContainerBuilder(mWm);
+ final TestWindowContainer root = builder.setLayer(0).build();
+ final TestWindowContainer child1 = root.addChildWindow(
+ builder.setWaitForTransitionStart(true));
+
+ assertFalse(root.isAnimating(TRANSITION));
+ assertTrue(child1.isAnimating(TRANSITION));
+ }
+
+ @Test
+ public void testIsAnimating_ParentsFlag() {
+ final TestWindowContainerBuilder builder = new TestWindowContainerBuilder(mWm);
+ final TestWindowContainer root = builder.setLayer(0).build();
+ final TestWindowContainer child1 = root.addChildWindow(builder);
+ final TestWindowContainer child2 = root.addChildWindow(builder.setIsAnimating(true));
+ final TestWindowContainer child21 = child2.addChildWindow(builder.setIsAnimating(false));
+
+ assertFalse(root.isAnimating());
+ assertFalse(child1.isAnimating());
+ assertFalse(child1.isAnimating(PARENTS));
+ assertTrue(child2.isAnimating());
+ assertTrue(child2.isAnimating(PARENTS));
+ assertFalse(child21.isAnimating());
+ assertTrue(child21.isAnimating(PARENTS));
+ }
+
+ @Test
+ public void testIsAnimating_ChildrenFlag() {
+ final TestWindowContainerBuilder builder = new TestWindowContainerBuilder(mWm);
+ final TestWindowContainer root = builder.setLayer(0).build();
+ final TestWindowContainer child1 = root.addChildWindow(builder);
+ final TestWindowContainer child2 = root.addChildWindow(builder.setIsAnimating(true));
+ final TestWindowContainer child11 = child1.addChildWindow(builder.setIsAnimating(true));
+
+ assertFalse(root.isAnimating());
+ assertTrue(root.isAnimating(CHILDREN));
+ assertFalse(child1.isAnimating());
+ assertTrue(child1.isAnimating(CHILDREN));
+ assertTrue(child2.isAnimating());
+ assertTrue(child2.isAnimating(CHILDREN));
+ assertTrue(child11.isAnimating());
+ assertTrue(child11.isAnimating(CHILDREN));
+ }
+
+ @Test
+ public void testIsAnimating_combineFlags() {
final TestWindowContainerBuilder builder = new TestWindowContainerBuilder(mWm);
final TestWindowContainer root = builder.setLayer(0).build();
@@ -345,19 +396,19 @@ public class WindowContainerTests extends WindowTestsBase {
final TestWindowContainer child12 = child1.addChildWindow(builder.setIsAnimating(true));
final TestWindowContainer child21 = child2.addChildWindow();
- assertFalse(root.isAnimating());
- assertTrue(child1.isAnimating());
- assertTrue(child11.isAnimating());
- assertTrue(child12.isAnimating());
- assertFalse(child2.isAnimating());
- assertFalse(child21.isAnimating());
-
- assertTrue(root.isSelfOrChildAnimating());
- assertTrue(child1.isSelfOrChildAnimating());
- assertFalse(child11.isSelfOrChildAnimating());
- assertTrue(child12.isSelfOrChildAnimating());
- assertFalse(child2.isSelfOrChildAnimating());
- assertFalse(child21.isSelfOrChildAnimating());
+ assertFalse(root.isAnimating(TRANSITION | PARENTS));
+ assertTrue(child1.isAnimating(TRANSITION | PARENTS));
+ assertTrue(child11.isAnimating(TRANSITION | PARENTS));
+ assertTrue(child12.isAnimating(TRANSITION | PARENTS));
+ assertFalse(child2.isAnimating(TRANSITION | PARENTS));
+ assertFalse(child21.isAnimating(TRANSITION | PARENTS));
+
+ assertTrue(root.isAnimating(TRANSITION | CHILDREN));
+ assertTrue(child1.isAnimating(TRANSITION | CHILDREN));
+ assertFalse(child11.isAnimating(TRANSITION | CHILDREN));
+ assertTrue(child12.isAnimating(TRANSITION | CHILDREN));
+ assertFalse(child2.isAnimating(TRANSITION | CHILDREN));
+ assertFalse(child21.isAnimating(TRANSITION | CHILDREN));
}
@Test
@@ -716,6 +767,7 @@ public class WindowContainerTests extends WindowTestsBase {
private boolean mIsAnimating;
private boolean mIsVisible;
private boolean mFillsParent;
+ private boolean mWaitForTransitStart;
private Integer mOrientation;
private boolean mOnParentChangedCalled;
@@ -738,7 +790,7 @@ public class WindowContainerTests extends WindowTestsBase {
};
TestWindowContainer(WindowManagerService wm, int layer, boolean isAnimating,
- boolean isVisible, Integer orientation) {
+ boolean isVisible, boolean waitTransitStart, Integer orientation) {
super(wm);
mLayer = layer;
@@ -746,6 +798,9 @@ public class WindowContainerTests extends WindowTestsBase {
mIsVisible = isVisible;
mFillsParent = true;
mOrientation = orientation;
+ mWaitForTransitStart = waitTransitStart;
+ spyOn(mSurfaceAnimator);
+ doReturn(mIsAnimating).when(mSurfaceAnimator).isAnimating();
}
TestWindowContainer getParentWindow() {
@@ -783,11 +838,6 @@ public class WindowContainerTests extends WindowTestsBase {
}
@Override
- boolean isSelfAnimating() {
- return mIsAnimating;
- }
-
- @Override
boolean isVisible() {
return mIsVisible;
}
@@ -810,6 +860,11 @@ public class WindowContainerTests extends WindowTestsBase {
void setFillsParent(boolean fillsParent) {
mFillsParent = fillsParent;
}
+
+ @Override
+ boolean isWaitingForTransitionStart() {
+ return mWaitForTransitStart;
+ }
}
private static class TestWindowContainerBuilder {
@@ -817,6 +872,7 @@ public class WindowContainerTests extends WindowTestsBase {
private int mLayer;
private boolean mIsAnimating;
private boolean mIsVisible;
+ private boolean mIsWaitTransitStart;
private Integer mOrientation;
TestWindowContainerBuilder(WindowManagerService wm) {
@@ -847,8 +903,14 @@ public class WindowContainerTests extends WindowTestsBase {
return this;
}
+ TestWindowContainerBuilder setWaitForTransitionStart(boolean waitTransitStart) {
+ mIsWaitTransitStart = waitTransitStart;
+ return this;
+ }
+
TestWindowContainer build() {
- return new TestWindowContainer(mWm, mLayer, mIsAnimating, mIsVisible, mOrientation);
+ return new TestWindowContainer(mWm, mLayer, mIsAnimating, mIsVisible,
+ mIsWaitTransitStart, mOrientation);
}
}
diff --git a/services/usage/java/com/android/server/usage/UsageStatsService.java b/services/usage/java/com/android/server/usage/UsageStatsService.java
index 6a805683e23d..f9b365906c5b 100644
--- a/services/usage/java/com/android/server/usage/UsageStatsService.java
+++ b/services/usage/java/com/android/server/usage/UsageStatsService.java
@@ -400,7 +400,7 @@ public class UsageStatsService extends SystemService implements
private final IUidObserver mUidObserver = new IUidObserver.Stub() {
@Override
- public void onUidStateChanged(int uid, int procState, long procStateSeq) {
+ public void onUidStateChanged(int uid, int procState, long procStateSeq, int capability) {
mHandler.obtainMessage(MSG_UID_STATE_CHANGED, uid, procState).sendToTarget();
}
@@ -411,7 +411,8 @@ public class UsageStatsService extends SystemService implements
@Override
public void onUidGone(int uid, boolean disabled) {
- onUidStateChanged(uid, ActivityManager.PROCESS_STATE_NONEXISTENT, 0);
+ onUidStateChanged(uid, ActivityManager.PROCESS_STATE_NONEXISTENT, 0,
+ ActivityManager.PROCESS_CAPABILITY_NONE);
}
@Override
diff --git a/telecomm/java/android/telecom/Connection.java b/telecomm/java/android/telecom/Connection.java
index fa16b84b544c..20abe773e415 100644
--- a/telecomm/java/android/telecom/Connection.java
+++ b/telecomm/java/android/telecom/Connection.java
@@ -858,7 +858,7 @@ public abstract class Connection extends Conferenceable {
}
/** @hide */
- public abstract static class Listener {
+ abstract static class Listener {
public void onStateChanged(Connection c, int state) {}
public void onAddressChanged(Connection c, Uri newAddress, int presentation) {}
public void onCallerDisplayNameChanged(
@@ -2006,7 +2006,7 @@ public abstract class Connection extends Conferenceable {
*
* @hide
*/
- public final Connection addConnectionListener(Listener l) {
+ final Connection addConnectionListener(Listener l) {
mListeners.add(l);
return this;
}
@@ -2019,7 +2019,7 @@ public abstract class Connection extends Conferenceable {
*
* @hide
*/
- public final Connection removeConnectionListener(Listener l) {
+ final Connection removeConnectionListener(Listener l) {
if (l != null) {
mListeners.remove(l);
}
diff --git a/telephony/java/android/telephony/CarrierConfigManager.java b/telephony/java/android/telephony/CarrierConfigManager.java
index 7bab2230fe05..010446492d16 100644..100755
--- a/telephony/java/android/telephony/CarrierConfigManager.java
+++ b/telephony/java/android/telephony/CarrierConfigManager.java
@@ -1838,6 +1838,13 @@ public class CarrierConfigManager {
"support_direct_fdn_dialing_bool";
/**
+ * Int indicating the max number length for FDN
+ * @hide
+ */
+ public static final String KEY_FDN_NUMBER_LENGTH_LIMIT_INT =
+ "fdn_number_length_limit_int";
+
+ /**
* Report IMEI as device id even if it's a CDMA/LTE phone.
*
* @hide
@@ -2881,6 +2888,16 @@ public class CarrierConfigManager {
"always_show_primary_signal_bar_in_opportunistic_network_boolean";
/**
+ * Upon data switching between subscriptions within a carrier group, if switch depends on
+ * validation result, this value defines customized value of how long we wait for validation
+ * success before we fail and revoke the switch.
+ * Time out is in milliseconds.
+ * @hide
+ */
+ public static final String KEY_DATA_SWITCH_VALIDATION_TIMEOUT_LONG =
+ "data_switch_validation_timeout_long";
+
+ /**
* GPS configs. See android.hardware.gnss@1.0 IGnssConfiguration.
* @hide
*/
@@ -3434,6 +3451,7 @@ public class CarrierConfigManager {
sDefaults.putBoolean(KEY_CDMA_HOME_REGISTERED_PLMN_NAME_OVERRIDE_BOOL, false);
sDefaults.putString(KEY_CDMA_HOME_REGISTERED_PLMN_NAME_STRING, "");
sDefaults.putBoolean(KEY_SUPPORT_DIRECT_FDN_DIALING_BOOL, false);
+ sDefaults.putInt(KEY_FDN_NUMBER_LENGTH_LIMIT_INT, 20);
sDefaults.putBoolean(KEY_CARRIER_DEFAULT_DATA_ROAMING_ENABLED_BOOL, false);
sDefaults.putBoolean(KEY_SKIP_CF_FAIL_TO_DISABLE_DIALOG_BOOL, false);
sDefaults.putBoolean(KEY_SUPPORT_ENHANCED_CALL_BLOCKING_BOOL, true);
@@ -3666,6 +3684,7 @@ public class CarrierConfigManager {
sDefaults.putIntArray(KEY_DISCONNECT_CAUSE_PLAY_BUSYTONE_INT_ARRAY,
new int[] {4 /* BUSY */});
sDefaults.putBoolean(KEY_PREVENT_CLIR_ACTIVATION_AND_DEACTIVATION_CODE_BOOL, false);
+ sDefaults.putLong(KEY_DATA_SWITCH_VALIDATION_TIMEOUT_LONG, 2000);
}
/**
diff --git a/telephony/java/android/telephony/CellBroadcastService.java b/telephony/java/android/telephony/CellBroadcastService.java
index 46eb9df8bdad..09e22aa4eb24 100644
--- a/telephony/java/android/telephony/CellBroadcastService.java
+++ b/telephony/java/android/telephony/CellBroadcastService.java
@@ -17,12 +17,19 @@
package android.telephony;
import android.annotation.CallSuper;
+import android.annotation.NonNull;
+import android.annotation.Nullable;
import android.annotation.SystemApi;
import android.app.Service;
import android.content.Intent;
+import android.os.Bundle;
import android.os.IBinder;
+import android.os.RemoteCallback;
import android.telephony.cdma.CdmaSmsCbProgramData;
+import java.util.List;
+import java.util.function.Consumer;
+
/**
* A service which exposes the cell broadcast handling module to the system.
* <p>
@@ -46,6 +53,7 @@ import android.telephony.cdma.CdmaSmsCbProgramData;
* </service>
* </manifest>
* }</pre>
+ *
* @hide
*/
@SystemApi
@@ -62,40 +70,59 @@ public abstract class CellBroadcastService extends Service {
/**
* Handle a GSM cell broadcast SMS message forwarded from the system.
+ *
* @param slotIndex the index of the slot which received the message
- * @param message the SMS PDU
+ * @param message the SMS PDU
*/
- public abstract void onGsmCellBroadcastSms(int slotIndex, byte[] message);
+ public abstract void onGsmCellBroadcastSms(int slotIndex, @NonNull byte[] message);
/**
* Handle a CDMA cell broadcast SMS message forwarded from the system.
- * @param slotIndex the index of the slot which received the message
- * @param bearerData the CDMA SMS bearer data
+ *
+ * @param slotIndex the index of the slot which received the message
+ * @param bearerData the CDMA SMS bearer data
* @param serviceCategory the CDMA SCPT service category
*/
- public abstract void onCdmaCellBroadcastSms(int slotIndex, byte[] bearerData,
+ public abstract void onCdmaCellBroadcastSms(int slotIndex, @NonNull byte[] bearerData,
@CdmaSmsCbProgramData.Category int serviceCategory);
/**
+ * Handle a CDMA cell broadcast SMS message forwarded from the system.
+ *
+ * @param slotIndex the index of the slot which received the message
+ * @param smsCbProgramData the SMS CB program data of the message
+ * @param originatingAddress the originating address of the message, as a non-separated dial
+ * string
+ * @param callback a callback to run after each cell broadcast receiver has handled
+ * the SCP message. The bundle will contain a non-separated
+ * dial string as and an ArrayList of {@link CdmaSmsCbProgramResults}.
+ */
+ public abstract void onCdmaScpMessage(int slotIndex,
+ @NonNull List<CdmaSmsCbProgramData> smsCbProgramData,
+ @NonNull String originatingAddress, @NonNull Consumer<Bundle> callback);
+
+ /**
* If overriding this method, call through to the super method for any unknown actions.
* {@inheritDoc}
*/
@Override
@CallSuper
- public IBinder onBind(Intent intent) {
+ public IBinder onBind(@Nullable Intent intent) {
return mStubWrapper;
}
/**
* A wrapper around ICellBroadcastService that forwards calls to implementations of
* {@link CellBroadcastService}.
+ *
* @hide
*/
public class ICellBroadcastServiceWrapper extends ICellBroadcastService.Stub {
/**
* Handle a GSM cell broadcast SMS.
+ *
* @param slotIndex the index of the slot which received the broadcast
- * @param message the SMS message PDU
+ * @param message the SMS message PDU
*/
@Override
public void handleGsmCellBroadcastSms(int slotIndex, byte[] message) {
@@ -104,8 +131,9 @@ public abstract class CellBroadcastService extends Service {
/**
* Handle a CDMA cell broadcast SMS.
- * @param slotIndex the index of the slot which received the broadcast
- * @param bearerData the CDMA SMS bearer data
+ *
+ * @param slotIndex the index of the slot which received the broadcast
+ * @param bearerData the CDMA SMS bearer data
* @param serviceCategory the CDMA SCPT service category
*/
@Override
@@ -114,5 +142,25 @@ public abstract class CellBroadcastService extends Service {
CellBroadcastService.this.onCdmaCellBroadcastSms(slotIndex, bearerData,
serviceCategory);
}
+
+ /**
+ * Handle a CDMA Service Category Program message.
+ *
+ * @param slotIndex the index of the slot which received the message
+ * @param smsCbProgramData the SMS CB program data of the message
+ * @param originatingAddress the originating address of the message
+ * @param callback a callback to run after each cell broadcast receiver has
+ * handled the SCP message
+ */
+ @Override
+ public void handleCdmaScpMessage(int slotIndex,
+ List<CdmaSmsCbProgramData> smsCbProgramData, String originatingAddress,
+ RemoteCallback callback) {
+ Consumer<Bundle> consumer = bundle -> {
+ callback.sendResult(bundle);
+ };
+ CellBroadcastService.this.onCdmaScpMessage(slotIndex, smsCbProgramData,
+ originatingAddress, consumer);
+ }
}
}
diff --git a/telephony/java/android/telephony/CellSignalStrengthNr.java b/telephony/java/android/telephony/CellSignalStrengthNr.java
index 1912c60ac122..f9b7f6dbc193 100644
--- a/telephony/java/android/telephony/CellSignalStrengthNr.java
+++ b/telephony/java/android/telephony/CellSignalStrengthNr.java
@@ -194,13 +194,13 @@ public final class CellSignalStrengthNr extends CellSignalStrength implements Pa
/** @hide */
@Override
public void updateLevel(PersistableBundle cc, ServiceState ss) {
- if (mCsiRsrp == CellInfo.UNAVAILABLE) {
+ if (mSsRsrp == CellInfo.UNAVAILABLE) {
mLevel = SIGNAL_STRENGTH_NONE_OR_UNKNOWN;
- } else if (mCsiRsrp >= SIGNAL_GREAT_THRESHOLD) {
+ } else if (mSsRsrp >= SIGNAL_GREAT_THRESHOLD) {
mLevel = SIGNAL_STRENGTH_GREAT;
- } else if (mCsiRsrp >= SIGNAL_GOOD_THRESHOLD) {
+ } else if (mSsRsrp >= SIGNAL_GOOD_THRESHOLD) {
mLevel = SIGNAL_STRENGTH_GOOD;
- } else if (mCsiRsrp >= SIGNAL_MODERATE_THRESHOLD) {
+ } else if (mSsRsrp >= SIGNAL_MODERATE_THRESHOLD) {
mLevel = SIGNAL_STRENGTH_MODERATE;
} else {
mLevel = SIGNAL_STRENGTH_POOR;
@@ -212,7 +212,7 @@ public final class CellSignalStrengthNr extends CellSignalStrength implements Pa
*
* Asu is calculated based on 3GPP RSRP. Refer to 3GPP 27.007 (Ver 10.3.0) Sec 8.69
*
- * @return RSCP in ASU 0..97, 255, or UNAVAILABLE
+ * @return RSRP in ASU 0..97, 255, or UNAVAILABLE
*/
@Override
public int getAsuLevel() {
@@ -231,11 +231,11 @@ public final class CellSignalStrengthNr extends CellSignalStrength implements Pa
}
/**
- * Get the CSI-RSRP as dBm value -140..-44dBm or {@link CellInfo#UNAVAILABLE UNAVAILABLE}.
+ * Get the SS-RSRP as dBm value -140..-44dBm or {@link CellInfo#UNAVAILABLE UNAVAILABLE}.
*/
@Override
public int getDbm() {
- return mCsiRsrp;
+ return mSsRsrp;
}
/** @hide */
diff --git a/telephony/java/android/telephony/ICellBroadcastService.aidl b/telephony/java/android/telephony/ICellBroadcastService.aidl
index bcd6cc546eed..11263d99cb8f 100644
--- a/telephony/java/android/telephony/ICellBroadcastService.aidl
+++ b/telephony/java/android/telephony/ICellBroadcastService.aidl
@@ -16,6 +16,9 @@
package android.telephony;
+import android.os.RemoteCallback;
+import android.telephony.cdma.CdmaSmsCbProgramData;
+
/**
* Service bound to by the system to allow custom handling of cell broadcast messages.
* <p>
@@ -29,4 +32,8 @@ interface ICellBroadcastService {
/** @see android.telephony.CellBroadcastService#onCdmaCellBroadcastSms */
oneway void handleCdmaCellBroadcastSms(int slotId, in byte[] bearerData, int serviceCategory);
+
+ /** @see android.telephony.CellBroadcastService#onCdmaScpMessage */
+ oneway void handleCdmaScpMessage(int slotId, in List<CdmaSmsCbProgramData> programData,
+ String originatingAddress, in RemoteCallback callback);
}
diff --git a/telephony/java/android/telephony/ImsiEncryptionInfo.java b/telephony/java/android/telephony/ImsiEncryptionInfo.java
index ef2f121ba01b..75a79d62d2aa 100644
--- a/telephony/java/android/telephony/ImsiEncryptionInfo.java
+++ b/telephony/java/android/telephony/ImsiEncryptionInfo.java
@@ -15,9 +15,11 @@
*/
package android.telephony;
+import android.annotation.NonNull;
+import android.annotation.Nullable;
+import android.annotation.SystemApi;
import android.os.Parcel;
import android.os.Parcelable;
-import java.util.Date;
import android.util.Log;
import java.security.KeyFactory;
@@ -25,18 +27,18 @@ import java.security.NoSuchAlgorithmException;
import java.security.PublicKey;
import java.security.spec.InvalidKeySpecException;
import java.security.spec.X509EncodedKeySpec;
+import java.util.Date;
/**
* Class to represent information sent by the carrier, which will be used to encrypt
* the IMSI + IMPI. The ecryption is being done by WLAN, and the modem.
- *
* @hide
*/
+@SystemApi
public final class ImsiEncryptionInfo implements Parcelable {
private static final String LOG_TAG = "ImsiEncryptionInfo";
-
private final String mcc;
private final String mnc;
private final PublicKey publicKey;
@@ -45,11 +47,13 @@ public final class ImsiEncryptionInfo implements Parcelable {
//Date-Time in UTC when the key will expire.
private final Date expirationTime;
+ /** @hide */
public ImsiEncryptionInfo(String mcc, String mnc, int keyType, String keyIdentifier,
byte[] key, Date expirationTime) {
this(mcc, mnc, keyType, keyIdentifier, makeKeyObject(key), expirationTime);
}
+ /** @hide */
public ImsiEncryptionInfo(String mcc, String mnc, int keyType, String keyIdentifier,
PublicKey publicKey, Date expirationTime) {
// todo need to validate that ImsiEncryptionInfo is being created with the correct params.
@@ -63,6 +67,7 @@ public final class ImsiEncryptionInfo implements Parcelable {
this.expirationTime = expirationTime;
}
+ /** @hide */
public ImsiEncryptionInfo(Parcel in) {
int length = in.readInt();
byte b[] = new byte[length];
@@ -75,26 +80,40 @@ public final class ImsiEncryptionInfo implements Parcelable {
expirationTime = new Date(in.readLong());
}
+ /** @hide */
public String getMnc() {
return this.mnc;
}
+ /** @hide */
public String getMcc() {
return this.mcc;
}
+ /**
+ * Returns key identifier, a string that helps the authentication server to locate the
+ * private key to decrypt the permanent identity, or {@code null} when uavailable.
+ */
+ @Nullable
public String getKeyIdentifier() {
return this.keyIdentifier;
}
+ /** @hide */
public int getKeyType() {
return this.keyType;
}
+ /**
+ * Returns the carrier public key that is used for the IMSI encryption,
+ * or {@code null} when uavailable.
+ */
+ @Nullable
public PublicKey getPublicKey() {
return this.publicKey;
}
+ /** @hide */
public Date getExpirationTime() {
return this.expirationTime;
}
@@ -115,7 +134,7 @@ public final class ImsiEncryptionInfo implements Parcelable {
return 0;
}
- public static final @android.annotation.NonNull Parcelable.Creator<ImsiEncryptionInfo> CREATOR =
+ public static final @NonNull Parcelable.Creator<ImsiEncryptionInfo> CREATOR =
new Parcelable.Creator<ImsiEncryptionInfo>() {
@Override
public ImsiEncryptionInfo createFromParcel(Parcel in) {
@@ -129,7 +148,7 @@ public final class ImsiEncryptionInfo implements Parcelable {
};
@Override
- public void writeToParcel(Parcel dest, int flags) {
+ public void writeToParcel(@NonNull Parcel dest, int flags) {
byte[] b = publicKey.getEncoded();
dest.writeInt(b.length);
dest.writeByteArray(b);
diff --git a/telephony/java/android/telephony/LocationAccessPolicy.java b/telephony/java/android/telephony/LocationAccessPolicy.java
index eb744f619f2e..79b375675588 100644
--- a/telephony/java/android/telephony/LocationAccessPolicy.java
+++ b/telephony/java/android/telephony/LocationAccessPolicy.java
@@ -18,6 +18,7 @@ package android.telephony;
import android.Manifest;
import android.annotation.NonNull;
+import android.annotation.Nullable;
import android.annotation.UserIdInt;
import android.app.ActivityManager;
import android.app.AppOpsManager;
@@ -59,6 +60,7 @@ public final class LocationAccessPolicy {
public static class LocationPermissionQuery {
public final String callingPackage;
+ public final String callingFeatureId;
public final int callingUid;
public final int callingPid;
public final int minSdkVersionForCoarse;
@@ -66,10 +68,11 @@ public final class LocationAccessPolicy {
public final boolean logAsInfo;
public final String method;
- private LocationPermissionQuery(String callingPackage, int callingUid, int callingPid,
- int minSdkVersionForCoarse, int minSdkVersionForFine, boolean logAsInfo,
- String method) {
+ private LocationPermissionQuery(String callingPackage, @Nullable String callingFeatureId,
+ int callingUid, int callingPid, int minSdkVersionForCoarse,
+ int minSdkVersionForFine, boolean logAsInfo, String method) {
this.callingPackage = callingPackage;
+ this.callingFeatureId = callingFeatureId;
this.callingUid = callingUid;
this.callingPid = callingPid;
this.minSdkVersionForCoarse = minSdkVersionForCoarse;
@@ -80,6 +83,7 @@ public final class LocationAccessPolicy {
public static class Builder {
private String mCallingPackage;
+ private String mCallingFeatureId;
private int mCallingUid;
private int mCallingPid;
private int mMinSdkVersionForCoarse = Integer.MAX_VALUE;
@@ -98,6 +102,14 @@ public final class LocationAccessPolicy {
/**
* Mandatory parameter, used for performing permission checks.
*/
+ public Builder setCallingFeatureId(@Nullable String callingFeatureId) {
+ mCallingFeatureId = callingFeatureId;
+ return this;
+ }
+
+ /**
+ * Mandatory parameter, used for performing permission checks.
+ */
public Builder setCallingUid(int callingUid) {
mCallingUid = callingUid;
return this;
@@ -148,8 +160,8 @@ public final class LocationAccessPolicy {
}
public LocationPermissionQuery build() {
- return new LocationPermissionQuery(mCallingPackage, mCallingUid,
- mCallingPid, mMinSdkVersionForCoarse, mMinSdkVersionForFine,
+ return new LocationPermissionQuery(mCallingPackage, mCallingFeatureId,
+ mCallingUid, mCallingPid, mMinSdkVersionForCoarse, mMinSdkVersionForFine,
mLogAsInfo, mMethod);
}
}
@@ -195,7 +207,7 @@ public final class LocationAccessPolicy {
// Only check the app op if the app has the permission.
int appOpMode = context.getSystemService(AppOpsManager.class)
.noteOpNoThrow(AppOpsManager.permissionToOpCode(permissionToCheck),
- query.callingUid, query.callingPackage);
+ query.callingUid, query.callingPackage, query.callingFeatureId, null);
if (appOpMode == AppOpsManager.MODE_ALLOWED) {
// If the app did everything right, return without logging.
return LocationPermissionResult.ALLOWED;
@@ -339,4 +351,4 @@ public final class LocationAccessPolicy {
}
return false;
}
-} \ No newline at end of file
+}
diff --git a/telephony/java/android/telephony/SmsManager.java b/telephony/java/android/telephony/SmsManager.java
index ee291fa0122b..2c16110ceb4c 100644
--- a/telephony/java/android/telephony/SmsManager.java
+++ b/telephony/java/android/telephony/SmsManager.java
@@ -2669,4 +2669,74 @@ public final class SmsManager {
}
return SmsManager.SMS_CATEGORY_NOT_SHORT_CODE;
}
+
+ /**
+ * Gets the SMSC address from (U)SIM.
+ *
+ * <p class="note"><strong>Note:</strong> Using this method requires that your app is the
+ * default SMS application, or READ_PRIVILEGED_PHONE_STATE permission, or has the carrier
+ * privileges.</p>
+ *
+ * <p class="note"><strong>Note:</strong> This method will never trigger an SMS disambiguation
+ * dialog. If this method is called on a device that has multiple active subscriptions, this
+ * {@link SmsManager} instance has been created with {@link #getDefault()}, and no user-defined
+ * default subscription is defined, the subscription ID associated with this method will be
+ * INVALID, which will result in the operation being completed on the subscription associated
+ * with logical slot 0. Use {@link #getSmsManagerForSubscriptionId(int)} to ensure the operation
+ * is performed on the correct subscription.
+ * </p>
+ *
+ * @return the SMSC address string, null if failed.
+ */
+ @SuppressAutoDoc // for carrier privileges and default SMS application.
+ @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE)
+ @Nullable
+ public String getSmscAddress() {
+ String smsc = null;
+
+ try {
+ ISms iSms = getISmsService();
+ if (iSms != null) {
+ smsc = iSms.getSmscAddressFromIccEfForSubscriber(
+ getSubscriptionId(), ActivityThread.currentPackageName());
+ }
+ } catch (RemoteException ex) {
+ // ignore it
+ }
+ return smsc;
+ }
+
+ /**
+ * Sets the SMSC address on (U)SIM.
+ *
+ * <p class="note"><strong>Note:</strong> Using this method requires that your app is the
+ * default SMS application, or has {@link android.Manifest.permission#MODIFY_PHONE_STATE}
+ * permission, or has the carrier privileges.</p>
+ *
+ * <p class="note"><strong>Note:</strong> This method will never trigger an SMS disambiguation
+ * dialog. If this method is called on a device that has multiple active subscriptions, this
+ * {@link SmsManager} instance has been created with {@link #getDefault()}, and no user-defined
+ * default subscription is defined, the subscription ID associated with this method will be
+ * INVALID, which will result in the operation being completed on the subscription associated
+ * with logical slot 0. Use {@link #getSmsManagerForSubscriptionId(int)} to ensure the operation
+ * is performed on the correct subscription.
+ * </p>
+ *
+ * @param smsc the SMSC address string.
+ * @return true for success, false otherwise.
+ */
+ @SuppressAutoDoc // for carrier privileges and default SMS application.
+ @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE)
+ public boolean setSmscAddress(@NonNull String smsc) {
+ try {
+ ISms iSms = getISmsService();
+ if (iSms != null) {
+ return iSms.setSmscAddressOnIccEfForSubscriber(
+ smsc, getSubscriptionId(), ActivityThread.currentPackageName());
+ }
+ } catch (RemoteException ex) {
+ // ignore it
+ }
+ return false;
+ }
}
diff --git a/telephony/java/android/telephony/TelephonyManager.java b/telephony/java/android/telephony/TelephonyManager.java
index 8455e3d57e49..0c663f85b99c 100644
--- a/telephony/java/android/telephony/TelephonyManager.java
+++ b/telephony/java/android/telephony/TelephonyManager.java
@@ -110,6 +110,7 @@ import java.util.HashMap;
import java.util.List;
import java.util.Locale;
import java.util.Map;
+import java.util.Objects;
import java.util.UUID;
import java.util.concurrent.Executor;
import java.util.function.Consumer;
@@ -197,12 +198,29 @@ public class TelephonyManager {
/** @hide */
static public final int OTASP_SIM_UNPROVISIONED = 5;
- /** @hide */
+ /**
+ * Used in carrier Wi-Fi for IMSI + IMPI encryption, this indicates a public key that's
+ * available for use in ePDG links.
+ *
+ * @hide
+ */
+ @SystemApi
static public final int KEY_TYPE_EPDG = 1;
- /** @hide */
+ /**
+ * Used in carrier Wi-Fi for IMSI + IMPI encryption, this indicates a public key that's
+ * available for use in WLAN links.
+ *
+ * @hide
+ */
+ @SystemApi
static public final int KEY_TYPE_WLAN = 2;
+ /** @hide */
+ @Retention(RetentionPolicy.SOURCE)
+ @IntDef(prefix = {"KEY_TYPE_"}, value = {KEY_TYPE_EPDG, KEY_TYPE_WLAN})
+ public @interface KeyType {}
+
/**
* No Single Radio Voice Call Continuity (SRVCC) handover is active.
* See TS 23.216 for more information.
@@ -308,7 +326,11 @@ public class TelephonyManager {
mSubId = subId;
Context appContext = context.getApplicationContext();
if (appContext != null) {
- mContext = appContext;
+ if (Objects.equals(context.getFeatureId(), appContext.getFeatureId())) {
+ mContext = appContext;
+ } else {
+ mContext = appContext.createFeatureContext(context.getFeatureId());
+ }
} else {
mContext = context;
}
@@ -343,6 +365,16 @@ public class TelephonyManager {
return ActivityThread.currentOpPackageName();
}
+ private String getFeatureId() {
+ // For legacy reasons the TelephonyManager has API for getting
+ // a static instance with no context set preventing us from
+ // getting the feature Id.
+ if (mContext != null) {
+ return mContext.getFeatureId();
+ }
+ return null;
+ }
+
private boolean isSystemProcess() {
return Process.myUid() == Process.SYSTEM_UID;
}
@@ -2007,7 +2039,8 @@ public class TelephonyManager {
return null;
}
- Bundle bundle = telephony.getCellLocation(mContext.getOpPackageName());
+ Bundle bundle = telephony.getCellLocation(mContext.getOpPackageName(),
+ mContext.getFeatureId());
if (bundle == null || bundle.isEmpty()) {
Rlog.d(TAG, "getCellLocation returning null because CellLocation is unavailable");
return null;
@@ -2095,7 +2128,8 @@ public class TelephonyManager {
ITelephony telephony = getITelephony();
if (telephony == null)
return null;
- return telephony.getNeighboringCellInfo(mContext.getOpPackageName());
+ return telephony.getNeighboringCellInfo(mContext.getOpPackageName(),
+ mContext.getFeatureId());
} catch (RemoteException ex) {
return null;
} catch (NullPointerException ex) {
@@ -3874,25 +3908,27 @@ public class TelephonyManager {
}
/**
- * Returns Carrier specific information that will be used to encrypt the IMSI and IMPI.
- * This includes the public key and the key identifier. For multi-sim devices, if no subId
- * has been specified, we will return the value for the dafault data sim.
- * Return null if it is unavailable.
+ * Returns carrier specific information that will be used to encrypt the IMSI and IMPI,
+ * including the public key and the key identifier; or {@code null} if not available.
* <p>
- * Requires Permission:
- * {@link android.Manifest.permission#READ_PHONE_STATE READ_PHONE_STATE}
- * @param keyType whether the key is being used for wlan or epdg. Valid key types are
- * {@link TelephonyManager#KEY_TYPE_EPDG} or
- * {@link TelephonyManager#KEY_TYPE_WLAN}.
+ * For a multi-sim device, the dafault data sim is used if not specified.
+ * <p>
+ * Requires Permission: READ_PRIVILEGED_PHONE_STATE.
+ *
+ * @param keyType whether the key is being used for EPDG or WLAN. Valid values are
+ * {@link #KEY_TYPE_EPDG} or {@link #KEY_TYPE_WLAN}.
* @return ImsiEncryptionInfo Carrier specific information that will be used to encrypt the
* IMSI and IMPI. This includes the public key and the key identifier. This information
- * will be stored in the device keystore. The system will return a null when no key was
- * found, and the carrier does not require a key. The system will throw
- * IllegalArgumentException when an invalid key is sent or when key is required but
+ * will be stored in the device keystore. {@code null} will be returned when no key is
+ * found, and the carrier does not require a key.
+ * @throws IllegalArgumentException when an invalid key is found or when key is required but
* not found.
* @hide
*/
- public ImsiEncryptionInfo getCarrierInfoForImsiEncryption(int keyType) {
+ @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE)
+ @SystemApi
+ @Nullable
+ public ImsiEncryptionInfo getCarrierInfoForImsiEncryption(@KeyType int keyType) {
try {
IPhoneSubInfo info = getSubscriberInfo();
if (info == null) {
@@ -3920,14 +3956,21 @@ public class TelephonyManager {
}
/**
- * Resets the Carrier Keys in the database. This involves 2 steps:
+ * Resets the carrier keys used to encrypt the IMSI and IMPI.
+ * <p>
+ * This involves 2 steps:
* 1. Delete the keys from the database.
* 2. Send an intent to download new Certificates.
* <p>
- * Requires Permission:
- * {@link android.Manifest.permission#MODIFY_PHONE_STATE MODIFY_PHONE_STATE}
+ * For a multi-sim device, the dafault data sim is used if not specified.
+ * <p>
+ * Requires Permission: MODIFY_PHONE_STATE.
+ *
+ * @see #getCarrierInfoForImsiEncryption
* @hide
*/
+ @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE)
+ @SystemApi
public void resetCarrierKeysForImsiEncryption() {
try {
IPhoneSubInfo info = getSubscriberInfo();
@@ -3954,7 +3997,7 @@ public class TelephonyManager {
* @return true if the digit at position keyType is 1, else false.
* @hide
*/
- private static boolean isKeyEnabled(int keyAvailability, int keyType) {
+ private static boolean isKeyEnabled(int keyAvailability, @KeyType int keyType) {
int returnValue = (keyAvailability >> (keyType - 1)) & 1;
return (returnValue == 1) ? true : false;
}
@@ -3963,7 +4006,7 @@ public class TelephonyManager {
* If Carrier requires Imsi to be encrypted.
* @hide
*/
- private boolean isImsiEncryptionRequired(int subId, int keyType) {
+ private boolean isImsiEncryptionRequired(int subId, @KeyType int keyType) {
CarrierConfigManager configManager =
(CarrierConfigManager) mContext.getSystemService(Context.CARRIER_CONFIG_SERVICE);
if (configManager == null) {
@@ -5488,8 +5531,7 @@ public class TelephonyManager {
ITelephony telephony = getITelephony();
if (telephony == null)
return null;
- return telephony.getAllCellInfo(
- getOpPackageName());
+ return telephony.getAllCellInfo(getOpPackageName(), getFeatureId());
} catch (RemoteException ex) {
} catch (NullPointerException ex) {
}
@@ -5581,7 +5623,7 @@ public class TelephonyManager {
errorCode,
createThrowableByClassName(exceptionName, message))));
}
- }, getOpPackageName());
+ }, getOpPackageName(), getFeatureId());
} catch (RemoteException ex) {
}
}
@@ -5623,7 +5665,7 @@ public class TelephonyManager {
errorCode,
createThrowableByClassName(exceptionName, message))));
}
- }, getOpPackageName(), workSource);
+ }, getOpPackageName(), getFeatureId(), workSource);
} catch (RemoteException ex) {
}
}
@@ -7447,7 +7489,8 @@ public class TelephonyManager {
try {
ITelephony telephony = getITelephony();
if (telephony != null) {
- return telephony.getCellNetworkScanResults(getSubId(), getOpPackageName());
+ return telephony.getCellNetworkScanResults(getSubId(), getOpPackageName(),
+ getFeatureId());
}
} catch (RemoteException ex) {
Rlog.e(TAG, "getAvailableNetworks RemoteException", ex);
@@ -7502,7 +7545,7 @@ public class TelephonyManager {
}
}
return mTelephonyScanManager.requestNetworkScan(getSubId(), request, executor, callback,
- getOpPackageName());
+ getOpPackageName(), getFeatureId());
}
/**
@@ -9498,16 +9541,28 @@ public class TelephonyManager {
return returnValue;
}
- private int getSubIdForPhoneAccountHandle(PhoneAccountHandle phoneAccountHandle) {
+ /**
+ * Returns the subscription ID for the given phone account handle.
+ *
+ * @param phoneAccountHandle the phone account handle for outgoing calls
+ * @return subscription ID for the given phone account handle; or
+ * {@link SubscriptionManager#INVALID_SUBSCRIPTION_ID}
+ * if not available; or throw a SecurityException if the caller doesn't have the
+ * permission.
+ */
+ @RequiresPermission(android.Manifest.permission.READ_PHONE_STATE)
+ public int getSubIdForPhoneAccountHandle(@NonNull PhoneAccountHandle phoneAccountHandle) {
int retval = SubscriptionManager.INVALID_SUBSCRIPTION_ID;
try {
- ITelecomService service = getTelecomService();
+ ITelephony service = getITelephony();
if (service != null) {
- retval = getSubIdForPhoneAccount(service.getPhoneAccount(phoneAccountHandle));
+ retval = service.getSubIdForPhoneAccountHandle(
+ phoneAccountHandle, mContext.getOpPackageName());
}
- } catch (RemoteException e) {
+ } catch (RemoteException ex) {
+ Log.e(TAG, "getSubIdForPhoneAccountHandle RemoteException", ex);
+ ex.rethrowAsRuntimeException();
}
-
return retval;
}
@@ -9621,7 +9676,8 @@ public class TelephonyManager {
try {
ITelephony service = getITelephony();
if (service != null) {
- return service.getServiceStateForSubscriber(subId, getOpPackageName());
+ return service.getServiceStateForSubscriber(subId, getOpPackageName(),
+ getFeatureId());
}
} catch (RemoteException e) {
Log.e(TAG, "Error calling ITelephony#getServiceStateForSubscriber", e);
@@ -10876,6 +10932,16 @@ public class TelephonyManager {
}
/**
+ * Broadcast intent action for Ota emergency number database installation complete.
+ *
+ * @hide
+ */
+ @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE)
+ @SystemApi
+ public static final String ACTION_OTA_EMERGENCY_NUMBER_DB_INSTALLED =
+ "android.telephony.action.OTA_EMERGENCY_NUMBER_DB_INSTALLED";
+
+ /**
* Returns whether {@link TelephonyManager#ACTION_EMERGENCY_ASSISTANCE emergency assistance} is
* available on the device.
* <p>
diff --git a/telephony/java/android/telephony/TelephonyScanManager.java b/telephony/java/android/telephony/TelephonyScanManager.java
index 9ff851598648..96b6db75b370 100644
--- a/telephony/java/android/telephony/TelephonyScanManager.java
+++ b/telephony/java/android/telephony/TelephonyScanManager.java
@@ -18,6 +18,7 @@ package android.telephony;
import static com.android.internal.util.Preconditions.checkNotNull;
+import android.annotation.Nullable;
import android.content.Context;
import android.os.Binder;
import android.os.Bundle;
@@ -195,18 +196,21 @@ public final class TelephonyScanManager {
*
* @param request Contains all the RAT with bands/channels that need to be scanned.
* @param callback Returns network scan results or errors.
+ * @param callingPackage The package name of the caller
+ * @param callingFeatureId The feature id inside of the calling package
* @return A NetworkScan obj which contains a callback which can stop the scan.
* @hide
*/
public NetworkScan requestNetworkScan(int subId,
NetworkScanRequest request, Executor executor, NetworkScanCallback callback,
- String callingPackage) {
+ String callingPackage, @Nullable String callingFeatureId) {
try {
ITelephony telephony = getITelephony();
if (telephony != null) {
synchronized (mScanInfo) {
int scanId = telephony.requestNetworkScan(
- subId, request, mMessenger, new Binder(), callingPackage);
+ subId, request, mMessenger, new Binder(), callingPackage,
+ callingFeatureId);
if (scanId == INVALID_SCAN_ID) {
Rlog.e(TAG, "Failed to initiate network scan");
return null;
diff --git a/telephony/java/android/telephony/cdma/CdmaSmsCbProgramData.aidl b/telephony/java/android/telephony/cdma/CdmaSmsCbProgramData.aidl
new file mode 100644
index 000000000000..a648a0e81073
--- /dev/null
+++ b/telephony/java/android/telephony/cdma/CdmaSmsCbProgramData.aidl
@@ -0,0 +1,21 @@
+/*
+ * 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.
+ */
+
+/** @hide */
+package android.telephony.cdma;
+
+parcelable CdmaSmsCbProgramData;
+
diff --git a/telephony/java/android/telephony/ims/ImsSsInfo.java b/telephony/java/android/telephony/ims/ImsSsInfo.java
index be34f9db3e54..0510a0012426 100644
--- a/telephony/java/android/telephony/ims/ImsSsInfo.java
+++ b/telephony/java/android/telephony/ims/ImsSsInfo.java
@@ -336,4 +336,31 @@ public final class ImsSsInfo implements Parcelable {
public @ClirInterrogationStatus int getClirInterrogationStatus() {
return mClirInterrogationStatus;
}
+
+ /**
+ * Parts of telephony still use the old {m,n} 3GPP definition, so convert to that format.
+ * @hide
+ */
+ public int[] getCompatArray(@ImsSsData.ServiceType int type) {
+ int[] result = new int[2];
+ // Convert ImsSsInfo into a form that telephony can read (as per 3GPP 27.007)
+ // CLIR (section 7.7)
+ if (type == ImsSsData.SS_CLIR) {
+ // Assume there will only be one ImsSsInfo.
+ // contains {"n","m"} parameters
+ result[0] = getClirOutgoingState();
+ result[1] = getClirInterrogationStatus();
+ return result;
+ }
+ // COLR 7.31
+ if (type == ImsSsData.SS_COLR) {
+ result[0] = getProvisionStatus();
+ }
+ // Facility Lock CLCK 7.4 (for call barring), CLIP 7.6, COLP 7.8, as well as any
+ // other result, just return the status for the "n" parameter and provisioning status for
+ // "m" as the default.
+ result[0] = getStatus();
+ result[1] = getProvisionStatus();
+ return result;
+ }
}
diff --git a/telephony/java/android/telephony/ims/ImsUtListener.java b/telephony/java/android/telephony/ims/ImsUtListener.java
index d50a0f738b25..1a21d0aa0c76 100644
--- a/telephony/java/android/telephony/ims/ImsUtListener.java
+++ b/telephony/java/android/telephony/ims/ImsUtListener.java
@@ -16,22 +16,53 @@
package android.telephony.ims;
+import android.annotation.NonNull;
import android.annotation.SystemApi;
import android.os.Bundle;
import android.os.RemoteException;
+import android.telephony.ims.stub.ImsUtImplBase;
import android.util.Log;
import com.android.ims.internal.IImsUtListener;
/**
- * Base implementation of the IMS UT listener interface, which implements stubs.
- * Override these methods to implement functionality.
+ * Listener interface used to receive network responses back from UT supplementary service queries
+ * made by the framework.
* @hide
*/
// DO NOT remove or change the existing APIs, only add new ones to this Base implementation or you
// will break other implementations of ImsUt maintained by other ImsServices.
@SystemApi
public class ImsUtListener {
+
+ /**
+ * The {@link Bundle} key for a Calling Line Identification Restriction (CLIR) response. The
+ * value will be an int[] with two values:
+ * int[0] contains the 'n' parameter from TS 27.007 7.7, which is the
+ * outgoing CLIR state. See {@link ImsSsInfo#CLIR_OUTGOING_DEFAULT},
+ * {@link ImsSsInfo#CLIR_OUTGOING_INVOCATION}, and {@link ImsSsInfo#CLIR_OUTGOING_SUPPRESSION};
+ * int[1] contains the 'm' parameter from TS 27.007 7.7, which is the CLIR interrogation status.
+ * See {@link ImsSsInfo#CLIR_STATUS_NOT_PROVISIONED},
+ * {@link ImsSsInfo#CLIR_STATUS_PROVISIONED_PERMANENT}, {@link ImsSsInfo#CLIR_STATUS_UNKNOWN},
+ * {@link ImsSsInfo#CLIR_STATUS_TEMPORARILY_RESTRICTED}, and
+ * {@link ImsSsInfo#CLIR_STATUS_TEMPORARILY_ALLOWED}.
+ * @deprecated Use {@link #onLineIdentificationSupplementaryServiceResponse(int, ImsSsInfo)}
+ * instead.
+ */
+ @Deprecated
+ public static final String BUNDLE_KEY_CLIR = "queryClir";
+
+ /**
+ * The {@link Bundle} key for a Calling Line Identification Presentation (CLIP), Connected Line
+ * Identification Presentation (COLP), or Connected Line Identification Restriction (COLR)
+ * response. The value will be an instance of {@link ImsSsInfo}, which contains the response to
+ * the query.
+ * @deprecated Use {@link #onLineIdentificationSupplementaryServiceResponse(int, ImsSsInfo)}
+ * instead.
+ */
+ @Deprecated
+ public static final String BUNDLE_KEY_SSINFO = "imsSsInfo";
+
private IImsUtListener mServiceInterface;
private static final String LOG_TAG = "ImsUtListener";
@@ -51,14 +82,54 @@ public class ImsUtListener {
}
}
- public void onUtConfigurationQueried(int id, Bundle ssInfo) {
+ /**
+ * Notify the framework of a UT configuration response to a {@link ImsUtImplBase#queryClir()},
+ * {@link ImsUtImplBase#queryClip()}, {@link ImsUtImplBase#queryColp()}, or
+ * {@link ImsUtImplBase#queryColr()} query for the transaction ID specified. If the query fails,
+ * {@link #onUtConfigurationQueryFailed(int, ImsReasonInfo)} should be called.
+ * @param id The ID associated with this UT configuration transaction from the framework.
+ * @param configuration A {@link Bundle} containing the result of querying the UT configuration.
+ * Must contain {@link #BUNDLE_KEY_CLIR} if it is a response to
+ * {@link ImsUtImplBase#queryClir()} or
+ * {@link #BUNDLE_KEY_SSINFO} if it is a response to
+ * {@link ImsUtImplBase#queryClip()}, {@link ImsUtImplBase#queryColp()}, or
+ * {@link ImsUtImplBase#queryColr()}.
+ * @deprecated Use {@link #onLineIdentificationSupplementaryServiceResponse(int, ImsSsInfo)}
+ * instead.
+ */
+ @Deprecated
+ public void onUtConfigurationQueried(int id, Bundle configuration) {
try {
- mServiceInterface.utConfigurationQueried(null, id, ssInfo);
+ mServiceInterface.utConfigurationQueried(null, id, configuration);
} catch (RemoteException e) {
Log.w(LOG_TAG, "utConfigurationQueried: remote exception");
}
}
+ /**
+ * Notify the framework of a UT configuration response to a {@link ImsUtImplBase#queryClir()},
+ * {@link ImsUtImplBase#queryClip()}, {@link ImsUtImplBase#queryColp()}, or
+ * {@link ImsUtImplBase#queryColr()} query for the transaction ID specified. If the query fails,
+ * the framework should be notified via
+ * {@link #onUtConfigurationQueryFailed(int, ImsReasonInfo)}.
+ * @param id The ID associated with this UT configuration transaction from the framework.
+ * @param configuration An {@link ImsSsInfo} instance containing the configuration for the
+ * line identification supplementary service queried.
+ */
+ public void onLineIdentificationSupplementaryServiceResponse(int id,
+ @NonNull ImsSsInfo configuration) {
+ try {
+ mServiceInterface.lineIdentificationSupplementaryServiceResponse(id, configuration);
+ } catch (RemoteException e) {
+ Log.w(LOG_TAG, "onLineIdentificationSupplementaryServicesResponse: remote exception");
+ }
+ }
+
+ /**
+ * Notify the Framework of the line identification query failure.
+ * @param id The ID associated with the UT query transaction.
+ * @param error The query failure reason.
+ */
public void onUtConfigurationQueryFailed(int id, ImsReasonInfo error) {
try {
mServiceInterface.utConfigurationQueryFailed(null, id, error);
diff --git a/telephony/java/android/telephony/ims/compat/stub/ImsUtListenerImplBase.java b/telephony/java/android/telephony/ims/compat/stub/ImsUtListenerImplBase.java
index 976c2be1a3fe..ae113f2f46c8 100644
--- a/telephony/java/android/telephony/ims/compat/stub/ImsUtListenerImplBase.java
+++ b/telephony/java/android/telephony/ims/compat/stub/ImsUtListenerImplBase.java
@@ -18,12 +18,11 @@ package android.telephony.ims.compat.stub;
import android.os.Bundle;
import android.os.RemoteException;
-
-import android.annotation.UnsupportedAppUsage;
import android.telephony.ims.ImsCallForwardInfo;
import android.telephony.ims.ImsReasonInfo;
import android.telephony.ims.ImsSsData;
import android.telephony.ims.ImsSsInfo;
+
import com.android.ims.internal.IImsUt;
import com.android.ims.internal.IImsUtListener;
@@ -65,6 +64,13 @@ public class ImsUtListenerImplBase extends IImsUtListener.Stub {
}
/**
+ * Notifies the result of a line identification supplementary service query.
+ */
+ @Override
+ public void lineIdentificationSupplementaryServiceResponse(int id, ImsSsInfo config) {
+ }
+
+ /**
* Notifies the status of the call barring supplementary service.
*/
@Override
diff --git a/telephony/java/com/android/ims/internal/IImsUtListener.aidl b/telephony/java/com/android/ims/internal/IImsUtListener.aidl
index fcb9fb1f8773..9a12ceee5212 100644
--- a/telephony/java/com/android/ims/internal/IImsUtListener.aidl
+++ b/telephony/java/com/android/ims/internal/IImsUtListener.aidl
@@ -44,6 +44,7 @@ oneway interface IImsUtListener {
@UnsupportedAppUsage
void utConfigurationQueryFailed(in IImsUt ut, int id, in ImsReasonInfo error);
+ void lineIdentificationSupplementaryServiceResponse(int id, in ImsSsInfo config);
/**
* Notifies the status of the call barring supplementary service.
*/
diff --git a/telephony/java/com/android/internal/telephony/ISms.aidl b/telephony/java/com/android/internal/telephony/ISms.aidl
index f3a335d93a6c..91aa3ce62cf2 100644
--- a/telephony/java/com/android/internal/telephony/ISms.aidl
+++ b/telephony/java/com/android/internal/telephony/ISms.aidl
@@ -574,4 +574,23 @@ interface ISms {
* @param destAddress the destination address to test for possible short code
*/
int checkSmsShortCodeDestination(int subId, String callingApk, String destAddress, String countryIso);
+
+ /**
+ * Gets the SMSC address from (U)SIM.
+ *
+ * @param subId the subscription Id.
+ * @param callingPackage the package name of the calling app.
+ * @return the SMSC address string, null if failed.
+ */
+ String getSmscAddressFromIccEfForSubscriber(int subId, String callingPackage);
+
+ /**
+ * Sets the SMSC address on (U)SIM.
+ *
+ * @param smsc the SMSC address string.
+ * @param subId the subscription Id.
+ * @param callingPackage the package name of the calling app.
+ * @return true for success, false otherwise.
+ */
+ boolean setSmscAddressOnIccEfForSubscriber(String smsc, int subId, String callingPackage);
}
diff --git a/telephony/java/com/android/internal/telephony/ISmsImplBase.java b/telephony/java/com/android/internal/telephony/ISmsImplBase.java
index 2096325b09f2..d9d4b6002206 100644
--- a/telephony/java/com/android/internal/telephony/ISmsImplBase.java
+++ b/telephony/java/com/android/internal/telephony/ISmsImplBase.java
@@ -201,4 +201,15 @@ public class ISmsImplBase extends ISms.Stub {
int subid, String callingApk, String destAddress, String countryIso) {
throw new UnsupportedOperationException();
}
+
+ @Override
+ public String getSmscAddressFromIccEfForSubscriber(int subId, String callingPackage) {
+ throw new UnsupportedOperationException();
+ }
+
+ @Override
+ public boolean setSmscAddressOnIccEfForSubscriber(
+ String smsc, int subId, String callingPackage) {
+ throw new UnsupportedOperationException();
+ }
}
diff --git a/telephony/java/com/android/internal/telephony/ITelephony.aidl b/telephony/java/com/android/internal/telephony/ITelephony.aidl
index ba3ffd461316..c6c9f3488e8c 100644
--- a/telephony/java/com/android/internal/telephony/ITelephony.aidl
+++ b/telephony/java/com/android/internal/telephony/ITelephony.aidl
@@ -295,7 +295,7 @@ interface ITelephony {
*/
boolean isDataConnectivityPossible(int subId);
- Bundle getCellLocation(String callingPkg);
+ Bundle getCellLocation(String callingPkg, String callingFeatureId);
/**
* Returns the ISO country code equivalent of the current registered
@@ -307,7 +307,7 @@ interface ITelephony {
/**
* Returns the neighboring cell information of the device.
*/
- List<NeighboringCellInfo> getNeighboringCellInfo(String callingPkg);
+ List<NeighboringCellInfo> getNeighboringCellInfo(String callingPkg, String callingFeatureId);
@UnsupportedAppUsage
int getCallState();
@@ -556,13 +556,14 @@ interface ITelephony {
/**
* Returns all observed cell information of the device.
*/
- List<CellInfo> getAllCellInfo(String callingPkg);
+ List<CellInfo> getAllCellInfo(String callingPkg, String callingFeatureId);
/**
* Request a cell information update for the specified subscription,
* reported via the CellInfoCallback.
*/
- void requestCellInfoUpdate(int subId, in ICellInfoCallback cb, String callingPkg);
+ void requestCellInfoUpdate(int subId, in ICellInfoCallback cb, String callingPkg,
+ String callingFeatureId);
/**
* Request a cell information update for the specified subscription,
@@ -570,8 +571,8 @@ interface ITelephony {
*
* @param workSource the requestor to whom the power consumption for this should be attributed.
*/
- void requestCellInfoUpdateWithWorkSource(
- int subId, in ICellInfoCallback cb, in String callingPkg, in WorkSource ws);
+ void requestCellInfoUpdateWithWorkSource(int subId, in ICellInfoCallback cb,
+ in String callingPkg, String callingFeatureId, in WorkSource ws);
/**
* Sets minimum time in milli-seconds between onCellInfoChanged
@@ -882,9 +883,12 @@ interface ITelephony {
* Perform a radio scan and return the list of avialble networks.
*
* @param subId the id of the subscription.
+ * @param callingPackage the calling package
+ * @param callingFeatureId The feature in the package
* @return CellNetworkScanResult containing status of scan and networks.
*/
- CellNetworkScanResult getCellNetworkScanResults(int subId, String callingPackage);
+ CellNetworkScanResult getCellNetworkScanResults(int subId, String callingPackage,
+ String callingFeatureId);
/**
* Perform a radio network scan and return the id of this scan.
@@ -894,10 +898,11 @@ interface ITelephony {
* @param messenger Callback messages will be sent using this messenger.
* @param binder the binder object instantiated in TelephonyManager.
* @param callingPackage the calling package
+ * @param callingFeatureId The feature in the package
* @return An id for this scan.
*/
int requestNetworkScan(int subId, in NetworkScanRequest request, in Messenger messenger,
- in IBinder binder, in String callingPackage);
+ in IBinder binder, in String callingPackage, String callingFeatureId);
/**
* Stop an existing radio network scan.
@@ -1313,6 +1318,12 @@ interface ITelephony {
int getSubIdForPhoneAccount(in PhoneAccount phoneAccount);
/**
+ * Returns the subscription ID associated with the specified PhoneAccountHandle.
+ */
+ int getSubIdForPhoneAccountHandle(in PhoneAccountHandle phoneAccountHandle,
+ String callingPackage);
+
+ /**
* Returns the PhoneAccountHandle associated with a subscription ID.
*/
PhoneAccountHandle getPhoneAccountHandleForSubscriptionId(int subscriptionId);
@@ -1340,9 +1351,11 @@ interface ITelephony {
* Get the service state on specified subscription
* @param subId Subscription id
* @param callingPackage The package making the call
+ * @param callingFeatureId The feature in the package
* @return Service state on specified subscription.
*/
- ServiceState getServiceStateForSubscriber(int subId, String callingPackage);
+ ServiceState getServiceStateForSubscriber(int subId, String callingPackage,
+ String callingFeatureId);
/**
* Returns the URI for the per-account voicemail ringtone set in Phone settings.
diff --git a/test-mock/Android.bp b/test-mock/Android.bp
index 81b1e49ffed1..0b5d4460612d 100644
--- a/test-mock/Android.bp
+++ b/test-mock/Android.bp
@@ -19,8 +19,14 @@
java_sdk_library {
name: "android.test.mock",
- srcs: ["src/**/*.java"],
- api_srcs: [":framework-all-sources"],
+ srcs: [
+ "src/**/*.java",
+ // Note: Below are NOT APIs of this library. We only take APIs under
+ // the android.test.mock package. They however provide private APIs that
+ // android.test.mock APIs references to.
+ ":framework-core-sources-for-test-mock",
+ ":framework_native_aidl",
+ ],
libs: ["framework-all"],
api_packages: [
diff --git a/test-mock/src/android/test/mock/MockContext.java b/test-mock/src/android/test/mock/MockContext.java
index 5053ceedc703..1de6260f3719 100644
--- a/test-mock/src/android/test/mock/MockContext.java
+++ b/test-mock/src/android/test/mock/MockContext.java
@@ -463,6 +463,13 @@ public class MockContext extends Context {
}
@Override
+ public void sendOrderedBroadcast(Intent intent, String receiverPermission,
+ String receiverAppOp, BroadcastReceiver resultReceiver, Handler scheduler,
+ int initialCode, String initialData, Bundle initialExtras) {
+ throw new UnsupportedOperationException();
+ }
+
+ @Override
public void sendStickyBroadcast(Intent intent) {
throw new UnsupportedOperationException();
}
diff --git a/tests/Codegen/runTest.sh b/tests/Codegen/runTest.sh
index 929f122e261e..31ab6d2ba46a 100755
--- a/tests/Codegen/runTest.sh
+++ b/tests/Codegen/runTest.sh
@@ -17,6 +17,7 @@ else
header_and_eval codegen $ANDROID_BUILD_TOP/frameworks/base/tests/Codegen/src/com/android/codegentest/HierrarchicalDataClassBase.java && \
header_and_eval codegen $ANDROID_BUILD_TOP/frameworks/base/tests/Codegen/src/com/android/codegentest/HierrarchicalDataClassChild.java && \
header_and_eval codegen $ANDROID_BUILD_TOP/frameworks/base/tests/Codegen/src/com/android/codegentest/StaleDataclassDetectorFalsePositivesTest.java && \
+ header_and_eval codegen $ANDROID_BUILD_TOP/frameworks/base/tests/Codegen/src/com/android/codegentest/SampleWithNestedDataClasses.java && \
(
cd $ANDROID_BUILD_TOP &&
header_and_eval mmma -j16 frameworks/base/tests/Codegen && \
diff --git a/tests/Codegen/src/com/android/codegentest/HierrarchicalDataClassBase.java b/tests/Codegen/src/com/android/codegentest/HierrarchicalDataClassBase.java
index 325c1c09dd8c..7d88161a2805 100644
--- a/tests/Codegen/src/com/android/codegentest/HierrarchicalDataClassBase.java
+++ b/tests/Codegen/src/com/android/codegentest/HierrarchicalDataClassBase.java
@@ -32,7 +32,7 @@ public class HierrarchicalDataClassBase implements Parcelable {
- // Code below generated by codegen v1.0.9.
+ // Code below generated by codegen v1.0.12.
//
// DO NOT MODIFY!
// CHECKSTYLE:OFF Generated code
@@ -98,11 +98,15 @@ public class HierrarchicalDataClassBase implements Parcelable {
};
@DataClass.Generated(
- time = 1571258914826L,
- codegenVersion = "1.0.9",
+ time = 1572655992854L,
+ codegenVersion = "1.0.12",
sourceFile = "frameworks/base/tests/Codegen/src/com/android/codegentest/HierrarchicalDataClassBase.java",
inputSignatures = "private int mBaseData\nclass HierrarchicalDataClassBase extends java.lang.Object implements [android.os.Parcelable]\n@com.android.internal.util.DataClass(genConstructor=false, genSetters=true)")
@Deprecated
private void __metadata() {}
+
+ //@formatter:on
+ // End of generated code
+
}
diff --git a/tests/Codegen/src/com/android/codegentest/HierrarchicalDataClassChild.java b/tests/Codegen/src/com/android/codegentest/HierrarchicalDataClassChild.java
index 6c92009f8533..c930ce535ab6 100644
--- a/tests/Codegen/src/com/android/codegentest/HierrarchicalDataClassChild.java
+++ b/tests/Codegen/src/com/android/codegentest/HierrarchicalDataClassChild.java
@@ -46,7 +46,7 @@ public class HierrarchicalDataClassChild extends HierrarchicalDataClassBase {
- // Code below generated by codegen v1.0.9.
+ // Code below generated by codegen v1.0.12.
//
// DO NOT MODIFY!
// CHECKSTYLE:OFF Generated code
@@ -120,11 +120,15 @@ public class HierrarchicalDataClassChild extends HierrarchicalDataClassBase {
};
@DataClass.Generated(
- time = 1571258915848L,
- codegenVersion = "1.0.9",
+ time = 1572655993858L,
+ codegenVersion = "1.0.12",
sourceFile = "frameworks/base/tests/Codegen/src/com/android/codegentest/HierrarchicalDataClassChild.java",
inputSignatures = "private @android.annotation.NonNull java.lang.String mChildData\nclass HierrarchicalDataClassChild extends com.android.codegentest.HierrarchicalDataClassBase implements []\n@com.android.internal.util.DataClass(genParcelable=true, genConstructor=false, genSetters=true)")
@Deprecated
private void __metadata() {}
+
+ //@formatter:on
+ // End of generated code
+
}
diff --git a/tests/Codegen/src/com/android/codegentest/ParcelAllTheThingsDataClass.java b/tests/Codegen/src/com/android/codegentest/ParcelAllTheThingsDataClass.java
index 36def8a8dfb1..368a5c3a81e8 100644
--- a/tests/Codegen/src/com/android/codegentest/ParcelAllTheThingsDataClass.java
+++ b/tests/Codegen/src/com/android/codegentest/ParcelAllTheThingsDataClass.java
@@ -52,7 +52,7 @@ public class ParcelAllTheThingsDataClass implements Parcelable {
- // Code below generated by codegen v1.0.9.
+ // Code below generated by codegen v1.0.12.
//
// DO NOT MODIFY!
// CHECKSTYLE:OFF Generated code
@@ -361,7 +361,7 @@ public class ParcelAllTheThingsDataClass implements Parcelable {
}
/** Builds the instance. This builder should not be touched after calling this! */
- public ParcelAllTheThingsDataClass build() {
+ public @NonNull ParcelAllTheThingsDataClass build() {
checkNotUsed();
mBuilderFieldsSet |= 0x100; // Mark builder used
@@ -410,11 +410,15 @@ public class ParcelAllTheThingsDataClass implements Parcelable {
}
@DataClass.Generated(
- time = 1571258913802L,
- codegenVersion = "1.0.9",
+ time = 1572655991821L,
+ codegenVersion = "1.0.12",
sourceFile = "frameworks/base/tests/Codegen/src/com/android/codegentest/ParcelAllTheThingsDataClass.java",
inputSignatures = " @android.annotation.NonNull java.lang.String[] mStringArray\n @android.annotation.NonNull int[] mIntArray\n @android.annotation.NonNull java.util.List<java.lang.String> mStringList\n @android.annotation.NonNull java.util.Map<java.lang.String,com.android.codegentest.SampleWithCustomBuilder> mMap\n @android.annotation.NonNull java.util.Map<java.lang.String,java.lang.String> mStringMap\n @android.annotation.NonNull android.util.SparseArray<com.android.codegentest.SampleWithCustomBuilder> mSparseArray\n @android.annotation.NonNull android.util.SparseIntArray mSparseIntArray\n @java.lang.SuppressWarnings({\"WeakerAccess\"}) @android.annotation.Nullable java.lang.Boolean mNullableBoolean\nclass ParcelAllTheThingsDataClass extends java.lang.Object implements [android.os.Parcelable]\n@com.android.internal.util.DataClass(genBuilder=true, genAidl=false, genToString=true)")
@Deprecated
private void __metadata() {}
+
+ //@formatter:on
+ // End of generated code
+
}
diff --git a/tests/Codegen/src/com/android/codegentest/SampleDataClass.java b/tests/Codegen/src/com/android/codegentest/SampleDataClass.java
index c444d61a0fba..9d52287d631e 100644
--- a/tests/Codegen/src/com/android/codegentest/SampleDataClass.java
+++ b/tests/Codegen/src/com/android/codegentest/SampleDataClass.java
@@ -342,7 +342,7 @@ public final class SampleDataClass implements Parcelable {
- // Code below generated by codegen v1.0.9.
+ // Code below generated by codegen v1.0.12.
//
// DO NOT MODIFY!
// CHECKSTYLE:OFF Generated code
@@ -1430,7 +1430,7 @@ public final class SampleDataClass implements Parcelable {
*/
@SuppressWarnings("WeakerAccess")
@DataClass.Generated.Member
- public static class Builder {
+ public static final class Builder {
private int mNum;
private int mNum2;
@@ -1793,7 +1793,7 @@ public final class SampleDataClass implements Parcelable {
}
/** Builds the instance. This builder should not be touched after calling this! */
- public SampleDataClass build() {
+ public @NonNull SampleDataClass build() {
checkNotUsed();
mBuilderFieldsSet |= 0x100000; // Mark builder used
@@ -1872,11 +1872,15 @@ public final class SampleDataClass implements Parcelable {
}
@DataClass.Generated(
- time = 1571258911688L,
- codegenVersion = "1.0.9",
+ time = 1572655989589L,
+ codegenVersion = "1.0.12",
sourceFile = "frameworks/base/tests/Codegen/src/com/android/codegentest/SampleDataClass.java",
inputSignatures = "public static final java.lang.String STATE_NAME_UNDEFINED\npublic static final java.lang.String STATE_NAME_ON\npublic static final java.lang.String STATE_NAME_OFF\npublic static final int STATE_UNDEFINED\npublic static final int STATE_ON\npublic static final int STATE_OFF\npublic static final @com.android.codegentest.SampleDataClass.RequestFlags int FLAG_MANUAL_REQUEST\npublic static final @com.android.codegentest.SampleDataClass.RequestFlags int FLAG_COMPATIBILITY_MODE_REQUEST\npublic static final @com.android.codegentest.SampleDataClass.RequestFlags int FLAG_AUGMENTED_REQUEST\nprivate int mNum\nprivate int mNum2\nprivate int mNum4\nprivate @android.annotation.Nullable java.lang.String mName\nprivate @android.annotation.NonNull java.lang.String mName2\nprivate @android.annotation.NonNull java.lang.String mName4\nprivate @android.annotation.Nullable android.view.accessibility.AccessibilityNodeInfo mOtherParcelable\nprivate @com.android.internal.util.DataClass.ParcelWith(com.android.codegentest.MyDateParcelling.class) @android.annotation.NonNull java.util.Date mDate\nprivate @com.android.internal.util.DataClass.ParcelWith(com.android.internal.util.Parcelling.BuiltIn.ForPattern.class) @android.annotation.NonNull java.util.regex.Pattern mPattern\nprivate @android.annotation.NonNull java.util.List<android.net.LinkAddress> mLinkAddresses2\nprivate @com.android.internal.util.DataClass.PluralOf(\"linkAddress\") @android.annotation.NonNull java.util.ArrayList<android.net.LinkAddress> mLinkAddresses\nprivate @android.annotation.Nullable android.net.LinkAddress[] mLinkAddresses4\nprivate @com.android.codegentest.SampleDataClass.StateName @android.annotation.NonNull java.lang.String mStateName\nprivate @com.android.codegentest.SampleDataClass.RequestFlags int mFlags\nprivate @com.android.codegentest.SampleDataClass.State int mState\npublic @android.annotation.NonNull java.lang.CharSequence charSeq\nprivate final @android.annotation.Nullable android.net.LinkAddress[] mLinkAddresses5\nprivate transient android.net.LinkAddress[] mLinkAddresses6\ntransient int[] mTmpStorage\nprivate @android.annotation.StringRes int mStringRes\nprivate @android.annotation.IntRange(from=0L, to=6L) int mDayOfWeek\nprivate @android.annotation.Size(2L) @android.annotation.NonNull @com.android.internal.util.DataClass.Each @android.annotation.FloatRange(from=0.0) float[] mCoords\nprivate static java.lang.String defaultName4()\nprivate int[] lazyInitTmpStorage()\npublic android.net.LinkAddress[] getLinkAddresses4()\nprivate boolean patternEquals(java.util.regex.Pattern)\nprivate int patternHashCode()\nprivate void onConstructed()\npublic void dump(java.io.PrintWriter)\nclass SampleDataClass extends java.lang.Object implements [android.os.Parcelable]\n@com.android.internal.util.DataClass(genBuilder=true, genConstructor=true, genEqualsHashCode=true, genToString=true, genForEachField=true, genSetters=true)")
@Deprecated
private void __metadata() {}
+
+ //@formatter:on
+ // End of generated code
+
}
diff --git a/tests/Codegen/src/com/android/codegentest/SampleDataClassTest.java b/tests/Codegen/src/com/android/codegentest/SampleDataClassTest.java
index c7a773530963..d13257743e21 100644
--- a/tests/Codegen/src/com/android/codegentest/SampleDataClassTest.java
+++ b/tests/Codegen/src/com/android/codegentest/SampleDataClassTest.java
@@ -243,6 +243,26 @@ public class SampleDataClassTest {
assertEquals(instance.toString(), unparceledInstance.toString());
}
+ @Test
+ public void testNestedDataClasses_notMangledWhenParceled() {
+ assertEqualsAfterParcelling(
+ new SampleWithNestedDataClasses.NestedDataClass("1"),
+ SampleWithNestedDataClasses.NestedDataClass.CREATOR);
+
+ assertEqualsAfterParcelling(
+ new SampleWithNestedDataClasses.NestedDataClass2("2"),
+ SampleWithNestedDataClasses.NestedDataClass2.CREATOR);
+
+ assertEqualsAfterParcelling(
+ new SampleWithNestedDataClasses.NestedDataClass2.NestedDataClass3(3),
+ SampleWithNestedDataClasses.NestedDataClass2.NestedDataClass3.CREATOR);
+ }
+
+ private static <T extends Parcelable> void assertEqualsAfterParcelling(
+ T p, Parcelable.Creator<T> creator) {
+ assertEquals(p, parcelAndUnparcel(p, creator));
+ }
+
private static <T extends Parcelable> T parcelAndUnparcel(
T original, Parcelable.Creator<T> creator) {
Parcel p = Parcel.obtain();
diff --git a/tests/Codegen/src/com/android/codegentest/SampleWithCustomBuilder.java b/tests/Codegen/src/com/android/codegentest/SampleWithCustomBuilder.java
index 55feae7200ea..cef32d1051df 100644
--- a/tests/Codegen/src/com/android/codegentest/SampleWithCustomBuilder.java
+++ b/tests/Codegen/src/com/android/codegentest/SampleWithCustomBuilder.java
@@ -85,7 +85,7 @@ public class SampleWithCustomBuilder implements Parcelable {
- // Code below generated by codegen v1.0.9.
+ // Code below generated by codegen v1.0.12.
//
// DO NOT MODIFY!
// CHECKSTYLE:OFF Generated code
@@ -224,7 +224,7 @@ public class SampleWithCustomBuilder implements Parcelable {
}
/** Builds the instance. This builder should not be touched after calling this! */
- public SampleWithCustomBuilder build() {
+ public @NonNull SampleWithCustomBuilder build() {
checkNotUsed();
mBuilderFieldsSet |= 0x8; // Mark builder used
@@ -253,11 +253,15 @@ public class SampleWithCustomBuilder implements Parcelable {
}
@DataClass.Generated(
- time = 1571258912752L,
- codegenVersion = "1.0.9",
+ time = 1572655990725L,
+ codegenVersion = "1.0.12",
sourceFile = "frameworks/base/tests/Codegen/src/com/android/codegentest/SampleWithCustomBuilder.java",
inputSignatures = " long delayAmount\n @android.annotation.NonNull java.util.concurrent.TimeUnit delayUnit\n long creationTimestamp\nprivate static java.util.concurrent.TimeUnit unparcelDelayUnit(android.os.Parcel)\nprivate void parcelDelayUnit(android.os.Parcel,int)\nclass SampleWithCustomBuilder extends java.lang.Object implements [android.os.Parcelable]\n@com.android.internal.util.DataClass(genBuilder=true, genAidl=false, genToString=true)\nabstract com.android.codegentest.SampleWithCustomBuilder.Builder setDelayAmount(long)\npublic abstract com.android.codegentest.SampleWithCustomBuilder.Builder setDelayUnit(java.util.concurrent.TimeUnit)\npublic com.android.codegentest.SampleWithCustomBuilder.Builder setDelay(long,java.util.concurrent.TimeUnit)\nclass BaseBuilder extends java.lang.Object implements []")
@Deprecated
private void __metadata() {}
+
+ //@formatter:on
+ // End of generated code
+
}
diff --git a/tests/Codegen/src/com/android/codegentest/SampleWithNestedDataClasses.java b/tests/Codegen/src/com/android/codegentest/SampleWithNestedDataClasses.java
new file mode 100644
index 000000000000..27055f6a4df8
--- /dev/null
+++ b/tests/Codegen/src/com/android/codegentest/SampleWithNestedDataClasses.java
@@ -0,0 +1,390 @@
+/*
+ * 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.codegentest;
+
+import android.annotation.NonNull;
+import android.os.Parcel;
+import android.os.Parcelable;
+
+import com.android.internal.util.DataClass;
+
+/**
+ * An example of deeply nested data classes
+ */
+public class SampleWithNestedDataClasses {
+
+ int mFoo = 0;
+
+ @DataClass(genEqualsHashCode = true)
+ public static class NestedDataClass implements Parcelable {
+
+ @NonNull String mBar;
+
+
+
+ // Code below generated by codegen v1.0.12.
+ //
+ // DO NOT MODIFY!
+ // CHECKSTYLE:OFF Generated code
+ //
+ // To regenerate run:
+ // $ codegen $ANDROID_BUILD_TOP/frameworks/base/tests/Codegen/src/com/android/codegentest/SampleWithNestedDataClasses.java
+ //
+ // To exclude the generated code from IntelliJ auto-formatting enable (one-time):
+ // Settings > Editor > Code Style > Formatter Control
+ //@formatter:off
+
+
+ @DataClass.Generated.Member
+ public NestedDataClass(
+ @NonNull String bar) {
+ this.mBar = bar;
+ com.android.internal.util.AnnotationValidations.validate(
+ NonNull.class, null, mBar);
+
+ // onConstructed(); // You can define this method to get a callback
+ }
+
+ @DataClass.Generated.Member
+ public @NonNull String getBar() {
+ return mBar;
+ }
+
+ @Override
+ @DataClass.Generated.Member
+ public boolean equals(@android.annotation.Nullable Object o) {
+ // You can override field equality logic by defining either of the methods like:
+ // boolean fieldNameEquals(NestedDataClass other) { ... }
+ // boolean fieldNameEquals(FieldType otherValue) { ... }
+
+ if (this == o) return true;
+ if (o == null || getClass() != o.getClass()) return false;
+ @SuppressWarnings("unchecked")
+ NestedDataClass that = (NestedDataClass) o;
+ //noinspection PointlessBooleanExpression
+ return true
+ && java.util.Objects.equals(mBar, that.mBar);
+ }
+
+ @Override
+ @DataClass.Generated.Member
+ public int hashCode() {
+ // You can override field hashCode logic by defining methods like:
+ // int fieldNameHashCode() { ... }
+
+ int _hash = 1;
+ _hash = 31 * _hash + java.util.Objects.hashCode(mBar);
+ return _hash;
+ }
+
+ @Override
+ @DataClass.Generated.Member
+ public void writeToParcel(@NonNull Parcel dest, int flags) {
+ // You can override field parcelling by defining methods like:
+ // void parcelFieldName(Parcel dest, int flags) { ... }
+
+ dest.writeString(mBar);
+ }
+
+ @Override
+ @DataClass.Generated.Member
+ public int describeContents() { return 0; }
+
+ /** @hide */
+ @SuppressWarnings({"unchecked", "RedundantCast"})
+ @DataClass.Generated.Member
+ protected NestedDataClass(@NonNull Parcel in) {
+ // You can override field unparcelling by defining methods like:
+ // static FieldType unparcelFieldName(Parcel in) { ... }
+
+ String bar = in.readString();
+
+ this.mBar = bar;
+ com.android.internal.util.AnnotationValidations.validate(
+ NonNull.class, null, mBar);
+
+ // onConstructed(); // You can define this method to get a callback
+ }
+
+ @DataClass.Generated.Member
+ public static final @NonNull Parcelable.Creator<NestedDataClass> CREATOR
+ = new Parcelable.Creator<NestedDataClass>() {
+ @Override
+ public NestedDataClass[] newArray(int size) {
+ return new NestedDataClass[size];
+ }
+
+ @Override
+ public NestedDataClass createFromParcel(@NonNull Parcel in) {
+ return new NestedDataClass(in);
+ }
+ };
+
+ @DataClass.Generated(
+ time = 1572655995915L,
+ codegenVersion = "1.0.12",
+ sourceFile = "frameworks/base/tests/Codegen/src/com/android/codegentest/SampleWithNestedDataClasses.java",
+ inputSignatures = " @android.annotation.NonNull java.lang.String mBar\nclass NestedDataClass extends java.lang.Object implements [android.os.Parcelable]\n@com.android.internal.util.DataClass(genEqualsHashCode=true)")
+ @Deprecated
+ private void __metadata() {}
+
+
+ //@formatter:on
+ // End of generated code
+
+ }
+
+ @DataClass(genEqualsHashCode = true)
+ public static class NestedDataClass2 implements Parcelable {
+
+ @NonNull String mBaz;
+
+ @DataClass(genEqualsHashCode = true)
+ public static class NestedDataClass3 implements Parcelable {
+
+ @NonNull long mBaz2;
+
+
+
+ // Code below generated by codegen v1.0.12.
+ //
+ // DO NOT MODIFY!
+ // CHECKSTYLE:OFF Generated code
+ //
+ // To regenerate run:
+ // $ codegen $ANDROID_BUILD_TOP/frameworks/base/tests/Codegen/src/com/android/codegentest/SampleWithNestedDataClasses.java
+ //
+ // To exclude the generated code from IntelliJ auto-formatting enable (one-time):
+ // Settings > Editor > Code Style > Formatter Control
+ //@formatter:off
+
+
+ @DataClass.Generated.Member
+ public NestedDataClass3(
+ @NonNull long baz2) {
+ this.mBaz2 = baz2;
+ com.android.internal.util.AnnotationValidations.validate(
+ NonNull.class, null, mBaz2);
+
+ // onConstructed(); // You can define this method to get a callback
+ }
+
+ @DataClass.Generated.Member
+ public @NonNull long getBaz2() {
+ return mBaz2;
+ }
+
+ @Override
+ @DataClass.Generated.Member
+ public boolean equals(@android.annotation.Nullable Object o) {
+ // You can override field equality logic by defining either of the methods like:
+ // boolean fieldNameEquals(NestedDataClass3 other) { ... }
+ // boolean fieldNameEquals(FieldType otherValue) { ... }
+
+ if (this == o) return true;
+ if (o == null || getClass() != o.getClass()) return false;
+ @SuppressWarnings("unchecked")
+ NestedDataClass3 that = (NestedDataClass3) o;
+ //noinspection PointlessBooleanExpression
+ return true
+ && mBaz2 == that.mBaz2;
+ }
+
+ @Override
+ @DataClass.Generated.Member
+ public int hashCode() {
+ // You can override field hashCode logic by defining methods like:
+ // int fieldNameHashCode() { ... }
+
+ int _hash = 1;
+ _hash = 31 * _hash + Long.hashCode(mBaz2);
+ return _hash;
+ }
+
+ @Override
+ @DataClass.Generated.Member
+ public void writeToParcel(@NonNull Parcel dest, int flags) {
+ // You can override field parcelling by defining methods like:
+ // void parcelFieldName(Parcel dest, int flags) { ... }
+
+ dest.writeLong(mBaz2);
+ }
+
+ @Override
+ @DataClass.Generated.Member
+ public int describeContents() { return 0; }
+
+ /** @hide */
+ @SuppressWarnings({"unchecked", "RedundantCast"})
+ @DataClass.Generated.Member
+ protected NestedDataClass3(@NonNull Parcel in) {
+ // You can override field unparcelling by defining methods like:
+ // static FieldType unparcelFieldName(Parcel in) { ... }
+
+ long baz2 = in.readLong();
+
+ this.mBaz2 = baz2;
+ com.android.internal.util.AnnotationValidations.validate(
+ NonNull.class, null, mBaz2);
+
+ // onConstructed(); // You can define this method to get a callback
+ }
+
+ @DataClass.Generated.Member
+ public static final @NonNull Parcelable.Creator<NestedDataClass3> CREATOR
+ = new Parcelable.Creator<NestedDataClass3>() {
+ @Override
+ public NestedDataClass3[] newArray(int size) {
+ return new NestedDataClass3[size];
+ }
+
+ @Override
+ public NestedDataClass3 createFromParcel(@NonNull Parcel in) {
+ return new NestedDataClass3(in);
+ }
+ };
+
+ @DataClass.Generated(
+ time = 1572655995924L,
+ codegenVersion = "1.0.12",
+ sourceFile = "frameworks/base/tests/Codegen/src/com/android/codegentest/SampleWithNestedDataClasses.java",
+ inputSignatures = " @android.annotation.NonNull long mBaz2\nclass NestedDataClass3 extends java.lang.Object implements [android.os.Parcelable]\n@com.android.internal.util.DataClass(genEqualsHashCode=true)")
+ @Deprecated
+ private void __metadata() {}
+
+
+ //@formatter:on
+ // End of generated code
+
+ }
+
+
+
+ // Code below generated by codegen v1.0.12.
+ //
+ // DO NOT MODIFY!
+ // CHECKSTYLE:OFF Generated code
+ //
+ // To regenerate run:
+ // $ codegen $ANDROID_BUILD_TOP/frameworks/base/tests/Codegen/src/com/android/codegentest/SampleWithNestedDataClasses.java
+ //
+ // To exclude the generated code from IntelliJ auto-formatting enable (one-time):
+ // Settings > Editor > Code Style > Formatter Control
+ //@formatter:off
+
+
+ @DataClass.Generated.Member
+ public NestedDataClass2(
+ @NonNull String baz) {
+ this.mBaz = baz;
+ com.android.internal.util.AnnotationValidations.validate(
+ NonNull.class, null, mBaz);
+
+ // onConstructed(); // You can define this method to get a callback
+ }
+
+ @DataClass.Generated.Member
+ public @NonNull String getBaz() {
+ return mBaz;
+ }
+
+ @Override
+ @DataClass.Generated.Member
+ public boolean equals(@android.annotation.Nullable Object o) {
+ // You can override field equality logic by defining either of the methods like:
+ // boolean fieldNameEquals(NestedDataClass2 other) { ... }
+ // boolean fieldNameEquals(FieldType otherValue) { ... }
+
+ if (this == o) return true;
+ if (o == null || getClass() != o.getClass()) return false;
+ @SuppressWarnings("unchecked")
+ NestedDataClass2 that = (NestedDataClass2) o;
+ //noinspection PointlessBooleanExpression
+ return true
+ && java.util.Objects.equals(mBaz, that.mBaz);
+ }
+
+ @Override
+ @DataClass.Generated.Member
+ public int hashCode() {
+ // You can override field hashCode logic by defining methods like:
+ // int fieldNameHashCode() { ... }
+
+ int _hash = 1;
+ _hash = 31 * _hash + java.util.Objects.hashCode(mBaz);
+ return _hash;
+ }
+
+ @Override
+ @DataClass.Generated.Member
+ public void writeToParcel(@NonNull Parcel dest, int flags) {
+ // You can override field parcelling by defining methods like:
+ // void parcelFieldName(Parcel dest, int flags) { ... }
+
+ dest.writeString(mBaz);
+ }
+
+ @Override
+ @DataClass.Generated.Member
+ public int describeContents() { return 0; }
+
+ /** @hide */
+ @SuppressWarnings({"unchecked", "RedundantCast"})
+ @DataClass.Generated.Member
+ protected NestedDataClass2(@NonNull Parcel in) {
+ // You can override field unparcelling by defining methods like:
+ // static FieldType unparcelFieldName(Parcel in) { ... }
+
+ String baz = in.readString();
+
+ this.mBaz = baz;
+ com.android.internal.util.AnnotationValidations.validate(
+ NonNull.class, null, mBaz);
+
+ // onConstructed(); // You can define this method to get a callback
+ }
+
+ @DataClass.Generated.Member
+ public static final @NonNull Parcelable.Creator<NestedDataClass2> CREATOR
+ = new Parcelable.Creator<NestedDataClass2>() {
+ @Override
+ public NestedDataClass2[] newArray(int size) {
+ return new NestedDataClass2[size];
+ }
+
+ @Override
+ public NestedDataClass2 createFromParcel(@NonNull Parcel in) {
+ return new NestedDataClass2(in);
+ }
+ };
+
+ @DataClass.Generated(
+ time = 1572655995930L,
+ codegenVersion = "1.0.12",
+ sourceFile = "frameworks/base/tests/Codegen/src/com/android/codegentest/SampleWithNestedDataClasses.java",
+ inputSignatures = " @android.annotation.NonNull java.lang.String mBaz\nclass NestedDataClass2 extends java.lang.Object implements [android.os.Parcelable]\n@com.android.internal.util.DataClass(genEqualsHashCode=true)")
+ @Deprecated
+ private void __metadata() {}
+
+
+ //@formatter:on
+ // End of generated code
+
+ }
+
+ void someCode() {}
+}
diff --git a/tests/Codegen/src/com/android/codegentest/StaleDataclassDetectorFalsePositivesTest.java b/tests/Codegen/src/com/android/codegentest/StaleDataclassDetectorFalsePositivesTest.java
index b967f19f9f7e..4bfec895fdcb 100644
--- a/tests/Codegen/src/com/android/codegentest/StaleDataclassDetectorFalsePositivesTest.java
+++ b/tests/Codegen/src/com/android/codegentest/StaleDataclassDetectorFalsePositivesTest.java
@@ -51,7 +51,7 @@ public class StaleDataclassDetectorFalsePositivesTest {
- // Code below generated by codegen v1.0.9.
+ // Code below generated by codegen v1.0.12.
//
// DO NOT MODIFY!
// CHECKSTYLE:OFF Generated code
@@ -65,11 +65,15 @@ public class StaleDataclassDetectorFalsePositivesTest {
@DataClass.Generated(
- time = 1571258916868L,
- codegenVersion = "1.0.9",
+ time = 1572655994865L,
+ codegenVersion = "1.0.12",
sourceFile = "frameworks/base/tests/Codegen/src/com/android/codegentest/StaleDataclassDetectorFalsePositivesTest.java",
inputSignatures = "public @android.annotation.NonNull java.lang.String someMethod(int)\nclass StaleDataclassDetectorFalsePositivesTest extends java.lang.Object implements []\n@com.android.internal.util.DataClass(genConstructor=false, genBuilder=false)")
@Deprecated
private void __metadata() {}
+
+ //@formatter:on
+ // End of generated code
+
}
diff --git a/tests/RollbackTest/RollbackTest/src/com/android/tests/rollback/StagedRollbackTest.java b/tests/RollbackTest/RollbackTest/src/com/android/tests/rollback/StagedRollbackTest.java
index bfb49689f98d..8b0193092d27 100644
--- a/tests/RollbackTest/RollbackTest/src/com/android/tests/rollback/StagedRollbackTest.java
+++ b/tests/RollbackTest/RollbackTest/src/com/android/tests/rollback/StagedRollbackTest.java
@@ -30,6 +30,7 @@ import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageInfo;
import android.content.pm.PackageInstaller;
+import android.content.pm.PackageManager;
import android.content.rollback.RollbackInfo;
import android.content.rollback.RollbackManager;
import android.os.ParcelFileDescriptor;
@@ -55,6 +56,7 @@ import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.JUnit4;
+import java.io.File;
import java.util.concurrent.TimeUnit;
/**
@@ -72,8 +74,13 @@ public class StagedRollbackTest {
"android.net.INetworkStackConnector";
private static final String PROPERTY_WATCHDOG_TRIGGER_FAILURE_COUNT =
"watchdog_trigger_failure_count";
+ private static final String PROPERTY_WATCHDOG_REQUEST_TIMEOUT_MILLIS =
+ "watchdog_request_timeout_millis";
private static final String MODULE_META_DATA_PACKAGE = getModuleMetadataPackageName();
+ private static final TestApp NETWORK_STACK = new TestApp("NetworkStack",
+ getNetworkStackPackageName(), -1, false,
+ new File("/system/priv-app/NetworkStack/NetworkStack.apk"));
/**
* Adopts common shell permissions needed for rollback tests.
@@ -214,6 +221,7 @@ public class StagedRollbackTest {
@Test
public void testNetworkFailedRollback_Phase1() throws Exception {
+ // Remove available rollbacks and uninstall NetworkStack on /data/
RollbackManager rm = RollbackUtils.getRollbackManager();
String networkStack = getNetworkStackPackageName();
@@ -222,6 +230,13 @@ public class StagedRollbackTest {
assertThat(getUniqueRollbackInfoForPackage(rm.getAvailableRollbacks(),
networkStack)).isNull();
+
+ // Reduce health check deadline
+ DeviceConfig.setProperty(DeviceConfig.NAMESPACE_ROLLBACK,
+ PROPERTY_WATCHDOG_REQUEST_TIMEOUT_MILLIS,
+ Integer.toString(120000), false);
+ // Simulate re-installation of new NetworkStack with rollbacks enabled
+ installNetworkStackPackage();
}
@Test
@@ -253,16 +268,20 @@ public class StagedRollbackTest {
getNetworkStackPackageName())).isNotNull();
}
- private String getNetworkStackPackageName() {
+ private static String getNetworkStackPackageName() {
Intent intent = new Intent(NETWORK_STACK_CONNECTOR_CLASS);
ComponentName comp = intent.resolveSystemService(
InstrumentationRegistry.getContext().getPackageManager(), 0);
return comp.getPackageName();
}
- private void uninstallNetworkStackPackage() {
- // Since the host side use shell command to install the network stack package, uninstall
- // must be done by shell command as well. Otherwise uninstall by a different user will fail.
+ private static void installNetworkStackPackage() throws Exception {
+ Install.single(NETWORK_STACK).setStaged().setEnableRollback()
+ .addInstallFlags(PackageManager.INSTALL_REPLACE_EXISTING).commit();
+ }
+
+ private static void uninstallNetworkStackPackage() {
+ // Uninstall the package as a privileged user so we won't fail due to permission.
runShellCommand("pm uninstall " + getNetworkStackPackageName());
}
@@ -348,7 +367,7 @@ public class StagedRollbackTest {
MODULE_META_DATA_PACKAGE)).isNull();
}
- private void runShellCommand(String cmd) {
+ private static void runShellCommand(String cmd) {
ParcelFileDescriptor pfd = InstrumentationRegistry.getInstrumentation().getUiAutomation()
.executeShellCommand(cmd);
IoUtils.closeQuietly(pfd);
diff --git a/tests/RollbackTest/StagedRollbackTest/src/com/android/tests/rollback/host/StagedRollbackTest.java b/tests/RollbackTest/StagedRollbackTest/src/com/android/tests/rollback/host/StagedRollbackTest.java
index c10169b2d3ee..18a813d52b85 100644
--- a/tests/RollbackTest/StagedRollbackTest/src/com/android/tests/rollback/host/StagedRollbackTest.java
+++ b/tests/RollbackTest/StagedRollbackTest/src/com/android/tests/rollback/host/StagedRollbackTest.java
@@ -24,8 +24,7 @@ import com.android.tradefed.log.LogUtil.CLog;
import com.android.tradefed.testtype.DeviceJUnit4ClassRunner;
import com.android.tradefed.testtype.junit4.BaseHostJUnit4Test;
-import org.junit.After;
-import org.junit.Before;
+import org.junit.Ignore;
import org.junit.Test;
import org.junit.runner.RunWith;
@@ -50,20 +49,6 @@ public class StagedRollbackTest extends BaseHostJUnit4Test {
phase));
}
- @Before
- public void setUp() throws Exception {
- // Disconnect internet so we can test network health triggered rollbacks
- getDevice().executeShellCommand("svc wifi disable");
- getDevice().executeShellCommand("svc data disable");
- }
-
- @After
- public void tearDown() throws Exception {
- // Reconnect internet after testing network health triggered rollbacks
- getDevice().executeShellCommand("svc wifi enable");
- getDevice().executeShellCommand("svc data enable");
- }
-
/**
* Tests watchdog triggered staged rollbacks involving only apks.
*/
@@ -121,33 +106,34 @@ public class StagedRollbackTest extends BaseHostJUnit4Test {
*/
@Test
public void testNetworkFailedRollback() throws Exception {
- // Remove available rollbacks and uninstall NetworkStack on /data/
- runPhase("testNetworkFailedRollback_Phase1");
- // Reduce health check deadline
- getDevice().executeShellCommand("device_config put rollback "
- + "watchdog_request_timeout_millis 120000");
- // Simulate re-installation of new NetworkStack with rollbacks enabled
- getDevice().executeShellCommand("pm install -r --staged --enable-rollback "
- + "/system/priv-app/NetworkStack/NetworkStack.apk");
-
- // Sleep to allow writes to disk before reboot
- Thread.sleep(5000);
- // Reboot device to activate staged package
- getDevice().reboot();
-
- // Verify rollback was enabled
- runPhase("testNetworkFailedRollback_Phase2");
- assertThrows(AssertionError.class, () -> runPhase("testNetworkFailedRollback_Phase3"));
-
- getDevice().waitForDeviceAvailable();
- // Verify rollback was executed after health check deadline
- runPhase("testNetworkFailedRollback_Phase4");
+ try {
+ // Disconnect internet so we can test network health triggered rollbacks
+ getDevice().executeShellCommand("svc wifi disable");
+ getDevice().executeShellCommand("svc data disable");
+
+ runPhase("testNetworkFailedRollback_Phase1");
+ // Reboot device to activate staged package
+ getDevice().reboot();
+
+ // Verify rollback was enabled
+ runPhase("testNetworkFailedRollback_Phase2");
+ assertThrows(AssertionError.class, () -> runPhase("testNetworkFailedRollback_Phase3"));
+
+ getDevice().waitForDeviceAvailable();
+ // Verify rollback was executed after health check deadline
+ runPhase("testNetworkFailedRollback_Phase4");
+ } finally {
+ // Reconnect internet again so we won't break tests which assume internet available
+ getDevice().executeShellCommand("svc wifi enable");
+ getDevice().executeShellCommand("svc data enable");
+ }
}
/**
* Tests passed network health check does not trigger watchdog staged rollbacks.
*/
@Test
+ @Ignore("b/143514090")
public void testNetworkPassedDoesNotRollback() throws Exception {
// Remove available rollbacks and uninstall NetworkStack on /data/
runPhase("testNetworkPassedDoesNotRollback_Phase1");
diff --git a/tests/TouchLatency/app/src/main/java/com/prefabulated/touchlatency/TouchLatencyActivity.java b/tests/TouchLatency/app/src/main/java/com/prefabulated/touchlatency/TouchLatencyActivity.java
index ba77a74974d1..1664746f4636 100644
--- a/tests/TouchLatency/app/src/main/java/com/prefabulated/touchlatency/TouchLatencyActivity.java
+++ b/tests/TouchLatency/app/src/main/java/com/prefabulated/touchlatency/TouchLatencyActivity.java
@@ -73,6 +73,10 @@ class TouchLatencyView extends View implements View.OnTouchListener {
mFps = 0;
mLastFpsUpdate = 0;
mFrameCount = 0;
+
+ mDf = new DecimalFormat("fps: #.##");
+ mDf.setRoundingMode(RoundingMode.HALF_UP);
+
Trace.endSection();
}
@@ -181,9 +185,7 @@ class TouchLatencyView extends View implements View.OnTouchListener {
// Draw the ball
canvas.drawColor(BACKGROUND_COLOR);
canvas.drawOval(left, top, right, bottom, getBallColor());
- DecimalFormat df = new DecimalFormat("fps: #.##");
- df.setRoundingMode(RoundingMode.HALF_UP);
- canvas.drawText(df.format(mFps), width, 100, mTextPaint);
+ canvas.drawText(mDf.format(mFps), width, 100, mTextPaint);
invalidate();
Trace.endSection();
@@ -220,6 +222,7 @@ class TouchLatencyView extends View implements View.OnTouchListener {
private long mLastDrawNano, mLastFpsUpdate, mFrameCount;
private float mFps;
+ private DecimalFormat mDf;
}
public class TouchLatencyActivity extends Activity {
diff --git a/tools/codegen/src/com/android/codegen/ClassInfo.kt b/tools/codegen/src/com/android/codegen/ClassInfo.kt
index 92da9dab863b..bf95a2eb2193 100644
--- a/tools/codegen/src/com/android/codegen/ClassInfo.kt
+++ b/tools/codegen/src/com/android/codegen/ClassInfo.kt
@@ -1,47 +1,15 @@
package com.android.codegen
-import com.github.javaparser.ParseProblemException
-import com.github.javaparser.ParseResult
-import com.github.javaparser.ast.CompilationUnit
import com.github.javaparser.ast.body.ClassOrInterfaceDeclaration
-open class ClassInfo(val sourceLines: List<String>) {
+open class ClassInfo(val classAst: ClassOrInterfaceDeclaration, val fileInfo: FileInfo) {
- private val userSourceCode = (sourceLines + "}").joinToString("\n")
- val fileAst: CompilationUnit = try {
- JAVA_PARSER.parse(userSourceCode).throwIfFailed()
- } catch (e: ParseProblemException) {
- throw parseFailed(cause = e)
- }
-
- fun <T> ParseResult<T>.throwIfFailed(): T {
- if (problems.isNotEmpty()) {
- throw parseFailed(
- desc = this@throwIfFailed.problems.joinToString("\n"),
- cause = this@throwIfFailed.problems.mapNotNull { it.cause.orElse(null) }.firstOrNull())
- }
- return result.get()
- }
+ val fileAst = fileInfo.fileAst
- private fun parseFailed(cause: Throwable? = null, desc: String = ""): RuntimeException {
- return RuntimeException("Failed to parse code:\n" +
- userSourceCode
- .lines()
- .mapIndexed { lnNum, ln -> "/*$lnNum*/$ln" }
- .joinToString("\n") + "\n$desc",
- cause)
- }
-
- val classAst = fileAst.types[0] as ClassOrInterfaceDeclaration
val nestedClasses = classAst.members.filterIsInstance<ClassOrInterfaceDeclaration>()
- val superInterfaces = (fileAst.types[0] as ClassOrInterfaceDeclaration)
- .implementedTypes.map { it.asString() }
-
- val superClass = run {
- val superClasses = (fileAst.types[0] as ClassOrInterfaceDeclaration).extendedTypes
- if (superClasses.isNonEmpty) superClasses[0] else null
- }
+ val superInterfaces = classAst.implementedTypes.map { it.asString() }
+ val superClass = classAst.extendedTypes.getOrNull(0)
val ClassName = classAst.nameAsString
private val genericArgsAst = classAst.typeParameters
diff --git a/tools/codegen/src/com/android/codegen/ClassPrinter.kt b/tools/codegen/src/com/android/codegen/ClassPrinter.kt
index bd72d9e7ec21..a4fd374d0c6e 100644
--- a/tools/codegen/src/com/android/codegen/ClassPrinter.kt
+++ b/tools/codegen/src/com/android/codegen/ClassPrinter.kt
@@ -11,36 +11,12 @@ import com.github.javaparser.ast.type.ClassOrInterfaceType
* [ClassInfo] + utilities for printing out new class code with proper indentation and imports
*/
class ClassPrinter(
- source: List<String>,
- private val stringBuilder: StringBuilder,
- var cliArgs: Array<String>
-) : ClassInfo(source) {
+ classAst: ClassOrInterfaceDeclaration,
+ fileInfo: FileInfo
+) : ClassInfo(classAst, fileInfo), Printer<ClassPrinter>, ImportsProvider {
val GENERATED_MEMBER_HEADER by lazy { "@$GeneratedMember" }
- // Imports
- val NonNull by lazy { classRef("android.annotation.NonNull") }
- val NonEmpty by lazy { classRef("android.annotation.NonEmpty") }
- val Nullable by lazy { classRef("android.annotation.Nullable") }
- val TextUtils by lazy { classRef("android.text.TextUtils") }
- val LinkedHashMap by lazy { classRef("java.util.LinkedHashMap") }
- val Collections by lazy { classRef("java.util.Collections") }
- val Preconditions by lazy { classRef("com.android.internal.util.Preconditions") }
- val ArrayList by lazy { classRef("java.util.ArrayList") }
- val DataClass by lazy { classRef("com.android.internal.util.DataClass") }
- val DataClassEnum by lazy { classRef("com.android.internal.util.DataClass.Enum") }
- val ParcelWith by lazy { classRef("com.android.internal.util.DataClass.ParcelWith") }
- val PluralOf by lazy { classRef("com.android.internal.util.DataClass.PluralOf") }
- val Each by lazy { classRef("com.android.internal.util.DataClass.Each") }
- val DataClassGenerated by lazy { classRef("com.android.internal.util.DataClass.Generated") }
- val DataClassSuppressConstDefs by lazy { classRef("com.android.internal.util.DataClass.SuppressConstDefsGeneration") }
- val DataClassSuppress by lazy { classRef("com.android.internal.util.DataClass.Suppress") }
- val GeneratedMember by lazy { classRef("com.android.internal.util.DataClass.Generated.Member") }
- val Parcelling by lazy { classRef("com.android.internal.util.Parcelling") }
- val Parcelable by lazy { classRef("android.os.Parcelable") }
- val Parcel by lazy { classRef("android.os.Parcel") }
- val UnsupportedAppUsage by lazy { classRef("android.annotation.UnsupportedAppUsage") }
-
init {
val fieldsWithMissingNullablity = fields.filter { field ->
!field.isPrimitive
@@ -60,50 +36,61 @@ class ClassPrinter(
}
}
- /**
- * Optionally shortens a class reference if there's a corresponding import present
- */
- fun classRef(fullName: String): String {
- if (cliArgs.contains(FLAG_NO_FULL_QUALIFIERS)) {
- return fullName.split(".").dropWhile { it[0].isLowerCase() }.joinToString(".")
- }
+ val cliArgs get() = fileInfo.cliArgs
- val pkg = fullName.substringBeforeLast(".")
- val simpleName = fullName.substringAfterLast(".")
- if (fileAst.imports.any { imprt ->
- imprt.nameAsString == fullName
- || (imprt.isAsterisk && imprt.nameAsString == pkg)
- }) {
- return simpleName
- } else {
- val outerClass = pkg.substringAfterLast(".", "")
- if (outerClass.firstOrNull()?.isUpperCase() == true) {
- return classRef(pkg) + "." + simpleName
- }
- }
- return fullName
- }
+ fun print() {
+ currentIndent = fileInfo.sourceLines
+ .find { "class $ClassName" in it }!!
+ .takeWhile { it.isWhitespace() }
+ .plus(INDENT_SINGLE)
- /** @see classRef */
- inline fun <reified T : Any> classRef(): String {
- return classRef(T::class.java.name)
- }
+ +fileInfo.generatedWarning
- /** @see classRef */
- fun memberRef(fullName: String): String {
- val className = fullName.substringBeforeLast(".")
- val methodName = fullName.substringAfterLast(".")
- return if (fileAst.imports.any {
- it.isStatic
- && (it.nameAsString == fullName
- || (it.isAsterisk && it.nameAsString == className))
- }) {
- className.substringAfterLast(".") + "." + methodName
- } else {
- classRef(className) + "." + methodName
+ if (FeatureFlag.CONST_DEFS()) generateConstDefs()
+
+
+ if (FeatureFlag.CONSTRUCTOR()) {
+ generateConstructor("public")
+ } else if (FeatureFlag.BUILDER()
+ || FeatureFlag.COPY_CONSTRUCTOR()
+ || FeatureFlag.WITHERS()) {
+ generateConstructor("/* package-private */")
}
+ if (FeatureFlag.COPY_CONSTRUCTOR()) generateCopyConstructor()
+
+ if (FeatureFlag.GETTERS()) generateGetters()
+ if (FeatureFlag.SETTERS()) generateSetters()
+ if (FeatureFlag.TO_STRING()) generateToString()
+ if (FeatureFlag.EQUALS_HASH_CODE()) generateEqualsHashcode()
+
+ if (FeatureFlag.FOR_EACH_FIELD()) generateForEachField()
+
+ if (FeatureFlag.WITHERS()) generateWithers()
+
+ if (FeatureFlag.PARCELABLE()) generateParcelable()
+
+ if (FeatureFlag.BUILDER() && FeatureFlag.BUILD_UPON()) generateBuildUpon()
+ if (FeatureFlag.BUILDER()) generateBuilder()
+
+ if (FeatureFlag.AIDL()) fileInfo.generateAidl() //TODO guard against nested classes requesting aidl
+
+ generateMetadata(fileInfo.file)
+
+ +"""
+ //@formatter:on
+ $GENERATED_END
+
+ """
+
+ rmEmptyLine()
}
+ override var currentIndent: String
+ get() = fileInfo.currentIndent
+ set(value) { fileInfo.currentIndent = value }
+ override val stringBuilder get() = fileInfo.stringBuilder
+
+
val dataClassAnnotationFeatures = classAst.annotations
.find { it.nameAsString == DataClass }
?.let { it as? NormalAnnotationExpr }
@@ -143,7 +130,7 @@ class ClassPrinter(
|| onByDefault
FeatureFlag.CONSTRUCTOR -> !FeatureFlag.BUILDER()
FeatureFlag.PARCELABLE -> "Parcelable" in superInterfaces
- FeatureFlag.AIDL -> FeatureFlag.PARCELABLE()
+ FeatureFlag.AIDL -> fileInfo.mainClass.nameAsString == ClassName && FeatureFlag.PARCELABLE()
FeatureFlag.IMPLICIT_NONNULL -> fields.any { it.isNullable }
&& fields.none { "@$NonNull" in it.annotations }
else -> onByDefault
@@ -163,162 +150,7 @@ class ClassPrinter(
}
}
- var currentIndent = INDENT_SINGLE
- private set
-
- fun pushIndent() {
- currentIndent += INDENT_SINGLE
- }
-
- fun popIndent() {
- currentIndent = currentIndent.substring(0, currentIndent.length - INDENT_SINGLE.length)
- }
-
- fun backspace() = stringBuilder.setLength(stringBuilder.length - 1)
- val lastChar get() = stringBuilder[stringBuilder.length - 1]
-
- private fun appendRaw(s: String) {
- stringBuilder.append(s)
- }
-
- fun append(s: String) {
- if (s.isBlank() && s != "\n") {
- appendRaw(s)
- } else {
- appendRaw(s.lines().map { line ->
- if (line.startsWith(" *")) line else line.trimStart()
- }.joinToString("\n$currentIndent"))
- }
- }
-
- fun appendSameLine(s: String) {
- while (lastChar.isWhitespace() || lastChar.isNewline()) {
- backspace()
- }
- appendRaw(s)
- }
-
- fun rmEmptyLine() {
- while (lastChar.isWhitespaceNonNewline()) backspace()
- if (lastChar.isNewline()) backspace()
- }
-
- /**
- * Syntactic sugar for:
- * ```
- * +"code()";
- * ```
- * to append the given string plus a newline
- */
- operator fun String.unaryPlus() = append("$this\n")
-
- /**
- * Syntactic sugar for:
- * ```
- * !"code()";
- * ```
- * to append the given string without a newline
- */
- operator fun String.not() = append(this)
-
- /**
- * Syntactic sugar for:
- * ```
- * ... {
- * ...
- * }+";"
- * ```
- * to append a ';' on same line after a block, and a newline afterwards
- */
- operator fun Unit.plus(s: String) {
- appendSameLine(s)
- +""
- }
-
- /**
- * A multi-purpose syntactic sugar for appending the given string plus anything generated in
- * the given [block], the latter with the appropriate deeper indent,
- * and resetting the indent back to original at the end
- *
- * Usage examples:
- *
- * ```
- * "if (...)" {
- * ...
- * }
- * ```
- * to append a corresponding if block appropriate indentation
- *
- * ```
- * "void foo(...)" {
- * ...
- * }
- * ```
- * similar to the previous one, plus an extra empty line after the function body
- *
- * ```
- * "void foo(" {
- * <args code>
- * }
- * ```
- * to use proper indentation for args code and close the bracket on same line at end
- *
- * ```
- * "..." {
- * ...
- * }
- * to use the correct indentation for inner code, resetting it at the end
- */
- inline operator fun String.invoke(block: ClassPrinter.() -> Unit) {
- if (this == " {") {
- appendSameLine(this)
- } else {
- append(this)
- }
- when {
- endsWith("(") -> {
- indentedBy(2, block)
- appendSameLine(")")
- }
- endsWith("{") || endsWith(")") -> {
- if (!endsWith("{")) appendSameLine(" {")
- indentedBy(1, block)
- +"}"
- if ((endsWith(") {") || endsWith(")") || this == " {")
- && !startsWith("synchronized")
- && !startsWith("switch")
- && !startsWith("if ")
- && !contains(" else ")
- && !contains("new ")
- && !contains("return ")) {
- +"" // extra line after function definitions
- }
- }
- else -> indentedBy(2, block)
- }
- }
-
- inline fun indentedBy(level: Int, block: ClassPrinter.() -> Unit) {
- append("\n")
- level times {
- append(INDENT_SINGLE)
- pushIndent()
- }
- block()
- level times { popIndent() }
- rmEmptyLine()
- +""
- }
- inline fun Iterable<FieldInfo>.forEachTrimmingTrailingComma(b: FieldInfo.() -> Unit) {
- forEachApply {
- b()
- if (isLast) {
- while (lastChar == ' ' || lastChar == '\n') backspace()
- if (lastChar == ',') backspace()
- }
- }
- }
inline operator fun <R> invoke(f: ClassPrinter.() -> R): R = run(f)
@@ -381,10 +213,10 @@ class ClassPrinter(
BuilderClass = (builderFactoryOverride.type as ClassOrInterfaceType).nameAsString
BuilderType = builderFactoryOverride.type.asString()
} else {
- val builderExtension = (fileAst.types
- + classAst.childNodes.filterIsInstance(TypeDeclaration::class.java)).find {
- it.nameAsString == CANONICAL_BUILDER_CLASS
- }
+ val builderExtension = classAst
+ .childNodes
+ .filterIsInstance(TypeDeclaration::class.java)
+ .find { it.nameAsString == CANONICAL_BUILDER_CLASS }
if (builderExtension != null) {
BuilderClass = BASE_BUILDER_CLASS
val tp = (builderExtension as ClassOrInterfaceDeclaration).typeParameters
diff --git a/tools/codegen/src/com/android/codegen/FieldInfo.kt b/tools/codegen/src/com/android/codegen/FieldInfo.kt
index 1a7fd6e241aa..ed35a1dfc599 100644
--- a/tools/codegen/src/com/android/codegen/FieldInfo.kt
+++ b/tools/codegen/src/com/android/codegen/FieldInfo.kt
@@ -1,5 +1,6 @@
package com.android.codegen
+import com.github.javaparser.JavaParser
import com.github.javaparser.ast.body.FieldDeclaration
import com.github.javaparser.ast.expr.ClassExpr
import com.github.javaparser.ast.expr.Name
@@ -111,11 +112,12 @@ data class FieldInfo(
val annotations by lazy {
if (FieldClass in BUILTIN_SPECIAL_PARCELLINGS) {
classPrinter {
- fieldAst.addAnnotation(SingleMemberAnnotationExpr(
- Name(ParcelWith),
- ClassExpr(JAVA_PARSER
- .parseClassOrInterfaceType("$Parcelling.BuiltIn.For$FieldClass")
- .throwIfFailed())))
+ fileInfo.apply {
+ fieldAst.addAnnotation(SingleMemberAnnotationExpr(
+ Name(ParcelWith),
+ ClassExpr(parseJava(JavaParser::parseClassOrInterfaceType,
+ "$Parcelling.BuiltIn.For$FieldClass"))))
+ }
}
}
fieldAst.annotations.map { it.removeComment().toString() }
diff --git a/tools/codegen/src/com/android/codegen/FileInfo.kt b/tools/codegen/src/com/android/codegen/FileInfo.kt
new file mode 100644
index 000000000000..909472640f29
--- /dev/null
+++ b/tools/codegen/src/com/android/codegen/FileInfo.kt
@@ -0,0 +1,289 @@
+/*
+ * 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.codegen
+
+import com.github.javaparser.JavaParser
+import com.github.javaparser.ast.CompilationUnit
+import com.github.javaparser.ast.body.ClassOrInterfaceDeclaration
+import com.github.javaparser.ast.body.TypeDeclaration
+import java.io.File
+
+/**
+ * File-level parsing & printing logic
+ *
+ * @see [main] entrypoint
+ */
+class FileInfo(
+ val sourceLines: List<String>,
+ val cliArgs: Array<String>,
+ val file: File)
+ : Printer<FileInfo>, ImportsProvider {
+
+ override val fileAst: CompilationUnit
+ = parseJava(JavaParser::parse, sourceLines.joinToString("\n"))
+
+ override val stringBuilder = StringBuilder()
+ override var currentIndent = INDENT_SINGLE
+
+
+ val generatedWarning = run {
+ val fileEscaped = file.absolutePath.replace(
+ System.getenv("ANDROID_BUILD_TOP"), "\$ANDROID_BUILD_TOP")
+
+ """
+
+
+ // $GENERATED_WARNING_PREFIX v$CODEGEN_VERSION.
+ //
+ // DO NOT MODIFY!
+ // CHECKSTYLE:OFF Generated code
+ //
+ // To regenerate run:
+ // $ $THIS_SCRIPT_LOCATION$CODEGEN_NAME ${cliArgs.dropLast(1).joinToString("") { "$it " }}$fileEscaped
+ //
+ // To exclude the generated code from IntelliJ auto-formatting enable (one-time):
+ // Settings > Editor > Code Style > Formatter Control
+ //@formatter:off
+
+ """
+ }
+ private val generatedWarningNumPrecedingEmptyLines
+ = generatedWarning.lines().takeWhile { it.isBlank() }.size
+
+ val classes = fileAst.types
+ .filterIsInstance<ClassOrInterfaceDeclaration>()
+ .flatMap { it.plusNested() }
+ .filterNot { it.isInterface }
+
+ val mainClass = classes.find { it.nameAsString == file.nameWithoutExtension }!!
+
+ // Parse stage 1
+ val classBounds: List<ClassBounds> = classes.map { ast ->
+ ClassBounds(ast, fileInfo = this)
+ }.apply {
+ forEachApply {
+ if (ast.isNestedType) {
+ val parent = find {
+ it.name == (ast.parentNode.get()!! as TypeDeclaration<*>).nameAsString
+ }!!
+ parent.nested.add(this)
+ nestedIn = parent
+ }
+ }
+ }
+
+ // Parse Stage 2
+ var codeChunks = buildList<CodeChunk> {
+ val mainClassBounds = classBounds.find { it.nestedIn == null }!!
+ add(CodeChunk.FileHeader(
+ mainClassBounds.fileInfo.sourceLines.subList(0, mainClassBounds.range.start)))
+ add(CodeChunk.DataClass.parse(mainClassBounds))
+ }
+
+ // Output stage
+ fun main() {
+ codeChunks.forEach { print(it) }
+ }
+
+ fun print(chunk: CodeChunk) {
+ when(chunk) {
+ is CodeChunk.GeneratedCode -> {
+ // Re-parse class code, discarding generated code and nested dataclasses
+ val ast = chunk.owner.chunks
+ .filter {
+ it.javaClass == CodeChunk.Code::class.java
+ || it.javaClass == CodeChunk.ClosingBrace::class.java
+ }
+ .flatMap { (it as CodeChunk.Code).lines }
+ .joinToString("\n")
+ .let {
+ parseJava(JavaParser::parseTypeDeclaration, it)
+ as ClassOrInterfaceDeclaration
+ }
+
+ // Write new generated code
+ ClassPrinter(ast, fileInfo = this).print()
+ }
+ is CodeChunk.ClosingBrace -> {
+ // Special case - print closing brace with -1 indent
+ rmEmptyLine()
+ popIndent()
+ +"\n}"
+ }
+ // Print general code as-is
+ is CodeChunk.Code -> chunk.lines.forEach { stringBuilder.appendln(it) }
+ // Recursively render data classes
+ is CodeChunk.DataClass -> chunk.chunks.forEach { print(it) }
+ }
+ }
+
+ /**
+ * Output of stage 1 of parsing a file:
+ * Recursively nested ranges of code line numbers containing nested classes
+ */
+ data class ClassBounds(
+ val ast: ClassOrInterfaceDeclaration,
+ val fileInfo: FileInfo,
+ val name: String = ast.nameAsString,
+ val range: ClosedRange<Int> = ast.range.get()!!.let { rng -> rng.begin.line-1..rng.end.line-1 },
+ val nested: MutableList<ClassBounds> = mutableListOf(),
+ var nestedIn: ClassBounds? = null) {
+
+ val nestedDataClasses: List<ClassBounds> by lazy {
+ nested.filter { it.isDataclass }.sortedBy { it.range.start }
+ }
+ val isDataclass = ast.annotations.any { it.nameAsString.endsWith("DataClass") }
+
+ val baseIndentLength = fileInfo.sourceLines.find { "class $name" in it }!!.takeWhile { it == ' ' }.length
+ val baseIndent = buildString { repeat(baseIndentLength) { append(' ') } }
+
+ val sourceNoPrefix = fileInfo.sourceLines.drop(range.start)
+ val generatedCodeRange = sourceNoPrefix
+ .indexOfFirst { it.startsWith("$baseIndent$INDENT_SINGLE// $GENERATED_WARNING_PREFIX") }
+ .let { start ->
+ if (start < 0) {
+ null
+ } else {
+ var endInclusive = sourceNoPrefix.indexOfFirst {
+ it.startsWith("$baseIndent$INDENT_SINGLE$GENERATED_END")
+ }
+ if (endInclusive == -1) {
+ // Legacy generated code doesn't have end markers
+ endInclusive = sourceNoPrefix.size - 2
+ }
+ IntRange(
+ range.start + start - fileInfo.generatedWarningNumPrecedingEmptyLines,
+ range.start + endInclusive)
+ }
+ }
+
+ /** Debug info */
+ override fun toString(): String {
+ return buildString {
+ appendln("class $name $range")
+ nested.forEach {
+ appendln(it)
+ }
+ appendln("end $name")
+ }
+ }
+ }
+
+ /**
+ * Output of stage 2 of parsing a file
+ */
+ sealed class CodeChunk {
+ /** General code */
+ open class Code(val lines: List<String>): CodeChunk() {}
+
+ /** Copyright + package + imports + main javadoc */
+ class FileHeader(lines: List<String>): Code(lines)
+
+ /** Code to be discarded and refreshed */
+ open class GeneratedCode(lines: List<String>): Code(lines) {
+ lateinit var owner: DataClass
+
+ class Placeholder: GeneratedCode(emptyList())
+ }
+
+ object ClosingBrace: Code(listOf("}"))
+
+ data class DataClass(
+ val ast: ClassOrInterfaceDeclaration,
+ val chunks: List<CodeChunk>,
+ val generatedCode: GeneratedCode?): CodeChunk() {
+
+ companion object {
+ fun parse(classBounds: ClassBounds): DataClass {
+ val initial = Code(lines = classBounds.fileInfo.sourceLines.subList(
+ fromIndex = classBounds.range.start,
+ toIndex = findLowerBound(
+ thisClass = classBounds,
+ nextNestedClass = classBounds.nestedDataClasses.getOrNull(0))))
+
+ val chunks = mutableListOf<CodeChunk>(initial)
+
+ classBounds.nestedDataClasses.forEachSequentialPair {
+ nestedDataClass, nextNestedDataClass ->
+ chunks += DataClass.parse(nestedDataClass)
+ chunks += Code(lines = classBounds.fileInfo.sourceLines.subList(
+ fromIndex = nestedDataClass.range.endInclusive + 1,
+ toIndex = findLowerBound(
+ thisClass = classBounds,
+ nextNestedClass = nextNestedDataClass)))
+ }
+
+ var generatedCode = classBounds.generatedCodeRange?.let { rng ->
+ GeneratedCode(classBounds.fileInfo.sourceLines.subList(
+ rng.start, rng.endInclusive+1))
+ }
+ if (generatedCode != null) {
+ chunks += generatedCode
+ chunks += ClosingBrace
+ } else if (classBounds.isDataclass) {
+
+ // Insert placeholder for generated code to be inserted for the 1st time
+ chunks.last = (chunks.last as Code)
+ .lines
+ .dropLastWhile { it.isBlank() }
+ .run {
+ if (last().dropWhile { it.isWhitespace() }.startsWith("}")) {
+ dropLast(1)
+ } else {
+ this
+ }
+ }.let { Code(it) }
+ generatedCode = GeneratedCode.Placeholder()
+ chunks += generatedCode
+ chunks += ClosingBrace
+ } else {
+ // Outer class may be not a @DataClass but contain ones
+ // so just skip generated code for them
+ }
+
+ return DataClass(classBounds.ast, chunks, generatedCode).also {
+ generatedCode?.owner = it
+ }
+ }
+
+ private fun findLowerBound(thisClass: ClassBounds, nextNestedClass: ClassBounds?): Int {
+ return nextNestedClass?.range?.start
+ ?: thisClass.generatedCodeRange?.start
+ ?: thisClass.range.endInclusive + 1
+ }
+ }
+ }
+
+ /** Debug info */
+ fun summary(): String = when(this) {
+ is Code -> "${javaClass.simpleName}(${lines.size} lines): ${lines.getOrNull(0)?.take(70) ?: ""}..."
+ is DataClass -> "DataClass ${ast.nameAsString}:\n" +
+ chunks.joinToString("\n") { it.summary() } +
+ "\n//end ${ast.nameAsString}"
+ }
+ }
+
+ private fun ClassOrInterfaceDeclaration.plusNested(): List<ClassOrInterfaceDeclaration> {
+ return mutableListOf<ClassOrInterfaceDeclaration>().apply {
+ add(this@plusNested)
+ childNodes.filterIsInstance<ClassOrInterfaceDeclaration>()
+ .flatMap { it.plusNested() }
+ .let { addAll(it) }
+ }
+ }
+} \ No newline at end of file
diff --git a/tools/codegen/src/com/android/codegen/Generators.kt b/tools/codegen/src/com/android/codegen/Generators.kt
index bd32f9c6d9cd..c25d0c74f251 100644
--- a/tools/codegen/src/com/android/codegen/Generators.kt
+++ b/tools/codegen/src/com/android/codegen/Generators.kt
@@ -119,14 +119,14 @@ fun ClassPrinter.generateConstDef(consts: List<Pair<VariableDeclarator, FieldDec
}
}
-fun ClassPrinter.generateAidl(javaFile: File) {
- val aidl = File(javaFile.path.substringBeforeLast(".java") + ".aidl")
+fun FileInfo.generateAidl() {
+ val aidl = File(file.path.substringBeforeLast(".java") + ".aidl")
if (aidl.exists()) return
aidl.writeText(buildString {
sourceLines.dropLastWhile { !it.startsWith("package ") }.forEach {
appendln(it)
}
- append("\nparcelable $ClassName;\n")
+ append("\nparcelable ${mainClass.nameAsString};\n")
})
}
diff --git a/tools/codegen/src/com/android/codegen/ImportsProvider.kt b/tools/codegen/src/com/android/codegen/ImportsProvider.kt
new file mode 100644
index 000000000000..ba0a0318c843
--- /dev/null
+++ b/tools/codegen/src/com/android/codegen/ImportsProvider.kt
@@ -0,0 +1,91 @@
+/*
+ * 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.codegen
+
+import com.github.javaparser.ast.CompilationUnit
+
+/**
+ * Mixin for optionally shortening references based on existing imports
+ */
+interface ImportsProvider {
+
+ abstract val fileAst: CompilationUnit
+
+ val NonNull: String get() { return classRef("android.annotation.NonNull") }
+ val NonEmpty: String get() { return classRef("android.annotation.NonEmpty") }
+ val Nullable: String get() { return classRef("android.annotation.Nullable") }
+ val TextUtils: String get() { return classRef("android.text.TextUtils") }
+ val LinkedHashMap: String get() { return classRef("java.util.LinkedHashMap") }
+ val Collections: String get() { return classRef("java.util.Collections") }
+ val Preconditions: String get() { return classRef("com.android.internal.util.Preconditions") }
+ val ArrayList: String get() { return classRef("java.util.ArrayList") }
+ val DataClass: String get() { return classRef("com.android.internal.util.DataClass") }
+ val DataClassEnum: String get() { return classRef("com.android.internal.util.DataClass.Enum") }
+ val ParcelWith: String get() { return classRef("com.android.internal.util.DataClass.ParcelWith") }
+ val PluralOf: String get() { return classRef("com.android.internal.util.DataClass.PluralOf") }
+ val Each: String get() { return classRef("com.android.internal.util.DataClass.Each") }
+ val DataClassGenerated: String get() { return classRef("com.android.internal.util.DataClass.Generated") }
+ val DataClassSuppressConstDefs: String get() { return classRef("com.android.internal.util.DataClass.SuppressConstDefsGeneration") }
+ val DataClassSuppress: String get() { return classRef("com.android.internal.util.DataClass.Suppress") }
+ val GeneratedMember: String get() { return classRef("com.android.internal.util.DataClass.Generated.Member") }
+ val Parcelling: String get() { return classRef("com.android.internal.util.Parcelling") }
+ val Parcelable: String get() { return classRef("android.os.Parcelable") }
+ val Parcel: String get() { return classRef("android.os.Parcel") }
+ val UnsupportedAppUsage: String get() { return classRef("android.annotation.UnsupportedAppUsage") }
+
+ /**
+ * Optionally shortens a class reference if there's a corresponding import present
+ */
+ fun classRef(fullName: String): String {
+
+ val pkg = fullName.substringBeforeLast(".")
+ val simpleName = fullName.substringAfterLast(".")
+ if (fileAst.imports.any { imprt ->
+ imprt.nameAsString == fullName
+ || (imprt.isAsterisk && imprt.nameAsString == pkg)
+ }) {
+ return simpleName
+ } else {
+ val outerClass = pkg.substringAfterLast(".", "")
+ if (outerClass.firstOrNull()?.isUpperCase() == true) {
+ return classRef(pkg) + "." + simpleName
+ }
+ }
+ return fullName
+ }
+
+ /** @see classRef */
+ fun memberRef(fullName: String): String {
+ val className = fullName.substringBeforeLast(".")
+ val methodName = fullName.substringAfterLast(".")
+ return if (fileAst.imports.any {
+ it.isStatic
+ && (it.nameAsString == fullName
+ || (it.isAsterisk && it.nameAsString == className))
+ }) {
+ className.substringAfterLast(".") + "." + methodName
+ } else {
+ classRef(className) + "." + methodName
+ }
+ }
+}
+
+/** @see classRef */
+inline fun <reified T : Any> ImportsProvider.classRef(): String {
+ return classRef(T::class.java.name)
+} \ No newline at end of file
diff --git a/tools/codegen/src/com/android/codegen/Main.kt b/tools/codegen/src/com/android/codegen/Main.kt
index ce83d3dc8e51..4b508d022991 100755
--- a/tools/codegen/src/com/android/codegen/Main.kt
+++ b/tools/codegen/src/com/android/codegen/Main.kt
@@ -6,6 +6,7 @@ import java.io.File
const val THIS_SCRIPT_LOCATION = ""
const val GENERATED_WARNING_PREFIX = "Code below generated by $CODEGEN_NAME"
+const val GENERATED_END = "// End of generated code"
const val INDENT_SINGLE = " "
val PRIMITIVE_TYPES = listOf("byte", "short", "int", "long", "char", "float", "double", "boolean")
@@ -115,81 +116,15 @@ fun main(args: Array<String>) {
System.exit(0)
}
val file = File(args.last()).absoluteFile
- val sourceLinesNoClosingBrace = file.readLines().dropLastWhile {
+ val sourceLisnesOriginal = file.readLines()
+ val sourceLinesNoClosingBrace = sourceLisnesOriginal.dropLastWhile {
it.startsWith("}") || it.all(Char::isWhitespace)
}
val cliArgs = handleUpdateFlag(args, sourceLinesNoClosingBrace)
- val sourceLinesAsIs = discardGeneratedCode(sourceLinesNoClosingBrace)
- val sourceLines = sourceLinesAsIs
- .filterNot { it.trim().startsWith("//") }
- .map { it.trimEnd().dropWhile { it == '\n' } }
- val stringBuilder = StringBuilder(sourceLinesAsIs.joinToString("\n"))
- ClassPrinter(sourceLines, stringBuilder, cliArgs).run {
-
- val cliExecutable = "$THIS_SCRIPT_LOCATION$CODEGEN_NAME"
- val fileEscaped = file.absolutePath.replace(
- System.getenv("ANDROID_BUILD_TOP"), "\$ANDROID_BUILD_TOP")
-
-
- +"""
-
-
-
- // $GENERATED_WARNING_PREFIX v$CODEGEN_VERSION.
- //
- // DO NOT MODIFY!
- // CHECKSTYLE:OFF Generated code
- //
- // To regenerate run:
- // $ $cliExecutable ${cliArgs.dropLast(1).joinToString("") { "$it " }}$fileEscaped
- //
- // To exclude the generated code from IntelliJ auto-formatting enable (one-time):
- // Settings > Editor > Code Style > Formatter Control
- //@formatter:off
-
- """
-
- if (FeatureFlag.CONST_DEFS()) generateConstDefs()
-
-
- if (FeatureFlag.CONSTRUCTOR()) {
- generateConstructor("public")
- } else if (FeatureFlag.BUILDER()
- || FeatureFlag.COPY_CONSTRUCTOR()
- || FeatureFlag.WITHERS()) {
- generateConstructor("/* package-private */")
- }
- if (FeatureFlag.COPY_CONSTRUCTOR()) generateCopyConstructor()
-
- if (FeatureFlag.GETTERS()) generateGetters()
- if (FeatureFlag.SETTERS()) generateSetters()
- if (FeatureFlag.TO_STRING()) generateToString()
- if (FeatureFlag.EQUALS_HASH_CODE()) generateEqualsHashcode()
-
- if (FeatureFlag.FOR_EACH_FIELD()) generateForEachField()
-
- if (FeatureFlag.WITHERS()) generateWithers()
-
- if (FeatureFlag.PARCELABLE()) generateParcelable()
-
- if (FeatureFlag.BUILDER() && FeatureFlag.BUILD_UPON()) generateBuildUpon()
- if (FeatureFlag.BUILDER()) generateBuilder()
-
- if (FeatureFlag.AIDL()) generateAidl(file)
-
- generateMetadata(file)
-
- rmEmptyLine()
- }
- stringBuilder.append("\n}\n")
- file.writeText(stringBuilder.toString().mapLines { trimEnd() })
-}
-
-internal fun discardGeneratedCode(sourceLinesNoClosingBrace: List<String>): List<String> {
- return sourceLinesNoClosingBrace
- .takeWhile { GENERATED_WARNING_PREFIX !in it }
- .dropLastWhile(String::isBlank)
+ val fileInfo = FileInfo(sourceLisnesOriginal, cliArgs, file)
+ fileInfo.main()
+ file.writeText(fileInfo.stringBuilder.toString().mapLines { trimEnd() })
}
private fun handleUpdateFlag(cliArgs: Array<String>, sourceLines: List<String>): Array<String> {
diff --git a/tools/codegen/src/com/android/codegen/Printer.kt b/tools/codegen/src/com/android/codegen/Printer.kt
new file mode 100644
index 000000000000..b30e3f68b307
--- /dev/null
+++ b/tools/codegen/src/com/android/codegen/Printer.kt
@@ -0,0 +1,186 @@
+/*
+ * 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.codegen
+
+/**
+ * Mixin for syntactic sugar around indent-aware printing into [stringBuilder]
+ */
+interface Printer<SELF: Printer<SELF>> {
+
+ val stringBuilder: StringBuilder
+
+ var currentIndent: String
+
+ fun pushIndent() {
+ currentIndent += INDENT_SINGLE
+ }
+
+ fun popIndent() {
+ currentIndent = if (currentIndent.length >= INDENT_SINGLE.length) {
+ currentIndent.substring(0, currentIndent.length - INDENT_SINGLE.length)
+ } else {
+ ""
+ }
+ }
+
+ fun backspace() = stringBuilder.setLength(stringBuilder.length - 1)
+ val lastChar get() = stringBuilder[stringBuilder.length - 1]
+
+ private fun appendRaw(s: String) {
+ stringBuilder.append(s)
+ }
+
+ fun append(s: String) {
+ if (s.isBlank() && s != "\n") {
+ appendRaw(s)
+ } else {
+ appendRaw(s.lines().map { line ->
+ if (line.startsWith(" *")) line else line.trimStart()
+ }.joinToString("\n$currentIndent"))
+ }
+ }
+
+ fun appendSameLine(s: String) {
+ while (lastChar.isWhitespace() || lastChar.isNewline()) {
+ backspace()
+ }
+ appendRaw(s)
+ }
+
+ fun rmEmptyLine() {
+ while (lastChar.isWhitespaceNonNewline()) backspace()
+ if (lastChar.isNewline()) backspace()
+ }
+
+ /**
+ * Syntactic sugar for:
+ * ```
+ * +"code()";
+ * ```
+ * to append the given string plus a newline
+ */
+ operator fun String.unaryPlus() = append("$this\n")
+
+ /**
+ * Syntactic sugar for:
+ * ```
+ * !"code()";
+ * ```
+ * to append the given string without a newline
+ */
+ operator fun String.not() = append(this)
+
+ /**
+ * Syntactic sugar for:
+ * ```
+ * ... {
+ * ...
+ * }+";"
+ * ```
+ * to append a ';' on same line after a block, and a newline afterwards
+ */
+ operator fun Unit.plus(s: String) {
+ appendSameLine(s)
+ +""
+ }
+
+ /**
+ * A multi-purpose syntactic sugar for appending the given string plus anything generated in
+ * the given [block], the latter with the appropriate deeper indent,
+ * and resetting the indent back to original at the end
+ *
+ * Usage examples:
+ *
+ * ```
+ * "if (...)" {
+ * ...
+ * }
+ * ```
+ * to append a corresponding if block appropriate indentation
+ *
+ * ```
+ * "void foo(...)" {
+ * ...
+ * }
+ * ```
+ * similar to the previous one, plus an extra empty line after the function body
+ *
+ * ```
+ * "void foo(" {
+ * <args code>
+ * }
+ * ```
+ * to use proper indentation for args code and close the bracket on same line at end
+ *
+ * ```
+ * "..." {
+ * ...
+ * }
+ * to use the correct indentation for inner code, resetting it at the end
+ */
+ operator fun String.invoke(block: SELF.() -> Unit) {
+ if (this == " {") {
+ appendSameLine(this)
+ } else {
+ append(this)
+ }
+ when {
+ endsWith("(") -> {
+ indentedBy(2, block)
+ appendSameLine(")")
+ }
+ endsWith("{") || endsWith(")") -> {
+ if (!endsWith("{")) appendSameLine(" {")
+ indentedBy(1, block)
+ +"}"
+ if ((endsWith(") {") || endsWith(")") || this == " {")
+ && !startsWith("synchronized")
+ && !startsWith("switch")
+ && !startsWith("if ")
+ && !contains(" else ")
+ && !contains("new ")
+ && !contains("return ")) {
+ +"" // extra line after function definitions
+ }
+ }
+ else -> indentedBy(2, block)
+ }
+ }
+
+ fun indentedBy(level: Int, block: SELF.() -> Unit) {
+ append("\n")
+ level times {
+ append(INDENT_SINGLE)
+ pushIndent()
+ }
+ (this as SELF).block()
+ level times { popIndent() }
+ rmEmptyLine()
+ +""
+ }
+
+ fun Iterable<FieldInfo>.forEachTrimmingTrailingComma(b: FieldInfo.() -> Unit) {
+ forEachApply {
+ b()
+ if (isLast) {
+ while (lastChar == ' ' || lastChar == '\n') backspace()
+ if (lastChar == ',') backspace()
+ }
+ }
+ }
+} \ No newline at end of file
diff --git a/tools/codegen/src/com/android/codegen/SharedConstants.kt b/tools/codegen/src/com/android/codegen/SharedConstants.kt
index 270d34a01a64..339057f24833 100644
--- a/tools/codegen/src/com/android/codegen/SharedConstants.kt
+++ b/tools/codegen/src/com/android/codegen/SharedConstants.kt
@@ -1,7 +1,7 @@
package com.android.codegen
const val CODEGEN_NAME = "codegen"
-const val CODEGEN_VERSION = "1.0.11"
+const val CODEGEN_VERSION = "1.0.12"
const val CANONICAL_BUILDER_CLASS = "Builder"
const val BASE_BUILDER_CLASS = "BaseBuilder"
diff --git a/tools/codegen/src/com/android/codegen/Utils.kt b/tools/codegen/src/com/android/codegen/Utils.kt
index e703397214eb..c19ae3b0b11f 100644
--- a/tools/codegen/src/com/android/codegen/Utils.kt
+++ b/tools/codegen/src/com/android/codegen/Utils.kt
@@ -1,5 +1,11 @@
package com.android.codegen
+import com.github.javaparser.JavaParser
+import com.github.javaparser.ParseProblemException
+import com.github.javaparser.ParseResult
+import com.github.javaparser.ast.Node
+import com.github.javaparser.ast.body.ClassOrInterfaceDeclaration
+import com.github.javaparser.ast.body.TypeDeclaration
import com.github.javaparser.ast.expr.*
import com.github.javaparser.ast.nodeTypes.NodeWithModifiers
import java.time.Instant
@@ -92,3 +98,49 @@ val AnnotationExpr.args: Map<String, Expression> get() = when (this) {
is NormalAnnotationExpr -> pairs.map { it.name.asString() to it.value }.toMap()
else -> throw IllegalArgumentException("Unknown annotation expression: $this")
}
+
+val TypeDeclaration<*>.nestedTypes get() = childNodes.filterIsInstance<TypeDeclaration<*>>()
+val TypeDeclaration<*>.nestedDataClasses get()
+ = nestedTypes.filterIsInstance<ClassOrInterfaceDeclaration>()
+ .filter { it.annotations.any { it.nameAsString.endsWith("DataClass") } }
+val TypeDeclaration<*>.startLine get() = range.get()!!.begin.line
+
+inline fun <T> List<T>.forEachSequentialPair(action: (T, T?) -> Unit) {
+ forEachIndexed { index, t ->
+ action(t, getOrNull(index + 1))
+ }
+}
+
+fun <T: Node> parseJava(fn: JavaParser.(String) -> ParseResult<T>, source: String): T = try {
+ val parse = JAVA_PARSER.fn(source)
+ if (parse.problems.isNotEmpty()) {
+ throw parseFailed(
+ source,
+ desc = parse.problems.joinToString("\n"),
+ cause = parse.problems.mapNotNull { it.cause.orElse(null) }.firstOrNull())
+ }
+ parse.result.get()
+} catch (e: ParseProblemException) {
+ throw parseFailed(source, cause = e)
+}
+
+private fun parseFailed(source: String, cause: Throwable? = null, desc: String = ""): RuntimeException {
+ return RuntimeException("Failed to parse code:\n" +
+ source
+ .lines()
+ .mapIndexed { lnNum, ln -> "/*$lnNum*/$ln" }
+ .joinToString("\n") + "\n$desc",
+ cause)
+}
+
+var <T> MutableList<T>.last
+ get() = last()
+ set(value) {
+ if (isEmpty()) {
+ add(value)
+ } else {
+ this[size - 1] = value
+ }
+ }
+
+inline fun <T> buildList(init: MutableList<T>.() -> Unit) = mutableListOf<T>().apply(init) \ No newline at end of file
diff --git a/tools/incident_section_gen/main.cpp b/tools/incident_section_gen/main.cpp
index 91f875ed9918..ded4b916c452 100644
--- a/tools/incident_section_gen/main.cpp
+++ b/tools/incident_section_gen/main.cpp
@@ -436,7 +436,9 @@ static bool generateSectionListCpp(Descriptor const* descriptor) {
printf(" NULL),\n");
break;
case SECTION_LOG:
- printf(" new LogSection(%d, %s),\n", field->number(), s.args().c_str());
+ printf(" new LogSection(%d, ", field->number());
+ splitAndPrint(s.args());
+ printf(" NULL),\n");
break;
case SECTION_GZIP:
printf(" new GZipSection(%d,", field->number());
diff --git a/tools/processors/staledataclass/src/android/processor/staledataclass/StaleDataclassProcessor.kt b/tools/processors/staledataclass/src/android/processor/staledataclass/StaleDataclassProcessor.kt
index 7fe21c7aab3e..51faa49a86cc 100644
--- a/tools/processors/staledataclass/src/android/processor/staledataclass/StaleDataclassProcessor.kt
+++ b/tools/processors/staledataclass/src/android/processor/staledataclass/StaleDataclassProcessor.kt
@@ -208,7 +208,16 @@ class StaleDataclassProcessor: AbstractProcessor() {
val refreshCmd = if (file != null) {
"$CODEGEN_NAME $file"
} else {
- "find \$ANDROID_BUILD_TOP -path */${clazz.replace('.', '/')}.java -exec $CODEGEN_NAME {} \\;"
+ var gotTopLevelCalssName = false
+ val filePath = clazz.split(".")
+ .takeWhile { word ->
+ if (!gotTopLevelCalssName && word[0].isUpperCase()) {
+ gotTopLevelCalssName = true
+ return@takeWhile true
+ }
+ !gotTopLevelCalssName
+ }.joinToString("/")
+ "find \$ANDROID_BUILD_TOP -path */$filePath.java -exec $CODEGEN_NAME {} \\;"
}
}
diff --git a/tools/protologtool/src/com/android/protolog/tool/ProtoLogTool.kt b/tools/protologtool/src/com/android/protolog/tool/ProtoLogTool.kt
index 629f720314b2..99a26dc80288 100644
--- a/tools/protologtool/src/com/android/protolog/tool/ProtoLogTool.kt
+++ b/tools/protologtool/src/com/android/protolog/tool/ProtoLogTool.kt
@@ -24,6 +24,7 @@ import com.github.javaparser.ast.CompilationUnit
import java.io.File
import java.io.FileInputStream
import java.io.FileOutputStream
+import java.io.OutputStream
import java.util.concurrent.ExecutorService
import java.util.concurrent.Executors
import java.util.jar.JarOutputStream
@@ -42,9 +43,10 @@ object ProtoLogTool {
}
private fun processClasses(command: CommandOptions) {
- val groups = ProtoLogGroupReader()
- .loadFromJar(command.protoLogGroupsJarArg, command.protoLogGroupsClassNameArg)
- val out = FileOutputStream(command.outputSourceJarArg)
+ val groups = injector.readLogGroups(
+ command.protoLogGroupsJarArg,
+ command.protoLogGroupsClassNameArg)
+ val out = injector.fileOutputStream(command.outputSourceJarArg)
val outJar = JarOutputStream(out)
val processor = ProtoLogCallProcessor(command.protoLogClassNameArg,
command.protoLogGroupsClassNameArg, groups)
@@ -56,18 +58,18 @@ object ProtoLogTool {
val transformer = SourceTransformer(command.protoLogImplClassNameArg,
command.protoLogCacheClassNameArg, processor)
val file = File(path)
- val text = file.readText()
+ val text = injector.readText(file)
val outSrc = try {
val code = tryParse(text, path)
if (containsProtoLogText(text, command.protoLogClassNameArg)) {
- transformer.processClass(text, path, code)
+ transformer.processClass(text, path, packagePath(file, code), code)
} else {
text
}
} catch (ex: ParsingException) {
// If we cannot parse this file, skip it (and log why). Compilation will fail
// in a subsequent build step.
- println("\n${ex.message}\n")
+ injector.reportParseError(ex)
text
}
path to outSrc
@@ -142,8 +144,9 @@ ${updates.replaceIndent(" ")}
}
private fun viewerConf(command: CommandOptions) {
- val groups = ProtoLogGroupReader()
- .loadFromJar(command.protoLogGroupsJarArg, command.protoLogGroupsClassNameArg)
+ val groups = injector.readLogGroups(
+ command.protoLogGroupsJarArg,
+ command.protoLogGroupsClassNameArg)
val processor = ProtoLogCallProcessor(command.protoLogClassNameArg,
command.protoLogGroupsClassNameArg, groups)
val builder = ViewerConfigBuilder(processor)
@@ -153,18 +156,15 @@ ${updates.replaceIndent(" ")}
command.javaSourceArgs.map { path ->
executor.submitCallable {
val file = File(path)
- val text = file.readText()
+ val text = injector.readText(file)
if (containsProtoLogText(text, command.protoLogClassNameArg)) {
try {
val code = tryParse(text, path)
- val pack = if (code.packageDeclaration.isPresent) code.packageDeclaration
- .get().nameAsString else ""
- val newPath = pack.replace('.', '/') + '/' + file.name
- builder.findLogCalls(code, newPath)
+ builder.findLogCalls(code, path, packagePath(file, code))
} catch (ex: ParsingException) {
// If we cannot parse this file, skip it (and log why). Compilation will fail
// in a subsequent build step.
- println("\n${ex.message}\n")
+ injector.reportParseError(ex)
null
}
} else {
@@ -177,11 +177,18 @@ ${updates.replaceIndent(" ")}
executor.shutdown()
- val out = FileOutputStream(command.viewerConfigJsonArg)
+ val out = injector.fileOutputStream(command.viewerConfigJsonArg)
out.write(builder.build().toByteArray())
out.close()
}
+ private fun packagePath(file: File, code: CompilationUnit): String {
+ val pack = if (code.packageDeclaration.isPresent) code.packageDeclaration
+ .get().nameAsString else ""
+ val packagePath = pack.replace('.', '/') + '/' + file.name
+ return packagePath
+ }
+
private fun read(command: CommandOptions) {
LogParser(ViewerConfigParser())
.parse(FileInputStream(command.logProtofileArg),
@@ -190,18 +197,9 @@ ${updates.replaceIndent(" ")}
@JvmStatic
fun main(args: Array<String>) {
- StaticJavaParser.setConfiguration(ParserConfiguration().apply {
- setLanguageLevel(ParserConfiguration.LanguageLevel.RAW)
- setAttributeComments(false)
- })
-
try {
val command = CommandOptions(args)
- when (command.command) {
- CommandOptions.TRANSFORM_CALLS_CMD -> processClasses(command)
- CommandOptions.GENERATE_CONFIG_CMD -> viewerConf(command)
- CommandOptions.READ_LOG_CMD -> read(command)
- }
+ invoke(command)
} catch (ex: InvalidCommandException) {
println("\n${ex.message}\n")
showHelpAndExit()
@@ -210,6 +208,36 @@ ${updates.replaceIndent(" ")}
exitProcess(1)
}
}
+
+ fun invoke(command: CommandOptions) {
+ StaticJavaParser.setConfiguration(ParserConfiguration().apply {
+ setLanguageLevel(ParserConfiguration.LanguageLevel.RAW)
+ setAttributeComments(false)
+ })
+
+ when (command.command) {
+ CommandOptions.TRANSFORM_CALLS_CMD -> processClasses(command)
+ CommandOptions.GENERATE_CONFIG_CMD -> viewerConf(command)
+ CommandOptions.READ_LOG_CMD -> read(command)
+ }
+ }
+
+ var injector = object : Injector {
+ override fun fileOutputStream(file: String) = FileOutputStream(file)
+ override fun readText(file: File) = file.readText()
+ override fun readLogGroups(jarPath: String, className: String) =
+ ProtoLogGroupReader().loadFromJar(jarPath, className)
+ override fun reportParseError(ex: ParsingException) {
+ println("\n${ex.message}\n")
+ }
+ }
+
+ interface Injector {
+ fun fileOutputStream(file: String): OutputStream
+ fun readText(file: File): String
+ fun readLogGroups(jarPath: String, className: String): Map<String, LogGroup>
+ fun reportParseError(ex: ParsingException)
+ }
}
private fun <T> ExecutorService.submitCallable(f: () -> T) = submit(f)
diff --git a/tools/protologtool/src/com/android/protolog/tool/SourceTransformer.kt b/tools/protologtool/src/com/android/protolog/tool/SourceTransformer.kt
index 0ad8091f97a2..36ea41129450 100644
--- a/tools/protologtool/src/com/android/protolog/tool/SourceTransformer.kt
+++ b/tools/protologtool/src/com/android/protolog/tool/SourceTransformer.kt
@@ -72,7 +72,7 @@ class SourceTransformer(
}
val ifStmt: IfStmt
if (group.enabled) {
- val hash = CodeUtils.hash(fileName, messageString, level, group)
+ val hash = CodeUtils.hash(packagePath, messageString, level, group)
val newCall = call.clone()
if (!group.textEnabled) {
// Remove message string if text logging is not enabled by default.
@@ -97,7 +97,7 @@ class SourceTransformer(
if (argTypes.size != call.arguments.size - 2) {
throw InvalidProtoLogCallException(
"Number of arguments (${argTypes.size} does not mach format" +
- " string in: $call", ParsingContext(fileName, call))
+ " string in: $call", ParsingContext(path, call))
}
val blockStmt = BlockStmt()
if (argTypes.isNotEmpty()) {
@@ -214,18 +214,23 @@ class SourceTransformer(
StaticJavaParser.parseExpression<FieldAccessExpr>(protoLogCacheClassName)
private var processedCode: MutableList<String> = mutableListOf()
private var offsets: IntArray = IntArray(0)
- private var fileName: String = ""
+ /** The path of the file being processed, relative to $ANDROID_BUILD_TOP */
+ private var path: String = ""
+ /** The path of the file being processed, relative to the root package */
+ private var packagePath: String = ""
fun processClass(
code: String,
path: String,
+ packagePath: String,
compilationUnit: CompilationUnit =
StaticJavaParser.parse(code)
): String {
- fileName = path
+ this.path = path
+ this.packagePath = packagePath
processedCode = code.split('\n').toMutableList()
offsets = IntArray(processedCode.size)
- protoLogCallProcessor.process(compilationUnit, this, fileName)
+ protoLogCallProcessor.process(compilationUnit, this, path)
return processedCode.joinToString("\n")
}
}
diff --git a/tools/protologtool/src/com/android/protolog/tool/ViewerConfigBuilder.kt b/tools/protologtool/src/com/android/protolog/tool/ViewerConfigBuilder.kt
index c1008263c083..175c71ff810b 100644
--- a/tools/protologtool/src/com/android/protolog/tool/ViewerConfigBuilder.kt
+++ b/tools/protologtool/src/com/android/protolog/tool/ViewerConfigBuilder.kt
@@ -46,7 +46,11 @@ class ViewerConfigBuilder(
private val statements: MutableMap<Int, LogCall> = mutableMapOf()
private val groups: MutableSet<LogGroup> = mutableSetOf()
- fun findLogCalls(unit: CompilationUnit, fileName: String): List<Pair<LogCall, ParsingContext>> {
+ fun findLogCalls(
+ unit: CompilationUnit,
+ path: String,
+ packagePath: String
+ ): List<Pair<LogCall, ParsingContext>> {
val calls = mutableListOf<Pair<LogCall, ParsingContext>>()
val visitor = object : ProtoLogCallVisitor {
override fun processCall(
@@ -55,12 +59,12 @@ class ViewerConfigBuilder(
level: LogLevel,
group: LogGroup
) {
- val logCall = LogCall(messageString, level, group, fileName)
- val context = ParsingContext(fileName, call)
+ val logCall = LogCall(messageString, level, group, packagePath)
+ val context = ParsingContext(path, call)
calls.add(logCall to context)
}
}
- processor.process(unit, visitor, fileName)
+ processor.process(unit, visitor, path)
return calls
}
diff --git a/tools/protologtool/tests/com/android/protolog/tool/EndToEndTest.kt b/tools/protologtool/tests/com/android/protolog/tool/EndToEndTest.kt
new file mode 100644
index 000000000000..dd8a0b1c50b4
--- /dev/null
+++ b/tools/protologtool/tests/com/android/protolog/tool/EndToEndTest.kt
@@ -0,0 +1,144 @@
+/*
+ * 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.protolog.tool
+
+import org.junit.Assert
+import org.junit.Assert.assertTrue
+import org.junit.Test
+import java.io.ByteArrayInputStream
+import java.io.ByteArrayOutputStream
+import java.io.File
+import java.io.FileNotFoundException
+import java.io.OutputStream
+import java.util.jar.JarInputStream
+
+class EndToEndTest {
+
+ @Test
+ fun e2e_transform() {
+ val output = run(
+ src = "frameworks/base/org/example/Example.java" to """
+ package org.example;
+ import com.android.server.protolog.common.ProtoLog;
+ import static com.android.server.wm.ProtoLogGroup.GROUP;
+
+ class Example {
+ void method() {
+ String argString = "hello";
+ int argInt = 123;
+ ProtoLog.d(GROUP, "Example: %s %d", argString, argInt);
+ }
+ }
+ """.trimIndent(),
+ logGroup = LogGroup("GROUP", true, false, "TAG_GROUP"),
+ commandOptions = CommandOptions(arrayOf("transform-protolog-calls",
+ "--protolog-class", "com.android.server.protolog.common.ProtoLog",
+ "--protolog-impl-class", "com.android.server.protolog.ProtoLogImpl",
+ "--protolog-cache-class",
+ "com.android.server.protolog.ProtoLog${"\$\$"}Cache",
+ "--loggroups-class", "com.android.server.wm.ProtoLogGroup",
+ "--loggroups-jar", "not_required.jar",
+ "--output-srcjar", "out.srcjar",
+ "frameworks/base/org/example/Example.java"))
+ )
+ val outSrcJar = assertLoadSrcJar(output, "out.srcjar")
+ assertTrue(" 2066303299," in outSrcJar["frameworks/base/org/example/Example.java"]!!)
+ }
+
+ @Test
+ fun e2e_viewerConfig() {
+ val output = run(
+ src = "frameworks/base/org/example/Example.java" to """
+ package org.example;
+ import com.android.server.protolog.common.ProtoLog;
+ import static com.android.server.wm.ProtoLogGroup.GROUP;
+
+ class Example {
+ void method() {
+ String argString = "hello";
+ int argInt = 123;
+ ProtoLog.d(GROUP, "Example: %s %d", argString, argInt);
+ }
+ }
+ """.trimIndent(),
+ logGroup = LogGroup("GROUP", true, false, "TAG_GROUP"),
+ commandOptions = CommandOptions(arrayOf("generate-viewer-config",
+ "--protolog-class", "com.android.server.protolog.common.ProtoLog",
+ "--loggroups-class", "com.android.server.wm.ProtoLogGroup",
+ "--loggroups-jar", "not_required.jar",
+ "--viewer-conf", "out.json",
+ "frameworks/base/org/example/Example.java"))
+ )
+ val viewerConfigJson = assertLoadText(output, "out.json")
+ assertTrue("\"2066303299\"" in viewerConfigJson)
+ }
+
+ private fun assertLoadSrcJar(
+ outputs: Map<String, ByteArray>,
+ path: String
+ ): Map<String, String> {
+ val out = outputs[path] ?: fail("$path not in outputs (${outputs.keys})")
+
+ val sources = mutableMapOf<String, String>()
+ JarInputStream(ByteArrayInputStream(out)).use { jarStream ->
+ var entry = jarStream.nextJarEntry
+ while (entry != null) {
+ if (entry.name.endsWith(".java")) {
+ sources[entry.name] = jarStream.reader().readText()
+ }
+ entry = jarStream.nextJarEntry
+ }
+ }
+ return sources
+ }
+
+ private fun assertLoadText(outputs: Map<String, ByteArray>, path: String): String {
+ val out = outputs[path] ?: fail("$path not in outputs (${outputs.keys})")
+ return out.toString(Charsets.UTF_8)
+ }
+
+ fun run(
+ src: Pair<String, String>,
+ logGroup: LogGroup,
+ commandOptions: CommandOptions
+ ): Map<String, ByteArray> {
+ val outputs = mutableMapOf<String, ByteArrayOutputStream>()
+
+ ProtoLogTool.injector = object : ProtoLogTool.Injector {
+ override fun fileOutputStream(file: String): OutputStream =
+ ByteArrayOutputStream().also { outputs[file] = it }
+
+ override fun readText(file: File): String {
+ if (file.path == src.first) {
+ return src.second
+ }
+ throw FileNotFoundException("expected: ${src.first}, but was $file")
+ }
+
+ override fun readLogGroups(jarPath: String, className: String) = mapOf(
+ logGroup.name to logGroup)
+
+ override fun reportParseError(ex: ParsingException) = throw AssertionError(ex)
+ }
+
+ ProtoLogTool.invoke(commandOptions)
+
+ return outputs.mapValues { it.value.toByteArray() }
+ }
+
+ fun fail(message: String): Nothing = Assert.fail(message) as Nothing
+}
diff --git a/tools/protologtool/tests/com/android/protolog/tool/SourceTransformerTest.kt b/tools/protologtool/tests/com/android/protolog/tool/SourceTransformerTest.kt
index 6f5955cd030b..4f2be328fc8a 100644
--- a/tools/protologtool/tests/com/android/protolog/tool/SourceTransformerTest.kt
+++ b/tools/protologtool/tests/com/android/protolog/tool/SourceTransformerTest.kt
@@ -186,7 +186,7 @@ class SourceTransformerTest {
invocation.arguments[0] as CompilationUnit
}
- val out = sourceJarWriter.processClass(TEST_CODE, PATH, code)
+ val out = sourceJarWriter.processClass(TEST_CODE, PATH, PATH, code)
code = StaticJavaParser.parse(out)
val ifStmts = code.findAll(IfStmt::class.java)
@@ -228,7 +228,7 @@ class SourceTransformerTest {
invocation.arguments[0] as CompilationUnit
}
- val out = sourceJarWriter.processClass(TEST_CODE_MULTICALLS, PATH, code)
+ val out = sourceJarWriter.processClass(TEST_CODE_MULTICALLS, PATH, PATH, code)
code = StaticJavaParser.parse(out)
val ifStmts = code.findAll(IfStmt::class.java)
@@ -266,7 +266,7 @@ class SourceTransformerTest {
invocation.arguments[0] as CompilationUnit
}
- val out = sourceJarWriter.processClass(TEST_CODE_MULTILINE, PATH, code)
+ val out = sourceJarWriter.processClass(TEST_CODE_MULTILINE, PATH, PATH, code)
code = StaticJavaParser.parse(out)
val ifStmts = code.findAll(IfStmt::class.java)
@@ -303,7 +303,7 @@ class SourceTransformerTest {
invocation.arguments[0] as CompilationUnit
}
- val out = sourceJarWriter.processClass(TEST_CODE_NO_PARAMS, PATH, code)
+ val out = sourceJarWriter.processClass(TEST_CODE_NO_PARAMS, PATH, PATH, code)
code = StaticJavaParser.parse(out)
val ifStmts = code.findAll(IfStmt::class.java)
@@ -337,7 +337,7 @@ class SourceTransformerTest {
invocation.arguments[0] as CompilationUnit
}
- val out = sourceJarWriter.processClass(TEST_CODE, PATH, code)
+ val out = sourceJarWriter.processClass(TEST_CODE, PATH, PATH, code)
code = StaticJavaParser.parse(out)
val ifStmts = code.findAll(IfStmt::class.java)
@@ -375,7 +375,7 @@ class SourceTransformerTest {
invocation.arguments[0] as CompilationUnit
}
- val out = sourceJarWriter.processClass(TEST_CODE_MULTILINE, PATH, code)
+ val out = sourceJarWriter.processClass(TEST_CODE_MULTILINE, PATH, PATH, code)
code = StaticJavaParser.parse(out)
val ifStmts = code.findAll(IfStmt::class.java)
@@ -413,7 +413,7 @@ class SourceTransformerTest {
invocation.arguments[0] as CompilationUnit
}
- val out = sourceJarWriter.processClass(TEST_CODE, PATH, code)
+ val out = sourceJarWriter.processClass(TEST_CODE, PATH, PATH, code)
code = StaticJavaParser.parse(out)
val ifStmts = code.findAll(IfStmt::class.java)
@@ -439,7 +439,7 @@ class SourceTransformerTest {
invocation.arguments[0] as CompilationUnit
}
- val out = sourceJarWriter.processClass(TEST_CODE_MULTILINE, PATH, code)
+ val out = sourceJarWriter.processClass(TEST_CODE_MULTILINE, PATH, PATH, code)
code = StaticJavaParser.parse(out)
val ifStmts = code.findAll(IfStmt::class.java)
diff --git a/wifi/java/android/net/wifi/ScanResult.java b/wifi/java/android/net/wifi/ScanResult.java
index c0c0361dd92f..aa895a61df9b 100644
--- a/wifi/java/android/net/wifi/ScanResult.java
+++ b/wifi/java/android/net/wifi/ScanResult.java
@@ -16,11 +16,15 @@
package android.net.wifi;
+import android.annotation.IntDef;
+import android.annotation.Nullable;
import android.annotation.SystemApi;
import android.annotation.UnsupportedAppUsage;
import android.os.Parcel;
import android.os.Parcelable;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
@@ -223,11 +227,86 @@ public class ScanResult implements Parcelable {
*/
public static final int CHANNEL_WIDTH_80MHZ_PLUS_MHZ = 4;
- /**
- * AP Channel bandwidth; one of {@link #CHANNEL_WIDTH_20MHZ}, {@link #CHANNEL_WIDTH_40MHZ},
- * {@link #CHANNEL_WIDTH_80MHZ}, {@link #CHANNEL_WIDTH_160MHZ}
- * or {@link #CHANNEL_WIDTH_80MHZ_PLUS_MHZ}.
- */
+ /**
+ * Wi-Fi unknown standard
+ */
+ public static final int WIFI_STANDARD_UNKNOWN = 0;
+
+ /**
+ * Wi-Fi 802.11a/b/g
+ */
+ public static final int WIFI_STANDARD_LEGACY = 1;
+
+ /**
+ * Wi-Fi 802.11n
+ */
+ public static final int WIFI_STANDARD_11N = 4;
+
+ /**
+ * Wi-Fi 802.11ac
+ */
+ public static final int WIFI_STANDARD_11AC = 5;
+
+ /**
+ * Wi-Fi 802.11ax
+ */
+ public static final int WIFI_STANDARD_11AX = 6;
+
+ /** @hide */
+ @IntDef(prefix = { "WIFI_STANDARD_" }, value = {
+ WIFI_STANDARD_UNKNOWN,
+ WIFI_STANDARD_LEGACY,
+ WIFI_STANDARD_11N,
+ WIFI_STANDARD_11AC,
+ WIFI_STANDARD_11AX
+ })
+ @Retention(RetentionPolicy.SOURCE)
+ public @interface WifiStandard{}
+
+ /**
+ * AP wifi standard.
+ */
+ private @WifiStandard int mWifiStandard;
+
+ /**
+ * return the AP wifi standard.
+ */
+ public @WifiStandard int getWifiStandard() {
+ return mWifiStandard;
+ }
+
+ /**
+ * sets the AP wifi standard.
+ * @hide
+ */
+ public void setWifiStandard(@WifiStandard int standard) {
+ mWifiStandard = standard;
+ }
+
+ /**
+ * Convert Wi-Fi standard to string
+ */
+ private static @Nullable String wifiStandardToString(@WifiStandard int standard) {
+ switch(standard) {
+ case WIFI_STANDARD_LEGACY:
+ return "legacy";
+ case WIFI_STANDARD_11N:
+ return "11n";
+ case WIFI_STANDARD_11AC:
+ return "11ac";
+ case WIFI_STANDARD_11AX:
+ return "11ax";
+ case WIFI_STANDARD_UNKNOWN:
+ return "unknown";
+ }
+ return null;
+ }
+
+ /**
+ * AP Channel bandwidth; one of {@link #CHANNEL_WIDTH_20MHZ}, {@link #CHANNEL_WIDTH_40MHZ},
+ * {@link #CHANNEL_WIDTH_80MHZ}, {@link #CHANNEL_WIDTH_160MHZ}
+ * or {@link #CHANNEL_WIDTH_80MHZ_PLUS_MHZ}.
+ */
public int channelWidth;
/**
@@ -465,9 +544,16 @@ public class ScanResult implements Parcelable {
public static final int EID_VHT_OPERATION = 192;
@UnsupportedAppUsage
public static final int EID_VSA = 221;
+ public static final int EID_EXTENSION_PRESENT = 255;
+
+ /**
+ * Extension IDs
+ */
+ public static final int EID_EXT_HE_OPERATION = 36;
@UnsupportedAppUsage
public int id;
+ public int idExt;
@UnsupportedAppUsage
public byte[] bytes;
@@ -476,6 +562,7 @@ public class ScanResult implements Parcelable {
public InformationElement(InformationElement rhs) {
this.id = rhs.id;
+ this.idExt = rhs.idExt;
this.bytes = rhs.bytes.clone();
}
}
@@ -541,6 +628,7 @@ public class ScanResult implements Parcelable {
this.carrierApEapType = UNSPECIFIED;
this.carrierName = null;
this.radioChainInfos = null;
+ this.mWifiStandard = WIFI_STANDARD_UNKNOWN;
}
/** {@hide} */
@@ -563,6 +651,7 @@ public class ScanResult implements Parcelable {
this.carrierApEapType = UNSPECIFIED;
this.carrierName = null;
this.radioChainInfos = null;
+ this.mWifiStandard = WIFI_STANDARD_UNKNOWN;
}
/** {@hide} */
@@ -592,6 +681,7 @@ public class ScanResult implements Parcelable {
this.carrierApEapType = UNSPECIFIED;
this.carrierName = null;
this.radioChainInfos = null;
+ this.mWifiStandard = WIFI_STANDARD_UNKNOWN;
}
/** {@hide} */
@@ -633,6 +723,7 @@ public class ScanResult implements Parcelable {
carrierApEapType = source.carrierApEapType;
carrierName = source.carrierName;
radioChainInfos = source.radioChainInfos;
+ this.mWifiStandard = source.mWifiStandard;
}
}
@@ -671,6 +762,7 @@ public class ScanResult implements Parcelable {
sb.append(", ChannelBandwidth: ").append(channelWidth);
sb.append(", centerFreq0: ").append(centerFreq0);
sb.append(", centerFreq1: ").append(centerFreq1);
+ sb.append(", standard: ").append(wifiStandardToString(mWifiStandard));
sb.append(", 80211mcResponder: ");
sb.append(((flags & FLAG_80211mc_RESPONDER) != 0) ? "is supported" : "is not supported");
sb.append(", Carrier AP: ").append(isCarrierAp ? "yes" : "no");
@@ -706,6 +798,7 @@ public class ScanResult implements Parcelable {
dest.writeInt(channelWidth);
dest.writeInt(centerFreq0);
dest.writeInt(centerFreq1);
+ dest.writeInt(mWifiStandard);
dest.writeLong(seen);
dest.writeInt(untrusted ? 1 : 0);
dest.writeInt(numUsage);
@@ -717,6 +810,7 @@ public class ScanResult implements Parcelable {
dest.writeInt(informationElements.length);
for (int i = 0; i < informationElements.length; i++) {
dest.writeInt(informationElements[i].id);
+ dest.writeInt(informationElements[i].idExt);
dest.writeInt(informationElements[i].bytes.length);
dest.writeByteArray(informationElements[i].bytes);
}
@@ -787,6 +881,7 @@ public class ScanResult implements Parcelable {
fixed with flags below */
);
+ sr.mWifiStandard = in.readInt();
sr.seen = in.readLong();
sr.untrusted = in.readInt() != 0;
sr.numUsage = in.readInt();
@@ -799,6 +894,7 @@ public class ScanResult implements Parcelable {
for (int i = 0; i < n; i++) {
sr.informationElements[i] = new InformationElement();
sr.informationElements[i].id = in.readInt();
+ sr.informationElements[i].idExt = in.readInt();
int len = in.readInt();
sr.informationElements[i].bytes = new byte[len];
in.readByteArray(sr.informationElements[i].bytes);
diff --git a/wifi/java/android/net/wifi/WifiInfo.java b/wifi/java/android/net/wifi/WifiInfo.java
index 62ba95dc806b..86e51227575b 100644
--- a/wifi/java/android/net/wifi/WifiInfo.java
+++ b/wifi/java/android/net/wifi/WifiInfo.java
@@ -16,7 +16,6 @@
package android.net.wifi;
-import android.annotation.IntDef;
import android.annotation.IntRange;
import android.annotation.Nullable;
import android.annotation.SystemApi;
@@ -28,8 +27,6 @@ import android.os.Parcel;
import android.os.Parcelable;
import android.text.TextUtils;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
import java.net.Inet4Address;
import java.net.InetAddress;
import java.net.UnknownHostException;
@@ -99,45 +96,9 @@ public class WifiInfo implements Parcelable {
private int mRssi;
/**
- * Wi-Fi unknown technology
+ * Wi-Fi standard for the connection
*/
- public static final int WIFI_TECHNOLOGY_UNKNOWN = 0;
-
- /**
- * Wi-Fi 802.11a/b/g
- */
- public static final int WIFI_TECHNOLOGY_LEGACY = 1;
-
- /**
- * Wi-Fi 802.11n
- */
- public static final int WIFI_TECHNOLOGY_11N = 4;
-
- /**
- * Wi-Fi 802.11ac
- */
- public static final int WIFI_TECHNOLOGY_11AC = 5;
-
- /**
- * Wi-Fi 802.11ax
- */
- public static final int WIFI_TECHNOLOGY_11AX = 6;
-
- /** @hide */
- @IntDef(prefix = { "WIFI_TECHNOLOGY_" }, value = {
- WIFI_TECHNOLOGY_UNKNOWN,
- WIFI_TECHNOLOGY_LEGACY,
- WIFI_TECHNOLOGY_11N,
- WIFI_TECHNOLOGY_11AC,
- WIFI_TECHNOLOGY_11AX
- })
- @Retention(RetentionPolicy.SOURCE)
- public @interface WifiTechnology{}
-
- /**
- * Wi-Fi technology for the connection
- */
- private @WifiTechnology int mWifiTechnology;
+ private @ScanResult.WifiStandard int mWifiStandard;
/**
* The unit in which links speeds are expressed.
@@ -330,7 +291,7 @@ public class WifiInfo implements Parcelable {
txSuccessRate = source.txSuccessRate;
rxSuccessRate = source.rxSuccessRate;
score = source.score;
- mWifiTechnology = source.mWifiTechnology;
+ mWifiStandard = source.mWifiStandard;
}
}
@@ -419,19 +380,19 @@ public class WifiInfo implements Parcelable {
}
/**
- * Sets the Wi-Fi technology
+ * Sets the Wi-Fi standard
* @hide
*/
- public void setWifiTechnology(@WifiTechnology int wifiTechnology) {
- mWifiTechnology = wifiTechnology;
+ public void setWifiStandard(@ScanResult.WifiStandard int wifiStandard) {
+ mWifiStandard = wifiStandard;
}
/**
- * Get connection Wi-Fi technology
- * @return the connection Wi-Fi technology
+ * Get connection Wi-Fi standard
+ * @return the connection Wi-Fi standard
*/
- public @WifiTechnology int getWifiTechnology() {
- return mWifiTechnology;
+ public @ScanResult.WifiStandard int getWifiStandard() {
+ return mWifiStandard;
}
/**
@@ -740,7 +701,7 @@ public class WifiInfo implements Parcelable {
.append(", MAC: ").append(mMacAddress == null ? none : mMacAddress)
.append(", Supplicant state: ")
.append(mSupplicantState == null ? none : mSupplicantState)
- .append(", Wi-Fi technology: ").append(mWifiTechnology)
+ .append(", Wi-Fi standard: ").append(mWifiStandard)
.append(", RSSI: ").append(mRssi)
.append(", Link speed: ").append(mLinkSpeed).append(LINK_SPEED_UNITS)
.append(", Tx Link speed: ").append(mTxLinkSpeed).append(LINK_SPEED_UNITS)
@@ -796,7 +757,7 @@ public class WifiInfo implements Parcelable {
dest.writeString(mNetworkSuggestionOrSpecifierPackageName);
dest.writeString(mFqdn);
dest.writeString(mProviderFriendlyName);
- dest.writeInt(mWifiTechnology);
+ dest.writeInt(mWifiStandard);
}
/** Implement the Parcelable interface {@hide} */
@@ -838,7 +799,7 @@ public class WifiInfo implements Parcelable {
info.mNetworkSuggestionOrSpecifierPackageName = in.readString();
info.mFqdn = in.readString();
info.mProviderFriendlyName = in.readString();
- info.mWifiTechnology = in.readInt();
+ info.mWifiStandard = in.readInt();
return info;
}
diff --git a/wifi/java/android/net/wifi/WifiManager.java b/wifi/java/android/net/wifi/WifiManager.java
index 380ebf104a14..07831c71b0d3 100644
--- a/wifi/java/android/net/wifi/WifiManager.java
+++ b/wifi/java/android/net/wifi/WifiManager.java
@@ -5240,16 +5240,18 @@ public class WifiManager {
/**
* Add a listener for Scan Results. See {@link ScanResultsListener}.
* Caller will receive the event when scan results are available.
- * Caller should use {@link WifiManager#getScanResults()} to get the scan results.
+ * Caller should use {@link WifiManager#getScanResults()} requires
+ * {@link android.Manifest.permission#ACCESS_FINE_LOCATION} to get the scan results.
* Caller can remove a previously registered listener using
* {@link WifiManager#removeScanResultsListener(ScanResultsListener)}
+ * Same caller can add multiple listeners.
* <p>
* Applications should have the
* {@link android.Manifest.permission#ACCESS_WIFI_STATE} permission. Callers
* without the permission will trigger a {@link java.lang.SecurityException}.
* <p>
*
- * @param executor The executor to execute the listener of the {@code listener} object.
+ * @param executor The executor to execute the listener of the {@code listener} object.
* @param listener listener for Scan Results events
*/
@@ -5267,7 +5269,7 @@ public class WifiManager {
iWifiManager.registerScanResultsListener(
new Binder(),
new ScanResultsListenerProxy(executor, listener),
- mContext.getOpPackageName().hashCode());
+ listener.hashCode());
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
}
@@ -5289,7 +5291,7 @@ public class WifiManager {
if (iWifiManager == null) {
throw new RemoteException("Wifi service is not running");
}
- iWifiManager.unregisterScanResultsListener(mContext.getOpPackageName().hashCode());
+ iWifiManager.unregisterScanResultsListener(listener.hashCode());
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
}
diff --git a/wifi/java/android/net/wifi/WifiScanner.java b/wifi/java/android/net/wifi/WifiScanner.java
index 21189a411d94..67993e1b72db 100644
--- a/wifi/java/android/net/wifi/WifiScanner.java
+++ b/wifi/java/android/net/wifi/WifiScanner.java
@@ -19,7 +19,6 @@ package android.net.wifi;
import android.Manifest;
import android.annotation.IntDef;
import android.annotation.NonNull;
-import android.annotation.Nullable;
import android.annotation.RequiresPermission;
import android.annotation.SuppressLint;
import android.annotation.SystemApi;
@@ -134,14 +133,14 @@ public class WifiScanner {
* @hide
*/
@SystemApi
- @Nullable
+ @NonNull
@RequiresPermission(android.Manifest.permission.LOCATION_HARDWARE)
public List<Integer> getAvailableChannels(@WifiBand int band) {
try {
Bundle bundle = mService.getAvailableChannels(band, mContext.getOpPackageName());
return bundle.getIntegerArrayList(GET_AVAILABLE_CHANNELS_EXTRA);
} catch (RemoteException e) {
- return null;
+ throw e.rethrowFromSystemServer();
}
}
@@ -344,7 +343,7 @@ public class WifiScanner {
}
/** Implement the Parcelable interface {@hide} */
- public static final @android.annotation.NonNull Creator<ScanSettings> CREATOR =
+ public static final @NonNull Creator<ScanSettings> CREATOR =
new Creator<ScanSettings>() {
public ScanSettings createFromParcel(Parcel in) {
ScanSettings settings = new ScanSettings();
@@ -492,7 +491,7 @@ public class WifiScanner {
}
/** Implement the Parcelable interface {@hide} */
- public static final @android.annotation.NonNull Creator<ScanData> CREATOR =
+ public static final @NonNull Creator<ScanData> CREATOR =
new Creator<ScanData>() {
public ScanData createFromParcel(Parcel in) {
int id = in.readInt();
@@ -541,7 +540,7 @@ public class WifiScanner {
}
/** Implement the Parcelable interface {@hide} */
- public static final @android.annotation.NonNull Creator<ParcelableScanData> CREATOR =
+ public static final @NonNull Creator<ParcelableScanData> CREATOR =
new Creator<ParcelableScanData>() {
public ParcelableScanData createFromParcel(Parcel in) {
int n = in.readInt();
@@ -589,7 +588,7 @@ public class WifiScanner {
}
/** Implement the Parcelable interface {@hide} */
- public static final @android.annotation.NonNull Creator<ParcelableScanResults> CREATOR =
+ public static final @NonNull Creator<ParcelableScanResults> CREATOR =
new Creator<ParcelableScanResults>() {
public ParcelableScanResults createFromParcel(Parcel in) {
int n = in.readInt();
@@ -720,7 +719,7 @@ public class WifiScanner {
}
/** Implement the Parcelable interface {@hide} */
- public static final @android.annotation.NonNull Creator<PnoSettings> CREATOR =
+ public static final @NonNull Creator<PnoSettings> CREATOR =
new Creator<PnoSettings>() {
public PnoSettings createFromParcel(Parcel in) {
PnoSettings settings = new PnoSettings();
@@ -1068,7 +1067,7 @@ public class WifiScanner {
}
/** Implement the Parcelable interface {@hide} */
- public static final @android.annotation.NonNull Creator<WifiChangeSettings> CREATOR =
+ public static final @NonNull Creator<WifiChangeSettings> CREATOR =
new Creator<WifiChangeSettings>() {
public WifiChangeSettings createFromParcel(Parcel in) {
return new WifiChangeSettings();
@@ -1179,7 +1178,7 @@ public class WifiScanner {
}
/** Implement the Parcelable interface {@hide} */
- public static final @android.annotation.NonNull Creator<HotlistSettings> CREATOR =
+ public static final @NonNull Creator<HotlistSettings> CREATOR =
new Creator<HotlistSettings>() {
public HotlistSettings createFromParcel(Parcel in) {
HotlistSettings settings = new HotlistSettings();
@@ -1412,7 +1411,7 @@ public class WifiScanner {
}
/** Implement the Parcelable interface {@hide} */
- public static final @android.annotation.NonNull Creator<OperationResult> CREATOR =
+ public static final @NonNull Creator<OperationResult> CREATOR =
new Creator<OperationResult>() {
public OperationResult createFromParcel(Parcel in) {
int reason = in.readInt();
diff --git a/wifi/tests/src/android/net/wifi/ScanResultTest.java b/wifi/tests/src/android/net/wifi/ScanResultTest.java
index 54ec32502878..b5c74d1d01b1 100644
--- a/wifi/tests/src/android/net/wifi/ScanResultTest.java
+++ b/wifi/tests/src/android/net/wifi/ScanResultTest.java
@@ -21,6 +21,7 @@ import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNull;
import static org.mockito.Mockito.validateMockitoUsage;
+import android.net.wifi.ScanResult.InformationElement;
import android.os.Parcel;
import androidx.test.filters.SmallTest;
@@ -41,6 +42,8 @@ public class ScanResultTest {
public static final int TEST_LEVEL = -56;
public static final int TEST_FREQUENCY = 2412;
public static final long TEST_TSF = 04660l;
+ public static final @ScanResult.WifiStandard int TEST_WIFI_STANDARD =
+ ScanResult.WIFI_STANDARD_11AC;
/**
* Setup before tests.
@@ -124,17 +127,38 @@ public class ScanResultTest {
}
/**
+ * Verify parcel read/write for ScanResult with Information Element
+ */
+ @Test
+ public void verifyScanResultParcelWithInformationElement() throws Exception {
+ ScanResult writeScanResult = createScanResult();
+ writeScanResult.informationElements = new ScanResult.InformationElement[2];
+ writeScanResult.informationElements[0] = new ScanResult.InformationElement();
+ writeScanResult.informationElements[0].id = InformationElement.EID_HT_OPERATION;
+ writeScanResult.informationElements[0].idExt = 0;
+ writeScanResult.informationElements[0].bytes = new byte[]{0x11, 0x22, 0x33};
+ writeScanResult.informationElements[1] = new ScanResult.InformationElement();
+ writeScanResult.informationElements[1].id = InformationElement.EID_EXTENSION_PRESENT;
+ writeScanResult.informationElements[1].idExt = InformationElement.EID_EXT_HE_OPERATION;
+ writeScanResult.informationElements[1].bytes = new byte[]{0x44, 0x55, 0x66};
+ ScanResult readScanResult = new ScanResult(writeScanResult);
+ assertScanResultEquals(writeScanResult, readScanResult);
+ }
+
+ /**
* Verify toString for ScanResult.
*/
@Test
public void verifyScanResultToStringWithoutRadioChainInfo() throws Exception {
ScanResult scanResult = createScanResult();
- assertEquals("SSID: \"test_ssid\", BSSID: 04:ac:fe:45:34:10, capabilities: CCMP, " +
- "level: -56, frequency: 2412, timestamp: 2480, distance: 0(cm), distanceSd: 0(cm), " +
- "passpoint: no, ChannelBandwidth: 0, centerFreq0: 0, centerFreq1: 0, " +
- "80211mcResponder: is not supported, Carrier AP: no, " +
- "Carrier AP EAP Type: 0, Carrier name: null, " +
- "Radio Chain Infos: null", scanResult.toString());
+ assertEquals("SSID: \"test_ssid\", BSSID: 04:ac:fe:45:34:10, capabilities: CCMP, "
+ + "level: -56, frequency: 2412, timestamp: 2480, "
+ + "distance: 0(cm), distanceSd: 0(cm), "
+ + "passpoint: no, ChannelBandwidth: 0, centerFreq0: 0, centerFreq1: 0, "
+ + "standard: 11ac, "
+ + "80211mcResponder: is not supported, Carrier AP: no, "
+ + "Carrier AP EAP Type: 0, Carrier name: null, "
+ + "Radio Chain Infos: null", scanResult.toString());
}
/**
@@ -150,13 +174,15 @@ public class ScanResultTest {
scanResult.radioChainInfos[1] = new ScanResult.RadioChainInfo();
scanResult.radioChainInfos[1].id = 1;
scanResult.radioChainInfos[1].level = -54;
- assertEquals("SSID: \"test_ssid\", BSSID: 04:ac:fe:45:34:10, capabilities: CCMP, " +
- "level: -56, frequency: 2412, timestamp: 2480, distance: 0(cm), distanceSd: 0(cm), " +
- "passpoint: no, ChannelBandwidth: 0, centerFreq0: 0, centerFreq1: 0, " +
- "80211mcResponder: is not supported, Carrier AP: no, " +
- "Carrier AP EAP Type: 0, Carrier name: null, " +
- "Radio Chain Infos: [RadioChainInfo: id=0, level=-45, " +
- "RadioChainInfo: id=1, level=-54]", scanResult.toString());
+ assertEquals("SSID: \"test_ssid\", BSSID: 04:ac:fe:45:34:10, capabilities: CCMP, "
+ + "level: -56, frequency: 2412, timestamp: 2480, distance: 0(cm), "
+ + "distanceSd: 0(cm), "
+ + "passpoint: no, ChannelBandwidth: 0, centerFreq0: 0, centerFreq1: 0, "
+ + "standard: 11ac, "
+ + "80211mcResponder: is not supported, Carrier AP: no, "
+ + "Carrier AP EAP Type: 0, Carrier name: null, "
+ + "Radio Chain Infos: [RadioChainInfo: id=0, level=-45, "
+ + "RadioChainInfo: id=1, level=-54]", scanResult.toString());
}
/**
@@ -177,6 +203,7 @@ public class ScanResultTest {
result.level = TEST_LEVEL;
result.frequency = TEST_FREQUENCY;
result.timestamp = TEST_TSF;
+ result.setWifiStandard(TEST_WIFI_STANDARD);
return result;
}
@@ -187,6 +214,8 @@ public class ScanResultTest {
assertEquals(expected.level, actual.level);
assertEquals(expected.frequency, actual.frequency);
assertEquals(expected.timestamp, actual.timestamp);
+ assertEquals(expected.getWifiStandard(), actual.getWifiStandard());
assertArrayEquals(expected.radioChainInfos, actual.radioChainInfos);
+ assertArrayEquals(expected.informationElements, actual.informationElements);
}
}
diff --git a/wifi/tests/src/android/net/wifi/WifiInfoTest.java b/wifi/tests/src/android/net/wifi/WifiInfoTest.java
index ea08ea8e8333..22a5faaac112 100644
--- a/wifi/tests/src/android/net/wifi/WifiInfoTest.java
+++ b/wifi/tests/src/android/net/wifi/WifiInfoTest.java
@@ -38,7 +38,7 @@ public class WifiInfoTest {
private static final String TEST_PACKAGE_NAME = "com.test.example";
private static final String TEST_FQDN = "test.com";
private static final String TEST_PROVIDER_NAME = "test";
- private static final int TEST_WIFI_TECHNOLOGY = WifiInfo.WIFI_TECHNOLOGY_11AC;
+ private static final int TEST_WIFI_STANDARD = ScanResult.WIFI_STANDARD_11AC;
/**
* Verify parcel write/read with WifiInfo.
@@ -55,7 +55,7 @@ public class WifiInfoTest {
writeWifiInfo.setFQDN(TEST_FQDN);
writeWifiInfo.setProviderFriendlyName(TEST_PROVIDER_NAME);
writeWifiInfo.setNetworkSuggestionOrSpecifierPackageName(TEST_PACKAGE_NAME);
- writeWifiInfo.setWifiTechnology(TEST_WIFI_TECHNOLOGY);
+ writeWifiInfo.setWifiStandard(TEST_WIFI_STANDARD);
Parcel parcel = Parcel.obtain();
writeWifiInfo.writeToParcel(parcel, 0);
@@ -74,6 +74,6 @@ public class WifiInfoTest {
assertEquals(TEST_PACKAGE_NAME, readWifiInfo.getNetworkSuggestionOrSpecifierPackageName());
assertEquals(TEST_FQDN, readWifiInfo.getPasspointFqdn());
assertEquals(TEST_PROVIDER_NAME, readWifiInfo.getPasspointProviderFriendlyName());
- assertEquals(TEST_WIFI_TECHNOLOGY, readWifiInfo.getWifiTechnology());
+ assertEquals(TEST_WIFI_STANDARD, readWifiInfo.getWifiStandard());
}
}